2022-01-26 07:22:11 +01:00
|
|
|
import type { NextConfig } from '../../../../server/config-shared'
|
2022-02-01 23:36:47 +01:00
|
|
|
import type { DocumentType, AppType } from '../../../../shared/lib/utils'
|
|
|
|
import type { BuildManifest } from '../../../../server/get-page-files'
|
|
|
|
import type { ReactLoadableManifest } from '../../../../server/load-components'
|
2022-01-26 07:22:11 +01:00
|
|
|
|
2021-11-16 21:43:57 +01:00
|
|
|
import { NextRequest } from '../../../../server/web/spec-extension/request'
|
|
|
|
|
2022-01-26 07:22:11 +01:00
|
|
|
import WebServer from '../../../../server/web-server'
|
2022-02-11 20:56:25 +01:00
|
|
|
import {
|
|
|
|
WebNextRequest,
|
|
|
|
WebNextResponse,
|
|
|
|
} from '../../../../server/base-http/web'
|
2022-01-26 07:22:11 +01:00
|
|
|
|
2022-02-01 23:36:47 +01:00
|
|
|
// Polyfilled for `path-browserify` inside the Web Server.
|
|
|
|
process.cwd = () => ''
|
|
|
|
|
2021-11-16 21:43:57 +01:00
|
|
|
export function getRender({
|
2022-02-01 23:36:47 +01:00
|
|
|
dev,
|
|
|
|
page,
|
|
|
|
pageMod,
|
|
|
|
errorMod,
|
|
|
|
error500Mod,
|
2021-11-16 21:43:57 +01:00
|
|
|
Document,
|
2022-02-01 23:36:47 +01:00
|
|
|
App,
|
|
|
|
buildManifest,
|
|
|
|
reactLoadableManifest,
|
|
|
|
serverComponentManifest,
|
2021-11-16 21:43:57 +01:00
|
|
|
isServerComponent,
|
2022-01-26 07:22:11 +01:00
|
|
|
config,
|
2022-02-01 23:36:47 +01:00
|
|
|
buildId,
|
2021-11-16 21:43:57 +01:00
|
|
|
}: {
|
2022-02-01 23:36:47 +01:00
|
|
|
dev: boolean
|
|
|
|
page: string
|
|
|
|
pageMod: any
|
|
|
|
errorMod: any
|
|
|
|
error500Mod: any
|
|
|
|
Document: DocumentType
|
|
|
|
App: AppType
|
|
|
|
buildManifest: BuildManifest
|
|
|
|
reactLoadableManifest: ReactLoadableManifest
|
|
|
|
serverComponentManifest: any | null
|
2021-11-16 21:43:57 +01:00
|
|
|
isServerComponent: boolean
|
2022-01-26 07:22:11 +01:00
|
|
|
config: NextConfig
|
2022-02-01 23:36:47 +01:00
|
|
|
buildId: string
|
2021-11-16 21:43:57 +01:00
|
|
|
}) {
|
2022-02-01 23:36:47 +01:00
|
|
|
const baseLoadComponentResult = {
|
|
|
|
dev,
|
|
|
|
buildManifest,
|
|
|
|
reactLoadableManifest,
|
|
|
|
Document,
|
|
|
|
App,
|
|
|
|
}
|
|
|
|
|
2022-01-26 07:22:11 +01:00
|
|
|
const server = new WebServer({
|
|
|
|
conf: config,
|
|
|
|
minimalMode: true,
|
2022-02-01 23:36:47 +01:00
|
|
|
webServerConfig: {
|
|
|
|
extendRenderOpts: {
|
|
|
|
buildId,
|
2022-02-14 17:18:57 +01:00
|
|
|
reactRoot: true,
|
2022-02-08 14:16:46 +01:00
|
|
|
runtime: 'edge',
|
2022-02-01 23:36:47 +01:00
|
|
|
supportsDynamicHTML: true,
|
|
|
|
disableOptimizedLoading: true,
|
|
|
|
serverComponentManifest,
|
|
|
|
},
|
|
|
|
loadComponent: async (pathname) => {
|
|
|
|
if (pathname === page) {
|
|
|
|
return {
|
|
|
|
...baseLoadComponentResult,
|
|
|
|
Component: pageMod.default,
|
|
|
|
pageConfig: pageMod.config || {},
|
|
|
|
getStaticProps: pageMod.getStaticProps,
|
|
|
|
getServerSideProps: pageMod.getServerSideProps,
|
|
|
|
getStaticPaths: pageMod.getStaticPaths,
|
|
|
|
ComponentMod: pageMod,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// If there is a custom 500 page, we need to handle it separately.
|
|
|
|
if (pathname === '/500' && error500Mod) {
|
|
|
|
return {
|
|
|
|
...baseLoadComponentResult,
|
|
|
|
Component: error500Mod.default,
|
|
|
|
pageConfig: error500Mod.config || {},
|
|
|
|
getStaticProps: error500Mod.getStaticProps,
|
|
|
|
getServerSideProps: error500Mod.getServerSideProps,
|
|
|
|
getStaticPaths: error500Mod.getStaticPaths,
|
|
|
|
ComponentMod: error500Mod,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pathname === '/_error') {
|
|
|
|
return {
|
|
|
|
...baseLoadComponentResult,
|
|
|
|
Component: errorMod.default,
|
|
|
|
pageConfig: errorMod.config || {},
|
|
|
|
getStaticProps: errorMod.getStaticProps,
|
|
|
|
getServerSideProps: errorMod.getServerSideProps,
|
|
|
|
getStaticPaths: errorMod.getStaticPaths,
|
|
|
|
ComponentMod: errorMod,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null
|
|
|
|
},
|
|
|
|
},
|
2022-01-26 07:22:11 +01:00
|
|
|
})
|
|
|
|
const requestHandler = server.getRequestHandler()
|
|
|
|
|
2021-11-16 21:43:57 +01:00
|
|
|
return async function render(request: NextRequest) {
|
2022-02-19 22:13:48 +01:00
|
|
|
const { nextUrl: url } = request
|
|
|
|
const { searchParams } = url
|
2021-11-16 21:43:57 +01:00
|
|
|
const query = Object.fromEntries(searchParams)
|
|
|
|
|
|
|
|
// Preflight request
|
|
|
|
if (request.method === 'HEAD') {
|
2022-02-19 22:13:48 +01:00
|
|
|
// Hint the client that the matched route is a SSR page.
|
2021-11-22 19:53:22 +01:00
|
|
|
return new Response(null, {
|
2022-02-19 22:13:48 +01:00
|
|
|
headers: {
|
|
|
|
'x-middleware-ssr': '1',
|
|
|
|
},
|
2021-11-16 21:43:57 +01:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
const renderServerComponentData = isServerComponent
|
|
|
|
? query.__flight__ !== undefined
|
|
|
|
: false
|
2021-12-10 11:22:31 +01:00
|
|
|
|
|
|
|
const serverComponentProps =
|
|
|
|
isServerComponent && query.__props__
|
|
|
|
? JSON.parse(query.__props__)
|
|
|
|
: undefined
|
|
|
|
|
2022-02-01 23:36:47 +01:00
|
|
|
// Extend the render options.
|
|
|
|
server.updateRenderOpts({
|
2021-11-16 21:43:57 +01:00
|
|
|
renderServerComponentData,
|
2021-12-10 11:22:31 +01:00
|
|
|
serverComponentProps,
|
2021-11-16 21:43:57 +01:00
|
|
|
})
|
2022-01-26 07:22:11 +01:00
|
|
|
|
|
|
|
const extendedReq = new WebNextRequest(request)
|
|
|
|
const extendedRes = new WebNextResponse()
|
|
|
|
requestHandler(extendedReq, extendedRes)
|
|
|
|
return await extendedRes.toResponse()
|
2021-11-16 21:43:57 +01:00
|
|
|
}
|
|
|
|
}
|