summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Matthew Phillips <matthew@skypack.dev> 2024-07-26 13:54:10 -0400
committerGravatar GitHub <noreply@github.com> 2024-07-26 13:54:10 -0400
commit504c383e20dfb5d8eb0825a70935f221b43577b2 (patch)
tree6039cd6b705443d8f0cb06d56e78a388a805cf4d
parent904f1e535aeb7a14ba7ce07c3130e25f3e708266 (diff)
downloadastro-504c383e20dfb5d8eb0825a70935f221b43577b2.tar.gz
astro-504c383e20dfb5d8eb0825a70935f221b43577b2.tar.zst
astro-504c383e20dfb5d8eb0825a70935f221b43577b2.zip
Fix server islands with trailingSlash: always (#11529)
* Fix server islands with trailingSlash: always * Fix test missing trailingslash * Prepend base to the server island URL * Add tests for base
-rw-r--r--.changeset/wicked-books-sip.md5
-rw-r--r--packages/astro/e2e/fixtures/server-islands/astro.config.mjs2
-rw-r--r--packages/astro/e2e/server-islands.test.js8
-rw-r--r--packages/astro/src/@types/astro.ts2
-rw-r--r--packages/astro/src/core/render-context.ts2
-rw-r--r--packages/astro/src/runtime/server/render/server-islands.ts3
6 files changed, 17 insertions, 5 deletions
diff --git a/.changeset/wicked-books-sip.md b/.changeset/wicked-books-sip.md
new file mode 100644
index 000000000..d6e4741a5
--- /dev/null
+++ b/.changeset/wicked-books-sip.md
@@ -0,0 +1,5 @@
+---
+'astro': patch
+---
+
+Fix server islands with trailingSlash: always
diff --git a/packages/astro/e2e/fixtures/server-islands/astro.config.mjs b/packages/astro/e2e/fixtures/server-islands/astro.config.mjs
index f03c53335..4bec97b9e 100644
--- a/packages/astro/e2e/fixtures/server-islands/astro.config.mjs
+++ b/packages/astro/e2e/fixtures/server-islands/astro.config.mjs
@@ -5,9 +5,11 @@ import nodejs from '@astrojs/node';
// https://astro.build/config
export default defineConfig({
+ base: '/base',
output: 'hybrid',
adapter: nodejs({ mode: 'standalone' }),
integrations: [react(), mdx()],
+ trailingSlash: 'always',
experimental: {
serverIslands: true,
}
diff --git a/packages/astro/e2e/server-islands.test.js b/packages/astro/e2e/server-islands.test.js
index 1479b807b..5f29acf60 100644
--- a/packages/astro/e2e/server-islands.test.js
+++ b/packages/astro/e2e/server-islands.test.js
@@ -16,7 +16,7 @@ test.describe('Server islands', () => {
});
test('Load content from the server', async ({ page, astro }) => {
- await page.goto(astro.resolveUrl('/'));
+ await page.goto(astro.resolveUrl('/base/'));
let el = page.locator('#island');
await expect(el, 'element rendered').toBeVisible();
@@ -24,7 +24,7 @@ test.describe('Server islands', () => {
});
test('Can be in an MDX file', async ({ page, astro }) => {
- await page.goto(astro.resolveUrl('/mdx'));
+ await page.goto(astro.resolveUrl('/base/mdx/'));
let el = page.locator('#island');
await expect(el, 'element rendered').toBeVisible();
@@ -32,7 +32,7 @@ test.describe('Server islands', () => {
});
test('Slots are provided back to the server islands', async ({ page, astro }) => {
- await page.goto(astro.resolveUrl('/'));
+ await page.goto(astro.resolveUrl('/base/'));
let el = page.locator('#children');
await expect(el, 'element rendered').toBeVisible();
@@ -55,7 +55,7 @@ test.describe('Server islands', () => {
});
test('Only one component in prod', async ({ page, astro }) => {
- await page.goto(astro.resolveUrl('/'));
+ await page.goto(astro.resolveUrl('/base/'));
let el = page.locator('#island');
diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts
index f11d708f1..20eb91f63 100644
--- a/packages/astro/src/@types/astro.ts
+++ b/packages/astro/src/@types/astro.ts
@@ -3324,6 +3324,7 @@ export interface SSRResult {
* Whether the page has failed with a non-recoverable error, or the client disconnected.
*/
cancelled: boolean;
+ base: string;
styles: Set<SSRElement>;
scripts: Set<SSRElement>;
links: Set<SSRElement>;
@@ -3352,6 +3353,7 @@ export interface SSRResult {
pathname: string;
cookies: AstroCookies | undefined;
serverIslandNameMap: Map<string, string>;
+ trailingSlash: AstroConfig['trailingSlash'];
_metadata: SSRMetadata;
}
diff --git a/packages/astro/src/core/render-context.ts b/packages/astro/src/core/render-context.ts
index bc97212a8..902ba0fc2 100644
--- a/packages/astro/src/core/render-context.ts
+++ b/packages/astro/src/core/render-context.ts
@@ -347,6 +347,7 @@ export class RenderContext {
// This object starts here as an empty shell (not yet the result) but then
// calling the render() function will populate the object with scripts, styles, etc.
const result: SSRResult = {
+ base: manifest.base,
cancelled: false,
clientDirectives,
inlinedScripts,
@@ -368,6 +369,7 @@ export class RenderContext {
styles,
actionResult,
serverIslandNameMap: manifest.serverIslandNameMap ?? new Map(),
+ trailingSlash: manifest.trailingSlash,
_metadata: {
hasHydrationScript: false,
rendererSpecificHydrationScripts: new Set(),
diff --git a/packages/astro/src/runtime/server/render/server-islands.ts b/packages/astro/src/runtime/server/render/server-islands.ts
index 52b6b006e..9a27fed51 100644
--- a/packages/astro/src/runtime/server/render/server-islands.ts
+++ b/packages/astro/src/runtime/server/render/server-islands.ts
@@ -60,6 +60,7 @@ export function renderServerIsland(
}
const hostId = crypto.randomUUID();
+ const serverIslandUrl = `${result.base}_server-islands/${componentId}${result.trailingSlash === 'always' ? '/' : ''}`;
destination.write(`<script async type="module" data-island-id="${hostId}">
let componentId = ${safeJsonStringify(componentId)};
@@ -71,7 +72,7 @@ let data = {
slots: ${safeJsonStringify(renderedSlots)},
};
-let response = await fetch('/_server-islands/${componentId}', {
+let response = await fetch('${serverIslandUrl}', {
method: 'POST',
body: JSON.stringify(data),
});