@react-router/dev 7.15.1 → 7.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # `@react-router/dev`
2
2
 
3
+ ## v7.17.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Fix future flag warning URLs and only log each future flag warning one time ([#15138](https://github.com/remix-run/react-router/pull/15138))
8
+
9
+ ### Unstable Changes
10
+
11
+ ⚠️ _[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use_
12
+
13
+ - Prevent RSC route module server exports from being scanned by the client dependency optimizer when `future.unstable_optimizeDeps` is enabled. ([#15005](https://github.com/remix-run/react-router/pull/15005))
14
+ - Updated dependencies:
15
+ - [`react-router@7.17.0`](https://github.com/remix-run/react-router/releases/tag/react-router@7.17.0)
16
+ - [`@react-router/node@7.17.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@7.17.0)
17
+ - [`@react-router/serve@7.17.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/serve@7.17.0)
18
+
19
+ ## v7.16.0
20
+
21
+ ### Minor Changes
22
+
23
+ - Stabilize `future.unstable_trailingSlashAwareDataRequests` as `future.v8_trailingSlashAwareDataRequests` ([#15098](https://github.com/remix-run/react-router/pull/15098))
24
+ - The unstable flag is no longer supported and will error during config resolution
25
+
26
+ - Log future flag warnings for upcoming React Router v8 flags ([#15029](https://github.com/remix-run/react-router/pull/15029))
27
+ - `v8_middleware`, `v8_splitRouteModules`, `v8_viteEnvironmentApi`, `v8_passThroughRequests`, `v8_trailingSlashAwareDataRequests`
28
+
29
+ ### Patch Changes
30
+
31
+ - Updated dependencies:
32
+ - [`react-router@7.16.0`](https://github.com/remix-run/react-router/releases/tag/react-router@7.16.0)
33
+ - [`@react-router/node@7.16.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@7.16.0)
34
+ - [`@react-router/serve@7.16.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/serve@7.16.0)
35
+
3
36
  ## v7.15.1
4
37
 
5
38
  ### Patch Changes
@@ -11,6 +44,7 @@
11
44
  strip the base prefix from server-build virtual module import paths, causing
12
45
  "Failed to load url /root.tsx" errors. The fix uses `/@fs/` absolute paths
13
46
  for those imports to bypass Vite's base-stripping logic.
47
+
14
48
  - Updated dependencies:
15
49
  - [`react-router@7.15.1`](https://github.com/remix-run/react-router/releases/tag/react-router@7.15.1)
16
50
  - [`@react-router/node@7.15.1`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@7.15.1)
package/dist/cli/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * @react-router/dev v7.15.1
3
+ * @react-router/dev v7.17.0
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
@@ -312,7 +312,8 @@ async function resolveConfig({
312
312
  viteNodeContext,
313
313
  reactRouterConfigFile,
314
314
  skipRoutes,
315
- validateConfig
315
+ validateConfig,
316
+ shouldLogFutureFlagWarnings
316
317
  }) {
317
318
  let reactRouterUserConfig = {};
318
319
  if (reactRouterConfigFile) {
@@ -514,6 +515,11 @@ async function resolveConfig({
514
515
  "The `future.unstable_passThroughRequests` flag has been stabilized as `future.v8_passThroughRequests`"
515
516
  );
516
517
  }
518
+ if ("unstable_trailingSlashAwareDataRequests" in futureConfig) {
519
+ return err(
520
+ "The `future.unstable_trailingSlashAwareDataRequests` flag has been stabilized as `future.v8_trailingSlashAwareDataRequests`"
521
+ );
522
+ }
517
523
  if ("unstable_subResourceIntegrity" in futureConfig) {
518
524
  return err(
519
525
  "The `future.unstable_subResourceIntegrity` flag has been stabilized and moved to a top-level `config.subResourceIntegrity` field"
@@ -523,7 +529,7 @@ async function resolveConfig({
523
529
  let future = {
524
530
  unstable_optimizeDeps: userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,
525
531
  v8_passThroughRequests: userAndPresetConfigs.future?.v8_passThroughRequests ?? false,
526
- unstable_trailingSlashAwareDataRequests: userAndPresetConfigs.future?.unstable_trailingSlashAwareDataRequests ?? false,
532
+ v8_trailingSlashAwareDataRequests: userAndPresetConfigs.future?.v8_trailingSlashAwareDataRequests ?? false,
527
533
  unstable_previewServerPrerendering: userAndPresetConfigs.future?.unstable_previewServerPrerendering ?? false,
528
534
  v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
529
535
  v8_splitRouteModules: userAndPresetConfigs.future?.v8_splitRouteModules ?? false,
@@ -551,14 +557,59 @@ async function resolveConfig({
551
557
  for (let preset of reactRouterUserConfig.presets ?? []) {
552
558
  await preset.reactRouterConfigResolved?.({ reactRouterConfig });
553
559
  }
560
+ if (shouldLogFutureFlagWarnings) {
561
+ logFutureFlagWarnings(userAndPresetConfigs.future || {});
562
+ }
554
563
  return ok(reactRouterConfig);
555
564
  }
565
+ function logFutureFlagWarning(flag, message) {
566
+ console.log(
567
+ import_picocolors.default.yellow(
568
+ ` \u26A0\uFE0F Future Flag Warning: ${message}
569
+ You can use the \`future.${flag}\` flag to opt in early.
570
+ -> https://reactrouter.com/v7/upgrading/future#future${flag.toLowerCase()}`
571
+ )
572
+ );
573
+ }
574
+ function logFutureFlagWarnings(future) {
575
+ if (future.v8_middleware === void 0) {
576
+ logFutureFlagWarning(
577
+ "v8_middleware",
578
+ "Route middleware support is changing in React Router v8."
579
+ );
580
+ }
581
+ if (future.v8_splitRouteModules === void 0) {
582
+ logFutureFlagWarning(
583
+ "v8_splitRouteModules",
584
+ "Route module splitting behavior is changing in React Router v8."
585
+ );
586
+ }
587
+ if (future.v8_viteEnvironmentApi === void 0) {
588
+ logFutureFlagWarning(
589
+ "v8_viteEnvironmentApi",
590
+ "Vite Environment API usage is changing in React Router v8."
591
+ );
592
+ }
593
+ if (future.v8_passThroughRequests === void 0) {
594
+ logFutureFlagWarning(
595
+ "v8_passThroughRequests",
596
+ "Request handling behavior is changing in React Router v8."
597
+ );
598
+ }
599
+ if (future.v8_trailingSlashAwareDataRequests === void 0) {
600
+ logFutureFlagWarning(
601
+ "v8_trailingSlashAwareDataRequests",
602
+ "Data request URL formats are changing in React Router v8."
603
+ );
604
+ }
605
+ }
556
606
  async function createConfigLoader({
557
607
  rootDirectory: root,
558
608
  watch: watch2,
559
609
  mode,
560
610
  skipRoutes,
561
- validateConfig
611
+ validateConfig,
612
+ shouldLogFutureFlagWarnings
562
613
  }) {
563
614
  root = import_pathe3.default.normalize(root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd());
564
615
  let vite2 = await import("vite");
@@ -582,10 +633,17 @@ async function createConfigLoader({
582
633
  viteNodeContext,
583
634
  reactRouterConfigFile,
584
635
  skipRoutes,
585
- validateConfig
636
+ validateConfig,
637
+ shouldLogFutureFlagWarnings
586
638
  });
587
639
  let appDirectory;
588
- let initialConfigResult = await getConfig();
640
+ let initialConfigResult = await resolveConfig({
641
+ root,
642
+ viteNodeContext,
643
+ reactRouterConfigFile,
644
+ skipRoutes,
645
+ validateConfig
646
+ });
589
647
  if (!initialConfigResult.ok) {
590
648
  throw new Error(initialConfigResult.error);
591
649
  }
package/dist/config.d.ts CHANGED
@@ -39,7 +39,7 @@ type ServerModuleFormat = "esm" | "cjs";
39
39
  interface FutureConfig {
40
40
  unstable_optimizeDeps: boolean;
41
41
  v8_passThroughRequests: boolean;
42
- unstable_trailingSlashAwareDataRequests: boolean;
42
+ v8_trailingSlashAwareDataRequests: boolean;
43
43
  /**
44
44
  * Prerender with Vite Preview server
45
45
  */
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.15.1
2
+ * @react-router/dev v7.17.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/routes.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.15.1
2
+ * @react-router/dev v7.17.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.15.1
2
+ * @react-router/dev v7.17.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -338,7 +338,8 @@ async function resolveConfig({
338
338
  viteNodeContext,
339
339
  reactRouterConfigFile,
340
340
  skipRoutes,
341
- validateConfig
341
+ validateConfig,
342
+ shouldLogFutureFlagWarnings
342
343
  }) {
343
344
  let reactRouterUserConfig = {};
344
345
  if (reactRouterConfigFile) {
@@ -540,6 +541,11 @@ async function resolveConfig({
540
541
  "The `future.unstable_passThroughRequests` flag has been stabilized as `future.v8_passThroughRequests`"
541
542
  );
542
543
  }
544
+ if ("unstable_trailingSlashAwareDataRequests" in futureConfig) {
545
+ return err(
546
+ "The `future.unstable_trailingSlashAwareDataRequests` flag has been stabilized as `future.v8_trailingSlashAwareDataRequests`"
547
+ );
548
+ }
543
549
  if ("unstable_subResourceIntegrity" in futureConfig) {
544
550
  return err(
545
551
  "The `future.unstable_subResourceIntegrity` flag has been stabilized and moved to a top-level `config.subResourceIntegrity` field"
@@ -549,7 +555,7 @@ async function resolveConfig({
549
555
  let future = {
550
556
  unstable_optimizeDeps: userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,
551
557
  v8_passThroughRequests: userAndPresetConfigs.future?.v8_passThroughRequests ?? false,
552
- unstable_trailingSlashAwareDataRequests: userAndPresetConfigs.future?.unstable_trailingSlashAwareDataRequests ?? false,
558
+ v8_trailingSlashAwareDataRequests: userAndPresetConfigs.future?.v8_trailingSlashAwareDataRequests ?? false,
553
559
  unstable_previewServerPrerendering: userAndPresetConfigs.future?.unstable_previewServerPrerendering ?? false,
554
560
  v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
555
561
  v8_splitRouteModules: userAndPresetConfigs.future?.v8_splitRouteModules ?? false,
@@ -577,14 +583,59 @@ async function resolveConfig({
577
583
  for (let preset of reactRouterUserConfig.presets ?? []) {
578
584
  await preset.reactRouterConfigResolved?.({ reactRouterConfig });
579
585
  }
586
+ if (shouldLogFutureFlagWarnings) {
587
+ logFutureFlagWarnings(userAndPresetConfigs.future || {});
588
+ }
580
589
  return ok(reactRouterConfig);
581
590
  }
591
+ function logFutureFlagWarning(flag, message) {
592
+ console.log(
593
+ import_picocolors.default.yellow(
594
+ ` \u26A0\uFE0F Future Flag Warning: ${message}
595
+ You can use the \`future.${flag}\` flag to opt in early.
596
+ -> https://reactrouter.com/v7/upgrading/future#future${flag.toLowerCase()}`
597
+ )
598
+ );
599
+ }
600
+ function logFutureFlagWarnings(future) {
601
+ if (future.v8_middleware === void 0) {
602
+ logFutureFlagWarning(
603
+ "v8_middleware",
604
+ "Route middleware support is changing in React Router v8."
605
+ );
606
+ }
607
+ if (future.v8_splitRouteModules === void 0) {
608
+ logFutureFlagWarning(
609
+ "v8_splitRouteModules",
610
+ "Route module splitting behavior is changing in React Router v8."
611
+ );
612
+ }
613
+ if (future.v8_viteEnvironmentApi === void 0) {
614
+ logFutureFlagWarning(
615
+ "v8_viteEnvironmentApi",
616
+ "Vite Environment API usage is changing in React Router v8."
617
+ );
618
+ }
619
+ if (future.v8_passThroughRequests === void 0) {
620
+ logFutureFlagWarning(
621
+ "v8_passThroughRequests",
622
+ "Request handling behavior is changing in React Router v8."
623
+ );
624
+ }
625
+ if (future.v8_trailingSlashAwareDataRequests === void 0) {
626
+ logFutureFlagWarning(
627
+ "v8_trailingSlashAwareDataRequests",
628
+ "Data request URL formats are changing in React Router v8."
629
+ );
630
+ }
631
+ }
582
632
  async function createConfigLoader({
583
633
  rootDirectory: root,
584
634
  watch,
585
635
  mode,
586
636
  skipRoutes,
587
- validateConfig
637
+ validateConfig,
638
+ shouldLogFutureFlagWarnings
588
639
  }) {
589
640
  root = import_pathe3.default.normalize(root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd());
590
641
  let vite2 = await import("vite");
@@ -608,10 +659,17 @@ async function createConfigLoader({
608
659
  viteNodeContext,
609
660
  reactRouterConfigFile,
610
661
  skipRoutes,
611
- validateConfig
662
+ validateConfig,
663
+ shouldLogFutureFlagWarnings
612
664
  });
613
665
  let appDirectory;
614
- let initialConfigResult = await getConfig();
666
+ let initialConfigResult = await resolveConfig({
667
+ root,
668
+ viteNodeContext,
669
+ reactRouterConfigFile,
670
+ skipRoutes,
671
+ validateConfig
672
+ });
615
673
  if (!initialConfigResult.ok) {
616
674
  throw new Error(initialConfigResult.error);
617
675
  }
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.15.1
2
+ * @react-router/dev v7.17.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -375,7 +375,8 @@ async function resolveConfig({
375
375
  viteNodeContext,
376
376
  reactRouterConfigFile,
377
377
  skipRoutes,
378
- validateConfig
378
+ validateConfig,
379
+ shouldLogFutureFlagWarnings
379
380
  }) {
380
381
  let reactRouterUserConfig = {};
381
382
  if (reactRouterConfigFile) {
@@ -577,6 +578,11 @@ async function resolveConfig({
577
578
  "The `future.unstable_passThroughRequests` flag has been stabilized as `future.v8_passThroughRequests`"
578
579
  );
579
580
  }
581
+ if ("unstable_trailingSlashAwareDataRequests" in futureConfig) {
582
+ return err(
583
+ "The `future.unstable_trailingSlashAwareDataRequests` flag has been stabilized as `future.v8_trailingSlashAwareDataRequests`"
584
+ );
585
+ }
580
586
  if ("unstable_subResourceIntegrity" in futureConfig) {
581
587
  return err(
582
588
  "The `future.unstable_subResourceIntegrity` flag has been stabilized and moved to a top-level `config.subResourceIntegrity` field"
@@ -586,7 +592,7 @@ async function resolveConfig({
586
592
  let future = {
587
593
  unstable_optimizeDeps: userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,
588
594
  v8_passThroughRequests: userAndPresetConfigs.future?.v8_passThroughRequests ?? false,
589
- unstable_trailingSlashAwareDataRequests: userAndPresetConfigs.future?.unstable_trailingSlashAwareDataRequests ?? false,
595
+ v8_trailingSlashAwareDataRequests: userAndPresetConfigs.future?.v8_trailingSlashAwareDataRequests ?? false,
590
596
  unstable_previewServerPrerendering: userAndPresetConfigs.future?.unstable_previewServerPrerendering ?? false,
591
597
  v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
592
598
  v8_splitRouteModules: userAndPresetConfigs.future?.v8_splitRouteModules ?? false,
@@ -614,14 +620,59 @@ async function resolveConfig({
614
620
  for (let preset of reactRouterUserConfig.presets ?? []) {
615
621
  await preset.reactRouterConfigResolved?.({ reactRouterConfig });
616
622
  }
623
+ if (shouldLogFutureFlagWarnings) {
624
+ logFutureFlagWarnings(userAndPresetConfigs.future || {});
625
+ }
617
626
  return ok(reactRouterConfig);
618
627
  }
628
+ function logFutureFlagWarning(flag, message) {
629
+ console.log(
630
+ import_picocolors.default.yellow(
631
+ ` \u26A0\uFE0F Future Flag Warning: ${message}
632
+ You can use the \`future.${flag}\` flag to opt in early.
633
+ -> https://reactrouter.com/v7/upgrading/future#future${flag.toLowerCase()}`
634
+ )
635
+ );
636
+ }
637
+ function logFutureFlagWarnings(future) {
638
+ if (future.v8_middleware === void 0) {
639
+ logFutureFlagWarning(
640
+ "v8_middleware",
641
+ "Route middleware support is changing in React Router v8."
642
+ );
643
+ }
644
+ if (future.v8_splitRouteModules === void 0) {
645
+ logFutureFlagWarning(
646
+ "v8_splitRouteModules",
647
+ "Route module splitting behavior is changing in React Router v8."
648
+ );
649
+ }
650
+ if (future.v8_viteEnvironmentApi === void 0) {
651
+ logFutureFlagWarning(
652
+ "v8_viteEnvironmentApi",
653
+ "Vite Environment API usage is changing in React Router v8."
654
+ );
655
+ }
656
+ if (future.v8_passThroughRequests === void 0) {
657
+ logFutureFlagWarning(
658
+ "v8_passThroughRequests",
659
+ "Request handling behavior is changing in React Router v8."
660
+ );
661
+ }
662
+ if (future.v8_trailingSlashAwareDataRequests === void 0) {
663
+ logFutureFlagWarning(
664
+ "v8_trailingSlashAwareDataRequests",
665
+ "Data request URL formats are changing in React Router v8."
666
+ );
667
+ }
668
+ }
619
669
  async function createConfigLoader({
620
670
  rootDirectory: root,
621
671
  watch: watch2,
622
672
  mode,
623
673
  skipRoutes,
624
- validateConfig
674
+ validateConfig,
675
+ shouldLogFutureFlagWarnings
625
676
  }) {
626
677
  root = import_pathe3.default.normalize(root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd());
627
678
  let vite2 = await import("vite");
@@ -645,10 +696,17 @@ async function createConfigLoader({
645
696
  viteNodeContext,
646
697
  reactRouterConfigFile,
647
698
  skipRoutes,
648
- validateConfig
699
+ validateConfig,
700
+ shouldLogFutureFlagWarnings
649
701
  });
650
702
  let appDirectory;
651
- let initialConfigResult = await getConfig();
703
+ let initialConfigResult = await resolveConfig({
704
+ root,
705
+ viteNodeContext,
706
+ reactRouterConfigFile,
707
+ skipRoutes,
708
+ validateConfig
709
+ });
652
710
  if (!initialConfigResult.ok) {
653
711
  throw new Error(initialConfigResult.error);
654
712
  }
@@ -3527,7 +3585,8 @@ var reactRouterVitePlugin = () => {
3527
3585
  reactRouterConfigLoader = await createConfigLoader({
3528
3586
  rootDirectory,
3529
3587
  mode,
3530
- watch: viteCommand === "serve"
3588
+ watch: viteCommand === "serve",
3589
+ shouldLogFutureFlagWarnings: viteCommand !== "build" || viteConfigEnv.isSsrBuild === true
3531
3590
  });
3532
3591
  await updatePluginContext();
3533
3592
  let environments = await getEnvironmentsOptions(ctx, viteCommand, {
@@ -4986,7 +5045,7 @@ function getStaticPrerenderPaths(routes) {
4986
5045
  }
4987
5046
  async function prerenderData(handler, prerenderPath, onlyRoutes, clientBuildDirectory, reactRouterConfig, viteConfig, requestInit) {
4988
5047
  let dataRequestPath;
4989
- if (reactRouterConfig.future.unstable_trailingSlashAwareDataRequests) {
5048
+ if (reactRouterConfig.future.v8_trailingSlashAwareDataRequests) {
4990
5049
  if (prerenderPath.endsWith("/")) {
4991
5050
  dataRequestPath = `${prerenderPath}_.data`;
4992
5051
  } else {
@@ -6105,6 +6164,13 @@ if (import.meta.hot) {
6105
6164
  }
6106
6165
  };
6107
6166
  }
6167
+ function createClientRouteModuleForOptimizeDepsScan(code) {
6168
+ const ast = import_parser.parse(code, {
6169
+ sourceType: "module"
6170
+ });
6171
+ removeExports(ast, SERVER_ROUTE_EXPORTS);
6172
+ return generate(ast);
6173
+ }
6108
6174
  function createId(id, type, value) {
6109
6175
  let [base, ...rest] = id.split("?");
6110
6176
  const searchParams = new URLSearchParams(rest.join("?"));
@@ -6361,6 +6427,15 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
6361
6427
  reactRouterConfig: config
6362
6428
  });
6363
6429
  let viteNormalizePath = (await import("vite")).normalizePath;
6430
+ let optimizeDepsEntries = getOptimizeDepsEntries({
6431
+ entryClientFilePath: entries.client,
6432
+ reactRouterConfig: config
6433
+ });
6434
+ let routeFiles = new Set(
6435
+ Object.values(config.routes).map(
6436
+ (route) => resolveRelativeRouteFilePath(route, config)
6437
+ )
6438
+ );
6364
6439
  return {
6365
6440
  resolve: {
6366
6441
  dedupe: [
@@ -6383,15 +6458,18 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
6383
6458
  ]
6384
6459
  },
6385
6460
  optimizeDeps: {
6386
- entries: getOptimizeDepsEntries({
6387
- entryClientFilePath: entries.client,
6388
- reactRouterConfig: config
6389
- }),
6461
+ entries: optimizeDepsEntries,
6390
6462
  ...defineOptimizeDepsCompilerOptions({
6391
6463
  rolldown: {
6392
6464
  transform: {
6393
6465
  jsx: "react-jsx"
6394
- }
6466
+ },
6467
+ plugins: config.future.unstable_optimizeDeps ? [
6468
+ createRSCOptimizeDepsRouteModulesPlugin({
6469
+ routeFiles,
6470
+ transformToJs
6471
+ })
6472
+ ] : []
6395
6473
  },
6396
6474
  esbuild: {
6397
6475
  jsx: "automatic"
@@ -6842,6 +6920,32 @@ function invalidateVirtualModules2(viteDevServer) {
6842
6920
  function getRootDirectory(viteUserConfig) {
6843
6921
  return viteUserConfig.root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd();
6844
6922
  }
6923
+ var jsRouteModuleRE = /\.[cm]?[jt]sx?$/;
6924
+ function createRSCOptimizeDepsRouteModulesPlugin({
6925
+ routeFiles,
6926
+ transformToJs
6927
+ }) {
6928
+ return {
6929
+ name: "react-router:rsc-optimize-deps-route-modules",
6930
+ transform: {
6931
+ filter: { id: jsRouteModuleRE },
6932
+ async handler(code, id) {
6933
+ let filename2 = id.split("?")[0];
6934
+ let normalizedFilename = getVite().normalizePath(filename2);
6935
+ if (!routeFiles.has(normalizedFilename)) {
6936
+ return;
6937
+ }
6938
+ let js2 = await transformToJs(code, filename2);
6939
+ let generated = createClientRouteModuleForOptimizeDepsScan(js2);
6940
+ return {
6941
+ code: generated.code,
6942
+ map: null,
6943
+ moduleType: "js"
6944
+ };
6945
+ }
6946
+ }
6947
+ };
6948
+ }
6845
6949
  var getClientBuildDirectory2 = (reactRouterConfig) => import_pathe6.default.join(reactRouterConfig.buildDirectory, "client");
6846
6950
  function getPrerenderConcurrencyConfig2(reactRouterConfig) {
6847
6951
  let concurrency = 1;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-router/dev",
3
- "version": "7.15.1",
3
+ "version": "7.17.0",
4
4
  "description": "Dev tools and CLI for React Router",
5
5
  "homepage": "https://reactrouter.com",
6
6
  "bugs": {
@@ -92,7 +92,7 @@
92
92
  "tinyglobby": "^0.2.14",
93
93
  "valibot": "^1.2.0",
94
94
  "vite-node": "^3.2.2",
95
- "@react-router/node": "7.15.1"
95
+ "@react-router/node": "7.17.0"
96
96
  },
97
97
  "devDependencies": {
98
98
  "@types/babel__core": "^7.20.5",
@@ -116,8 +116,8 @@
116
116
  "vite": "^6.3.0",
117
117
  "wireit": "0.14.9",
118
118
  "wrangler": "^4.23.0",
119
- "@react-router/serve": "7.15.1",
120
- "react-router": "^7.15.1"
119
+ "react-router": "^7.17.0",
120
+ "@react-router/serve": "7.17.0"
121
121
  },
122
122
  "peerDependencies": {
123
123
  "@vitejs/plugin-rsc": "~0.5.21",
@@ -125,8 +125,8 @@
125
125
  "typescript": "^5.1.0 || ^6.0.0",
126
126
  "vite": "^5.1.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
127
127
  "wrangler": "^3.28.2 || ^4.0.0",
128
- "@react-router/serve": "^7.15.1",
129
- "react-router": "^7.15.1"
128
+ "@react-router/serve": "^7.17.0",
129
+ "react-router": "^7.17.0"
130
130
  },
131
131
  "peerDependenciesMeta": {
132
132
  "@vitejs/plugin-rsc": {