Skip to content

Commit 64f8b8a

Browse files
Validate unsupported config in RSC Framework Mode (#14296)
1 parent 50c99a2 commit 64f8b8a

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ type ServerBundlesBuildManifest = BaseBuildManifest & {
8383

8484
type ServerModuleFormat = "esm" | "cjs";
8585

86+
type ValidateConfigFunction = (config: ReactRouterConfig) => string | void;
87+
8688
interface FutureConfig {
8789
/**
8890
* Enable route middleware
@@ -356,11 +358,13 @@ async function resolveConfig({
356358
viteNodeContext,
357359
reactRouterConfigFile,
358360
skipRoutes,
361+
validateConfig,
359362
}: {
360363
root: string;
361364
viteNodeContext: ViteNode.Context;
362365
reactRouterConfigFile?: string;
363366
skipRoutes?: boolean;
367+
validateConfig?: ValidateConfigFunction;
364368
}): Promise<Result<ResolvedReactRouterConfig>> {
365369
let reactRouterUserConfig: ReactRouterConfig = {};
366370

@@ -383,6 +387,13 @@ async function resolveConfig({
383387
}
384388

385389
reactRouterUserConfig = configModule.default;
390+
391+
if (validateConfig) {
392+
const error = validateConfig(reactRouterUserConfig);
393+
if (error) {
394+
return err(error);
395+
}
396+
}
386397
} catch (error) {
387398
return err(`Error loading ${reactRouterConfigFile}: ${error}`);
388399
}
@@ -631,11 +642,13 @@ export async function createConfigLoader({
631642
watch,
632643
mode,
633644
skipRoutes,
645+
validateConfig,
634646
}: {
635647
watch: boolean;
636648
rootDirectory?: string;
637649
mode: string;
638650
skipRoutes?: boolean;
651+
validateConfig?: ValidateConfigFunction;
639652
}): Promise<ConfigLoader> {
640653
root = Path.normalize(root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd());
641654

@@ -660,7 +673,13 @@ export async function createConfigLoader({
660673
updateReactRouterConfigFile();
661674

662675
let getConfig = () =>
663-
resolveConfig({ root, viteNodeContext, reactRouterConfigFile, skipRoutes });
676+
resolveConfig({
677+
root,
678+
viteNodeContext,
679+
reactRouterConfigFile,
680+
skipRoutes,
681+
validateConfig,
682+
});
664683

665684
let appDirectory: string;
666685

packages/react-router-dev/vite/rsc/plugin.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,31 @@ export function reactRouterRSCVitePlugin(): Vite.PluginOption[] {
4646
const rootDirectory = getRootDirectory(viteUserConfig);
4747
const watch = command === "serve";
4848

49-
configLoader = await createConfigLoader({ rootDirectory, mode, watch });
49+
configLoader = await createConfigLoader({
50+
rootDirectory,
51+
mode,
52+
watch,
53+
validateConfig: (userConfig) => {
54+
let errors: string[] = [];
55+
if (userConfig.buildEnd) errors.push("buildEnd");
56+
if (userConfig.prerender) errors.push("prerender");
57+
if (userConfig.presets?.length) errors.push("presets");
58+
if (userConfig.routeDiscovery) errors.push("routeDiscovery");
59+
if (userConfig.serverBundles) errors.push("serverBundles");
60+
if (userConfig.ssr === false) errors.push("ssr: false");
61+
if (userConfig.future?.unstable_splitRouteModules)
62+
errors.push("future.unstable_splitRouteModules");
63+
if (userConfig.future?.unstable_viteEnvironmentApi === false)
64+
errors.push("future.unstable_viteEnvironmentApi: false");
65+
if (userConfig.future?.v8_middleware === false)
66+
errors.push("future.v8_middleware: false");
67+
if (userConfig.future?.unstable_subResourceIntegrity)
68+
errors.push("future.unstable_subResourceIntegrity");
69+
if (errors.length) {
70+
return `RSC Framework Mode does not currently support the following React Router config:\n${errors.map((x) => ` - ${x}`).join("\n")}\n`;
71+
}
72+
},
73+
});
5074

5175
const configResult = await configLoader.getConfig();
5276
if (!configResult.ok) throw new Error(configResult.error);

0 commit comments

Comments
 (0)