diff --git a/packages/next/build/entries.ts b/packages/next/build/entries.ts index 1ac79e357ed3..304b7047b149 100644 --- a/packages/next/build/entries.ts +++ b/packages/next/build/entries.ts @@ -144,7 +144,7 @@ export async function getPageRuntime( for (const node of body) { const { type, declaration } = node if (type === 'ExportDeclaration') { - // `export const config` + // Match `export const config` const valueNode = declaration?.declarations?.[0] if (valueNode?.id?.value === 'config') { const props = valueNode.init.properties @@ -155,15 +155,30 @@ export async function getPageRuntime( pageRuntime = runtime === 'edge' || runtime === 'nodejs' ? runtime : pageRuntime } else if (declaration?.type === 'FunctionDeclaration') { - // `export function getStaticProps` and - // `export function getServerSideProps` + // Match `export function getStaticProps | getServerSideProps` + const identifier = declaration.identifier?.value if ( - declaration.identifier?.value === 'getStaticProps' || - declaration.identifier?.value === 'getServerSideProps' + identifier === 'getStaticProps' || + identifier === 'getServerSideProps' ) { isRuntimeRequired = true } } + } else if (type === 'ExportNamedDeclaration') { + // Match `export { getStaticProps | getServerSideProps } ` + const { specifiers } = node + for (const specifier of specifiers) { + const { orig } = specifier + const hasDataFetchingExports = + specifier.type === 'ExportSpecifier' && + orig?.type === 'Identifier' && + (orig?.value === 'getStaticProps' || + orig?.value === 'getServerSideProps') + if (hasDataFetchingExports) { + isRuntimeRequired = true + break + } + } } } } catch (err) {} diff --git a/test/unit/fixtures/page-runtime/fallback-re-export-gsp.js b/test/unit/fixtures/page-runtime/fallback-re-export-gsp.js new file mode 100644 index 000000000000..4cb8568fa50a --- /dev/null +++ b/test/unit/fixtures/page-runtime/fallback-re-export-gsp.js @@ -0,0 +1,5 @@ +export { getStaticProps } from '../lib/utils' + +export default function ImportGsp({ gsp }) { + return `import-${gsp}` +} diff --git a/test/unit/fixtures/page-runtime/fallback.js b/test/unit/fixtures/page-runtime/fallback-with-gsp.js similarity index 100% rename from test/unit/fixtures/page-runtime/fallback.js rename to test/unit/fixtures/page-runtime/fallback-with-gsp.js diff --git a/test/unit/parse-page-runtime.test.ts b/test/unit/parse-page-runtime.test.ts index d567e5e70bf3..11b4946ec1a2 100644 --- a/test/unit/parse-page-runtime.test.ts +++ b/test/unit/parse-page-runtime.test.ts @@ -24,10 +24,20 @@ describe('parse page runtime config', () => { ) expect(runtime).toBe(undefined) }) +}) + +describe('fallback to the global runtime configuration', () => { + it('should fallback when gSP is defined and exported', async () => { + const runtime = await getPageRuntime( + join(fixtureDir, 'page-runtime/fallback-with-gsp.js'), + 'edge' + ) + expect(runtime).toBe('edge') + }) - it('should fallback to the global runtime configuration if a runtime is needed', async () => { + it('should fallback when gSP is re-exported from other module', async () => { const runtime = await getPageRuntime( - join(fixtureDir, 'page-runtime/fallback.js'), + join(fixtureDir, 'page-runtime/fallback-re-export-gsp.js'), 'edge' ) expect(runtime).toBe('edge')