diff --git a/packages/devtools-kit/src/_types/options.ts b/packages/devtools-kit/src/_types/options.ts
index b0ac0ae05a..b246594a3f 100644
--- a/packages/devtools-kit/src/_types/options.ts
+++ b/packages/devtools-kit/src/_types/options.ts
@@ -43,14 +43,6 @@ export interface ModuleOptions {
*/
viteInspect?: boolean
- /**
- * Enable Vite DevTools integration
- *
- * @experimental
- * @default false
- */
- viteDevTools?: boolean
-
/**
* Disable dev time authorization check.
*
diff --git a/packages/devtools-kit/src/index.test.ts b/packages/devtools-kit/src/index.test.ts
new file mode 100644
index 0000000000..fa2885f671
--- /dev/null
+++ b/packages/devtools-kit/src/index.test.ts
@@ -0,0 +1,96 @@
+import { Buffer } from 'node:buffer'
+import { EventEmitter } from 'node:events'
+import { beforeEach, describe, expect, it, vi } from 'vitest'
+import { extendServerRpc, startSubprocess } from './index'
+
+const { execaMock } = vi.hoisted(() => ({
+ execaMock: vi.fn(),
+}))
+
+vi.mock('execa', () => ({
+ execa: execaMock,
+}))
+
+class MockProcess extends EventEmitter {
+ stdout = new EventEmitter()
+ stderr = new EventEmitter()
+ kill = vi.fn()
+}
+
+describe('@nuxt/devtools-kit compat helpers', () => {
+ beforeEach(() => {
+ execaMock.mockReset()
+ })
+
+ it('extends server rpc through devtools context', () => {
+ const rpc = {
+ broadcast: {
+ ping: vi.fn(),
+ },
+ }
+ const nuxt = {
+ devtools: {
+ extendServerRpc: vi.fn(() => rpc),
+ },
+ }
+
+ const result = extendServerRpc('custom-rpc', {
+ hello() {
+ return 'hi'
+ },
+ }, nuxt as any)
+
+ expect((nuxt.devtools.extendServerRpc as any).mock.calls[0]?.[0]).toBe('custom-rpc')
+ expect(result).toBe(rpc as any)
+ })
+
+ it('streams subprocess output to terminal hooks', () => {
+ const process = new MockProcess()
+ execaMock.mockReturnValue(process)
+
+ const callHook = vi.fn()
+ const closeHooks: (() => void)[] = []
+ const nuxt = {
+ callHook,
+ hook(name: string, fn: () => void) {
+ if (name === 'close')
+ closeHooks.push(fn)
+ },
+ }
+
+ const subprocess = startSubprocess(
+ {
+ command: 'node',
+ args: ['-e', 'console.log("hello")'],
+ },
+ {
+ id: 'devtools:test',
+ name: 'Test Terminal',
+ },
+ nuxt as any,
+ )
+
+ expect(callHook).toHaveBeenCalledWith('devtools:terminal:register', expect.objectContaining({
+ id: 'devtools:test',
+ name: 'Test Terminal',
+ }))
+ expect(callHook).toHaveBeenCalledWith('devtools:terminal:write', expect.objectContaining({
+ id: 'devtools:test',
+ data: expect.stringContaining('node -e console.log("hello")'),
+ }))
+
+ process.stdout.emit('data', Buffer.from('stdout'))
+ process.stderr.emit('data', Buffer.from('stderr'))
+ process.emit('exit', 0)
+
+ expect(callHook).toHaveBeenCalledWith('devtools:terminal:write', { id: 'devtools:test', data: 'stdout' })
+ expect(callHook).toHaveBeenCalledWith('devtools:terminal:write', { id: 'devtools:test', data: 'stderr' })
+ expect(callHook).toHaveBeenCalledWith('devtools:terminal:exit', { id: 'devtools:test', code: 0 })
+
+ subprocess.terminate()
+ expect(callHook).toHaveBeenCalledWith('devtools:terminal:remove', { id: 'devtools:test' })
+
+ closeHooks.forEach(fn => fn())
+ expect((process as any).kill).toHaveBeenCalled()
+ })
+})
diff --git a/packages/devtools/client/components/DockingPanel.vue b/packages/devtools/client/components/DockingPanel.vue
index d5a4d2bc40..8f3f994b91 100644
--- a/packages/devtools/client/components/DockingPanel.vue
+++ b/packages/devtools/client/components/DockingPanel.vue
@@ -31,7 +31,6 @@ function toggleSplitScreen() {
{{ splitScreenEnabled ? 'Close Split Screen' : 'Split Screen' }}
-
diff --git a/packages/devtools/client/pages/index.vue b/packages/devtools/client/pages/index.vue
index 5ed6f7514e..1b3f298f11 100644
--- a/packages/devtools/client/pages/index.vue
+++ b/packages/devtools/client/pages/index.vue
@@ -1,31 +1,19 @@
@@ -48,9 +36,6 @@ function hideFloatingPanel() {
Get Started
-
- Always hide the floating panel
-
diff --git a/packages/devtools/client/pages/settings.vue b/packages/devtools/client/pages/settings.vue
index 805a339585..9fd0e7c7c0 100644
--- a/packages/devtools/client/pages/settings.vue
+++ b/packages/devtools/client/pages/settings.vue
@@ -1,6 +1,5 @@
@@ -222,9 +198,6 @@ watchEffect(() => {
Features
-
- Close DevTools when clicking outside
-
@@ -232,19 +205,6 @@ watchEffect(() => {
Show help buttons
-
- Show the floating panel
-
-
-
-
- Minimize floating panel on inactive
-
-
-
-
Open In Editor
diff --git a/packages/devtools/package.json b/packages/devtools/package.json
index a90aea8211..961be8b965 100644
--- a/packages/devtools/package.json
+++ b/packages/devtools/package.json
@@ -46,18 +46,13 @@
"prepack": "pnpm build"
},
"peerDependencies": {
- "@vitejs/devtools": "*",
"vite": ">=6.0"
},
- "peerDependenciesMeta": {
- "@vitejs/devtools": {
- "optional": true
- }
- },
"dependencies": {
"@nuxt/devtools-kit": "workspace:*",
"@nuxt/devtools-wizard": "workspace:*",
"@nuxt/kit": "catalog:prod",
+ "@vitejs/devtools": "catalog:buildtools",
"@vue/devtools-core": "catalog:frontend",
"@vue/devtools-kit": "catalog:prod",
"birpc": "catalog:frontend",
@@ -107,7 +102,6 @@
"@unocss/preset-icons": "catalog:buildtools",
"@unocss/preset-uno": "catalog:buildtools",
"@unocss/runtime": "catalog:frontend",
- "@vitejs/devtools": "catalog:buildtools",
"@vitest/ui": "catalog:cli",
"@vue/devtools-applet": "catalog:frontend",
"@vueuse/nuxt": "catalog:buildtools",
diff --git a/packages/devtools/src/integrations/vite-devtools.test.ts b/packages/devtools/src/integrations/vite-devtools.test.ts
new file mode 100644
index 0000000000..1452edd82b
--- /dev/null
+++ b/packages/devtools/src/integrations/vite-devtools.test.ts
@@ -0,0 +1,57 @@
+import type { Plugin } from 'vite'
+import { describe, expect, it, vi } from 'vitest'
+import * as bridge from './vite-devtools'
+
+describe('vite-devtools integration helpers', () => {
+ it('resolves base route with normalized slashes', () => {
+ expect(bridge.resolveNuxtDevToolsBaseRoute('/')).toBe('/__nuxt_devtools__')
+ expect(bridge.resolveNuxtDevToolsBaseRoute('/foo/')).toBe('/foo/__nuxt_devtools__')
+ expect(bridge.resolveNuxtDevToolsBaseRoute('foo')).toBe('foo/__nuxt_devtools__')
+ })
+
+ it('resolves client route with trailing slash', () => {
+ expect(bridge.resolveNuxtDevToolsClientRoute('/')).toBe('/__nuxt_devtools__/client/')
+ expect(bridge.resolveNuxtDevToolsClientRoute('/foo/')).toBe('/foo/__nuxt_devtools__/client/')
+ })
+
+ it('throws importer errors', async () => {
+ await expect(bridge.loadViteDevToolsPlugins(async () => {
+ throw new Error('boom')
+ })).rejects.toThrow('boom')
+ })
+
+ it('loads plugins when importer resolves', async () => {
+ const plugin = { name: 'mock-devtools-plugin' } as Plugin
+ const plugins = await bridge.loadViteDevToolsPlugins(async () => ({
+ DevTools: async () => [plugin],
+ }))
+ expect(plugins).toEqual([plugin])
+ })
+
+ it('creates a bridge plugin with base-aware dock url and captures context', async () => {
+ const existingPlugin = { name: 'existing-devtools-plugin' } as Plugin
+ const loadSpy = vi.spyOn(bridge, 'loadViteDevToolsPlugins').mockResolvedValue([existingPlugin])
+
+ const result = await bridge.setupViteDevToolsBridge({
+ options: {
+ app: {
+ baseURL: '/foo/',
+ },
+ },
+ } as any)
+
+ loadSpy.mockRestore()
+ expect(result.state.dockUrl).toBe('/foo/__nuxt_devtools__/client/')
+
+ const register = vi.fn()
+ const context = { docks: { register } }
+ result.plugins.at(-1)!.devtools!.setup(context as any)
+
+ expect(register).toHaveBeenCalledWith(expect.objectContaining({
+ id: bridge.NUXT_DOCK_ID,
+ type: 'iframe',
+ url: '/foo/__nuxt_devtools__/client/',
+ }))
+ expect(result.state.context).toBe(context)
+ })
+})
diff --git a/packages/devtools/src/integrations/vite-devtools.ts b/packages/devtools/src/integrations/vite-devtools.ts
new file mode 100644
index 0000000000..2494910392
--- /dev/null
+++ b/packages/devtools/src/integrations/vite-devtools.ts
@@ -0,0 +1,61 @@
+import type { DevToolsNodeContext } from '@vitejs/devtools-kit'
+import type { Nuxt } from 'nuxt/schema'
+import type { Plugin } from 'vite'
+
+const MULTIPLE_SLASHES_RE = /\/+/g
+const NUXT_DOCK_ICON = 'https://nuxt.com/assets/design-kit/icon-green.svg'
+export const NUXT_DOCK_ID = 'nuxt:devtools'
+
+export interface ViteDevToolsBridgeState {
+ dockUrl: string
+ context?: DevToolsNodeContext
+}
+
+export interface ViteDevToolsBridge {
+ plugins: Plugin[]
+ state: ViteDevToolsBridgeState
+}
+
+export function resolveNuxtDevToolsBaseRoute(baseURL: string | undefined) {
+ return `${baseURL || '/'}/__nuxt_devtools__`.replace(MULTIPLE_SLASHES_RE, '/')
+}
+
+export function resolveNuxtDevToolsClientRoute(baseURL: string | undefined) {
+ return `${resolveNuxtDevToolsBaseRoute(baseURL)}/client/`.replace(MULTIPLE_SLASHES_RE, '/')
+}
+
+export async function loadViteDevToolsPlugins(
+ importer: () => Promise<{ DevTools: () => Promise }> = () => import('@vitejs/devtools'),
+) {
+ const { DevTools } = await importer()
+ return await DevTools()
+}
+
+export async function setupViteDevToolsBridge(
+ nuxt: Nuxt,
+): Promise {
+ const plugins = await loadViteDevToolsPlugins()
+ const dockUrl = resolveNuxtDevToolsClientRoute(nuxt.options.app.baseURL)
+ const state: ViteDevToolsBridgeState = { dockUrl }
+
+ plugins.push({
+ name: 'nuxt:devtools:vite-kit-bridge',
+ devtools: {
+ setup(ctx) {
+ state.context = ctx
+ ctx.docks.register({
+ id: NUXT_DOCK_ID,
+ type: 'iframe',
+ icon: NUXT_DOCK_ICON,
+ title: 'Nuxt DevTools',
+ url: dockUrl,
+ })
+ },
+ },
+ })
+
+ return {
+ plugins,
+ state,
+ }
+}
diff --git a/packages/devtools/src/module-main.ts b/packages/devtools/src/module-main.ts
index b1c0d09e13..ada8752a95 100644
--- a/packages/devtools/src/module-main.ts
+++ b/packages/devtools/src/module-main.ts
@@ -1,4 +1,3 @@
-import type {} from '@vitejs/devtools-kit'
import type { ServerResponse } from 'node:http'
import type { Nuxt } from 'nuxt/schema'
import type { ModuleOptions, NuxtDevToolsOptions } from './types'
@@ -14,10 +13,10 @@ import { version } from '../package.json'
import { defaultTabOptions } from './constant'
import { getDevAuthToken } from './dev-auth'
import { clientDir, isGlobalInstall, packageDir, runtimeDir } from './dirs'
+import { resolveNuxtDevToolsBaseRoute, setupViteDevToolsBridge } from './integrations/vite-devtools'
import { setupRPC } from './server-rpc'
import { readLocalOptions } from './utils/local-options'
-const MULTIPLE_SLASHES_RE = /\/+/g
const DEVTOOLS_BASE_RE = /\/__NUXT_DEVTOOLS_BASE__\//g
export async function enableModule(options: ModuleOptions, nuxt: Nuxt) {
@@ -36,6 +35,10 @@ export async function enableModule(options: ModuleOptions, nuxt: Nuxt) {
return
}
+ if (typeof nuxt.options.devtools === 'object' && nuxt.options.devtools && 'viteDevTools' in nuxt.options.devtools) {
+ logger.warn('[nuxt-devtools] `devtools.viteDevTools` is removed and now always enabled. The option is ignored.')
+ }
+
// Determine if user aware devtools, by checking the presentation in the config
const enabledExplicitly = (nuxt.options.devtools === true as unknown)
|| (nuxt.options.devtools && (nuxt.options.devtools as unknown as ModuleOptions).enabled)
@@ -61,29 +64,9 @@ export async function enableModule(options: ModuleOptions, nuxt: Nuxt) {
mode: 'server',
})
- if (options.viteDevTools) {
- logger.info('[nuxt-devtools] Enabling experimental Vite DevTools integration')
- const DevTools = await import('@vitejs/devtools').then(r => r.DevTools())
- addVitePlugin(DevTools)
- addVitePlugin({
- name: 'nuxt:devtools',
- devtools: {
- setup(ctx) {
- ctx.docks.register({
- id: 'nuxt:devtools',
- type: 'iframe',
- icon: 'https://nuxt.com/assets/design-kit/icon-green.svg',
- title: 'Nuxt DevTools',
- url: '/__nuxt_devtools__/client/',
- })
- },
- },
- })
- addPlugin({
- src: join(runtimeDir, 'plugins/vite-devtools.client'),
- mode: 'client',
- })
- }
+ const viteDevToolsBridge = await setupViteDevToolsBridge(nuxt)
+ console.log({viteDevToolsBridge})
+ viteDevToolsBridge.plugins.forEach(plugin => addVitePlugin(plugin))
// Mainly for the injected runtime plugin to access the settings
// Usage `import settings from '#build/devtools/settings'`
@@ -93,13 +76,10 @@ export async function enableModule(options: ModuleOptions, nuxt: Nuxt) {
const uiOptions = await readLocalOptions(
{
...defaultTabOptions.ui,
- // When not enabled explicitly, we hide the panel by default
- // When Vite DevTools is enabled, we hide the panel by default
- showPanel: options.viteDevTools
- ? false
- : enabledExplicitly
- ? true
- : null,
+ // Legacy no-op option, retained for compatibility.
+ showPanel: enabledExplicitly
+ ? true
+ : null,
},
{ root: nuxt.options.rootDir },
)
@@ -138,6 +118,9 @@ window.__NUXT_DEVTOOLS_TIME_METRIC__.appInit = Date.now()
...ctx
} = setupRPC(nuxt, options)
+ const devtoolsCtx = ctx as any
+ devtoolsCtx.viteDevToolsBridge = viteDevToolsBridge.state
+
addVitePlugin(vitePlugin)
const clientDirExists = existsSync(clientDir)
@@ -163,7 +146,7 @@ window.__NUXT_DEVTOOLS_TIME_METRIC__.appInit = Date.now()
from: join(runtimeDir, 'use-nuxt-devtools'),
})
- const ROUTE_PATH = `${nuxt.options.app.baseURL || '/'}/__nuxt_devtools__`.replace(MULTIPLE_SLASHES_RE, '/')
+ const ROUTE_PATH = resolveNuxtDevToolsBaseRoute(nuxt.options.app.baseURL)
const ROUTE_CLIENT = `${ROUTE_PATH}/client`
const ROUTE_AUTH = `${ROUTE_PATH}/auth`
const ROUTE_AUTH_VERIFY = `${ROUTE_PATH}/auth-verify`
diff --git a/packages/devtools/src/runtime/plugins/devtools.client.ts b/packages/devtools/src/runtime/plugins/devtools.client.ts
index 974647c848..d7a4f1c5f2 100644
--- a/packages/devtools/src/runtime/plugins/devtools.client.ts
+++ b/packages/devtools/src/runtime/plugins/devtools.client.ts
@@ -17,7 +17,7 @@ export default defineNuxtPlugin((nuxt: any) => {
return
if (parent && window.self !== parent) {
- if (parent.__NUXT_DEVTOOLS_VIEW__ || parent.document.querySelector('#nuxt-devtools-container'))
+ if (parent.__NUXT_DEVTOOLS_VIEW__)
return
}
}
@@ -62,15 +62,5 @@ export default defineNuxtPlugin((nuxt: any) => {
timeMetric,
router,
})
-
- const isMac = typeof navigator !== 'undefined' && navigator.platform.toLowerCase().includes('mac')
-
- // eslint-disable-next-line no-console
- console.log(
- `✨ %cNuxt DevTools %c Press Shift + ${isMac ? 'Option' : 'Alt'} + D to open DevTools`,
- 'color: black; border-radius: 3px 0 0 3px; padding: 2px 2px 1px 10px; background: #00DC82',
- 'border-radius: 0 3px 3px 0; padding: 2px 10px 1px 2px; background: #00DC8220',
- '',
- )
})
})
diff --git a/packages/devtools/src/runtime/plugins/view/client.ts b/packages/devtools/src/runtime/plugins/view/client.ts
index f7691f4f49..f6e6e28a72 100644
--- a/packages/devtools/src/runtime/plugins/view/client.ts
+++ b/packages/devtools/src/runtime/plugins/view/client.ts
@@ -6,9 +6,8 @@ import type { Ref } from 'vue'
import type { Router } from 'vue-router'
// eslint-disable-next-line ts/ban-ts-comment
// @ts-ignore tsconfig
-import { useAppConfig, useRuntimeConfig } from '#imports'
-import { NuxtDevtoolsFrame, NuxtDevtoolsInspectPanel } from '@nuxt/devtools/webcomponents'
-import { setIframeServerContext } from '@vue/devtools-kit'
+import { useAppConfig } from '#imports'
+import { NuxtDevtoolsInspectPanel } from '@nuxt/devtools/webcomponents'
import { createHooks } from 'hookable'
import { debounce } from 'perfect-debounce'
@@ -16,10 +15,8 @@ import { events as inspectorEvents, hasData as inspectorHasData, state as inspec
import { computed, markRaw, nextTick, reactive, ref, shallowReactive, shallowRef, toRef, watch } from 'vue'
import { initTimelineMetrics } from '../../function-metrics-helpers'
-import { settings } from '../../settings'
-import { popupWindow, state } from './state'
-
-const MULTIPLE_SLASHES_RE = /\/+/g
+import { state } from './state'
+import { closeNuxtDock, findNuxtDockIframe, getViteDocksContext, isNuxtDockSelected, openNuxtDock, toggleNuxtDock, waitForViteDocksContext } from './vite-dock'
const clientRef = shallowRef()
@@ -53,33 +50,29 @@ export async function setupDevToolsClient({
syncClient,
devtools: {
- toggle() {
- if (state.value.open)
- client.devtools.close()
- else
- client.devtools.open()
+ async toggle() {
+ const docks = await waitForViteDocksContext()
+ if (!docks)
+ return
+ await toggleNuxtDock(docks)
+ state.value.open = isNuxtDockSelected(docks)
},
- close() {
- if (!state.value.open)
+ async close() {
+ const docks = getViteDocksContext()
+ if (!docks)
return
- state.value.open = false
- if (popupWindow.value) {
- try {
- popupWindow.value.close()
- }
- catch {
- }
- popupWindow.value = null
- }
+ await closeNuxtDock(docks)
+ state.value.open = isNuxtDockSelected(docks)
},
- open() {
- if (state.value.open)
+ async open() {
+ const docks = await waitForViteDocksContext()
+ if (!docks)
return
- state.value.open = true
+ await openNuxtDock(docks)
+ state.value.open = isNuxtDockSelected(docks)
},
async navigate(path: string) {
- if (!state.value.open)
- await client.devtools.open()
+ await client.devtools.open()
await client.hooks.callHook('host:action:navigate', path)
},
async reload() {
@@ -120,7 +113,7 @@ export async function setupDevToolsClient({
client.inspector = getInspectorInstance()
try {
- iframe?.contentWindow?.__NUXT_DEVTOOLS_VIEW__?.setClient(client)
+ getIframe()?.contentWindow?.__NUXT_DEVTOOLS_VIEW__?.setClient(client)
}
catch (e) {
// cross-origin
@@ -130,64 +123,10 @@ export async function setupDevToolsClient({
}
function getIframe() {
- if (!iframe) {
- const runtimeConfig = useRuntimeConfig()
- const CLIENT_BASE = '/__nuxt_devtools__/client'
- const CLIENT_PATH = `${runtimeConfig.app.baseURL.replace(CLIENT_BASE, '/')}${CLIENT_BASE}`.replace(MULTIPLE_SLASHES_RE, '/')
- const initialUrl = CLIENT_PATH + state.value.route
- iframe = document.createElement('iframe')
-
- // custom iframe props
- for (const [key, value] of Object.entries(runtimeConfig.app.devtools?.iframeProps || {}))
- iframe.setAttribute(key, String(value))
-
- iframe.id = 'nuxt-devtools-iframe'
- iframe.src = initialUrl
- iframe.onload = async () => {
- try {
- setIframeServerContext(iframe!)
- await waitForClientInjection()
- client.syncClient()
- }
- catch (e) {
- console.error('Nuxt DevTools client injection failed')
- console.error(e)
- }
- }
- }
-
+ iframe = findNuxtDockIframe() || iframe
return iframe
}
- function waitForClientInjection(retry = 20, timeout = 300) {
- let lastError: any
- const test = () => {
- try {
- return !!iframe?.contentWindow?.__NUXT_DEVTOOLS_VIEW__
- }
- catch (e) {
- lastError = e
- }
- return false
- }
-
- if (test())
- return
-
- return new Promise((resolve, reject) => {
- const interval = setInterval(() => {
- if (test()) {
- clearInterval(interval)
- resolve()
- }
- else if (retry-- <= 0) {
- clearInterval(interval)
- reject(lastError)
- }
- }, timeout)
- })
- }
-
function getInspectorInstance(): NuxtDevtoolsHostClient['inspector'] {
if (inspector)
return inspector
@@ -280,68 +219,16 @@ export async function setupDevToolsClient({
clientRef.value = client
- // Experimental: Picture-in-Picture mode
- // https://developer.chrome.com/docs/web-platform/document-picture-in-picture/
- const documentPictureInPicture = window.documentPictureInPicture
- if (documentPictureInPicture?.requestWindow) {
- client.devtools.popup = async () => {
- const iframe = getIframe()
- if (!iframe)
- return
- const pip = popupWindow.value = await documentPictureInPicture.requestWindow({
- width: Math.round(window.innerWidth * state.value.width / 100),
- height: Math.round(window.innerHeight * state.value.height / 100),
- }) as Window
- const style = pip.document.createElement('style')
- style.innerHTML = `
- body {
- margin: 0;
- padding: 0;
- }
- iframe {
- width: 100vw;
- height: 100vh;
- border: none;
- outline: none;
- }
- `
- pip.__NUXT_DEVTOOLS_DISABLE__ = true
- pip.__NUXT_DEVTOOLS_IS_POPUP__ = true
- // eslint-disable-next-line ts/ban-ts-comment
- // @ts-ignore Missing types
- pip.__NUXT__ = window.parent?.__NUXT__ || window.__NUXT__
- pip.document.title = 'Nuxt DevTools'
- pip.document.head.appendChild(style)
- pip.document.body.appendChild(iframe)
- pip.addEventListener('resize', () => {
- state.value.width = Math.round(pip.innerWidth / window.innerWidth * 100)
- state.value.height = Math.round(pip.innerHeight / window.innerHeight * 100)
- })
- pip.addEventListener('pagehide', () => {
- popupWindow.value = null
- pip.close()
- })
- }
- }
-
- const holder = document.createElement('div')
- holder.id = 'nuxt-devtools-container'
- holder.setAttribute('data-v-inspector-ignore', 'true')
- document.body.appendChild(holder)
+ state.value.open = isNuxtDockSelected(getViteDocksContext())
+ waitForViteDocksContext().then((docks) => {
+ state.value.open = isNuxtDockSelected(docks)
+ }).catch(() => {})
// Shortcut to toggle devtools
window.addEventListener('keydown', (e) => {
if (e.code === 'KeyD' && e.altKey && e.shiftKey)
- client.devtools.toggle()
+ void client.devtools.toggle()
})
-
- const frame = new NuxtDevtoolsFrame(reactive({
- client,
- settings,
- state,
- popupWindow,
- }))
- holder.appendChild(frame)
}
export function useClientColorMode(): Ref {
diff --git a/packages/devtools/src/runtime/plugins/view/state.ts b/packages/devtools/src/runtime/plugins/view/state.ts
index 7adca676c4..9972964665 100644
--- a/packages/devtools/src/runtime/plugins/view/state.ts
+++ b/packages/devtools/src/runtime/plugins/view/state.ts
@@ -1,9 +1,6 @@
import type { DevToolsFrameState } from '@nuxt/devtools/types'
-import { shallowRef } from 'vue'
import { useObjectStorage } from './utils'
-export const popupWindow = shallowRef(null)
-
export const state = useObjectStorage('nuxt-devtools-frame-state', {
width: 80,
height: 60,
diff --git a/packages/devtools/src/runtime/plugins/view/vite-dock.test.ts b/packages/devtools/src/runtime/plugins/view/vite-dock.test.ts
new file mode 100644
index 0000000000..b841f85135
--- /dev/null
+++ b/packages/devtools/src/runtime/plugins/view/vite-dock.test.ts
@@ -0,0 +1,83 @@
+import { afterEach, describe, expect, it, vi } from 'vitest'
+import { NUXT_DOCK_ID } from '../../../integrations/vite-devtools'
+import { closeNuxtDock, findNuxtDockIframe, getViteDocksContext, isNuxtDockSelected, openNuxtDock, toggleNuxtDock, waitForViteDocksContext } from './vite-dock'
+
+describe('vite dock adapter', () => {
+ afterEach(() => {
+ vi.unstubAllGlobals()
+ })
+
+ it('opens and toggles Nuxt dock via context methods', async () => {
+ const docks = {
+ selectedId: null as string | null,
+ switchEntry: vi.fn(async (id?: string | null) => {
+ docks.selectedId = id ?? null
+ return true
+ }),
+ toggleEntry: vi.fn(async (id: string) => {
+ docks.selectedId = docks.selectedId === id ? null : id
+ return true
+ }),
+ }
+
+ await openNuxtDock(docks)
+ expect(docks.switchEntry).toHaveBeenCalledWith(NUXT_DOCK_ID)
+ expect(isNuxtDockSelected(docks)).toBe(true)
+
+ await toggleNuxtDock(docks)
+ expect(docks.toggleEntry).toHaveBeenCalledWith(NUXT_DOCK_ID)
+ expect(isNuxtDockSelected(docks)).toBe(false)
+ })
+
+ it('closes only when Nuxt dock is selected', async () => {
+ const docks = {
+ selectedId: 'other:dock',
+ switchEntry: vi.fn(async () => true),
+ toggleEntry: vi.fn(async () => true),
+ }
+
+ await closeNuxtDock(docks)
+ expect(docks.switchEntry).not.toHaveBeenCalled()
+
+ docks.selectedId = NUXT_DOCK_ID
+ await closeNuxtDock(docks)
+ expect(docks.switchEntry).toHaveBeenCalledWith(null)
+ })
+
+ it('reads dock context from embedded element', async () => {
+ const docks = {
+ selectedId: null as string | null,
+ switchEntry: vi.fn(async () => true),
+ toggleEntry: vi.fn(async () => true),
+ }
+ vi.stubGlobal('document', {
+ querySelector: vi.fn(() => ({ context: { docks } })),
+ })
+
+ expect(getViteDocksContext()).toBe(docks)
+ expect(await waitForViteDocksContext(1, 1)).toBe(docks)
+ })
+
+ it('returns undefined if dock context is unavailable', async () => {
+ vi.stubGlobal('document', {
+ querySelector: vi.fn(() => null),
+ })
+ expect(getViteDocksContext()).toBeUndefined()
+ expect(await waitForViteDocksContext(1, 1)).toBeUndefined()
+ })
+
+ it('finds Nuxt dock iframe from Vite dock shadow root', () => {
+ const iframe = {
+ src: 'http://localhost:3000/foo/__nuxt_devtools__/client/',
+ } as HTMLIFrameElement
+ vi.stubGlobal('document', {
+ querySelector: vi.fn(() => ({
+ shadowRoot: {
+ querySelectorAll: () => [iframe],
+ },
+ })),
+ })
+
+ expect(findNuxtDockIframe()).toBe(iframe)
+ })
+})
diff --git a/packages/devtools/src/runtime/plugins/view/vite-dock.ts b/packages/devtools/src/runtime/plugins/view/vite-dock.ts
new file mode 100644
index 0000000000..1e8d9d728c
--- /dev/null
+++ b/packages/devtools/src/runtime/plugins/view/vite-dock.ts
@@ -0,0 +1,58 @@
+const NUXT_DOCK_ID = 'nuxt:devtools'
+const VITE_DOCK_EMBEDDED_TAG = 'vite-devtools-dock-embedded'
+
+export interface ViteDockHost {
+ selected?: { id?: string | null } | null
+ selectedId?: string | null
+ switchEntry: (id?: string | null) => Promise | boolean
+ toggleEntry: (id: string) => Promise | boolean
+}
+
+export function getViteDocksContext() {
+ const dock = document.querySelector(VITE_DOCK_EMBEDDED_TAG)
+ const docks = dock?.context?.docks
+ if (!docks)
+ return undefined
+ if (typeof docks.switchEntry !== 'function' || typeof docks.toggleEntry !== 'function')
+ return undefined
+ return docks
+}
+
+export async function waitForViteDocksContext(retry = 40, timeout = 50): Promise {
+ while (retry-- > 0) {
+ const docks = getViteDocksContext()
+ if (docks)
+ return docks
+ await new Promise(resolve => setTimeout(resolve, timeout))
+ }
+ return undefined
+}
+
+export function isNuxtDockSelected(docks: ViteDockHost | undefined) {
+ if (!docks)
+ return false
+ return docks.selected?.id === NUXT_DOCK_ID || docks.selectedId === NUXT_DOCK_ID
+}
+
+export async function openNuxtDock(docks: ViteDockHost) {
+ await docks.switchEntry(NUXT_DOCK_ID)
+}
+
+export async function closeNuxtDock(docks: ViteDockHost) {
+ if (!isNuxtDockSelected(docks))
+ return
+ await docks.switchEntry(null)
+}
+
+export async function toggleNuxtDock(docks: ViteDockHost) {
+ await docks.toggleEntry(NUXT_DOCK_ID)
+}
+
+export function findNuxtDockIframe() {
+ const dock = document.querySelector(VITE_DOCK_EMBEDDED_TAG)
+ const root = dock?.shadowRoot
+ if (!root)
+ return undefined
+ return [...root.querySelectorAll('iframe')]
+ .find(iframe => iframe.src.includes('/__nuxt_devtools__/client'))
+}
diff --git a/packages/devtools/src/runtime/plugins/vite-devtools.client.ts b/packages/devtools/src/runtime/plugins/vite-devtools.client.ts
deleted file mode 100644
index 2d88561e36..0000000000
--- a/packages/devtools/src/runtime/plugins/vite-devtools.client.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { defineNuxtPlugin } from '#imports'
-
-export default defineNuxtPlugin(() => {
- import('@vitejs/devtools/client/inject')
-})
diff --git a/playgrounds/module-starter/test/basic.test.js b/playgrounds/module-starter/test/basic.test.js
new file mode 100644
index 0000000000..a9f092b45b
--- /dev/null
+++ b/playgrounds/module-starter/test/basic.test.js
@@ -0,0 +1,41 @@
+import { fileURLToPath } from 'node:url'
+import { $fetch, setup } from '@nuxt/test-utils'
+import { describe, expect, it, vi } from 'vitest'
+import { setupDevToolsUI } from '../src/devtools'
+
+describe('ssr', async () => {
+ await setup({
+ rootDir: fileURLToPath(new URL('./fixtures/basic', import.meta.url)),
+ })
+
+ it('renders the index page', async () => {
+ // Get response to a server-rendered page with `$fetch`.
+ const html = await $fetch('/')
+ expect(html).toContain('basic
')
+ })
+})
+
+it('keeps module custom tab contribution contract', () => {
+ const hooks = new Map()
+ const nuxt = {
+ hook: vi.fn((name, fn) => hooks.set(name, fn)),
+ }
+ const resolver = {
+ resolve: vi.fn((path = '.') => fileURLToPath(new URL(path, import.meta.url))),
+ }
+
+ setupDevToolsUI(nuxt, resolver)
+
+ const tabs = []
+ hooks.get('devtools:customTabs')?.(tabs)
+
+ expect(tabs).toContainEqual({
+ name: 'my-module',
+ title: 'My Module',
+ icon: 'carbon:apps',
+ view: {
+ type: 'iframe',
+ src: '/__my-module',
+ },
+ })
+})
diff --git a/playgrounds/module-starter/test/basic.test.ts b/playgrounds/module-starter/test/basic.test.ts
deleted file mode 100644
index 43de88977d..0000000000
--- a/playgrounds/module-starter/test/basic.test.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { fileURLToPath } from 'node:url'
-import { $fetch, setup } from '@nuxt/test-utils'
-import { describe, expect, it } from 'vitest'
-
-describe('ssr', async () => {
- await setup({
- rootDir: fileURLToPath(new URL('./fixtures/basic', import.meta.url)),
- })
-
- it('renders the index page', async () => {
- // Get response to a server-rendered page with `$fetch`.
- const html = await $fetch('/')
- expect(html).toContain('basic
')
- })
-})
diff --git a/playgrounds/module-starter/tsconfig.json b/playgrounds/module-starter/tsconfig.json
index dbe438dccd..4082f16a5d 100644
--- a/playgrounds/module-starter/tsconfig.json
+++ b/playgrounds/module-starter/tsconfig.json
@@ -1,3 +1,3 @@
{
- "extends": "./client/.nuxt/tsconfig.json"
+ "extends": "../../tsconfig.json"
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9535af0d62..d008d33379 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -516,6 +516,9 @@ importers:
'@nuxt/kit':
specifier: catalog:prod
version: 4.3.1(magicast@0.5.2)
+ '@vitejs/devtools':
+ specifier: catalog:buildtools
+ version: 0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3))
'@vue/devtools-core':
specifier: catalog:frontend
version: 8.0.7(vue@3.5.29(typescript@5.9.3))
@@ -593,7 +596,7 @@ importers:
version: 0.2.15
vite:
specifier: ^8.0.0-beta.16
- version: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ version: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
vite-plugin-inspect:
specifier: catalog:prod
version: 11.3.3(@nuxt/kit@4.3.1(magicast@0.5.2))(vite@8.0.0-beta.16)
@@ -661,9 +664,6 @@ importers:
'@unocss/runtime':
specifier: catalog:frontend
version: 66.6.6
- '@vitejs/devtools':
- specifier: catalog:buildtools
- version: 0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3))
'@vitest/ui':
specifier: catalog:cli
version: 4.0.18(vitest@4.0.18)
@@ -771,7 +771,7 @@ importers:
version: 8.0.1
vite:
specifier: ^8.0.0-beta.16
- version: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ version: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
devDependencies:
'@nuxt/schema':
specifier: catalog:types
@@ -946,7 +946,7 @@ importers:
version: 4.3.1(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(@vue/compiler-sfc@3.5.29)(cac@6.7.14)(db0@0.3.4)(eslint@10.0.3(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(rolldown@1.0.0-rc.6)(rollup@4.59.0)(terser@5.39.0)(tsx@4.21.0)(typescript@5.9.3)(vue-tsc@3.2.5(typescript@5.9.3))(yaml@2.8.2)
vitest:
specifier: catalog:cli
- version: 4.0.18(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(@vitest/ui@4.0.18)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ version: 4.0.18(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(@vitest/ui@4.0.18)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
playgrounds/module-starter/client: {}
@@ -9628,7 +9628,7 @@ snapshots:
dependencies:
'@nuxt/kit': 3.21.1(magicast@0.5.2)
execa: 8.0.1
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- magicast
@@ -9636,7 +9636,7 @@ snapshots:
dependencies:
'@nuxt/kit': 4.3.1(magicast@0.5.2)
execa: 8.0.1
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- magicast
@@ -9960,7 +9960,7 @@ snapshots:
vue: 3.5.29(typescript@5.9.3)
optionalDependencies:
'@vitest/ui': 4.0.18(vitest@4.0.18)
- vitest: 4.0.18(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(@vitest/ui@4.0.18)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vitest: 4.0.18(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(@vitest/ui@4.0.18)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- crossws
- magicast
@@ -9971,8 +9971,8 @@ snapshots:
dependencies:
'@nuxt/kit': 4.3.1(magicast@0.5.2)
'@rollup/plugin-replace': 6.0.3(rollup@4.59.0)
- '@vitejs/plugin-vue': 6.0.4(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3))
- '@vitejs/plugin-vue-jsx': 5.1.4(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3))
+ '@vitejs/plugin-vue': 6.0.4(vite@8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))
+ '@vitejs/plugin-vue-jsx': 5.1.4(vite@8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))
autoprefixer: 10.4.24(postcss@8.5.6)
consola: 3.4.2
cssnano: 7.1.2(postcss@8.5.6)
@@ -9995,9 +9995,9 @@ snapshots:
std-env: 3.10.0
ufo: 1.6.3
unenv: 2.0.0-rc.24
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
- vite-node: 5.3.0(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
- vite-plugin-checker: 0.12.0(eslint@10.0.3(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue-tsc@3.2.5(typescript@5.9.3))
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite-node: 5.3.0(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite-plugin-checker: 0.12.0(eslint@10.0.3(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.5(typescript@5.9.3))
vue: 3.5.29(typescript@5.9.3)
vue-bundle-renderer: 2.2.0
optionalDependencies:
@@ -10031,8 +10031,8 @@ snapshots:
dependencies:
'@nuxt/kit': 4.3.1(magicast@0.5.2)
'@rollup/plugin-replace': 6.0.3(rollup@4.59.0)
- '@vitejs/plugin-vue': 6.0.4(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3))
- '@vitejs/plugin-vue-jsx': 5.1.4(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3))
+ '@vitejs/plugin-vue': 6.0.4(vite@8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))
+ '@vitejs/plugin-vue-jsx': 5.1.4(vite@8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))
autoprefixer: 10.4.24(postcss@8.5.6)
consola: 3.4.2
cssnano: 7.1.2(postcss@8.5.6)
@@ -10055,9 +10055,9 @@ snapshots:
std-env: 3.10.0
ufo: 1.6.3
unenv: 2.0.0-rc.24
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
- vite-node: 5.3.0(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
- vite-plugin-checker: 0.12.0(eslint@10.0.3(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue-tsc@3.2.5(typescript@5.9.3))
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite-node: 5.3.0(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite-plugin-checker: 0.12.0(eslint@10.0.3(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.5(typescript@5.9.3))
vue: 3.5.29(typescript@5.9.3)
vue-bundle-renderer: 2.2.0
optionalDependencies:
@@ -11256,7 +11256,7 @@ snapshots:
pathe: 2.0.3
tinyglobby: 0.2.15
unplugin-utils: 0.3.1
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
'@unocss/webpack@66.6.6(webpack@5.98.0(esbuild@0.27.3))':
dependencies:
@@ -11355,7 +11355,7 @@ snapshots:
'@vitejs/devtools-rpc': 0.0.0-alpha.33(typescript@5.9.3)(ws@8.19.0)
birpc: 4.0.0
immer: 11.1.4
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- typescript
- ws
@@ -11444,7 +11444,7 @@ snapshots:
perfect-debounce: 2.1.0
sirv: 3.0.2
tinyexec: 1.0.2
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
ws: 8.19.0
transitivePeerDependencies:
- '@azure/app-configuration'
@@ -11472,22 +11472,22 @@ snapshots:
- utf-8-validate
- vue
- '@vitejs/plugin-vue-jsx@5.1.4(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3))':
+ '@vitejs/plugin-vue-jsx@5.1.4(vite@8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))':
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0)
'@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0)
'@rolldown/pluginutils': 1.0.0-rc.6
'@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0)
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
vue: 3.5.29(typescript@5.9.3)
transitivePeerDependencies:
- supports-color
- '@vitejs/plugin-vue@6.0.4(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3))':
+ '@vitejs/plugin-vue@6.0.4(vite@8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))':
dependencies:
'@rolldown/pluginutils': 1.0.0-rc.2
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
vue: 3.5.29(typescript@5.9.3)
'@vitest/eslint-plugin@1.6.9(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18)':
@@ -11497,7 +11497,7 @@ snapshots:
eslint: 10.0.3(jiti@2.6.1)
optionalDependencies:
typescript: 5.9.3
- vitest: 4.0.18(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(@vitest/ui@4.0.18)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vitest: 4.0.18(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(@vitest/ui@4.0.18)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- supports-color
@@ -11516,7 +11516,7 @@ snapshots:
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
'@vitest/pretty-format@4.0.18':
dependencies:
@@ -11544,7 +11544,7 @@ snapshots:
sirv: 3.0.2
tinyglobby: 0.2.15
tinyrainbow: 3.0.3
- vitest: 4.0.18(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(@vitest/ui@4.0.18)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vitest: 4.0.18(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(@vitest/ui@4.0.18)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
'@vitest/utils@4.0.18':
dependencies:
@@ -16997,7 +16997,7 @@ snapshots:
markdown-exit: 1.0.0-beta.9
unplugin: 2.3.11
unplugin-utils: 0.3.1
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
unplugin-vue-router@0.19.2(@vue/compiler-sfc@3.5.29)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)):
dependencies:
@@ -17031,7 +17031,7 @@ snapshots:
'@vue/reactivity': 3.5.29
obug: 2.1.1
unplugin: 3.0.0
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
vue: 3.5.29(typescript@5.9.3)
transitivePeerDependencies:
- '@types/node'
@@ -17240,20 +17240,20 @@ snapshots:
vite-dev-rpc@1.1.0(vite@8.0.0-beta.16):
dependencies:
birpc: 2.8.0
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
vite-hot-client: 2.1.0(vite@8.0.0-beta.16)
vite-hot-client@2.1.0(vite@8.0.0-beta.16):
dependencies:
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
- vite-node@5.3.0(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2):
+ vite-node@5.3.0(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2):
dependencies:
cac: 6.7.14
es-module-lexer: 2.0.0
obug: 2.1.1
pathe: 2.0.3
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- '@types/node'
- '@vitejs/devtools'
@@ -17268,7 +17268,7 @@ snapshots:
- tsx
- yaml
- vite-plugin-checker@0.12.0(eslint@10.0.3(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue-tsc@3.2.5(typescript@5.9.3)):
+ vite-plugin-checker@0.12.0(eslint@10.0.3(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.5(typescript@5.9.3)):
dependencies:
'@babel/code-frame': 7.29.0
chokidar: 5.0.0
@@ -17277,7 +17277,7 @@ snapshots:
picomatch: 4.0.3
tiny-invariant: 1.3.3
tinyglobby: 0.2.15
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
vscode-uri: 3.1.0
optionalDependencies:
eslint: 10.0.3(jiti@2.6.1)
@@ -17296,7 +17296,7 @@ snapshots:
perfect-debounce: 2.1.0
sirv: 3.0.2
unplugin-utils: 0.3.1
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
vite-dev-rpc: 1.1.0(vite@8.0.0-beta.16)
optionalDependencies:
'@nuxt/kit': 4.3.1(magicast@0.5.2)
@@ -17310,10 +17310,10 @@ snapshots:
magic-string: 0.30.21
pathe: 2.0.3
source-map-js: 1.2.1
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
vue: 3.5.29(typescript@5.9.3)
- vite@8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2):
+ vite@8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2):
dependencies:
'@oxc-project/runtime': 0.115.0
lightningcss: 1.32.0
@@ -17350,7 +17350,7 @@ snapshots:
- vite
- vitest
- vitest@4.0.18(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(@vitest/ui@4.0.18)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2):
+ vitest@4.0.18(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(@vitest/ui@4.0.18)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2):
dependencies:
'@vitest/expect': 4.0.18
'@vitest/mocker': 4.0.18(vite@8.0.0-beta.16)
@@ -17370,7 +17370,7 @@ snapshots:
tinyexec: 1.0.2
tinyglobby: 0.2.15
tinyrainbow: 3.0.3
- vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 8.0.0-beta.16(@types/node@25.3.5)(@vitejs/devtools@0.0.0-alpha.33(@netlify/blobs@9.1.2)(@pnpm/logger@1001.0.1)(db0@0.3.4)(ioredis@5.9.2)(typescript@5.9.3)(vite@8.0.0-beta.16)(vue@3.5.29(typescript@5.9.3)))(esbuild@0.27.3)(jiti@2.6.1)(terser@5.39.0)(tsx@4.21.0)(yaml@2.8.2)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 25.3.5