UNPKG

vike

Version:

The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.

61 lines (60 loc) 2.89 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.addSsrMiddleware = addSsrMiddleware; const renderPage_js_1 = require("../../runtime/renderPage.js"); const utils_js_1 = require("../utils.js"); const picocolors_1 = __importDefault(require("@brillout/picocolors")); function addSsrMiddleware(middlewares, config, isPreview, isPrerenderingEnabled) { middlewares.use(async (req, res, next) => { if (res.headersSent) return next(); const url = req.originalUrl || req.url; if (!url) return next(); const { headers } = req; const pageContextInit = { urlOriginal: url, headersOriginal: headers, }; Object.defineProperty(pageContextInit, 'userAgent', { get() { // TODO/next-major-release: assertUsage() instead of assertWarning() (0, utils_js_1.assertWarning)(false, `${picocolors_1.default.cyan('pageContext.userAgent')} is deprecated: use ${picocolors_1.default.cyan("pageContext.headers['user-agent']")} instead.`, { showStackTrace: true, onlyOnce: true, }); return headers['user-agent']; }, enumerable: false, }); let pageContext; try { pageContext = await (0, renderPage_js_1.renderPage)(pageContextInit); } catch (err) { // Throwing an error in a connect middleware shut downs the server console.error(err); // - next(err) automatically uses buildErrorMessage() (pretty formatting of Rollup errors) // - But it only works for users using Vite's standalone dev server (it doesn't work for users using Vite's dev middleware) // - We purposely don't use next(err) to align behavior: we use our own/copied implementation of buildErrorMessage() regardless of whether the user uses Vite's dev middleware or Vite's standalone dev server return next(); } if (pageContext.httpResponse.statusCode === 404 && isPreview && isPrerenderingEnabled) { // Serve /dist/client/404.html instead return next(); } const configHeaders = (isPreview && config?.preview?.headers) || config?.server?.headers; if (configHeaders) { for (const [name, value] of Object.entries(configHeaders)) if (value) res.setHeader(name, value); } const { httpResponse } = pageContext; httpResponse.headers.forEach(([name, value]) => res.setHeader(name, value)); res.statusCode = httpResponse.statusCode; httpResponse.pipe(res); }); }