123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.getPageHandler = getPageHandler;
- var _url = require("url");
- var _utils = require("../../../../shared/lib/utils");
- var _sendPayload = require("../../../../server/send-payload");
- var _utils1 = require("./utils");
- var _render = require("../../../../server/render");
- var _node = require("../../../../server/api-utils/node");
- var _denormalizePagePath = require("../../../../shared/lib/page-path/denormalize-page-path");
- var _apiUtils = require("../../../../server/api-utils");
- var _redirectStatus = require("../../../../lib/redirect-status");
- var _getRouteFromAssetPath = _interopRequireDefault(require("../../../../shared/lib/router/utils/get-route-from-asset-path"));
- var _constants = require("../../../../shared/lib/constants");
- var _renderResult = _interopRequireDefault(require("../../../../server/render-result"));
- var _isError = _interopRequireDefault(require("../../../../lib/is-error"));
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : {
- default: obj
- };
- }
- function getPageHandler(ctx) {
- const { page , pageComponent , pageConfig , pageGetStaticProps , pageGetStaticPaths , pageGetServerSideProps , appModule , documentModule , errorModule , notFoundModule , encodedPreviewProps , pageIsDynamic , generateEtags , poweredByHeader , runtimeConfig , buildManifest , reactLoadableManifest , i18n , buildId , basePath , assetPrefix , canonicalBase , escapedBuildId , } = ctx;
- const { handleLocale , handleRewrites , handleBasePath , defaultRouteRegex , dynamicRouteMatcher , interpolateDynamicPath , getParamsFromRouteMatches , normalizeDynamicRouteParams , normalizeVercelUrl , } = (0, _utils1).getUtils(ctx);
- async function renderReqToHTML(req, res, renderMode, _renderOpts, _params) {
- let Component;
- let App;
- let config;
- let Document;
- let Error;
- let notFoundMod;
- let getStaticProps;
- let getStaticPaths;
- let getServerSideProps;
- [getStaticProps, getServerSideProps, getStaticPaths, Component, App, config, { default: Document }, { default: Error }, notFoundMod, ] = await Promise.all([
- pageGetStaticProps,
- pageGetServerSideProps,
- pageGetStaticPaths,
- pageComponent,
- appModule,
- pageConfig,
- documentModule,
- errorModule,
- notFoundModule,
- ]);
- const fromExport = renderMode === "export" || renderMode === true;
- const nextStartMode = renderMode === "passthrough";
- let hasValidParams = true;
- (0, _apiUtils).setLazyProp({
- req: req
- }, "cookies", (0, _apiUtils).getCookieParser(req.headers));
- const options = {
- App,
- Document,
- ComponentMod: {
- default: Component
- },
- buildManifest,
- getStaticProps,
- getServerSideProps,
- getStaticPaths,
- reactLoadableManifest,
- canonicalBase,
- buildId,
- assetPrefix,
- runtimeConfig: (runtimeConfig || {}).publicRuntimeConfig || {},
- previewProps: encodedPreviewProps,
- env: process.env,
- basePath,
- supportsDynamicHTML: false,
- ..._renderOpts
- };
- let _nextData = false;
- let defaultLocale = i18n == null ? void 0 : i18n.defaultLocale;
- let detectedLocale = i18n == null ? void 0 : i18n.defaultLocale;
- let parsedUrl;
- try {
- var ref;
- // We need to trust the dynamic route params from the proxy
- // to ensure we are using the correct values
- const trustQuery = !getStaticProps && req.headers[_utils1.vercelHeader];
- parsedUrl = (0, _url).parse(req.url, true);
- let routeNoAssetPath = parsedUrl.pathname;
- if (basePath) {
- routeNoAssetPath = routeNoAssetPath.replace(new RegExp(`^${basePath}`), "") || "/";
- }
- const origQuery = Object.assign({}, parsedUrl.query);
- handleRewrites(req, parsedUrl);
- handleBasePath(req, parsedUrl);
- // remove ?amp=1 from request URL if rendering for export
- if (fromExport && parsedUrl.query.amp) {
- const queryNoAmp = Object.assign({}, origQuery);
- delete queryNoAmp.amp;
- req.url = (0, _url).format({
- ...parsedUrl,
- search: undefined,
- query: queryNoAmp
- });
- }
- if (parsedUrl.pathname.match(/_next\/data/)) {
- _nextData = page !== "/_error";
- parsedUrl.pathname = (0, _getRouteFromAssetPath).default(parsedUrl.pathname.replace(new RegExp(`/_next/data/${escapedBuildId}/`), "/"), ".json");
- routeNoAssetPath = parsedUrl.pathname;
- }
- const localeResult = handleLocale(req, res, parsedUrl, routeNoAssetPath, fromExport || nextStartMode);
- defaultLocale = (localeResult == null ? void 0 : localeResult.defaultLocale) || defaultLocale;
- detectedLocale = (localeResult == null ? void 0 : localeResult.detectedLocale) || detectedLocale;
- routeNoAssetPath = (localeResult == null ? void 0 : localeResult.routeNoAssetPath) || routeNoAssetPath;
- if (parsedUrl.query.nextInternalLocale) {
- detectedLocale = parsedUrl.query.nextInternalLocale;
- delete parsedUrl.query.nextInternalLocale;
- }
- const renderOpts = Object.assign({
- Component,
- pageConfig: config,
- nextExport: fromExport,
- isDataReq: _nextData,
- locales: i18n == null ? void 0 : i18n.locales,
- locale: detectedLocale,
- defaultLocale,
- domainLocales: i18n == null ? void 0 : i18n.domains,
- optimizeCss: process.env.__NEXT_OPTIMIZE_CSS,
- nextScriptWorkers: process.env.__NEXT_SCRIPT_WORKERS,
- crossOrigin: process.env.__NEXT_CROSS_ORIGIN
- }, options);
- if (page === "/_error" && !res.statusCode) {
- res.statusCode = 404;
- }
- let params = {};
- if (!fromExport && pageIsDynamic) {
- const result = normalizeDynamicRouteParams(trustQuery ? parsedUrl.query : dynamicRouteMatcher(parsedUrl.pathname));
- hasValidParams = result.hasValidParams;
- params = result.params;
- }
- let nowParams = null;
- if (pageIsDynamic && !hasValidParams && ((ref = req.headers) == null ? void 0 : ref["x-now-route-matches"])) {
- nowParams = getParamsFromRouteMatches(req, renderOpts, detectedLocale);
- }
- // make sure to set renderOpts to the correct params e.g. _params
- // if provided from worker or params if we're parsing them here
- renderOpts.params = _params || params;
- normalizeVercelUrl(req, !!trustQuery);
- // normalize request URL/asPath for fallback/revalidate pages since the
- // proxy sets the request URL to the output's path for fallback pages
- if (pageIsDynamic && nowParams && defaultRouteRegex) {
- const _parsedUrl = (0, _url).parse(req.url);
- _parsedUrl.pathname = interpolateDynamicPath(_parsedUrl.pathname, nowParams);
- parsedUrl.pathname = _parsedUrl.pathname;
- req.url = (0, _url).format(_parsedUrl);
- }
- // make sure to normalize asPath for revalidate and _next/data requests
- // since the asPath should match what is shown on the client
- if (!fromExport && (getStaticProps || getServerSideProps)) {
- // don't include dynamic route params in query while normalizing
- // asPath
- if (pageIsDynamic && defaultRouteRegex) {
- delete parsedUrl.search;
- for (const param of Object.keys(defaultRouteRegex.groups)){
- delete origQuery[param];
- }
- }
- parsedUrl.pathname = (0, _denormalizePagePath).denormalizePagePath(parsedUrl.pathname);
- renderOpts.resolvedUrl = (0, _url).format({
- ...parsedUrl,
- query: origQuery
- });
- // For getServerSideProps we need to ensure we use the original URL
- // and not the resolved URL to prevent a hydration mismatch on asPath
- renderOpts.resolvedAsPath = getServerSideProps ? (0, _url).format({
- ...parsedUrl,
- pathname: routeNoAssetPath,
- query: origQuery
- }) : renderOpts.resolvedUrl;
- }
- const isFallback = parsedUrl.query.__nextFallback;
- const previewData = (0, _node).tryGetPreviewData(req, res, options.previewProps);
- const isPreviewMode = previewData !== false;
- if (process.env.__NEXT_OPTIMIZE_FONTS) {
- renderOpts.optimizeFonts = process.env.__NEXT_OPTIMIZE_FONTS;
- /**
- * __webpack_require__.__NEXT_FONT_MANIFEST__ is added by
- * font-stylesheet-gathering-plugin
- */ // @ts-ignore
- renderOpts.fontManifest = __webpack_require__.__NEXT_FONT_MANIFEST__;
- }
- let result = await (0, _render).renderToHTML(req, res, page, Object.assign({}, getStaticProps ? {
- ...parsedUrl.query.amp ? {
- amp: "1"
- } : {}
- } : parsedUrl.query, nowParams ? nowParams : params, _params, isFallback ? {
- __nextFallback: "true"
- } : {}), renderOpts);
- if (!renderMode) {
- if (_nextData || getStaticProps || getServerSideProps) {
- if (renderOpts.isNotFound) {
- res.statusCode = 404;
- if (_nextData) {
- res.end('{"notFound":true}');
- return null;
- }
- const NotFoundComponent = notFoundMod ? notFoundMod.default : Error;
- const errPathname = notFoundMod ? "/404" : "/_error";
- const result2 = await (0, _render).renderToHTML(req, res, errPathname, parsedUrl.query, Object.assign({}, options, {
- getStaticProps: notFoundMod ? notFoundMod.getStaticProps : undefined,
- getStaticPaths: undefined,
- getServerSideProps: undefined,
- Component: NotFoundComponent,
- err: undefined,
- locale: detectedLocale,
- locales: i18n == null ? void 0 : i18n.locales,
- defaultLocale: i18n == null ? void 0 : i18n.defaultLocale
- }));
- (0, _sendPayload).sendRenderResult({
- req,
- res,
- result: result2 != null ? result2 : _renderResult.default.empty,
- type: "html",
- generateEtags,
- poweredByHeader,
- options: {
- private: isPreviewMode || page === "/404",
- stateful: !!getServerSideProps,
- revalidate: renderOpts.revalidate
- }
- });
- return null;
- } else if (renderOpts.isRedirect && !_nextData) {
- const redirect = {
- destination: renderOpts.pageData.pageProps.__N_REDIRECT,
- statusCode: renderOpts.pageData.pageProps.__N_REDIRECT_STATUS,
- basePath: renderOpts.pageData.pageProps.__N_REDIRECT_BASE_PATH
- };
- const statusCode = (0, _redirectStatus).getRedirectStatus(redirect);
- if (basePath && redirect.basePath !== false && redirect.destination.startsWith("/")) {
- redirect.destination = `${basePath}${redirect.destination}`;
- }
- if (statusCode === _constants.PERMANENT_REDIRECT_STATUS) {
- res.setHeader("Refresh", `0;url=${redirect.destination}`);
- }
- res.statusCode = statusCode;
- res.setHeader("Location", redirect.destination);
- res.end(redirect.destination);
- return null;
- } else {
- (0, _sendPayload).sendRenderResult({
- req,
- res,
- result: _nextData ? _renderResult.default.fromStatic(JSON.stringify(renderOpts.pageData)) : result != null ? result : _renderResult.default.empty,
- type: _nextData ? "json" : "html",
- generateEtags,
- poweredByHeader,
- options: {
- private: isPreviewMode || renderOpts.is404Page,
- stateful: !!getServerSideProps,
- revalidate: renderOpts.revalidate
- }
- });
- return null;
- }
- }
- } else if (isPreviewMode) {
- res.setHeader("Cache-Control", "private, no-cache, no-store, max-age=0, must-revalidate");
- }
- if (renderMode) return {
- html: result,
- renderOpts
- };
- return result ? result.toUnchunkedString() : null;
- } catch (err) {
- if (!parsedUrl) {
- parsedUrl = (0, _url).parse(req.url, true);
- }
- if ((0, _isError).default(err) && err.code === "ENOENT") {
- res.statusCode = 404;
- } else if (err instanceof _utils.DecodeError) {
- res.statusCode = 400;
- } else {
- console.error("Unhandled error during request:", err);
- // Backwards compat (call getInitialProps in custom error):
- try {
- await (0, _render).renderToHTML(req, res, "/_error", parsedUrl.query, Object.assign({}, options, {
- getStaticProps: undefined,
- getStaticPaths: undefined,
- getServerSideProps: undefined,
- Component: Error,
- err: err,
- // Short-circuit rendering:
- isDataReq: true
- }));
- } catch (underErrorErr) {
- console.error("Failed call /_error subroutine, continuing to crash function:", underErrorErr);
- }
- // Throw the error to crash the serverless function
- if ((0, _utils).isResSent(res)) {
- console.error("!!! WARNING !!!");
- console.error("Your function crashed, but closed the response before allowing the function to exit.\\n" + "This may cause unexpected behavior for the next request.");
- console.error("!!! WARNING !!!");
- }
- throw err;
- }
- const result2 = await (0, _render).renderToHTML(req, res, "/_error", parsedUrl.query, Object.assign({}, options, {
- getStaticProps: undefined,
- getStaticPaths: undefined,
- getServerSideProps: undefined,
- Component: Error,
- err: res.statusCode === 404 ? undefined : err
- }));
- return result2 ? result2.toUnchunkedString() : null;
- }
- }
- return {
- renderReqToHTML,
- render: async function render(req, res) {
- try {
- const html = await renderReqToHTML(req, res);
- if (html) {
- (0, _sendPayload).sendRenderResult({
- req,
- res,
- result: _renderResult.default.fromStatic(html),
- type: "html",
- generateEtags,
- poweredByHeader
- });
- }
- } catch (err) {
- console.error(err);
- // Throw the error to crash the serverless function
- throw err;
- }
- }
- };
- }
- //# sourceMappingURL=page-handler.js.map
|