Skip to content

Commit e496b2e

Browse files
Fix asynchronous appEntrypoint support (#9558)
1 parent 22f42d1 commit e496b2e

File tree

11 files changed

+101
-2
lines changed

11 files changed

+101
-2
lines changed

.changeset/ninety-buses-occur.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@astrojs/vue": patch
3+
---
4+
5+
Fixes support for async `appEntrypoint`

packages/integrations/vue/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ function virtualAppEntrypoint(options?: Options): Plugin {
6363
return `\
6464
import * as mod from ${JSON.stringify(appEntrypoint)};
6565
66-
export const setup = (app) => {
66+
export const setup = async (app) => {
6767
if ('default' in mod) {
68-
mod.default(app);
68+
await mod.default(app);
6969
} else {
7070
${
7171
!isBuild

packages/integrations/vue/test/app-entrypoint.test.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,3 +185,26 @@ describe('App Entrypoint /src/absolute', () => {
185185
expect(js).not.to.match(/\w+\.component\(\"Bar\"/gm);
186186
});
187187
});
188+
189+
describe('App Entrypoint async', () => {
190+
/** @type {import('./test-utils').Fixture} */
191+
let fixture;
192+
193+
before(async () => {
194+
fixture = await loadFixture({
195+
root: './fixtures/app-entrypoint-async/',
196+
});
197+
await fixture.build();
198+
});
199+
200+
it('loads during SSR', async () => {
201+
const html = await fixture.readFile('/index.html');
202+
const $ = cheerioLoad(html);
203+
204+
// test 1: component before await renders
205+
expect($('#foo > #bar').text()).to.eq('works');
206+
207+
// test 2: component after await renders
208+
expect($('#foo > #baz').text()).to.eq('works');
209+
});
210+
});
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { defineConfig } from 'astro/config';
2+
import vue from '@astrojs/vue';
3+
import ViteSvgLoader from 'vite-svg-loader'
4+
5+
export default defineConfig({
6+
integrations: [vue({
7+
appEntrypoint: '/src/pages/_app'
8+
})],
9+
vite: {
10+
plugins: [
11+
ViteSvgLoader(),
12+
],
13+
},
14+
})
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"name": "@test/vue-app-entrypoint-async",
3+
"version": "0.0.0",
4+
"private": true,
5+
"dependencies": {
6+
"@astrojs/vue": "workspace:*",
7+
"astro": "workspace:*",
8+
"vite-svg-loader": "5.0.1"
9+
}
10+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<template>
2+
<div id="bar">works</div>
3+
</template>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<template>
2+
<div id="baz">works</div>
3+
</template>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<template>
2+
<div id="foo">
3+
<Bar />
4+
<Baz />
5+
</div>
6+
</template>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import type { App } from 'vue'
2+
import Bar from '../components/Bar.vue'
3+
import Baz from '../components/Baz.vue'
4+
5+
export default async function setup(app: App) {
6+
app.component('Bar', Bar);
7+
8+
await new Promise(resolve => setTimeout(resolve, 250));
9+
10+
app.component('Baz', Baz);
11+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
import Foo from '../components/Foo.vue';
3+
---
4+
5+
<html>
6+
<head>
7+
<title>Vue App Entrypoint</title>
8+
</head>
9+
<body>
10+
<Foo client:load />
11+
</body>
12+
</html>

0 commit comments

Comments
 (0)