85e720a092
* initial commit for SPRv2 * Add initial SPR cache handling * update SPR handling * Implement SPR handling in render * Update tests, handle caching with serverless next start, add TODOs, and update manifest generating * Handle no prerender-manifest from not being used * Fix url.parse error * Apply suggestions from code review Co-Authored-By: Joe Haddad <joe.haddad@zeit.co> * Replace set with constants in next-page-config * simplify sprStatus.used * Add error if getStaticProps is used with getInitialProps * Remove stale TODO * Update revalidate values in SPR cache for non-seeded routes * Apply suggestions from code review * Remove concurrency type * Rename variable for clarity * Add copying prerender files during export * Add comment for clarity * Fix exporting * Update comment * Add additional note * Rename variable * Update to not re-export SPR pages from build * Hard navigate when fetching data fails * Remove default extension * Add brackets * Add checking output files to prerender tests * Adjust export move logic * Clarify behavior of export aggregation * Update variable names for clarity * Update tests * Add comment * s/an oxymoron/contradictory/ * rename * Extract error case * Add tests for exporting SPR pages and update /_next/data endpoint to end with .json * Relocate variable * Adjust route building * Rename to unstable * Rename unstable_getStaticParams * Fix linting * Only add this when a data request * Update prerender data tests * s/isServerless/isLikeServerless/ * Don't rely on query for `next start` in serverless mode * Rename var * Update renderedDuringBuild check * Add test for dynamic param with bracket * Fix serverless next start handling * remove todo * Adjust comment * Update calculateRevalidate * Remove cache logic from render.tsx * Remove extra imports * Move SPR cache logic to next-server * Remove old isDynamic prop * Add calling App getInitialProps for SPR pages * Update revalidate logic * Add isStale to SprCacheValue * Update headers for SPR * add awaiting pendingRevalidation * Dont return null for revalidation render * Adjust logic * Be sure to remove coalesced render * Fix data for serverless * Create a method coalescing utility * Remove TODO * Extract send payload helper * Wrap in-line * Move around some code * Add tests for de-duping and revalidating * Update prerender manifest test
91 lines
2 KiB
TypeScript
91 lines
2 KiB
TypeScript
import {
|
|
BUILD_MANIFEST,
|
|
CLIENT_STATIC_FILES_PATH,
|
|
REACT_LOADABLE_MANIFEST,
|
|
SERVER_DIRECTORY,
|
|
} from '../lib/constants'
|
|
import { join } from 'path'
|
|
import { PageConfig } from '../../types'
|
|
import { requirePage } from './require'
|
|
|
|
export function interopDefault(mod: any) {
|
|
return mod.default || mod
|
|
}
|
|
|
|
export type LoadComponentsReturnType = {
|
|
Component: any
|
|
pageConfig: PageConfig
|
|
unstable_getStaticProps?: (params: {
|
|
params: any
|
|
}) => {
|
|
props: any
|
|
revalidate: number | false
|
|
}
|
|
buildManifest?: any
|
|
reactLoadableManifest?: any
|
|
Document?: any
|
|
DocumentMiddleware?: any
|
|
App?: any
|
|
}
|
|
|
|
export async function loadComponents(
|
|
distDir: string,
|
|
buildId: string,
|
|
pathname: string,
|
|
serverless: boolean
|
|
): Promise<LoadComponentsReturnType> {
|
|
if (serverless) {
|
|
const Component = await requirePage(pathname, distDir, serverless)
|
|
return {
|
|
Component,
|
|
pageConfig: Component.config || {},
|
|
unstable_getStaticProps: Component.unstable_getStaticProps,
|
|
}
|
|
}
|
|
const documentPath = join(
|
|
distDir,
|
|
SERVER_DIRECTORY,
|
|
CLIENT_STATIC_FILES_PATH,
|
|
buildId,
|
|
'pages',
|
|
'_document'
|
|
)
|
|
const appPath = join(
|
|
distDir,
|
|
SERVER_DIRECTORY,
|
|
CLIENT_STATIC_FILES_PATH,
|
|
buildId,
|
|
'pages',
|
|
'_app'
|
|
)
|
|
|
|
const DocumentMod = require(documentPath)
|
|
const { middleware: DocumentMiddleware } = DocumentMod
|
|
|
|
const ComponentMod = requirePage(pathname, distDir, serverless)
|
|
|
|
const [
|
|
buildManifest,
|
|
reactLoadableManifest,
|
|
Component,
|
|
Document,
|
|
App,
|
|
] = await Promise.all([
|
|
require(join(distDir, BUILD_MANIFEST)),
|
|
require(join(distDir, REACT_LOADABLE_MANIFEST)),
|
|
interopDefault(ComponentMod),
|
|
interopDefault(DocumentMod),
|
|
interopDefault(require(appPath)),
|
|
])
|
|
|
|
return {
|
|
App,
|
|
Document,
|
|
Component,
|
|
buildManifest,
|
|
DocumentMiddleware,
|
|
reactLoadableManifest,
|
|
pageConfig: ComponentMod.config || {},
|
|
unstable_getStaticProps: ComponentMod.unstable_getStaticProps,
|
|
}
|
|
}
|