Expose the ssr manifest (#6435)
* Expose the ssr manifest * Add changeset * Add types for virtual mod
This commit is contained in:
parent
2751584387
commit
a206106098
10 changed files with 102 additions and 1 deletions
5
.changeset/heavy-kids-heal.md
Normal file
5
.changeset/heavy-kids-heal.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'astro': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Expose the manifest to plugins via the astro:ssr-manifest virtual module
|
4
packages/astro/client-base.d.ts
vendored
4
packages/astro/client-base.d.ts
vendored
|
@ -140,6 +140,10 @@ declare module '*.mdx' {
|
||||||
export default load;
|
export default load;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare module 'astro:ssr-manifest' {
|
||||||
|
export const manifest: import('./dist/@types/astro').SSRManifest;
|
||||||
|
}
|
||||||
|
|
||||||
// Everything below are Vite's types (apart from image types, which are in `client.d.ts`)
|
// Everything below are Vite's types (apart from image types, which are in `client.d.ts`)
|
||||||
|
|
||||||
// CSS modules
|
// CSS modules
|
||||||
|
|
|
@ -38,10 +38,12 @@ export function vitePluginSSR(internals: BuildInternals, adapter: AstroAdapter):
|
||||||
return `import * as adapter from '${adapter.serverEntrypoint}';
|
return `import * as adapter from '${adapter.serverEntrypoint}';
|
||||||
import * as _main from '${pagesVirtualModuleId}';
|
import * as _main from '${pagesVirtualModuleId}';
|
||||||
import { deserializeManifest as _deserializeManifest } from 'astro/app';
|
import { deserializeManifest as _deserializeManifest } from 'astro/app';
|
||||||
|
import { _privateSetManifestDontUseThis } from 'astro:ssr-manifest';
|
||||||
const _manifest = Object.assign(_deserializeManifest('${manifestReplace}'), {
|
const _manifest = Object.assign(_deserializeManifest('${manifestReplace}'), {
|
||||||
pageMap: _main.pageMap,
|
pageMap: _main.pageMap,
|
||||||
renderers: _main.renderers
|
renderers: _main.renderers
|
||||||
});
|
});
|
||||||
|
_privateSetManifestDontUseThis(_manifest);
|
||||||
const _args = ${adapter.args ? JSON.stringify(adapter.args) : 'undefined'};
|
const _args = ${adapter.args ? JSON.stringify(adapter.args) : 'undefined'};
|
||||||
export * from '${pagesVirtualModuleId}';
|
export * from '${pagesVirtualModuleId}';
|
||||||
${
|
${
|
||||||
|
|
|
@ -26,6 +26,7 @@ import markdownVitePlugin from '../vite-plugin-markdown/index.js';
|
||||||
import astroScannerPlugin from '../vite-plugin-scanner/index.js';
|
import astroScannerPlugin from '../vite-plugin-scanner/index.js';
|
||||||
import astroScriptsPlugin from '../vite-plugin-scripts/index.js';
|
import astroScriptsPlugin from '../vite-plugin-scripts/index.js';
|
||||||
import astroScriptsPageSSRPlugin from '../vite-plugin-scripts/page-ssr.js';
|
import astroScriptsPageSSRPlugin from '../vite-plugin-scripts/page-ssr.js';
|
||||||
|
import { vitePluginSSRManifest } from '../vite-plugin-ssr-manifest/index.js';
|
||||||
|
|
||||||
interface CreateViteOptions {
|
interface CreateViteOptions {
|
||||||
settings: AstroSettings;
|
settings: AstroSettings;
|
||||||
|
@ -116,6 +117,7 @@ export async function createVite(
|
||||||
astroContentVirtualModPlugin({ settings }),
|
astroContentVirtualModPlugin({ settings }),
|
||||||
astroContentImportPlugin({ fs, settings }),
|
astroContentImportPlugin({ fs, settings }),
|
||||||
astroContentAssetPropagationPlugin({ mode }),
|
astroContentAssetPropagationPlugin({ mode }),
|
||||||
|
vitePluginSSRManifest(),
|
||||||
settings.config.experimental.assets ? [astroAssetsPlugin({ settings, logging, mode })] : [],
|
settings.config.experimental.assets ? [astroAssetsPlugin({ settings, logging, mode })] : [],
|
||||||
],
|
],
|
||||||
publicDir: fileURLToPath(settings.config.publicDir),
|
publicDir: fileURLToPath(settings.config.publicDir),
|
||||||
|
|
|
@ -50,7 +50,8 @@ export default function createVitePluginAstroServer({
|
||||||
handle: baseMiddleware(settings, logging),
|
handle: baseMiddleware(settings, logging),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
viteServer.middlewares.use(async (req, res) => {
|
// Note that this function has a name so other middleware can find it.
|
||||||
|
viteServer.middlewares.use(async function astroDevHandler(req, res) {
|
||||||
if (req.url === undefined || !req.method) {
|
if (req.url === undefined || !req.method) {
|
||||||
res.writeHead(500, 'Incomplete request');
|
res.writeHead(500, 'Incomplete request');
|
||||||
res.end();
|
res.end();
|
||||||
|
|
26
packages/astro/src/vite-plugin-ssr-manifest/index.ts
Normal file
26
packages/astro/src/vite-plugin-ssr-manifest/index.ts
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
import type { Plugin as VitePlugin } from 'vite';
|
||||||
|
|
||||||
|
const manifestVirtualModuleId = 'astro:ssr-manifest';
|
||||||
|
const resolvedManifestVirtualModuleId = '\0' + manifestVirtualModuleId;
|
||||||
|
|
||||||
|
export function vitePluginSSRManifest(): VitePlugin {
|
||||||
|
return {
|
||||||
|
name: '@astrojs/vite-plugin-astro-ssr-manifest',
|
||||||
|
enforce: 'post',
|
||||||
|
resolveId(id, parent) {
|
||||||
|
if(id === manifestVirtualModuleId) {
|
||||||
|
return resolvedManifestVirtualModuleId;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
load(id) {
|
||||||
|
if (id === resolvedManifestVirtualModuleId) {
|
||||||
|
return `export let manifest = {};
|
||||||
|
export function _privateSetManifestDontUseThis(ssrManifest) {
|
||||||
|
manifest = ssrManifest;
|
||||||
|
}`;
|
||||||
|
}
|
||||||
|
return void 0;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
8
packages/astro/test/fixtures/ssr-manifest/package.json
vendored
Normal file
8
packages/astro/test/fixtures/ssr-manifest/package.json
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"name": "@test/ssr-manifest",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"dependencies": {
|
||||||
|
"astro": "workspace:*"
|
||||||
|
}
|
||||||
|
}
|
17
packages/astro/test/fixtures/ssr-manifest/src/pages/index.astro
vendored
Normal file
17
packages/astro/test/fixtures/ssr-manifest/src/pages/index.astro
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
---
|
||||||
|
import { manifest } from 'astro:ssr-manifest';
|
||||||
|
---
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Testing</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: green;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Testing</h1>
|
||||||
|
<div id="assets" set:html={JSON.stringify([...manifest.assets])}></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
30
packages/astro/test/ssr-manifest.test.js
Normal file
30
packages/astro/test/ssr-manifest.test.js
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
|
||||||
|
import { expect } from 'chai';
|
||||||
|
import { loadFixture } from './test-utils.js';
|
||||||
|
import testAdapter from './test-adapter.js';
|
||||||
|
import * as cheerio from 'cheerio';
|
||||||
|
|
||||||
|
describe('astro:ssr-manifest', () => {
|
||||||
|
/** @type {import('./test-utils').Fixture} */
|
||||||
|
let fixture;
|
||||||
|
|
||||||
|
before(async () => {
|
||||||
|
fixture = await loadFixture({
|
||||||
|
root: './fixtures/ssr-manifest/',
|
||||||
|
output: 'server',
|
||||||
|
adapter: testAdapter(),
|
||||||
|
});
|
||||||
|
await fixture.build();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('works', async () => {
|
||||||
|
const app = await fixture.loadTestAdapterApp();
|
||||||
|
const request = new Request('http://example.com/');
|
||||||
|
const response = await app.render(request);
|
||||||
|
const html = await response.text();
|
||||||
|
|
||||||
|
const $ = cheerio.load(html);
|
||||||
|
expect($('#assets').text()).to.equal('["/_astro/index.1bad7273.css"]');
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
6
pnpm-lock.yaml
generated
6
pnpm-lock.yaml
generated
|
@ -2410,6 +2410,12 @@ importers:
|
||||||
dependencies:
|
dependencies:
|
||||||
astro: link:../../..
|
astro: link:../../..
|
||||||
|
|
||||||
|
packages/astro/test/fixtures/ssr-manifest:
|
||||||
|
specifiers:
|
||||||
|
astro: workspace:*
|
||||||
|
dependencies:
|
||||||
|
astro: link:../../..
|
||||||
|
|
||||||
packages/astro/test/fixtures/ssr-markdown:
|
packages/astro/test/fixtures/ssr-markdown:
|
||||||
specifiers:
|
specifiers:
|
||||||
astro: workspace:*
|
astro: workspace:*
|
||||||
|
|
Loading…
Add table
Reference in a new issue