From 308c7e898cad2a0a9b6b36cdb37a1fad9eb11af9 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 16 Aug 2023 11:56:07 +0200 Subject: [PATCH 1/3] feat: preserve prerendered asset `content-type` header --- src/prerender.ts | 12 ++++++++++-- src/rollup/plugins/public-assets.ts | 2 +- src/types/nitro.ts | 2 ++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/prerender.ts b/src/prerender.ts index b868232e79..0db81d8d95 100644 --- a/src/prerender.ts +++ b/src/prerender.ts @@ -4,6 +4,7 @@ import { joinURL, parseURL, withBase, withoutBase } from "ufo"; import chalk from "chalk"; import { createRouter as createRadixRouter, toRouteMatcher } from "radix3"; import { defu } from "defu"; +import mime from "mime"; import { createNitro } from "./nitro"; import { build } from "./build"; import type { Nitro, NitroRouteRules, PrerenderRoute } from "./types"; @@ -49,6 +50,7 @@ export async function prerender(nitro: Nitro) { // Build with prerender preset nitro.logger.info("Initializing prerenderer"); nitro._prerenderedRoutes = []; + nitro._prerenderMeta = nitro._prerenderMeta || {}; const prerendererConfig = { ...nitro.options._config, static: false, @@ -208,17 +210,23 @@ export async function prerender(nitro: Nitro) { _route.generateTimeMS = Date.now() - start; // Guess route type and populate fileName + const contentType = res.headers.get("content-type") || ""; const isImplicitHTML = - !route.endsWith(".html") && - (res.headers.get("content-type") || "").includes("html"); + !route.endsWith(".html") && contentType.includes("html"); const routeWithIndex = route.endsWith("/") ? route + "index" : route; _route.fileName = withoutBase( isImplicitHTML ? joinURL(route, "index.html") : routeWithIndex, nitro.options.baseURL ); + // Allow overriding content-type in `prerender:generate` hook + const inferredContentType = mime.getType(_route.fileName) || "text/plain"; + _route.contentType = contentType || inferredContentType; // Allow hooking before generate await nitro.hooks.callHook("prerender:generate", _route, nitro); + if (_route.contentType !== inferredContentType) { + nitro._prerenderMeta[_route.fileName].contentType = _route.contentType; + } // Check if route is skipped or has errors if (_route.skip || _route.error) { diff --git a/src/rollup/plugins/public-assets.ts b/src/rollup/plugins/public-assets.ts index 43596bc5c8..efe8aef9f3 100644 --- a/src/rollup/plugins/public-assets.ts +++ b/src/rollup/plugins/public-assets.ts @@ -40,7 +40,7 @@ export function publicAssets(nitro: Nitro): Plugin { } assets[assetId] = { - type: mimeType, + type: nitro._prerenderMeta?.[id]?.contentType || mimeType, encoding, etag, mtime: stat.mtime.toJSON(), diff --git a/src/types/nitro.ts b/src/types/nitro.ts index 5217423fcf..ea5bfdf568 100644 --- a/src/types/nitro.ts +++ b/src/types/nitro.ts @@ -60,6 +60,7 @@ export interface Nitro { /* @internal */ _prerenderedRoutes?: PrerenderRoute[]; + _prerenderMeta?: Record; } export interface PrerenderRoute { @@ -70,6 +71,7 @@ export interface PrerenderRoute { error?: Error & { statusCode: number; statusMessage: string }; generateTimeMS?: number; skip?: boolean; + contentType?: string; } /** @deprecated Internal type will be removed in future versions */ From 2ce96d77e80427af4a75f3760e77a712b47d0028 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 16 Aug 2023 11:57:55 +0200 Subject: [PATCH 2/3] fix: initialise meta --- src/prerender.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/prerender.ts b/src/prerender.ts index 0db81d8d95..96e6f40739 100644 --- a/src/prerender.ts +++ b/src/prerender.ts @@ -225,6 +225,7 @@ export async function prerender(nitro: Nitro) { // Allow hooking before generate await nitro.hooks.callHook("prerender:generate", _route, nitro); if (_route.contentType !== inferredContentType) { + nitro._prerenderMeta[_route.fileName] ||= {} nitro._prerenderMeta[_route.fileName].contentType = _route.contentType; } From 5de0d06628e4ecaaed933508efd0cf87f67d64e2 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 16 Aug 2023 09:59:29 +0000 Subject: [PATCH 3/3] chore: apply automated lint fixes --- src/prerender.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/prerender.ts b/src/prerender.ts index 96e6f40739..a800ccc636 100644 --- a/src/prerender.ts +++ b/src/prerender.ts @@ -225,7 +225,7 @@ export async function prerender(nitro: Nitro) { // Allow hooking before generate await nitro.hooks.callHook("prerender:generate", _route, nitro); if (_route.contentType !== inferredContentType) { - nitro._prerenderMeta[_route.fileName] ||= {} + nitro._prerenderMeta[_route.fileName] ||= {}; nitro._prerenderMeta[_route.fileName].contentType = _route.contentType; }