summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/neat-buttons-guess.md5
-rw-r--r--packages/astro/test/fixtures/vue-component/astro.config.mjs8
-rw-r--r--packages/astro/test/fixtures/vue-component/src/components/Result.vue1
-rw-r--r--packages/astro/test/vue-component.test.js3
-rw-r--r--packages/integrations/vue/README.md23
-rw-r--r--packages/integrations/vue/src/index.ts9
6 files changed, 44 insertions, 5 deletions
diff --git a/.changeset/neat-buttons-guess.md b/.changeset/neat-buttons-guess.md
new file mode 100644
index 000000000..64098a927
--- /dev/null
+++ b/.changeset/neat-buttons-guess.md
@@ -0,0 +1,5 @@
+---
+'@astrojs/vue': patch
+---
+
+`@astrojs/vue` integration supports custom vue compiler options
diff --git a/packages/astro/test/fixtures/vue-component/astro.config.mjs b/packages/astro/test/fixtures/vue-component/astro.config.mjs
index 8a3a38574..0e870b2b4 100644
--- a/packages/astro/test/fixtures/vue-component/astro.config.mjs
+++ b/packages/astro/test/fixtures/vue-component/astro.config.mjs
@@ -3,5 +3,11 @@ import vue from '@astrojs/vue';
// https://astro.build/config
export default defineConfig({
- integrations: [vue()],
+ integrations: [vue({
+ template: {
+ compilerOptions: {
+ isCustomElement: tag => tag.includes('my-button')
+ }
+ }
+ })],
}); \ No newline at end of file
diff --git a/packages/astro/test/fixtures/vue-component/src/components/Result.vue b/packages/astro/test/fixtures/vue-component/src/components/Result.vue
index 7795d5ae0..90bf218b2 100644
--- a/packages/astro/test/fixtures/vue-component/src/components/Result.vue
+++ b/packages/astro/test/fixtures/vue-component/src/components/Result.vue
@@ -1,5 +1,6 @@
<template>
<pre>{{ value }}</pre>
+ <my-button>Click Me</my-button>
</template>
<script>
diff --git a/packages/astro/test/vue-component.test.js b/packages/astro/test/vue-component.test.js
index e26a3cdbe..d3870dc88 100644
--- a/packages/astro/test/vue-component.test.js
+++ b/packages/astro/test/vue-component.test.js
@@ -33,6 +33,9 @@ describe('Vue component', () => {
// test 3: all <astro-root>s have uid attributes
expect($('astro-root[uid]')).to.have.lengthOf(6);
+ // test 4: treats <my-button> as a custom element
+ expect($('my-button')).to.have.lengthOf(7);
+
// test 5: components with identical render output and props have been deduplicated
const uniqueRootUIDs = $('astro-root').map((i, el) => $(el).attr('uid'));
expect(new Set(uniqueRootUIDs).size).to.equal(5);
diff --git a/packages/integrations/vue/README.md b/packages/integrations/vue/README.md
index e9a55d3da..3d5baa70d 100644
--- a/packages/integrations/vue/README.md
+++ b/packages/integrations/vue/README.md
@@ -63,3 +63,26 @@ Also check our [Astro Integration Documentation][astro-integration] for more on
[astro-integration]: https://docs.astro.build/en/guides/integrations-guide/
[astro-ui-frameworks]: https://docs.astro.build/en/core-concepts/framework-components/#using-framework-components
+
+## Options
+
+This integration is powered by `@vitejs/plugin-vue`. To customize the Vue compiler, options can be provided to the integration. See the `@vitejs/plugin-vue` [docs](https://github.com/vitejs/vite/tree/main/packages/plugin-vue) for more details.
+
+__astro.config.mjs__
+
+```js
+import vue from '@astrojs/vue';
+
+export default {
+ // ...
+ integrations: [vue({
+ template: {
+ compilerOptions: {
+ // treat any tag that starts with ion- as custom elements
+ isCustomElement: tag => tag.startsWith('ion-')
+ }
+ }
+ // ...
+ })],
+}
+``` \ No newline at end of file
diff --git a/packages/integrations/vue/src/index.ts b/packages/integrations/vue/src/index.ts
index 20adf0f66..b56763504 100644
--- a/packages/integrations/vue/src/index.ts
+++ b/packages/integrations/vue/src/index.ts
@@ -1,5 +1,6 @@
import type { AstroIntegration, AstroRenderer } from 'astro';
import vue from '@vitejs/plugin-vue';
+import type { Options } from '@vitejs/plugin-vue';
function getRenderer(): AstroRenderer {
return {
@@ -9,26 +10,26 @@ function getRenderer(): AstroRenderer {
};
}
-function getViteConfiguration() {
+function getViteConfiguration(options?: Options) {
return {
optimizeDeps: {
include: ['@astrojs/vue/client.js', 'vue'],
exclude: ['@astrojs/vue/server.js'],
},
- plugins: [vue()],
+ plugins: [vue(options)],
ssr: {
external: ['@vue/server-renderer'],
},
};
}
-export default function (): AstroIntegration {
+export default function (options?: Options): AstroIntegration {
return {
name: '@astrojs/vue',
hooks: {
'astro:config:setup': ({ addRenderer, updateConfig }) => {
addRenderer(getRenderer());
- updateConfig({ vite: getViteConfiguration() });
+ updateConfig({ vite: getViteConfiguration(options) });
},
},
};