import { BUILD_MANIFEST, REACT_LOADABLE_MANIFEST, } from '../shared/lib/constants' import { join } from 'path' import { requirePage } from './require' import { BuildManifest } from './get-page-files' import { AppType, DocumentType } from '../shared/lib/utils' import { interopDefault } from '../lib/interop-default' import { PageConfig, GetStaticPaths, GetServerSideProps, GetStaticProps, } from 'next/types' export type ManifestItem = { id: number | string files: string[] } export type ReactLoadableManifest = { [moduleId: string]: ManifestItem } export type LoadComponentsReturnType = { Component: React.ComponentType pageConfig: PageConfig buildManifest: BuildManifest reactLoadableManifest: ReactLoadableManifest Document: DocumentType App: AppType getStaticProps?: GetStaticProps getStaticPaths?: GetStaticPaths getServerSideProps?: GetServerSideProps ComponentMod: any } export async function loadDefaultErrorComponents(distDir: string) { const Document = interopDefault(require('next/dist/pages/_document')) const App = interopDefault(require('next/dist/pages/_app')) const ComponentMod = require('next/dist/pages/_error') const Component = interopDefault(ComponentMod) return { App, Document, Component, pageConfig: {}, buildManifest: require(join(distDir, `fallback-${BUILD_MANIFEST}`)), reactLoadableManifest: {}, ComponentMod, } } export async function loadComponents( distDir: string, pathname: string, serverless: boolean ): Promise { if (serverless) { const ComponentMod = await requirePage(pathname, distDir, serverless) if (typeof ComponentMod === 'string') { return { Component: ComponentMod as any, pageConfig: {}, ComponentMod, } as LoadComponentsReturnType } let { default: Component, getStaticProps, getStaticPaths, getServerSideProps, } = ComponentMod Component = await Component getStaticProps = await getStaticProps getStaticPaths = await getStaticPaths getServerSideProps = await getServerSideProps const pageConfig = (await ComponentMod.config) || {} return { Component, pageConfig, getStaticProps, getStaticPaths, getServerSideProps, ComponentMod, } as LoadComponentsReturnType } const [DocumentMod, AppMod, ComponentMod] = await Promise.all([ requirePage('/_document', distDir, serverless), requirePage('/_app', distDir, serverless), requirePage(pathname, distDir, serverless), ]) const [buildManifest, reactLoadableManifest] = await Promise.all([ require(join(distDir, BUILD_MANIFEST)), require(join(distDir, REACT_LOADABLE_MANIFEST)), ]) const Component = interopDefault(ComponentMod) const Document = interopDefault(DocumentMod) const App = interopDefault(AppMod) const { getServerSideProps, getStaticProps, getStaticPaths } = ComponentMod return { App, Document, Component, buildManifest, reactLoadableManifest, pageConfig: ComponentMod.config || {}, ComponentMod, getServerSideProps, getStaticProps, getStaticPaths, } }