Skip to content

Commit 5ae7baa

Browse files
authored
Add experimental clientParamParsing feature flag (#82393)
This will be used to roll out an internal implementation change; it won't ever be a user-facing configuration. The plan is to remove it as soon as the feature is properly tested.
1 parent 62bc131 commit 5ae7baa

File tree

10 files changed

+51
-2
lines changed

10 files changed

+51
-2
lines changed

packages/next/src/build/define-env.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,9 @@ export function getDefineEnv({
199199
'process.env.__NEXT_CLIENT_SEGMENT_CACHE': Boolean(
200200
config.experimental.clientSegmentCache
201201
),
202+
'process.env.__NEXT_CLIENT_PARAM_PARSING': Boolean(
203+
config.experimental.clientParamParsing
204+
),
202205
'process.env.__NEXT_CLIENT_VALIDATE_RSC_REQUEST_HEADERS': Boolean(
203206
config.experimental.validateRSCRequestHeaders
204207
),

packages/next/src/build/templates/app-page.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,9 @@ export async function handler(
533533
clientSegmentCache: Boolean(
534534
nextConfig.experimental.clientSegmentCache
535535
),
536+
clientParamParsing: Boolean(
537+
nextConfig.experimental.clientParamParsing
538+
),
536539
dynamicOnHover: Boolean(nextConfig.experimental.dynamicOnHover),
537540
inlineCss: Boolean(nextConfig.experimental.inlineCss),
538541
authInterrupts: Boolean(nextConfig.experimental.authInterrupts),

packages/next/src/build/templates/edge-ssr-app.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ async function requestHandler(
163163
staleTimes: nextConfig.experimental.staleTimes,
164164
cacheComponents: Boolean(nextConfig.experimental.cacheComponents),
165165
clientSegmentCache: Boolean(nextConfig.experimental.clientSegmentCache),
166+
clientParamParsing: Boolean(nextConfig.experimental.clientParamParsing),
166167
dynamicOnHover: Boolean(nextConfig.experimental.dynamicOnHover),
167168
inlineCss: Boolean(nextConfig.experimental.inlineCss),
168169
authInterrupts: Boolean(nextConfig.experimental.authInterrupts),

packages/next/src/export/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,7 @@ async function exportAppImpl(
404404
nextConfig.experimental.clientSegmentCache === 'client-only'
405405
? 'client-only'
406406
: Boolean(nextConfig.experimental.clientSegmentCache),
407+
clientParamParsing: nextConfig.experimental.clientParamParsing ?? false,
407408
dynamicOnHover: nextConfig.experimental.dynamicOnHover ?? false,
408409
inlineCss: nextConfig.experimental.inlineCss ?? false,
409410
authInterrupts: !!nextConfig.experimental.authInterrupts,

packages/next/src/server/app-render/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ export interface RenderOptsPartial {
261261
clientTraceMetadata: string[] | undefined
262262
cacheComponents: boolean
263263
clientSegmentCache: boolean | 'client-only'
264+
clientParamParsing: boolean
264265
dynamicOnHover: boolean
265266
inlineCss: boolean
266267
authInterrupts: boolean

packages/next/src/server/base-server.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,8 @@ export default abstract class Server<
568568
this.nextConfig.experimental.clientSegmentCache === 'client-only'
569569
? 'client-only'
570570
: Boolean(this.nextConfig.experimental.clientSegmentCache),
571+
clientParamParsing:
572+
this.nextConfig.experimental.clientParamParsing ?? false,
571573
dynamicOnHover: this.nextConfig.experimental.dynamicOnHover ?? false,
572574
inlineCss: this.nextConfig.experimental.inlineCss ?? false,
573575
authInterrupts: !!this.nextConfig.experimental.authInterrupts,

packages/next/src/server/config-schema.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ export const configSchema: zod.ZodType<NextConfig> = z.lazy(() =>
358358
clientSegmentCache: z
359359
.union([z.boolean(), z.literal('client-only')])
360360
.optional(),
361+
clientParamParsing: z.boolean().optional(),
361362
dynamicOnHover: z.boolean().optional(),
362363
disableOptimizedLoading: z.boolean().optional(),
363364
disablePostcssPresetEnv: z.boolean().optional(),

packages/next/src/server/config-shared.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ export interface ExperimentalConfig {
331331
linkNoTouchStart?: boolean
332332
caseSensitiveRoutes?: boolean
333333
clientSegmentCache?: boolean | 'client-only'
334+
clientParamParsing?: boolean
334335
dynamicOnHover?: boolean
335336
appDocumentPreloading?: boolean
336337
preloadEntriesOnStart?: boolean
@@ -1400,6 +1401,7 @@ export const defaultConfig = Object.freeze({
14001401
linkNoTouchStart: false,
14011402
caseSensitiveRoutes: false,
14021403
clientSegmentCache: false,
1404+
clientParamParsing: false,
14031405
dynamicOnHover: false,
14041406
appDocumentPreloading: undefined,
14051407
preloadEntriesOnStart: true,

packages/next/src/server/config.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1715,6 +1715,25 @@ function enforceExperimentalFeatures(
17151715
}
17161716
}
17171717

1718+
// TODO: Remove this once we've made Client Param Parsing the default.
1719+
if (
1720+
process.env.__NEXT_EXPERIMENTAL_PPR === 'true' &&
1721+
// We do respect an explicit value in the user config.
1722+
(config.experimental.clientParamParsing === undefined ||
1723+
(isDefaultConfig && !config.experimental.clientParamParsing))
1724+
) {
1725+
config.experimental.clientParamParsing = true
1726+
1727+
if (configuredExperimentalFeatures) {
1728+
addConfiguredExperimentalFeature(
1729+
configuredExperimentalFeatures,
1730+
'clientParamParsing',
1731+
true,
1732+
'enabled by `__NEXT_EXPERIMENTAL_PPR`'
1733+
)
1734+
}
1735+
}
1736+
17181737
// TODO: Remove this once we've made Cache Components the default.
17191738
if (
17201739
process.env.__NEXT_EXPERIMENTAL_CACHE_COMPONENTS === 'true' &&

test/production/app-dir/build-output-prerender/build-output-prerender.test.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ describe('build-output-prerender', () => {
2626
✓ ppr (enabled by \`__NEXT_EXPERIMENTAL_CACHE_COMPONENTS\`)
2727
✓ cacheComponents
2828
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
29+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
2930
✓ enablePrerenderSourceMaps (enabled by \`experimental.cacheComponents\`)"
3031
`)
3132
} else {
@@ -35,6 +36,7 @@ describe('build-output-prerender', () => {
3536
✓ ppr (enabled by \`__NEXT_EXPERIMENTAL_CACHE_COMPONENTS\`)
3637
✓ cacheComponents
3738
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
39+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
3840
✓ enablePrerenderSourceMaps (enabled by \`experimental.cacheComponents\`)"
3941
`)
4042
}
@@ -46,6 +48,7 @@ describe('build-output-prerender', () => {
4648
✓ ppr (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
4749
✓ cacheComponents
4850
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
51+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
4952
✓ enablePrerenderSourceMaps (enabled by \`experimental.cacheComponents\`)"
5053
`)
5154
} else {
@@ -55,6 +58,7 @@ describe('build-output-prerender', () => {
5558
✓ ppr (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
5659
✓ cacheComponents
5760
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
61+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
5862
✓ enablePrerenderSourceMaps (enabled by \`experimental.cacheComponents\`)"
5963
`)
6064
}
@@ -131,6 +135,7 @@ describe('build-output-prerender', () => {
131135
✓ serverSourceMaps (enabled by \`--debug-prerender\`)
132136
⨯ prerenderEarlyExit (disabled by \`--debug-prerender\`)
133137
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
138+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
134139
✓ enablePrerenderSourceMaps (enabled by \`--debug-prerender\`)"
135140
`)
136141
} else {
@@ -144,6 +149,7 @@ describe('build-output-prerender', () => {
144149
⨯ serverMinification (disabled by \`--debug-prerender\`)
145150
⨯ prerenderEarlyExit (disabled by \`--debug-prerender\`)
146151
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
152+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
147153
✓ enablePrerenderSourceMaps (enabled by \`--debug-prerender\`)"
148154
`)
149155
}
@@ -159,6 +165,7 @@ describe('build-output-prerender', () => {
159165
✓ serverSourceMaps (enabled by \`--debug-prerender\`)
160166
⨯ prerenderEarlyExit (disabled by \`--debug-prerender\`)
161167
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
168+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
162169
✓ enablePrerenderSourceMaps (enabled by \`--debug-prerender\`)"
163170
`)
164171
} else {
@@ -172,6 +179,7 @@ describe('build-output-prerender', () => {
172179
⨯ serverMinification (disabled by \`--debug-prerender\`)
173180
⨯ prerenderEarlyExit (disabled by \`--debug-prerender\`)
174181
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
182+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
175183
✓ enablePrerenderSourceMaps (enabled by \`--debug-prerender\`)"
176184
`)
177185
}
@@ -251,6 +259,7 @@ describe('build-output-prerender', () => {
251259
✓ ppr (enabled by \`__NEXT_EXPERIMENTAL_CACHE_COMPONENTS\`)
252260
✓ cacheComponents (enabled by \`__NEXT_EXPERIMENTAL_CACHE_COMPONENTS\`)
253261
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
262+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
254263
✓ enablePrerenderSourceMaps (enabled by \`experimental.cacheComponents\`)"
255264
`)
256265
} else {
@@ -260,6 +269,7 @@ describe('build-output-prerender', () => {
260269
✓ ppr (enabled by \`__NEXT_EXPERIMENTAL_CACHE_COMPONENTS\`)
261270
✓ cacheComponents (enabled by \`__NEXT_EXPERIMENTAL_CACHE_COMPONENTS\`)
262271
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
272+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
263273
✓ enablePrerenderSourceMaps (enabled by \`experimental.cacheComponents\`)"
264274
`)
265275
}
@@ -269,14 +279,16 @@ describe('build-output-prerender', () => {
269279
"▲ Next.js x.y.z (Turbopack)
270280
- Experiments (use with caution):
271281
✓ ppr (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
272-
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)"
282+
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
283+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)"
273284
`)
274285
} else {
275286
expect(getPreambleOutput(next.cliOutput)).toMatchInlineSnapshot(`
276287
"▲ Next.js x.y.z
277288
- Experiments (use with caution):
278289
✓ ppr (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
279-
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)"
290+
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
291+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)"
280292
`)
281293
}
282294
} else {
@@ -315,6 +327,7 @@ describe('build-output-prerender', () => {
315327
✓ serverSourceMaps (enabled by \`--debug-prerender\`)
316328
⨯ prerenderEarlyExit (disabled by \`--debug-prerender\`)
317329
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
330+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
318331
✓ enablePrerenderSourceMaps (enabled by \`--debug-prerender\`)"
319332
`)
320333
} else {
@@ -328,6 +341,7 @@ describe('build-output-prerender', () => {
328341
⨯ serverMinification (disabled by \`--debug-prerender\`)
329342
⨯ prerenderEarlyExit (disabled by \`--debug-prerender\`)
330343
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
344+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
331345
✓ enablePrerenderSourceMaps (enabled by \`--debug-prerender\`)"
332346
`)
333347
}
@@ -342,6 +356,7 @@ describe('build-output-prerender', () => {
342356
✓ serverSourceMaps (enabled by \`--debug-prerender\`)
343357
⨯ prerenderEarlyExit (disabled by \`--debug-prerender\`)
344358
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
359+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
345360
✓ enablePrerenderSourceMaps (enabled by \`--debug-prerender\`)"
346361
`)
347362
} else {
@@ -354,6 +369,7 @@ describe('build-output-prerender', () => {
354369
⨯ serverMinification (disabled by \`--debug-prerender\`)
355370
⨯ prerenderEarlyExit (disabled by \`--debug-prerender\`)
356371
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
372+
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
357373
✓ enablePrerenderSourceMaps (enabled by \`--debug-prerender\`)"
358374
`)
359375
}

0 commit comments

Comments
 (0)