UNPKG

vike

Version:

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

138 lines (137 loc) 7.54 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getHttpResponseBody = getHttpResponseBody; exports.getHttpResponseBodyStreamHandlers = getHttpResponseBodyStreamHandlers; const stream_js_1 = require("../html/stream.js"); const utils_js_1 = require("../utils.js"); const renderHtml_js_1 = require("../html/renderHtml.js"); const picocolors_1 = __importDefault(require("@brillout/picocolors")); const streamDocs = 'See https://vike.dev/streaming for more information.'; function getHttpResponseBody(htmlRender, renderHook) { if (typeof htmlRender !== 'string') { (0, utils_js_1.assertUsage)(false, getErrMsg(htmlRender, renderHook, 'body', `Use ${picocolors_1.default.cyan('pageContext.httpResponse.pipe()')} instead`)); } const body = htmlRender; return body; } function getHttpResponseBodyStreamHandlers(htmlRender, renderHook) { return { pipe(writable) { const getErrMsgMixingStreamTypes = (writableType) => `The ${getErrMsgBody(htmlRender, renderHook)} while a ${writableType} was passed to pageContext.httpResponse.pipe() which is contradictory. You cannot mix a Web Stream with a Node.js Stream.`; if ((0, stream_js_1.isStreamWritableWeb)(writable)) { const success = (0, stream_js_1.pipeToStreamWritableWeb)(htmlRender, writable); if (success) { return; } else { (0, utils_js_1.assert)((0, stream_js_1.isStreamReadableNode)(htmlRender) || (0, stream_js_1.isStreamPipeNode)(htmlRender)); (0, utils_js_1.assertUsage)(false, getErrMsgMixingStreamTypes('Web Writable')); } } if ((0, stream_js_1.isStreamWritableNode)(writable)) { const success = (0, stream_js_1.pipeToStreamWritableNode)(htmlRender, writable); if (success) { return; } else { (0, utils_js_1.assert)((0, stream_js_1.isStreamReadableWeb)(htmlRender) || (0, stream_js_1.isStreamPipeWeb)(htmlRender)); (0, utils_js_1.assertUsage)(false, getErrMsgMixingStreamTypes('Node.js Writable')); } } (0, utils_js_1.assertUsage)(false, `The argument ${picocolors_1.default.cyan('writable')} passed to ${picocolors_1.default.cyan('pageContext.httpResponse.pipe(writable)')} doesn't seem to be ${(0, stream_js_1.getStreamName)('writable', 'web')} nor ${(0, stream_js_1.getStreamName)('writable', 'node')}.`); }, getReadableWebStream() { const webStream = (0, stream_js_1.getStreamReadableWeb)(htmlRender); if (webStream === null) { (0, utils_js_1.assertUsage)(false, getErrMsg(htmlRender, renderHook, 'getReadableWebStream()', getFixMsg('readable', 'web'))); } return webStream; }, async getReadableNodeStream() { const nodeStream = await (0, stream_js_1.getStreamReadableNode)(htmlRender); if (nodeStream === null) { (0, utils_js_1.assertUsage)(false, getErrMsg(htmlRender, renderHook, 'getReadableNodeStream()', getFixMsg('readable', 'node'))); } return nodeStream; }, async getBody() { const body = await (0, renderHtml_js_1.getHtmlString)(htmlRender); return body; }, // TODO/v1-release: remove async getNodeStream() { (0, utils_js_1.assertWarning)(false, '`pageContext.httpResponse.getNodeStream()` is outdated, use `pageContext.httpResponse.getReadableNodeStream()` instead. ' + streamDocs, { onlyOnce: true, showStackTrace: true }); const nodeStream = await (0, stream_js_1.getStreamReadableNode)(htmlRender); if (nodeStream === null) { (0, utils_js_1.assertUsage)(false, getErrMsg(htmlRender, renderHook, 'getNodeStream()', getFixMsg('readable', 'node'))); } return nodeStream; }, // TODO/v1-release: remove getWebStream() { (0, utils_js_1.assertWarning)(false, '`pageContext.httpResponse.getWebStream(res)` is outdated, use `pageContext.httpResponse.getReadableWebStream(res)` instead. ' + streamDocs, { onlyOnce: true, showStackTrace: true }); const webStream = (0, stream_js_1.getStreamReadableWeb)(htmlRender); if (webStream === null) { (0, utils_js_1.assertUsage)(false, getErrMsg(htmlRender, renderHook, 'getWebStream()', getFixMsg('readable', 'web'))); } return webStream; }, // TODO/v1-release: remove pipeToWebWritable(writable) { (0, utils_js_1.assertWarning)(false, '`pageContext.httpResponse.pipeToWebWritable(res)` is outdated, use `pageContext.httpResponse.pipe(res)` instead. ' + streamDocs, { onlyOnce: true, showStackTrace: true }); const success = (0, stream_js_1.pipeToStreamWritableWeb)(htmlRender, writable); if (!success) { (0, utils_js_1.assertUsage)(false, getErrMsg(htmlRender, renderHook, 'pipeToWebWritable()')); } }, // TODO/v1-release: remove pipeToNodeWritable(writable) { (0, utils_js_1.assertWarning)(false, '`pageContext.httpResponse.pipeToNodeWritable(res)` is outdated, use `pageContext.httpResponse.pipe(res)` instead. ' + streamDocs, { onlyOnce: true, showStackTrace: true }); const success = (0, stream_js_1.pipeToStreamWritableNode)(htmlRender, writable); if (!success) { (0, utils_js_1.assertUsage)(false, getErrMsg(htmlRender, renderHook, 'pipeToNodeWritable()')); } }, }; function getFixMsg(kind, type) { const streamName = (0, stream_js_1.getStreamName)(kind, type); (0, utils_js_1.assert)(['a ', 'an ', 'the '].some((s) => streamName.startsWith(s))); (0, utils_js_1.assert)(renderHook); const { hookFilePath, hookName } = renderHook; return `Make sure the ${hookName}() hook defined by ${hookFilePath} provides ${streamName} instead`; } } function getErrMsg(htmlRender, renderHook, method, msgAddendum) { (0, utils_js_1.assert)(!msgAddendum || !msgAddendum.endsWith('.')); const errMsgBody = getErrMsgBody(htmlRender, renderHook); return [`pageContext.httpResponse.${method} can't be used because the ${errMsgBody}`, msgAddendum, streamDocs] .filter(Boolean) .join('. '); } function getErrMsgBody(htmlRender, renderHook) { (0, utils_js_1.assert)(renderHook); const { hookFilePath, hookName } = renderHook; const hookReturnType = getHookReturnType(htmlRender); (0, utils_js_1.assert)(['a ', 'an ', 'the '].some((s) => hookReturnType.startsWith(s))); const errMsgBody = `${hookName}()\ hook defined by ${hookFilePath} provides ${hookReturnType}`; (0, utils_js_1.assert)(!errMsgBody.endsWith(' ')); return errMsgBody; } function getHookReturnType(htmlRender) { if (typeof htmlRender === 'string') { return 'an HTML string'; } else if ((0, stream_js_1.isStream)(htmlRender)) { return (0, stream_js_1.inferStreamName)(htmlRender); } else { (0, utils_js_1.assert)(false); } }