summaryrefslogtreecommitdiff
path: root/packages/integrations/vue
diff options
context:
space:
mode:
authorGravatar Florian Lefebvre <contact@florian-lefebvre.dev> 2024-05-06 16:02:06 +0200
committerGravatar GitHub <noreply@github.com> 2024-05-06 16:02:06 +0200
commit082abb82d574a200f9168ee5ae92c65c71e29eda (patch)
tree52390cc913762f610da253ab424e5e4453b47f69 /packages/integrations/vue
parent11c58a9c5a33a44756435e2acede68cb274fb05b (diff)
downloadastro-082abb82d574a200f9168ee5ae92c65c71e29eda.tar.gz
astro-082abb82d574a200f9168ee5ae92c65c71e29eda.tar.zst
astro-082abb82d574a200f9168ee5ae92c65c71e29eda.zip
feat(vue): add support for devtools (#10929)
Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca>
Diffstat (limited to 'packages/integrations/vue')
-rw-r--r--packages/integrations/vue/package.json3
-rw-r--r--packages/integrations/vue/src/index.ts35
2 files changed, 26 insertions, 12 deletions
diff --git a/packages/integrations/vue/package.json b/packages/integrations/vue/package.json
index 102d102ba..5fcf280a4 100644
--- a/packages/integrations/vue/package.json
+++ b/packages/integrations/vue/package.json
@@ -42,7 +42,8 @@
"dependencies": {
"@vitejs/plugin-vue": "^5.0.4",
"@vitejs/plugin-vue-jsx": "^3.1.0",
- "@vue/compiler-sfc": "^3.4.26"
+ "@vue/compiler-sfc": "^3.4.26",
+ "vite-plugin-vue-devtools": "^7.1.3"
},
"devDependencies": {
"astro": "workspace:*",
diff --git a/packages/integrations/vue/src/index.ts b/packages/integrations/vue/src/index.ts
index 803095c19..f61b35a09 100644
--- a/packages/integrations/vue/src/index.ts
+++ b/packages/integrations/vue/src/index.ts
@@ -3,12 +3,16 @@ import type { Options as VueOptions } from '@vitejs/plugin-vue';
import vue from '@vitejs/plugin-vue';
import type { Options as VueJsxOptions } from '@vitejs/plugin-vue-jsx';
import { MagicString } from '@vue/compiler-sfc';
-import type { AstroIntegration, AstroRenderer } from 'astro';
+import type { AstroIntegration, AstroRenderer, HookParameters } from 'astro';
import type { Plugin, UserConfig } from 'vite';
+const VIRTUAL_MODULE_ID = 'virtual:@astrojs/vue/app';
+const RESOLVED_VIRTUAL_MODULE_ID = `\0${VIRTUAL_MODULE_ID}`;
+
interface Options extends VueOptions {
jsx?: boolean | VueJsxOptions;
appEntrypoint?: string;
+ devtools?: boolean;
}
function getRenderer(): AstroRenderer {
@@ -28,9 +32,6 @@ function getJsxRenderer(): AstroRenderer {
}
function virtualAppEntrypoint(options?: Options): Plugin {
- const virtualModuleId = 'virtual:@astrojs/vue/app';
- const resolvedVirtualModuleId = '\0' + virtualModuleId;
-
let isBuild: boolean;
let root: string;
let appEntrypoint: string | undefined;
@@ -49,12 +50,12 @@ function virtualAppEntrypoint(options?: Options): Plugin {
}
},
resolveId(id: string) {
- if (id == virtualModuleId) {
- return resolvedVirtualModuleId;
+ if (id == VIRTUAL_MODULE_ID) {
+ return RESOLVED_VIRTUAL_MODULE_ID;
}
},
load(id: string) {
- if (id === resolvedVirtualModuleId) {
+ if (id === RESOLVED_VIRTUAL_MODULE_ID) {
if (appEntrypoint) {
return `\
import * as mod from ${JSON.stringify(appEntrypoint)};
@@ -93,7 +94,10 @@ export const setup = async (app) => {
};
}
-async function getViteConfiguration(options?: Options): Promise<UserConfig> {
+async function getViteConfiguration(
+ command: HookParameters<'astro:config:setup'>['command'],
+ options?: Options
+): Promise<UserConfig> {
let vueOptions = {
...options,
template: {
@@ -105,7 +109,7 @@ async function getViteConfiguration(options?: Options): Promise<UserConfig> {
const config: UserConfig = {
optimizeDeps: {
include: ['@astrojs/vue/client.js', 'vue'],
- exclude: ['@astrojs/vue/server.js', 'virtual:@astrojs/vue/app'],
+ exclude: ['@astrojs/vue/server.js', VIRTUAL_MODULE_ID],
},
plugins: [vue(vueOptions), virtualAppEntrypoint(vueOptions)],
ssr: {
@@ -119,6 +123,15 @@ async function getViteConfiguration(options?: Options): Promise<UserConfig> {
config.plugins?.push(vueJsx(jsxOptions));
}
+ if (command === 'dev' && options?.devtools) {
+ const vueDevTools = (await import('vite-plugin-vue-devtools')).default;
+ config.plugins?.push(
+ vueDevTools({
+ appendTo: VIRTUAL_MODULE_ID,
+ })
+ );
+ }
+
return config;
}
@@ -126,12 +139,12 @@ export default function (options?: Options): AstroIntegration {
return {
name: '@astrojs/vue',
hooks: {
- 'astro:config:setup': async ({ addRenderer, updateConfig }) => {
+ 'astro:config:setup': async ({ addRenderer, updateConfig, command }) => {
addRenderer(getRenderer());
if (options?.jsx) {
addRenderer(getJsxRenderer());
}
- updateConfig({ vite: await getViteConfiguration(options) });
+ updateConfig({ vite: await getViteConfiguration(command, options) });
},
},
};