Skip to content

Commit 31cdc35

Browse files
committed
fix: add backwards compat for middleware → proxy field renames
When a new proxy config key is set but the old middlewar names is not, copy the value to the old name on the *resolved* config object. This avoids breaking changes for providers and other integrations that read the the `.next/` build output files. Applies to: - `experimental.proxyPrefetch` → `experimental.middlewarePrefetch` - `experimental.externalProxyRewritesResolve` → `experimental.externalMiddlewareRewritesResolve` - `skipProxyUrlNormalize` → `skipMiddlewareUrlNormalize` This also adds test coverage for both the existing forward compat (old→new) and the new backwards compat (new→old).
1 parent 3f09e56 commit 31cdc35

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

packages/next/src/server/config.test.ts

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,77 @@ describe('loadConfig', () => {
134134
)
135135
})
136136
})
137+
138+
describe('middleware to proxy config key rename backward/forward compatibility', () => {
139+
it('should copy `skipMiddlewareUrlNormalize value` to `skipProxyUrlNormalize`', async () => {
140+
const result = await loadConfig(PHASE_PRODUCTION_BUILD, __dirname, {
141+
customConfig: {
142+
skipMiddlewareUrlNormalize: true,
143+
},
144+
})
145+
146+
expect(result.skipProxyUrlNormalize).toBe(true)
147+
})
148+
149+
it('should copy `experimental.middlewarePrefetch` to `experimental.proxyPrefetch`', async () => {
150+
const result = await loadConfig(PHASE_PRODUCTION_BUILD, __dirname, {
151+
customConfig: {
152+
experimental: {
153+
middlewarePrefetch: 'strict',
154+
},
155+
},
156+
})
157+
158+
expect(result.experimental.proxyPrefetch).toBe('strict')
159+
})
160+
161+
it('should copy `experimental.externalMiddlewareRewritesResolve` to `experimental.externalProxyRewritesResolve`', async () => {
162+
const result = await loadConfig(PHASE_PRODUCTION_BUILD, __dirname, {
163+
customConfig: {
164+
experimental: {
165+
externalMiddlewareRewritesResolve: true,
166+
},
167+
},
168+
})
169+
170+
expect(result.experimental.externalProxyRewritesResolve).toBe(true)
171+
})
172+
173+
it('should copy `skipProxyUrlNormalize` to `skipMiddlewareUrlNormalize`', async () => {
174+
const result = await loadConfig(PHASE_PRODUCTION_BUILD, __dirname, {
175+
customConfig: {
176+
skipProxyUrlNormalize: true,
177+
},
178+
})
179+
180+
expect(result.skipMiddlewareUrlNormalize).toBe(true)
181+
expect(result.skipProxyUrlNormalize).toBe(true)
182+
})
183+
184+
it('should copy `experimental.proxyPrefetch` to `experimental.middlewarePrefetch`', async () => {
185+
const result = await loadConfig(PHASE_PRODUCTION_BUILD, __dirname, {
186+
customConfig: {
187+
experimental: {
188+
proxyPrefetch: 'strict',
189+
},
190+
},
191+
})
192+
193+
expect(result.experimental.middlewarePrefetch).toBe('strict')
194+
expect(result.experimental.proxyPrefetch).toBe('strict')
195+
})
196+
197+
it('should copy `experimental.externalProxyRewritesResolve` to `experimental.externalMiddlewareRewritesResolve`', async () => {
198+
const result = await loadConfig(PHASE_PRODUCTION_BUILD, __dirname, {
199+
customConfig: {
200+
experimental: {
201+
externalProxyRewritesResolve: true,
202+
},
203+
},
204+
})
205+
206+
expect(result.experimental.externalMiddlewareRewritesResolve).toBe(true)
207+
expect(result.experimental.externalProxyRewritesResolve).toBe(true)
208+
})
209+
})
137210
})

packages/next/src/server/config.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,28 @@ function assignDefaultsAndValidate(
836836
) {
837837
result.skipProxyUrlNormalize = userConfig.skipMiddlewareUrlNormalize
838838
}
839+
// Inverse case: when new name is set but not the old name, copy the value to the old name
840+
// to avoid breaking change on resolved config object written to `.next/`
841+
if (
842+
userConfig.experimental?.proxyPrefetch !== undefined &&
843+
userConfig.experimental?.middlewarePrefetch === undefined
844+
) {
845+
result.experimental.middlewarePrefetch =
846+
userConfig.experimental.proxyPrefetch
847+
}
848+
if (
849+
userConfig.experimental?.externalProxyRewritesResolve !== undefined &&
850+
userConfig.experimental?.externalMiddlewareRewritesResolve === undefined
851+
) {
852+
result.experimental.externalMiddlewareRewritesResolve =
853+
userConfig.experimental.externalProxyRewritesResolve
854+
}
855+
if (
856+
userConfig.skipProxyUrlNormalize !== undefined &&
857+
userConfig.skipMiddlewareUrlNormalize === undefined
858+
) {
859+
result.skipMiddlewareUrlNormalize = userConfig.skipProxyUrlNormalize
860+
}
839861

840862
// Normalize & validate experimental.proxyClientMaxBodySize
841863
if (typeof result.experimental?.proxyClientMaxBodySize !== 'undefined') {

0 commit comments

Comments
 (0)