Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/social-paws-throw.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'astro': patch
---

Fixes `Astro.site` always being `undefined` when rendering components via the Container API, even when `site` is set in `astroConfig`
15 changes: 8 additions & 7 deletions packages/astro/src/container/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ function createManifest(
manifest?: AstroContainerManifest,
renderers?: SSRLoadedRenderer[],
middleware?: MiddlewareHandler,
site?: string,
): SSRManifest {
function middlewareInstance(): AstroMiddlewareInstance {
return {
Expand Down Expand Up @@ -174,6 +175,7 @@ function createManifest(
componentMetadata: manifest?.componentMetadata ?? new Map(),
inlinedScripts: manifest?.inlinedScripts ?? new Map(),
i18n: manifest?.i18n,
site: site ?? manifest?.site,
checkOrigin: false,
allowedDomains: manifest?.allowedDomains ?? [],
actionBodySizeLimit: 1024 * 1024,
Expand Down Expand Up @@ -281,13 +283,15 @@ type AstroContainerManifest = Pick<
| 'middlewareMode'
| 'assetsDir'
| 'image'
| 'site'
>;

type AstroContainerConstructor = {
streaming?: boolean;
renderers?: SSRLoadedRenderer[];
manifest?: AstroContainerManifest;
resolve?: SSRResult['resolve'];
site?: string;
};

export class experimental_AstroContainer {
Expand Down Expand Up @@ -315,8 +319,9 @@ export class experimental_AstroContainer {
manifest,
renderers,
resolve,
site,
}: AstroContainerConstructor) {
const ssrManifest = createManifest(manifest, renderers);
const ssrManifest = createManifest(manifest, renderers, undefined, site);
const containerRenderers = renderers ?? manifest?.renderers ?? [];
const containerResolve = async (specifier: string): Promise<string> => {
if (this.#withManifest) {
Expand All @@ -327,7 +332,6 @@ export class experimental_AstroContainer {
return specifier;
};
const interner = new WeakMap<RouteData, SinglePageBuiltModule>();
// Composition order: logger → environment → warm the route table.
setLogger(ssrManifest, createConsoleLogger({ level: 'error' }));
setEnvironment(
ssrManifest,
Expand All @@ -338,10 +342,6 @@ export class experimental_AstroContainer {
streaming,
}),
);
// Warm the derived route table. Deliberately left un-refreshed when
// routes are inserted later — route matching is irrelevant here
// because `renderToResponse` always assigns `state.routeData`
// explicitly.
getRouteTable(ssrManifest);
this.#manifest = ssrManifest;
this.#interner = interner;
Expand All @@ -363,12 +363,13 @@ export class experimental_AstroContainer {
public static async create(
containerOptions: AstroContainerOptions = {},
): Promise<experimental_AstroContainer> {
const { streaming = false, manifest, renderers = [], resolve } = containerOptions;
const { streaming = false, manifest, renderers = [], resolve, astroConfig } = containerOptions;
return new experimental_AstroContainer({
streaming,
manifest,
renderers,
resolve,
site: astroConfig?.site ?? manifest?.site,
});
}

Expand Down
34 changes: 34 additions & 0 deletions packages/astro/test/units/render/container.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,4 +276,38 @@ describe('Container', () => {

assert.match(result, /Is open/);
});

it('Astro.site reflects astroConfig.site', async () => {
const $Astro = createAstro('https://example.com');
const SitePage = createComponent((result, props, slots) => {
const Astro = result.createAstro($Astro, props, slots);
const site = Astro.site;
return render`${maybeRenderHead()}<div>${site ? site.toString() : 'SITE_UNDEFINED'}</div>`;
});

const container = await experimental_AstroContainer.create({
astroConfig: {
site: 'https://example.com',
},
});

const response = await container.renderToString(SitePage);

assert.match(response, /https:\/\/example\.com/);
assert.doesNotMatch(response, /SITE_UNDEFINED/);
});

it('Astro.site is undefined when astroConfig.site is not set', async () => {
const $Astro = createAstro(undefined);
const SitePage = createComponent((result, props, slots) => {
const Astro = result.createAstro($Astro, props, slots);
const site = Astro.site;
return render`${maybeRenderHead()}<div>${site ? site.toString() : 'SITE_UNDEFINED'}</div>`;
});

const container = await experimental_AstroContainer.create();
const response = await container.renderToString(SitePage);

assert.match(response, /SITE_UNDEFINED/);
});
});
Loading