Skip to content

Commit 73960be

Browse files
authored
fix(react-router-dev): Fix preset future flags merge (#14369)
* fix: preset future flags are ignored during config resolution Fixes a bug where future flags defined by presets were completely ignored. The config resolution was incorrectly reading from reactRouterUserConfig.future instead of the merged userAndPresetConfigs.future, causing all preset-defined future flags to be lost. This fix ensures presets can properly enable experimental features as intended by the preset system design. Fixes #14368 * Add changeset
1 parent 4ad108c commit 73960be

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
"@react-router/dev": patch
3+
---
4+
5+
Fix preset future flags being ignored during config resolution
6+
7+
Fixes a bug where future flags defined by presets were completely ignored. The config resolution was incorrectly reading from `reactRouterUserConfig.future` instead of the merged `userAndPresetConfigs.future`, causing all preset-defined future flags to be lost.
8+
9+
This fix ensures presets can properly enable experimental features as intended by the preset system design.

integration/vite-presets-test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,17 @@ const files = {
114114
}),
115115
},
116116
117+
// Ensure presets can set future flags
118+
{
119+
name: "test-preset",
120+
reactRouterConfig: async () => ({
121+
future: {
122+
v8_middleware: true,
123+
unstable_optimizeDeps: true,
124+
},
125+
}),
126+
},
127+
117128
// Ensure presets can set buildEnd option (this is critical for Vercel support)
118129
{
119130
name: "test-preset",
@@ -128,6 +139,7 @@ const files = {
128139
"export const buildManifest = " + serializeJs(buildManifest, { space: 2, unsafe: true }) + ";",
129140
"export const reactRouterConfig = " + serializeJs(reactRouterConfig, { space: 2, unsafe: true }) + ";",
130141
"export const assetsDir = " + JSON.stringify(viteConfig.build.assetsDir) + ";",
142+
"export const futureFlags = " + JSON.stringify(reactRouterConfig.future) + ";",
131143
].join("\\n"),
132144
"utf-8"
133145
);
@@ -229,6 +241,15 @@ test.describe("Vite / presets", async () => {
229241
"unstable_routeConfig",
230242
]);
231243

244+
// Ensure future flags from presets are properly merged
245+
expect(buildEndArgsMeta.futureFlags).toEqual({
246+
v8_middleware: true,
247+
unstable_optimizeDeps: true,
248+
unstable_splitRouteModules: false,
249+
unstable_subResourceIntegrity: false,
250+
unstable_viteEnvironmentApi: false,
251+
});
252+
232253
// Ensure we get a valid build manifest
233254
expect(buildEndArgsMeta.buildManifest).toEqual({
234255
routeIdToServerBundleId: {

packages/react-router-dev/config/config.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -587,15 +587,15 @@ async function resolveConfig({
587587
}
588588

589589
let future: FutureConfig = {
590-
v8_middleware: reactRouterUserConfig.future?.v8_middleware ?? false,
590+
v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
591591
unstable_optimizeDeps:
592-
reactRouterUserConfig.future?.unstable_optimizeDeps ?? false,
592+
userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,
593593
unstable_splitRouteModules:
594-
reactRouterUserConfig.future?.unstable_splitRouteModules ?? false,
594+
userAndPresetConfigs.future?.unstable_splitRouteModules ?? false,
595595
unstable_subResourceIntegrity:
596-
reactRouterUserConfig.future?.unstable_subResourceIntegrity ?? false,
596+
userAndPresetConfigs.future?.unstable_subResourceIntegrity ?? false,
597597
unstable_viteEnvironmentApi:
598-
reactRouterUserConfig.future?.unstable_viteEnvironmentApi ?? false,
598+
userAndPresetConfigs.future?.unstable_viteEnvironmentApi ?? false,
599599
};
600600

601601
let reactRouterConfig: ResolvedReactRouterConfig = deepFreeze({

0 commit comments

Comments
 (0)