@@ -1227,7 +1227,6 @@ type GenerateParamsResult = {
12271227 config ?: AppConfig
12281228 isDynamicSegment ?: boolean
12291229 segmentPath : string
1230- getStaticPaths ?: GetStaticPaths
12311230 generateStaticParams ?: GenerateStaticParams
12321231 isLayout ?: boolean
12331232}
@@ -1306,7 +1305,7 @@ export async function collectGenerateParams(tree: LoaderTree) {
13061305
13071306 const isDynamicSegment = / ^ \[ .+ \] $ / . test ( page )
13081307
1309- const { generateStaticParams, getStaticPaths } = mod || { }
1308+ const { generateStaticParams } = mod || { }
13101309
13111310 if ( isDynamicSegment && isClientComponent && generateStaticParams ) {
13121311 throw new Error (
@@ -1323,20 +1322,14 @@ export async function collectGenerateParams(tree: LoaderTree) {
13231322 isDynamicSegment,
13241323 segmentPath,
13251324 config,
1326- getStaticPaths : ! isClientComponent ? getStaticPaths : undefined ,
13271325 generateStaticParams : ! isClientComponent
13281326 ? generateStaticParams
13291327 : undefined ,
13301328 }
13311329
13321330 // If the configuration contributes to the static generation, then add it
13331331 // to the list.
1334- if (
1335- result . config ||
1336- result . generateStaticParams ||
1337- result . getStaticPaths ||
1338- isDynamicSegment
1339- ) {
1332+ if ( result . config || result . generateStaticParams || isDynamicSegment ) {
13401333 generateParams . push ( result )
13411334 }
13421335
@@ -1431,145 +1424,131 @@ export async function buildAppStaticPaths({
14311424 } ,
14321425 } ,
14331426 async ( ) : Promise < PartialStaticPathsResult > => {
1434- const pageEntry = generateParams [ generateParams . length - 1 ]
1427+ let hadAllParamsGenerated = false
14351428
1436- // if the page has legacy getStaticPaths we call it like normal
1437- if ( typeof pageEntry ?. getStaticPaths === 'function' ) {
1438- return buildStaticPaths ( {
1439- page,
1440- configFileName,
1441- getStaticPaths : pageEntry . getStaticPaths ,
1442- } )
1443- } else {
1444- // if generateStaticParams is being used we iterate over them
1445- // collecting them from each level
1446- let hadAllParamsGenerated = false
1447-
1448- const buildParams = async (
1449- paramsItems : Params [ ] = [ { } ] ,
1450- idx = 0
1451- ) : Promise < Params [ ] > => {
1452- const current = generateParams [ idx ]
1453-
1454- if ( idx === generateParams . length ) {
1455- return paramsItems
1456- }
1429+ const buildParams = async (
1430+ paramsItems : Params [ ] = [ { } ] ,
1431+ idx = 0
1432+ ) : Promise < Params [ ] > => {
1433+ const current = generateParams [ idx ]
14571434
1458- if (
1459- typeof current . generateStaticParams !== 'function' &&
1460- idx < generateParams . length
1461- ) {
1462- if ( current . isDynamicSegment ) {
1463- // This dynamic level has no generateStaticParams so we change
1464- // this flag to false, but it could be covered by a later
1465- // generateStaticParams so it could be set back to true.
1466- hadAllParamsGenerated = false
1467- }
1468- return buildParams ( paramsItems , idx + 1 )
1435+ if ( idx === generateParams . length ) {
1436+ return paramsItems
1437+ }
1438+
1439+ if (
1440+ typeof current . generateStaticParams !== 'function' &&
1441+ idx < generateParams . length
1442+ ) {
1443+ if ( current . isDynamicSegment ) {
1444+ // This dynamic level has no generateStaticParams so we change
1445+ // this flag to false, but it could be covered by a later
1446+ // generateStaticParams so it could be set back to true.
1447+ hadAllParamsGenerated = false
14691448 }
1470- hadAllParamsGenerated = true
1449+ return buildParams ( paramsItems , idx + 1 )
1450+ }
1451+ hadAllParamsGenerated = true
14711452
1472- const newParams : Params [ ] = [ ]
1453+ const newParams : Params [ ] = [ ]
14731454
1474- if ( current . generateStaticParams ) {
1475- const store = ComponentMod . staticGenerationAsyncStorage . getStore ( )
1455+ if ( current . generateStaticParams ) {
1456+ const store = ComponentMod . staticGenerationAsyncStorage . getStore ( )
14761457
1477- if ( store ) {
1478- if ( typeof current ?. config ?. fetchCache !== 'undefined' ) {
1479- store . fetchCache = current . config . fetchCache
1480- }
1481- if ( typeof current ?. config ?. revalidate !== 'undefined' ) {
1482- store . revalidate = current . config . revalidate
1483- }
1484- if ( current ?. config ?. dynamic === 'force-dynamic' ) {
1485- store . forceDynamic = true
1486- }
1458+ if ( store ) {
1459+ if ( typeof current ?. config ?. fetchCache !== 'undefined' ) {
1460+ store . fetchCache = current . config . fetchCache
14871461 }
1488-
1489- for ( const params of paramsItems ) {
1490- const result = await current . generateStaticParams ( {
1491- params,
1492- } )
1493-
1494- // TODO: validate the result is valid here or wait for buildStaticPaths to validate?
1495- for ( const item of result ) {
1496- newParams . push ( { ...params , ...item } )
1497- }
1462+ if ( typeof current ?. config ?. revalidate !== 'undefined' ) {
1463+ store . revalidate = current . config . revalidate
1464+ }
1465+ if ( current ?. config ?. dynamic === 'force-dynamic' ) {
1466+ store . forceDynamic = true
14981467 }
14991468 }
15001469
1501- if ( idx < generateParams . length ) {
1502- return buildParams ( newParams , idx + 1 )
1470+ for ( const params of paramsItems ) {
1471+ const result = await current . generateStaticParams ( {
1472+ params,
1473+ } )
1474+
1475+ // TODO: validate the result is valid here or wait for buildStaticPaths to validate?
1476+ for ( const item of result ) {
1477+ newParams . push ( { ...params , ...item } )
1478+ }
15031479 }
1480+ }
15041481
1505- return newParams
1482+ if ( idx < generateParams . length ) {
1483+ return buildParams ( newParams , idx + 1 )
15061484 }
15071485
1508- const builtParams = await buildParams ( )
1486+ return newParams
1487+ }
15091488
1510- if (
1511- generateParams . some (
1512- ( generate ) => generate . config ?. dynamicParams === true
1513- ) &&
1514- nextConfigOutput === 'export'
1515- ) {
1516- throw new Error (
1517- '"dynamicParams: true" cannot be used with "output: export". See more info here: https://nextjs.org/docs/app/building-your-application/deploying/static-exports'
1518- )
1519- }
1489+ const builtParams = await buildParams ( )
15201490
1521- // TODO: dynamic params should be allowed to be granular per segment but
1522- // we need additional information stored/leveraged in the prerender
1523- // manifest to allow this behavior.
1524- const dynamicParams = generateParams . every (
1525- ( param ) => param . config ?. dynamicParams !== false
1491+ if (
1492+ generateParams . some (
1493+ ( generate ) => generate . config ?. dynamicParams === true
1494+ ) &&
1495+ nextConfigOutput === 'export'
1496+ ) {
1497+ throw new Error (
1498+ '"dynamicParams: true" cannot be used with "output: export". See more info here: https://nextjs.org/docs/app/building-your-application/deploying/static-exports'
15261499 )
1500+ }
15271501
1528- const isProduction = process . env . NODE_ENV === 'production'
1502+ // TODO: dynamic params should be allowed to be granular per segment but
1503+ // we need additional information stored/leveraged in the prerender
1504+ // manifest to allow this behavior.
1505+ const dynamicParams = generateParams . every (
1506+ ( param ) => param . config ?. dynamicParams !== false
1507+ )
15291508
1530- const supportsStaticGeneration = hadAllParamsGenerated || isProduction
1509+ const isProduction = process . env . NODE_ENV === 'production'
15311510
1532- const supportsPPRFallbacks =
1533- isRoutePPREnabled && isAppPPRFallbacksEnabled
1511+ const supportsStaticGeneration = hadAllParamsGenerated || isProduction
15341512
1535- const fallbackMode = dynamicParams
1536- ? supportsStaticGeneration
1537- ? supportsPPRFallbacks
1538- ? FallbackMode . PRERENDER
1539- : FallbackMode . BLOCKING_STATIC_RENDER
1540- : undefined
1541- : FallbackMode . NOT_FOUND
1513+ const supportsPPRFallbacks = isRoutePPREnabled && isAppPPRFallbacksEnabled
15421514
1543- let result : PartialStaticPathsResult = {
1544- fallbackMode,
1545- prerenderedRoutes : undefined ,
1546- }
1515+ const fallbackMode = dynamicParams
1516+ ? supportsStaticGeneration
1517+ ? supportsPPRFallbacks
1518+ ? FallbackMode . PRERENDER
1519+ : FallbackMode . BLOCKING_STATIC_RENDER
1520+ : undefined
1521+ : FallbackMode . NOT_FOUND
15471522
1548- if ( hadAllParamsGenerated && fallbackMode ) {
1549- result = await buildStaticPaths ( {
1550- staticPathsResult : {
1551- fallback : fallbackModeToStaticPathsResult ( fallbackMode ) ,
1552- paths : builtParams . map ( ( params ) => ( { params } ) ) ,
1553- } ,
1554- page,
1555- configFileName,
1556- appDir : true ,
1557- } )
1558- }
1523+ let result : PartialStaticPathsResult = {
1524+ fallbackMode,
1525+ prerenderedRoutes : undefined ,
1526+ }
15591527
1560- // If the fallback mode is a prerender, we want to include the dynamic
1561- // route in the prerendered routes too.
1562- if ( isRoutePPREnabled && isAppPPRFallbacksEnabled ) {
1563- result . prerenderedRoutes ??= [ ]
1564- result . prerenderedRoutes . unshift ( {
1565- path : page ,
1566- encoded : page ,
1567- fallbackRouteParams : getParamKeys ( page ) ,
1568- } )
1569- }
1528+ if ( hadAllParamsGenerated && fallbackMode ) {
1529+ result = await buildStaticPaths ( {
1530+ staticPathsResult : {
1531+ fallback : fallbackModeToStaticPathsResult ( fallbackMode ) ,
1532+ paths : builtParams . map ( ( params ) => ( { params } ) ) ,
1533+ } ,
1534+ page,
1535+ configFileName,
1536+ appDir : true ,
1537+ } )
1538+ }
15701539
1571- return result
1540+ // If the fallback mode is a prerender, we want to include the dynamic
1541+ // route in the prerendered routes too.
1542+ if ( isRoutePPREnabled && isAppPPRFallbacksEnabled ) {
1543+ result . prerenderedRoutes ??= [ ]
1544+ result . prerenderedRoutes . unshift ( {
1545+ path : page ,
1546+ encoded : page ,
1547+ fallbackRouteParams : getParamKeys ( page ) ,
1548+ } )
15721549 }
1550+
1551+ return result
15731552 }
15741553 )
15751554}
0 commit comments