diff --git a/packages/next/next-server/server/render.tsx b/packages/next/next-server/server/render.tsx index 7aa8cf64faafd0e..41cb03f46936e3f 100644 --- a/packages/next/next-server/server/render.tsx +++ b/packages/next/next-server/server/render.tsx @@ -636,7 +636,7 @@ export async function renderToHTML( throw new Error(invalidKeysMsg('getStaticProps', invalidKeys)) } - if (data.unstable_notFound) { + if ('unstable_notFound' in data && data.unstable_notFound) { if (pathname === '/404') { throw new Error( `The /404 page can not return unstable_notFound in "getStaticProps", please remove it to continue!` @@ -649,6 +649,7 @@ export async function renderToHTML( } if ( + 'unstable_redirect' in data && data.unstable_redirect && typeof data.unstable_redirect === 'object' ) { @@ -662,7 +663,7 @@ export async function renderToHTML( } if (isDataReq) { - data.props = { + ;(data as any).props = { __N_REDIRECT: data.unstable_redirect.destination, } } else { @@ -673,7 +674,7 @@ export async function renderToHTML( if ( (dev || isBuildTimeSSG) && - !isSerializableProps(pathname, 'getStaticProps', data.props) + !isSerializableProps(pathname, 'getStaticProps', (data as any).props) ) { // this fn should throw an error instead of ever returning `false` throw new Error( @@ -681,7 +682,7 @@ export async function renderToHTML( ) } - if (typeof data.revalidate === 'number') { + if ('revalidate' in data && typeof data.revalidate === 'number') { if (!Number.isInteger(data.revalidate)) { throw new Error( `A page's revalidate option must be seconds expressed as a natural number. Mixed numbers, such as '${data.revalidate}', cannot be used.` + @@ -702,20 +703,25 @@ export async function renderToHTML( `\nTo only run getStaticProps at build-time and not revalidate at runtime, you can set \`revalidate\` to \`false\`!` ) } - } else if (data.revalidate === true) { + } else if ('revalidate' in data && data.revalidate === true) { // When enabled, revalidate after 1 second. This value is optimal for // the most up-to-date page possible, but without a 1-to-1 // request-refresh ratio. data.revalidate = 1 } else { // By default, we never revalidate. - data.revalidate = false + ;(data as any).revalidate = false } - props.pageProps = Object.assign({}, props.pageProps, data.props) + props.pageProps = Object.assign( + {}, + props.pageProps, + 'props' in data ? data.props : undefined + ) // pass up revalidate and props for export // TODO: change this to a different passing mechanism - ;(renderOpts as any).revalidate = data.revalidate + ;(renderOpts as any).revalidate = + 'revalidate' in data ? data.revalidate : undefined ;(renderOpts as any).pageData = props } diff --git a/packages/next/types/index.d.ts b/packages/next/types/index.d.ts index f834d3114fa0efa..9992573b6360420 100644 --- a/packages/next/types/index.d.ts +++ b/packages/next/types/index.d.ts @@ -85,12 +85,10 @@ export type GetStaticPropsContext = { locales?: string[] } -export type GetStaticPropsResult

= { - props?: P - revalidate?: number | boolean - unstable_redirect?: Redirect - unstable_notFound?: true -} +export type GetStaticPropsResult

= + | { props: P; revalidate?: number | boolean } + | { unstable_redirect: Redirect; revalidate?: number | boolean } + | { unstable_notFound: true } export type GetStaticProps< P extends { [key: string]: any } = { [key: string]: any }, @@ -133,15 +131,9 @@ export type GetServerSidePropsContext< } export type GetServerSidePropsResult

= - | { - props: P - } - | { - unstable_redirect: Redirect - } - | { - unstable_notFound: true - } + | { props: P } + | { unstable_redirect: Redirect } + | { unstable_notFound: true } export type GetServerSideProps< P extends { [key: string]: any } = { [key: string]: any },