diff --git a/.gitignore b/.gitignore index 81713ca5..677c1668 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ packages/kit/skills *.tsbuildinfo docs/.vitepress/cache .turbo +.context diff --git a/alias.ts b/alias.ts index 109a0d10..0a0fcb63 100644 --- a/alias.ts +++ b/alias.ts @@ -19,6 +19,7 @@ export const alias = { '@vitejs/devtools-kit/utils/shared-state': r('kit/src/utils/shared-state.ts'), '@vitejs/devtools-kit': r('kit/src/index.ts'), '@vitejs/devtools-rolldown': r('rolldown/src/index.ts'), + '@vitejs/devtools-self-inspect': r('self-inspect/src/index.ts'), '@vitejs/devtools/client/inject': r('core/src/client/inject/index.ts'), '@vitejs/devtools/client/webcomponents': r('core/src/client/webcomponents/index.ts'), '@vitejs/devtools': r('core/src/index.ts'), diff --git a/docs/kit/devtools-plugin.md b/docs/kit/devtools-plugin.md index 34c9061a..671898f8 100644 --- a/docs/kit/devtools-plugin.md +++ b/docs/kit/devtools-plugin.md @@ -210,6 +210,28 @@ export default function myAnalyzerPlugin(): Plugin { } ``` +## Debugging with Self Inspect + +When developing or debugging a DevTools plugin, you can install `@vitejs/devtools-self-inspect` to get a live view of all registered RPC functions, dock entries, client scripts, and DevTools-enabled plugins: + +```bash +pnpm add -D @vitejs/devtools-self-inspect +``` + +```ts [vite.config.ts] +import { DevToolsSelfInspect } from '@vitejs/devtools-self-inspect' + +export default defineConfig({ + plugins: [ + DevTools(), + DevToolsSelfInspect(), + // ...your plugins + ], +}) +``` + +This adds a "Self Inspect" panel to DevTools that shows the internal state of the DevTools system — helpful for verifying that your plugin's RPC functions, docks, and client scripts are registered correctly. + ## Next Steps - **[Dock System](./dock-system)** - Learn about different dock entry types (iframe, action, custom renderer) diff --git a/packages/core/playground/vite.config.ts b/packages/core/playground/vite.config.ts index 4143a093..1af8b7c8 100644 --- a/packages/core/playground/vite.config.ts +++ b/packages/core/playground/vite.config.ts @@ -5,11 +5,12 @@ import VueRouter from 'unplugin-vue-router/vite' import { defineConfig } from 'vite' import Tracer from 'vite-plugin-vue-tracer' import { alias } from '../../../alias' +import { DevTools } from '../../core/src' +import { buildCSS } from '../../core/src/client/webcomponents/scripts/build-css' // eslint-disable-next-line ts/ban-ts-comment // @ts-ignore ignore the type error import { DevToolsRolldownUI } from '../../rolldown/src/node' -import { DevTools } from '../src' -import { buildCSS } from '../src/client/webcomponents/scripts/build-css' +import { DevToolsSelfInspect } from '../../self-inspect/src/node' declare module '@vitejs/devtools-kit' { interface DevToolsRpcSharedStates { @@ -29,6 +30,7 @@ export default defineConfig({ plugins: [ VueRouter(), Vue(), + DevToolsSelfInspect(), { name: 'build-css', handleHotUpdate({ file }) { diff --git a/packages/self-inspect/README.md b/packages/self-inspect/README.md new file mode 100644 index 00000000..93a88472 --- /dev/null +++ b/packages/self-inspect/README.md @@ -0,0 +1,36 @@ +# @vitejs/devtools-self-inspect + +A Vite DevTools plugin for inspecting the DevTools itself. Useful when developing or debugging DevTools plugins built with `@vitejs/devtools-kit`. + +## Features + +- List all registered RPC functions with their metadata (type, schema, cacheability, etc.) +- List all registered dock entries +- List all registered client scripts +- List all Vite plugins with DevTools support and their capabilities + +## Installation + +```bash +pnpm add -D @vitejs/devtools-self-inspect +``` + +## Usage + +Add the plugin to your Vite config: + +```ts +import DevTools from '@vitejs/devtools' +import { DevToolsSelfInspect } from '@vitejs/devtools-self-inspect' +// vite.config.ts +import { defineConfig } from 'vite' + +export default defineConfig({ + plugins: [ + DevTools(), + DevToolsSelfInspect(), + ], +}) +``` + +A "Self Inspect" panel will appear in the DevTools dock, giving you a live view of the registered RPC functions, docks, client scripts, and DevTools-enabled plugins. diff --git a/packages/self-inspect/package.json b/packages/self-inspect/package.json new file mode 100644 index 00000000..ec2f8c19 --- /dev/null +++ b/packages/self-inspect/package.json @@ -0,0 +1,49 @@ +{ + "name": "@vitejs/devtools-self-inspect", + "type": "module", + "version": "0.0.0-alpha.34", + "description": "DevTools for inspecting the DevTools itself", + "author": "VoidZero Inc.", + "license": "MIT", + "homepage": "https://github.com/vitejs/devtools#readme", + "repository": { + "directory": "packages/self-inspect", + "type": "git", + "url": "git+https://github.com/vitejs/devtools.git" + }, + "bugs": "https://github.com/vitejs/devtools/issues", + "keywords": [ + "devtools", + "self-inspect" + ], + "sideEffects": false, + "exports": { + ".": "./dist/index.mjs", + "./package.json": "./package.json" + }, + "types": "./dist/index.d.mts", + "files": [ + "dist" + ], + "scripts": { + "build": "pnpm dev:prepare && nuxi build src && tsdown", + "dev": "nuxi dev src", + "dev:prepare": "nuxi prepare src", + "prepack": "pnpm build" + }, + "dependencies": { + "@vitejs/devtools-kit": "workspace:*", + "@vitejs/devtools-rpc": "workspace:*", + "birpc": "catalog:deps", + "pathe": "catalog:deps" + }, + "devDependencies": { + "@unocss/nuxt": "catalog:build", + "@vueuse/core": "catalog:frontend", + "@vueuse/nuxt": "catalog:build", + "structured-clone-es": "catalog:deps", + "tsdown": "catalog:build", + "unocss": "catalog:build", + "vite-hot-client": "catalog:frontend" + } +} diff --git a/packages/self-inspect/src/app/app.vue b/packages/self-inspect/src/app/app.vue new file mode 100644 index 00000000..70706e41 --- /dev/null +++ b/packages/self-inspect/src/app/app.vue @@ -0,0 +1,73 @@ + + + diff --git a/packages/self-inspect/src/app/components/ClientScriptsList.vue b/packages/self-inspect/src/app/components/ClientScriptsList.vue new file mode 100644 index 00000000..f4336181 --- /dev/null +++ b/packages/self-inspect/src/app/components/ClientScriptsList.vue @@ -0,0 +1,78 @@ + + + diff --git a/packages/self-inspect/src/app/components/DevtoolsPluginsList.vue b/packages/self-inspect/src/app/components/DevtoolsPluginsList.vue new file mode 100644 index 00000000..61d8f8f6 --- /dev/null +++ b/packages/self-inspect/src/app/components/DevtoolsPluginsList.vue @@ -0,0 +1,77 @@ + + + diff --git a/packages/self-inspect/src/app/components/DocksList.vue b/packages/self-inspect/src/app/components/DocksList.vue new file mode 100644 index 00000000..b0f7b927 --- /dev/null +++ b/packages/self-inspect/src/app/components/DocksList.vue @@ -0,0 +1,87 @@ + + + diff --git a/packages/self-inspect/src/app/components/RpcFunctionsList.vue b/packages/self-inspect/src/app/components/RpcFunctionsList.vue new file mode 100644 index 00000000..186a88e5 --- /dev/null +++ b/packages/self-inspect/src/app/components/RpcFunctionsList.vue @@ -0,0 +1,134 @@ + + + diff --git a/packages/self-inspect/src/app/composables/refresh.ts b/packages/self-inspect/src/app/composables/refresh.ts new file mode 100644 index 00000000..841d7aac --- /dev/null +++ b/packages/self-inspect/src/app/composables/refresh.ts @@ -0,0 +1,27 @@ +import { onScopeDispose, ref, shallowRef } from 'vue' + +const refreshFn = shallowRef<(() => Promise) | null>(null) +const loading = ref(false) + +export function useRefreshProvider(fn: () => Promise) { + refreshFn.value = fn + onScopeDispose(() => { + refreshFn.value = null + }) +} + +export function useRefresh() { + async function refresh() { + if (!refreshFn.value || loading.value) + return + loading.value = true + try { + await refreshFn.value() + } + finally { + loading.value = false + } + } + + return { refresh, loading } +} diff --git a/packages/self-inspect/src/app/composables/rpc.ts b/packages/self-inspect/src/app/composables/rpc.ts new file mode 100644 index 00000000..47feb0da --- /dev/null +++ b/packages/self-inspect/src/app/composables/rpc.ts @@ -0,0 +1,60 @@ +import type {} from '@vitejs/devtools' +import type { DevToolsRpcClient } from '@vitejs/devtools-kit/client' +import type {} from '../../node/rpc' +import { useRuntimeConfig } from '#app/nuxt' +import { getDevToolsRpcClient } from '@vitejs/devtools-kit/client' +import { DEVTOOLS_MOUNT_PATH } from '@vitejs/devtools-kit/constants' +import { reactive, shallowRef } from 'vue' + +export const connectionState = reactive<{ + connected: boolean + error: Error | null +}>({ + connected: false, + error: null, +}) + +const rpc = shallowRef(undefined!) + +export async function connect() { + const runtimeConfig = useRuntimeConfig() + try { + rpc.value = await getDevToolsRpcClient({ + baseURL: [ + DEVTOOLS_MOUNT_PATH, + runtimeConfig.app.baseURL, + ], + connectionMeta: runtimeConfig.app.connection, + wsOptions: { + onConnected: () => { + connectionState.connected = true + }, + onError: (e) => { + connectionState.error = e + }, + onDisconnected: () => { + connectionState.connected = false + }, + }, + rpcOptions: { + onGeneralError: (e, name) => { + connectionState.error = e + console.error(`[self-inspect] RPC error on executing "${name}":`, e) + }, + onFunctionError: (e, name) => { + connectionState.error = e + console.error(`[self-inspect] RPC error on executing "${name}":`, e) + }, + }, + }) + + connectionState.connected = true + } + catch (e) { + connectionState.error = e as Error + } +} + +export function useRpc() { + return rpc +} diff --git a/packages/self-inspect/src/app/pages/docks.vue b/packages/self-inspect/src/app/pages/docks.vue new file mode 100644 index 00000000..0670cb48 --- /dev/null +++ b/packages/self-inspect/src/app/pages/docks.vue @@ -0,0 +1,21 @@ + + + diff --git a/packages/self-inspect/src/app/pages/index.vue b/packages/self-inspect/src/app/pages/index.vue new file mode 100644 index 00000000..42d3976b --- /dev/null +++ b/packages/self-inspect/src/app/pages/index.vue @@ -0,0 +1,5 @@ + diff --git a/packages/self-inspect/src/app/pages/plugins.vue b/packages/self-inspect/src/app/pages/plugins.vue new file mode 100644 index 00000000..cb3b5ad2 --- /dev/null +++ b/packages/self-inspect/src/app/pages/plugins.vue @@ -0,0 +1,21 @@ + + + diff --git a/packages/self-inspect/src/app/pages/rpc.vue b/packages/self-inspect/src/app/pages/rpc.vue new file mode 100644 index 00000000..57db2ad4 --- /dev/null +++ b/packages/self-inspect/src/app/pages/rpc.vue @@ -0,0 +1,31 @@ + + + diff --git a/packages/self-inspect/src/app/pages/scripts.vue b/packages/self-inspect/src/app/pages/scripts.vue new file mode 100644 index 00000000..18c793fb --- /dev/null +++ b/packages/self-inspect/src/app/pages/scripts.vue @@ -0,0 +1,21 @@ + + + diff --git a/packages/self-inspect/src/app/styles/global.css b/packages/self-inspect/src/app/styles/global.css new file mode 100644 index 00000000..11ccea94 --- /dev/null +++ b/packages/self-inspect/src/app/styles/global.css @@ -0,0 +1,52 @@ +html, body , #__nuxt{ + height: 100vh; + margin: 0; + padding: 0; +} + +:root { + --app-scrollbar-size: 6px; + --app-scrollbar-radius: 1px; + --app-scrollbar-thumb: #8884; + --app-scrollbar-thumb-hover: #8885; +} + +html { + --uno: bg-base font-sans; + color-scheme: light; +} +html.dark { + color-scheme: dark; + background-color: #121212; +} +body { + --uno: color-base; +} + +/* For Scrollbar */ +::-webkit-scrollbar { + width: var(--app-scrollbar-size); +} + +::-webkit-scrollbar:horizontal { + height: var(--app-scrollbar-size); +} + +::-webkit-scrollbar-corner { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background-color: var(--app-scrollbar-thumb); + transition: background 0.2s ease; + border-radius: var(--app-scrollbar-radius); +} + +::-webkit-scrollbar-thumb:hover { + background-color: var(--app-scrollbar-thumb-hover); +} + +::-webkit-scrollbar-track { + border-radius: var(--app-scrollbar-radius); + background: transparent; +} diff --git a/packages/self-inspect/src/dirs.ts b/packages/self-inspect/src/dirs.ts new file mode 100644 index 00000000..e73398c2 --- /dev/null +++ b/packages/self-inspect/src/dirs.ts @@ -0,0 +1,3 @@ +import { fileURLToPath } from 'node:url' + +export const clientPublicDir: string = fileURLToPath(new URL('../dist/public', import.meta.url)) diff --git a/packages/self-inspect/src/index.ts b/packages/self-inspect/src/index.ts new file mode 100644 index 00000000..46f1036d --- /dev/null +++ b/packages/self-inspect/src/index.ts @@ -0,0 +1,2 @@ +export * from './node/index' +export * from './node/plugin' diff --git a/packages/self-inspect/src/modules/rpc.ts b/packages/self-inspect/src/modules/rpc.ts new file mode 100644 index 00000000..a7ff3797 --- /dev/null +++ b/packages/self-inspect/src/modules/rpc.ts @@ -0,0 +1,24 @@ +import { addVitePlugin, defineNuxtModule } from '@nuxt/kit' +import { DevToolsServer } from '../../../core/src/node/plugins/server' +import { rpcFunctions } from '../node/rpc' + +export default defineNuxtModule({ + meta: { + name: 'devtools-rpc', + configKey: 'devtoolsRpc', + }, + setup() { + addVitePlugin({ + name: 'vite:devtools:self-inspect', + devtools: { + setup(ctx) { + for (const fn of rpcFunctions) { + ctx.rpc.register(fn) + } + }, + }, + }) + + addVitePlugin(DevToolsServer()) + }, +}) diff --git a/packages/self-inspect/src/node/index.ts b/packages/self-inspect/src/node/index.ts new file mode 100644 index 00000000..69b561c5 --- /dev/null +++ b/packages/self-inspect/src/node/index.ts @@ -0,0 +1 @@ +export { DevToolsSelfInspect } from './plugin' diff --git a/packages/self-inspect/src/node/plugin.ts b/packages/self-inspect/src/node/plugin.ts new file mode 100644 index 00000000..33c18688 --- /dev/null +++ b/packages/self-inspect/src/node/plugin.ts @@ -0,0 +1,30 @@ +import type { PluginWithDevTools } from '@vitejs/devtools-kit' +import { clientPublicDir } from '../dirs' +import { rpcFunctions } from './rpc/index' + +export function DevToolsSelfInspect(): PluginWithDevTools { + return { + name: 'vite:devtools:self-inspect', + devtools: { + setup(ctx) { + for (const fn of rpcFunctions) { + ctx.rpc.register(fn) + } + + ctx.views.hostStatic( + '/.devtools-self-inspect/', + clientPublicDir, + ) + + ctx.docks.register({ + id: 'self-inspect', + title: 'Self Inspect', + category: 'advanced', + icon: 'ph:stethoscope-duotone', + type: 'iframe', + url: '/.devtools-self-inspect/', + }) + }, + }, + } +} diff --git a/packages/self-inspect/src/node/rpc/functions/get-client-scripts.ts b/packages/self-inspect/src/node/rpc/functions/get-client-scripts.ts new file mode 100644 index 00000000..2226c228 --- /dev/null +++ b/packages/self-inspect/src/node/rpc/functions/get-client-scripts.ts @@ -0,0 +1,41 @@ +import type { ClientScriptInfo } from '../../../types' +import { defineRpcFunction } from '@vitejs/devtools-kit' + +export const getClientScripts = defineRpcFunction({ + name: 'devtoolskit:self-inspect:get-client-scripts', + type: 'query', + setup: (context) => { + return { + handler: async () => { + const scripts: ClientScriptInfo[] = [] + for (const dock of context.docks.values()) { + if (dock.type === 'action') { + scripts.push({ + dockId: dock.id, + dockTitle: dock.title, + dockType: dock.type, + script: dock.action, + }) + } + else if (dock.type === 'custom-render') { + scripts.push({ + dockId: dock.id, + dockTitle: dock.title, + dockType: dock.type, + script: dock.renderer, + }) + } + else if (dock.type === 'iframe' && dock.clientScript) { + scripts.push({ + dockId: dock.id, + dockTitle: dock.title, + dockType: dock.type, + script: dock.clientScript, + }) + } + } + return scripts + }, + } + }, +}) diff --git a/packages/self-inspect/src/node/rpc/functions/get-devtools-plugins.ts b/packages/self-inspect/src/node/rpc/functions/get-devtools-plugins.ts new file mode 100644 index 00000000..1caca665 --- /dev/null +++ b/packages/self-inspect/src/node/rpc/functions/get-devtools-plugins.ts @@ -0,0 +1,19 @@ +import type { DevtoolsPluginInfo } from '../../../types' +import { defineRpcFunction } from '@vitejs/devtools-kit' + +export const getDevtoolsPlugins = defineRpcFunction({ + name: 'devtoolskit:self-inspect:get-devtools-plugins', + type: 'query', + setup: (context) => { + return { + handler: async () => { + return context.viteConfig.plugins.map((plugin): DevtoolsPluginInfo => ({ + name: plugin.name, + hasDevtools: 'devtools' in plugin, + hasSetup: !!plugin.devtools?.setup, + capabilities: plugin.devtools?.capabilities, + })) + }, + } + }, +}) diff --git a/packages/self-inspect/src/node/rpc/functions/get-docks.ts b/packages/self-inspect/src/node/rpc/functions/get-docks.ts new file mode 100644 index 00000000..0f8cb573 --- /dev/null +++ b/packages/self-inspect/src/node/rpc/functions/get-docks.ts @@ -0,0 +1,13 @@ +import { defineRpcFunction } from '@vitejs/devtools-kit' + +export const getDocks = defineRpcFunction({ + name: 'devtoolskit:self-inspect:get-docks', + type: 'query', + setup: (context) => { + return { + handler: async () => { + return context.docks.values() + }, + } + }, +}) diff --git a/packages/self-inspect/src/node/rpc/functions/get-rpc-functions.ts b/packages/self-inspect/src/node/rpc/functions/get-rpc-functions.ts new file mode 100644 index 00000000..6ed03897 --- /dev/null +++ b/packages/self-inspect/src/node/rpc/functions/get-rpc-functions.ts @@ -0,0 +1,22 @@ +import { defineRpcFunction } from '@vitejs/devtools-kit' + +export const getRpcFunctions = defineRpcFunction({ + name: 'devtoolskit:self-inspect:get-rpc-functions', + type: 'query', + setup: (context) => { + return { + handler: async () => { + return Array.from(context.rpc.definitions.entries()).map(([name, fn]) => ({ + name, + type: fn.type ?? 'query', + cacheable: fn.cacheable ?? false, + hasArgs: !!fn.args, + hasReturns: !!fn.returns, + hasDump: !!fn.dump, + hasSetup: !!fn.setup, + hasHandler: !!fn.handler, + })) + }, + } + }, +}) diff --git a/packages/self-inspect/src/node/rpc/index.ts b/packages/self-inspect/src/node/rpc/index.ts new file mode 100644 index 00000000..cfc88bd7 --- /dev/null +++ b/packages/self-inspect/src/node/rpc/index.ts @@ -0,0 +1,27 @@ +import type { RpcDefinitionsFilter, RpcDefinitionsToFunctions } from '@vitejs/devtools-kit' +import { getClientScripts } from './functions/get-client-scripts' +import { getDevtoolsPlugins } from './functions/get-devtools-plugins' +import { getDocks } from './functions/get-docks' +import { getRpcFunctions } from './functions/get-rpc-functions' +import '@vitejs/devtools-kit' + +export const rpcFunctions = [ + getDocks, + getRpcFunctions, + getClientScripts, + getDevtoolsPlugins, +] as const + +export type ServerFunctions = RpcDefinitionsToFunctions + +export type ServerFunctionsStatic = RpcDefinitionsToFunctions< + RpcDefinitionsFilter +> + +export type ServerFunctionsDump = { + [K in keyof ServerFunctionsStatic]: Awaited> +} + +declare module '@vitejs/devtools-kit' { + export interface DevToolsRpcServerFunctions extends ServerFunctions {} +} diff --git a/packages/self-inspect/src/nuxt.config.ts b/packages/self-inspect/src/nuxt.config.ts new file mode 100644 index 00000000..9af2273d --- /dev/null +++ b/packages/self-inspect/src/nuxt.config.ts @@ -0,0 +1,109 @@ +import { fileURLToPath } from 'node:url' +import { defineNuxtConfig } from 'nuxt/config' +import { alias } from '../../../alias' +import '@nuxt/eslint' + +const BASE = '/.devtools-self-inspect/' + +export default defineNuxtConfig({ + ssr: false, + + modules: [ + '@vueuse/nuxt', + '@unocss/nuxt', + '@nuxt/eslint', + './modules/rpc', + ], + + alias, + + logLevel: 'verbose', + srcDir: 'app', + + eslint: { + config: { + standalone: false, + }, + }, + + experimental: { + typedPages: true, + clientNodeCompat: true, + }, + + features: { + inlineStyles: false, + }, + + nitro: { + preset: 'static', + output: { + dir: '../dist', + }, + routeRules: { + '/': { + prerender: true, + }, + '/200.html': { + prerender: true, + }, + '/404.html': { + prerender: true, + }, + '/**': { + prerender: false, + }, + }, + sourceMap: false, + }, + + unocss: { + configFile: fileURLToPath(new URL('./uno.config.ts', import.meta.url)), + }, + + app: { + baseURL: BASE, + head: { + title: 'DevTools Self Inspect', + charset: 'utf-8', + viewport: 'width=device-width,initial-scale=1', + meta: [ + { name: 'description', content: 'DevTools for inspecting the DevTools itself' }, + ], + htmlAttrs: { + lang: 'en', + }, + }, + }, + + debug: false, + + vite: { + base: BASE, + build: { + cssMinify: false, + }, + optimizeDeps: { + exclude: [ + 'structured-clone-es', + 'birpc', + ], + }, + // @ts-expect-error devtools is a custom vite option + devtools: { + clientAuth: false, + }, + }, + + devtools: { + enabled: false, + }, + + typescript: { + includeWorkspace: true, + }, + + workspaceDir: '../../', + + compatibilityDate: '2024-07-17', +}) diff --git a/packages/self-inspect/src/tsconfig.json b/packages/self-inspect/src/tsconfig.json new file mode 100644 index 00000000..4b34df15 --- /dev/null +++ b/packages/self-inspect/src/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./.nuxt/tsconfig.json" +} diff --git a/packages/self-inspect/src/types.ts b/packages/self-inspect/src/types.ts new file mode 100644 index 00000000..ca1360ac --- /dev/null +++ b/packages/self-inspect/src/types.ts @@ -0,0 +1,18 @@ +import type { ClientScriptEntry } from '@vitejs/devtools-kit' + +export interface ClientScriptInfo { + dockId: string + dockTitle: string + dockType: string + script: ClientScriptEntry +} + +export interface DevtoolsPluginInfo { + name: string + hasDevtools: boolean + hasSetup: boolean + capabilities?: { + dev?: unknown + build?: unknown + } +} diff --git a/packages/self-inspect/src/uno.config.ts b/packages/self-inspect/src/uno.config.ts new file mode 100644 index 00000000..1e552808 --- /dev/null +++ b/packages/self-inspect/src/uno.config.ts @@ -0,0 +1,8 @@ +import { presetDevToolsUI } from '@vitejs/devtools-ui/unocss' +import { defineConfig } from 'unocss' + +export default defineConfig({ + presets: [ + presetDevToolsUI(), + ], +}) diff --git a/packages/self-inspect/tsdown.config.ts b/packages/self-inspect/tsdown.config.ts new file mode 100644 index 00000000..3cec7723 --- /dev/null +++ b/packages/self-inspect/tsdown.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from 'tsdown' + +export default defineConfig({ + entry: { + index: 'src/index.ts', + }, + tsconfig: '../../tsconfig.base.json', + target: 'esnext', + exports: true, + dts: true, + clean: false, + inputOptions: { + experimental: { + resolveNewUrlToAsset: false, + }, + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75675bc8..4102401a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -875,6 +875,43 @@ importers: specifier: catalog:deps version: 8.19.0 + packages/self-inspect: + dependencies: + '@vitejs/devtools-kit': + specifier: workspace:* + version: link:../kit + '@vitejs/devtools-rpc': + specifier: workspace:* + version: link:../rpc + birpc: + specifier: catalog:deps + version: 4.0.0 + pathe: + specifier: catalog:deps + version: 2.0.3 + devDependencies: + '@unocss/nuxt': + specifier: catalog:build + version: 66.6.6(magicast@0.5.2)(vite@8.0.0-beta.18(@types/node@25.0.3)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.27.3)) + '@vueuse/core': + specifier: catalog:frontend + version: 14.2.1(vue@3.5.30(typescript@5.9.3)) + '@vueuse/nuxt': + specifier: catalog:build + version: 14.2.1(magicast@0.5.2)(nuxt@4.3.1(@parcel/watcher@2.5.1)(@types/node@25.0.3)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@10.0.3(jiti@2.6.1))(idb-keyval@6.2.2)(ioredis@5.9.1)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-rc.8)(rollup@4.55.1)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.0-beta.18(@types/node@25.0.3)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.5(typescript@5.9.3))(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + structured-clone-es: + specifier: catalog:deps + version: 1.0.0 + tsdown: + specifier: catalog:build + version: 0.21.1(@vitejs/devtools@packages+core)(publint@0.3.18)(synckit@0.11.12)(typescript@5.9.3)(vue-tsc@3.2.5(typescript@5.9.3)) + unocss: + specifier: catalog:build + version: 66.6.6(@unocss/webpack@66.6.6(webpack@5.104.1(esbuild@0.27.3)))(vite@8.0.0-beta.18(@types/node@25.0.3)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + vite-hot-client: + specifier: catalog:frontend + version: 2.1.0(vite@8.0.0-beta.18(@types/node@25.0.3)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + packages/ui: dependencies: '@vueuse/core': diff --git a/test/exports/@vitejs/devtools-self-inspect.yaml b/test/exports/@vitejs/devtools-self-inspect.yaml new file mode 100644 index 00000000..7321f558 --- /dev/null +++ b/test/exports/@vitejs/devtools-self-inspect.yaml @@ -0,0 +1,2 @@ +.: + DevToolsSelfInspect: function diff --git a/tsconfig.base.json b/tsconfig.base.json index 4448572d..7f145b0a 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -48,6 +48,9 @@ "@vitejs/devtools-rolldown": [ "./packages/rolldown/src/index.ts" ], + "@vitejs/devtools-self-inspect": [ + "./packages/self-inspect/src/index.ts" + ], "@vitejs/devtools/client/inject": [ "./packages/core/src/client/inject/index.ts" ], diff --git a/turbo.json b/turbo.json index 26fbb84d..d8d76183 100644 --- a/turbo.json +++ b/turbo.json @@ -26,6 +26,12 @@ "dist/**" ] }, + "@vitejs/devtools-self-inspect#build": { + "outputLogs": "new-only", + "outputs": [ + "dist/**" + ] + }, "@vitejs/devtools-rpc#build": { "outputLogs": "new-only", "outputs": [