Support custom vue compiler options in @astrojs/vue (#3143)

* adds support for passing options to @vitejs/plugin-vue

* updating vue integration README with options details

* adding a tests for custom vue compiler options

* chore: adding changeset
This commit is contained in:
Tony Sullivan 2022-04-19 16:31:32 +00:00 committed by GitHub
parent 550c7d0a94
commit 44e294c9cb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 44 additions and 5 deletions

View file

@ -0,0 +1,5 @@
---
'@astrojs/vue': patch
---
`@astrojs/vue` integration supports custom vue compiler options

View file

@ -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')
}
}
})],
});

View file

@ -1,5 +1,6 @@
<template>
<pre>{{ value }}</pre>
<my-button>Click Me</my-button>
</template>
<script>

View file

@ -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);

View file

@ -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-')
}
}
// ...
})],
}
```

View file

@ -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) });
},
},
};