vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
117 lines (116 loc) • 5.75 kB
JavaScript
export { createHttpResponsePage };
export { createHttpResponsePageContextJson };
export { createHttpResponseError };
export { createHttpResponseErrorWithoutGlobalContext };
export { createHttpResponseRedirect };
export { createHttpResponse404 };
export { createHttpResponseBaseIsMissing };
import { assert, assertWarning, escapeHtml } from '../utils.js';
import { getErrorPageId, isErrorPage } from '../../../shared/error-page.js';
import { getHttpResponseBody, getHttpResponseBodyStreamHandlers } from './getHttpResponseBody.js';
import { getEarlyHints } from './getEarlyHints.js';
import { getCacheControl } from './createHttpResponse/getCacheControl.js';
import { assertNoInfiniteHttpRedirect } from './createHttpResponse/assertNoInfiniteHttpRedirect.js';
async function createHttpResponsePage(htmlRender, renderHook, pageContext) {
let statusCode = pageContext.abortStatusCode;
if (!statusCode) {
const isError = !pageContext.pageId || isErrorPage(pageContext.pageId, pageContext._globalContext._pageConfigs);
if (pageContext.errorWhileRendering) {
assert(isError);
}
if (!isError) {
assert(pageContext.is404 === null);
statusCode = 200;
}
else {
assert(pageContext.is404 === true || pageContext.is404 === false);
statusCode = pageContext.is404 ? 404 : 500;
}
}
const earlyHints = getEarlyHints(await pageContext.__getPageAssets());
const headers = [];
const cacheControl = getCacheControl(pageContext.pageId, pageContext._globalContext._pageConfigs, statusCode);
if (cacheControl) {
headers.push(['Cache-Control', cacheControl]);
}
return createHttpResponse(statusCode, 'text/html;charset=utf-8', headers, htmlRender, earlyHints, renderHook);
}
function createHttpResponse404(errMsg404) {
const httpResponse = createHttpResponse(404, 'text/html;charset=utf-8', [], `<p>${errMsg404}.</p><script>console.log('This HTML was generated by Vike.')</script>`);
return httpResponse;
}
function createHttpResponseBaseIsMissing(urlOriginal, baseServer) {
const httpResponse = createHttpResponse(
// We use the error code `500` to signal a failing state because this HTTP response should never be used, see https://vike.dev/base-url#setup
// In other words: this HTTP response is expected to be generated but isn't expected to be actually used.
500, 'text/html;charset=utf-8', [], `
<h1>Error: Base URL is missing</h1>
<p>
<a href="https://vike.dev/renderPage"><code>renderPage(pageContextInit)</code></a> called with <code>pageContextInit.urlOriginal===${JSON.stringify(urlOriginal)}</code> which doesn't start with the Base URL <code>${baseServer}</code>.
</p>
<p>
See <a href="https://vike.dev/base-url#setup">vike.dev/base-url#setup</a> for how to properly setup your server while using a Base URL.
</p>
<style>
code {
font-family: monospace;
background-color: #eaeaea;
padding: 3px 5px;
border-radius: 4px;
}
</style>
`);
return httpResponse;
}
function createHttpResponseError(pageContext) {
const reason = (() => {
const errorPageId = getErrorPageId(pageContext._globalContext._pageFilesAll, pageContext._globalContext._pageConfigs);
if (errorPageId) {
return "the error page (https://vike.dev/error-page) couldn't be rendered (for example if an error occurred while rendering the error page)";
}
else {
return 'no error page (https://vike.dev/error-page) is defined, make sure to create one';
}
})();
return createHttpResponseError_(reason);
}
function createHttpResponseErrorWithoutGlobalContext() {
return createHttpResponseError_('no error page (https://vike.dev/error-page) could be rendered');
}
function createHttpResponseError_(reason) {
const httpResponse = createHttpResponse(500, 'text/html;charset=utf-8', [], `<p>An error occurred.</p><script>console.log(${JSON.stringify(`This HTML was generated by Vike. Vike returned this HTML because ${reason}.`)})</script>`);
return httpResponse;
}
async function createHttpResponsePageContextJson(pageContextSerialized) {
const httpResponse = createHttpResponse(200, 'application/json', [], pageContextSerialized, [], null);
return httpResponse;
}
function createHttpResponseRedirect({ url, statusCode }, pageContextInit) {
assertNoInfiniteHttpRedirect(url, pageContextInit);
assert(url);
assert(statusCode);
assert(300 <= statusCode && statusCode <= 399);
const headers = [['Location', url]];
return createHttpResponse(statusCode, 'text/html;charset=utf-8', headers,
// For bots / programmatic crawlig: show what's going on.
// For users: showing a blank page is probably better than a flickering text.
`<p style="display: none">Redirecting to ${escapeHtml(url)}</p><script>console.log('This HTML was generated by Vike.')</script>`);
}
function createHttpResponse(statusCode, contentType, headers, htmlRender, earlyHints = [], renderHook = null) {
headers.push(['Content-Type', contentType]);
assert(renderHook || typeof htmlRender === 'string');
return {
statusCode,
headers,
// TODO/v1-release: remove
get contentType() {
assertWarning(false, 'pageContext.httpResponse.contentType is deprecated and will be removed in the next major release. Use pageContext.httpResponse.headers instead, see https://vike.dev/migration/0.4.134', { onlyOnce: true });
return contentType;
},
earlyHints,
get body() {
return getHttpResponseBody(htmlRender, renderHook);
},
...getHttpResponseBodyStreamHandlers(htmlRender, renderHook),
};
}