diff --git a/packages/astro/src/core/app/dev.ts b/packages/astro/src/core/app/dev.ts index 76d65176d..eb2e1defc 100644 --- a/packages/astro/src/core/app/dev.ts +++ b/packages/astro/src/core/app/dev.ts @@ -1,10 +1,20 @@ -import type { ManifestData, RouteData } from '../../@types/astro'; +import type { ComponentInstance, ManifestData, RouteData } from '../../@types/astro'; import type { SSRManifest as Manifest } from './types'; import { createContainer, type CreateContainerParams } from '../dev/index.js'; import { createViteLoader } from '../module-loader/index.js'; import { createRouteManifest } from '../routing/index.js'; -import { createDevelopmentEnvironment, preload, type DevelopmentEnvironment } from '../render/dev/index.js'; +import { + createDevelopmentEnvironment, + getScriptsAndStyles, + preload, + type DevelopmentEnvironment +} from '../render/dev/index.js'; +import { + createRenderContext, + renderPage as coreRenderPage +} from '../render/index.js'; import { App, MatchOptions } from './index.js'; +import { RenderContext, Environment } from '../render'; export type DevAppParams = Partial & { root: URL; @@ -16,6 +26,7 @@ export class DevApp extends App { #container: Awaited> | null = null; #env: DevelopmentEnvironment | null = null; #root: URL; + #modToRoute = new Map(); constructor(params: DevAppParams) { const { root, userConfig } = params; const manifest: Manifest = { @@ -98,7 +109,24 @@ export class DevApp extends App { // Save this module in the pageMap, so that super.render() finds it. this.#manifest.pageMap.set(route.component, mod); + this.#modToRoute.set(mod, route); } return super.render(request, route); } + + renderPage = async (mod: ComponentInstance, ctx: RenderContext, env: Environment) => { + const route = this.#modToRoute.get(mod)!; + + const { scripts, links, styles, propagationMap } = await getScriptsAndStyles({ + env: this.#env!, + filePath: new URL(route.component, this.#root), + }); + + ctx.scripts = scripts; + ctx.links = links; + ctx.styles = styles; + ctx.propagation = propagationMap; + + return coreRenderPage(mod, ctx, env); + }; } diff --git a/packages/astro/src/core/app/index.ts b/packages/astro/src/core/app/index.ts index 051043da1..4b048c507 100644 --- a/packages/astro/src/core/app/index.ts +++ b/packages/astro/src/core/app/index.ts @@ -47,6 +47,7 @@ export class App { }; #base: string; #baseWithoutTrailingSlash: string; + renderPage: typeof renderPage; constructor(manifest: Manifest, streaming = true) { this.#manifest = manifest; @@ -80,6 +81,7 @@ export class App { this.#base = this.#manifest.base || '/'; this.#baseWithoutTrailingSlash = removeTrailingForwardSlash(this.#base); + this.renderPage = renderPage; } updateRoutes(routes: RouteInfo[]) { this.#manifestData = { @@ -212,7 +214,7 @@ export class App { status, }); - const response = await renderPage(mod, ctx, this.#env); + const response = await this.renderPage(mod, ctx, this.#env); return response; } catch (err: any) { error(this.#logging, 'ssr', err.stack || err.message || String(err)); diff --git a/packages/astro/src/core/render/dev/index.ts b/packages/astro/src/core/render/dev/index.ts index 92d374d3e..3e18884cb 100644 --- a/packages/astro/src/core/render/dev/index.ts +++ b/packages/astro/src/core/render/dev/index.ts @@ -74,7 +74,7 @@ interface GetScriptsAndStylesParams { filePath: URL; } -async function getScriptsAndStyles({ env, filePath }: GetScriptsAndStylesParams) { +export async function getScriptsAndStyles({ env, filePath }: GetScriptsAndStylesParams) { // Add hoisted script tags const scripts = await getScriptsForURL(filePath, env.loader); diff --git a/packages/astro/test/units/dev/base.test.js b/packages/astro/test/units/dev/base.test.js index 20ccea3d2..6100223fc 100644 --- a/packages/astro/test/units/dev/base.test.js +++ b/packages/astro/test/units/dev/base.test.js @@ -52,40 +52,11 @@ describe('base configuration', () => { try { const request = new Request(`http://localhost:8080/docs`); - debugger; const response = await app.render(request); - expect(response.status).to.equal(200); - console.log(await response.text()); } finally { await app.close(); } - - - - /* - - await runInContainer( - { - fs, - root, - userConfig: { - base: '/docs', - trailingSlash: 'never', - }, - }, - async (container) => { - const { req, res, done, text } = createRequestAndResponse({ - method: 'GET', - url: '/docs', - }); - container.handle(req, res); - await done; - expect(res.statusCode).to.equal(200); - } - ); - */ - }); });