@react-router/dev 7.0.2 → 7.1.0-pre.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,24 @@
1
1
  # `@react-router/dev`
2
2
 
3
+ ## 7.1.0-pre.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Add support for Vite v6 ([#12469](https://github.com/remix-run/react-router/pull/12469))
8
+
9
+ ### Patch Changes
10
+
11
+ - Properly initialize `NODE_ENV` if not already set for compatibility with React 19 ([#12578](https://github.com/remix-run/react-router/pull/12578))
12
+ - Remove the leftover/unused `abortDelay` prop from `ServerRouter` and update the default `entry.server.tsx` to use the new `streamTimeout` value for Single Fetch ([#12478](https://github.com/remix-run/react-router/pull/12478))
13
+
14
+ - The `abortDelay` functionality was removed in v7 as it was coupled to the `defer` implementation from Remix v2, but this removal of this prop was missed
15
+ - If you were still using this prop in your `entry.server` file, it's likely your app is not aborting streams as you would expect and you will need to adopt the new [`streamTimeout`](https://reactrouter.com/explanation/special-files#streamtimeout) value introduced with Single Fetch
16
+
17
+ - Updated dependencies:
18
+ - `react-router@7.1.0-pre.0`
19
+ - `@react-router/node@7.1.0-pre.0`
20
+ - `@react-router/serve@7.1.0-pre.0`
21
+
3
22
  ## 7.0.2
4
23
 
5
24
  ### Patch Changes
@@ -44,7 +63,7 @@
44
63
  +import { cloudflareDevProxy } from "@react-router/dev/vite/cloudflare";
45
64
  ```
46
65
 
47
- - Remove single\_fetch future flag. ([#11522](https://github.com/remix-run/react-router/pull/11522))
66
+ - Remove single_fetch future flag. ([#11522](https://github.com/remix-run/react-router/pull/11522))
48
67
 
49
68
  - update minimum node version to 18 ([#11690](https://github.com/remix-run/react-router/pull/11690))
50
69
 
package/bin.js CHANGED
@@ -1,2 +1,15 @@
1
1
  #!/usr/bin/env node
2
+ let arg = require("arg");
3
+
4
+ // Minimal replication of our actual parsing in `run.ts`. If not already set,
5
+ // default `NODE_ENV` so React loads the proper version in it's CJS entry script.
6
+ // We have to do this before importing `run.ts` since that is what imports
7
+ // `react` (indirectly via `react-router`)
8
+ let args = arg({}, { argv: process.argv.slice(2) });
9
+ if (args._[0] === "dev") {
10
+ process.env.NODE_ENV = process.env.NODE_ENV ?? "development";
11
+ } else {
12
+ process.env.NODE_ENV = process.env.NODE_ENV ?? "production";
13
+ }
14
+
2
15
  require("./dist/cli/index");
package/dist/cli/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * @react-router/dev v7.0.2
3
+ * @react-router/dev v7.1.0-pre.0
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
@@ -100,11 +100,11 @@ async function createContext(viteConfig = {}) {
100
100
  const runner = new import_client.ViteNodeRunner({
101
101
  root: devServer.config.root,
102
102
  base: devServer.config.base,
103
- fetchModule(id2) {
104
- return server.fetchModule(id2);
103
+ fetchModule(id) {
104
+ return server.fetchModule(id);
105
105
  },
106
- resolveId(id2, importer) {
107
- return server.resolveId(id2, importer);
106
+ resolveId(id, importer) {
107
+ return server.resolveId(id, importer);
108
108
  }
109
109
  });
110
110
  return { devServer, server, runner };
@@ -160,24 +160,24 @@ ${message}`
160
160
  function configRoutesToRouteManifest(appDirectory, routes2, rootId = "root") {
161
161
  let routeManifest = {};
162
162
  function walk(route, parentId) {
163
- let id2 = route.id || createRouteId(route.file);
163
+ let id = route.id || createRouteId(route.file);
164
164
  let manifestItem = {
165
- id: id2,
165
+ id,
166
166
  parentId,
167
167
  file: Path.isAbsolute(route.file) ? Path.relative(appDirectory, route.file) : route.file,
168
168
  path: route.path,
169
169
  index: route.index,
170
170
  caseSensitive: route.caseSensitive
171
171
  };
172
- if (routeManifest.hasOwnProperty(id2)) {
172
+ if (routeManifest.hasOwnProperty(id)) {
173
173
  throw new Error(
174
- `Unable to define routes with duplicate route id: "${id2}"`
174
+ `Unable to define routes with duplicate route id: "${id}"`
175
175
  );
176
176
  }
177
- routeManifest[id2] = manifestItem;
177
+ routeManifest[id] = manifestItem;
178
178
  if (route.children) {
179
179
  for (let child of route.children) {
180
- walk(child, id2);
180
+ walk(child, id);
181
181
  }
182
182
  }
183
183
  }
@@ -808,17 +808,24 @@ var init_styles = __esm({
808
808
  path3 = __toESM(require("path"));
809
809
  import_react_router = require("react-router");
810
810
  init_resolve_file_url();
811
+ init_import_vite_esm_sync();
811
812
  cssFileRegExp = /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/;
812
813
  cssModulesRegExp = new RegExp(`\\.module${cssFileRegExp.source}`);
813
814
  }
814
815
  });
815
816
 
816
- // vite/vmod.ts
817
- var id;
818
- var init_vmod = __esm({
819
- "vite/vmod.ts"() {
817
+ // vite/virtual-module.ts
818
+ function create(name) {
819
+ let id = `virtual:react-router/${name}`;
820
+ return {
821
+ id,
822
+ resolvedId: `\0${id}`,
823
+ url: `/@id/__x00__${id}`
824
+ };
825
+ }
826
+ var init_virtual_module = __esm({
827
+ "vite/virtual-module.ts"() {
820
828
  "use strict";
821
- id = (name) => `virtual:react-router/${name}`;
822
829
  }
823
830
  });
824
831
 
@@ -840,14 +847,14 @@ var init_remove_exports = __esm({
840
847
  });
841
848
 
842
849
  // vite/with-props.ts
843
- var import_dedent2, vmodId;
850
+ var import_dedent2, vmod;
844
851
  var init_with_props = __esm({
845
852
  "vite/with-props.ts"() {
846
853
  "use strict";
847
854
  import_dedent2 = __toESM(require("dedent"));
848
855
  init_babel();
849
- init_vmod();
850
- vmodId = id("with-props");
856
+ init_virtual_module();
857
+ vmod = create("with-props");
851
858
  }
852
859
  });
853
860
 
@@ -912,7 +919,7 @@ function findConfig(dir, basename2, extensions) {
912
919
  }
913
920
  return void 0;
914
921
  }
915
- var import_node_crypto, path4, url, fse, babel, import_react_router2, import_es_module_lexer, import_jsesc, import_picocolors3, serverBuildId, serverManifestId, browserManifestId, hmrRuntimeId, injectHmrRuntimeId, getServerBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER, REACT_REFRESH_FOOTER;
922
+ var import_node_crypto, path4, url, fse, babel, import_react_router2, import_es_module_lexer, import_jsesc, import_picocolors3, virtualHmrRuntime, virtualInjectHmrRuntime, virtual, getServerBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER, REACT_REFRESH_FOOTER;
916
923
  var init_plugin = __esm({
917
924
  "vite/plugin.ts"() {
918
925
  "use strict";
@@ -930,18 +937,20 @@ var init_plugin = __esm({
930
937
  init_babel();
931
938
  init_node_adapter();
932
939
  init_styles();
933
- init_vmod();
940
+ init_virtual_module();
934
941
  init_resolve_file_url();
935
942
  init_combine_urls();
936
943
  init_remove_exports();
937
944
  init_import_vite_esm_sync();
938
945
  init_config();
939
946
  init_with_props();
940
- serverBuildId = id("server-build");
941
- serverManifestId = id("server-manifest");
942
- browserManifestId = id("browser-manifest");
943
- hmrRuntimeId = id("hmr-runtime");
944
- injectHmrRuntimeId = id("inject-hmr-runtime");
947
+ virtualHmrRuntime = create("hmr-runtime");
948
+ virtualInjectHmrRuntime = create("inject-hmr-runtime");
949
+ virtual = {
950
+ serverBuild: create("server-build"),
951
+ serverManifest: create("server-manifest"),
952
+ browserManifest: create("browser-manifest")
953
+ };
945
954
  getServerBuildDirectory = (ctx) => path4.join(
946
955
  ctx.reactRouterConfig.buildDirectory,
947
956
  "server",
@@ -956,7 +965,7 @@ var init_plugin = __esm({
956
965
  defaultEntries = fse.readdirSync(defaultEntriesDir).map((filename3) => path4.join(defaultEntriesDir, filename3));
957
966
  invariant(defaultEntries.length > 0, "No default entries found");
958
967
  REACT_REFRESH_HEADER = `
959
- import RefreshRuntime from "${hmrRuntimeId}";
968
+ import RefreshRuntime from "${virtualHmrRuntime.id}";
960
969
 
961
970
  const inWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
962
971
  let prevRefreshReg;
@@ -1039,8 +1048,8 @@ __export(build_exports, {
1039
1048
  });
1040
1049
  function getAddressableRoutes(routes2) {
1041
1050
  let nonAddressableIds = /* @__PURE__ */ new Set();
1042
- for (let id2 in routes2) {
1043
- let route = routes2[id2];
1051
+ for (let id in routes2) {
1052
+ let route = routes2[id];
1044
1053
  if (route.index) {
1045
1054
  invariant(
1046
1055
  route.parentId,
@@ -1049,7 +1058,7 @@ function getAddressableRoutes(routes2) {
1049
1058
  nonAddressableIds.add(route.parentId);
1050
1059
  }
1051
1060
  if (typeof route.path !== "string" && !route.index) {
1052
- nonAddressableIds.add(id2);
1061
+ nonAddressableIds.add(id);
1053
1062
  }
1054
1063
  }
1055
1064
  return Object.values(routes2).filter(
@@ -1080,12 +1089,12 @@ async function getServerBuilds(ctx) {
1080
1089
  let { normalizePath } = await import("vite");
1081
1090
  let resolvedAppDirectory = import_node_path2.default.resolve(rootDirectory, appDirectory);
1082
1091
  let rootRelativeRoutes = Object.fromEntries(
1083
- Object.entries(routes2).map(([id2, route]) => {
1092
+ Object.entries(routes2).map(([id, route]) => {
1084
1093
  let filePath = import_node_path2.default.join(resolvedAppDirectory, route.file);
1085
1094
  let rootRelativeFilePath = normalizePath(
1086
1095
  import_node_path2.default.relative(rootDirectory, filePath)
1087
1096
  );
1088
- return [id2, { ...route, file: rootRelativeFilePath }];
1097
+ return [id, { ...route, file: rootRelativeFilePath }];
1089
1098
  })
1090
1099
  );
1091
1100
  let buildManifest = {
@@ -7,7 +7,7 @@ import { isbot } from "isbot";
7
7
  import type { RenderToPipeableStreamOptions } from "react-dom/server";
8
8
  import { renderToPipeableStream } from "react-dom/server";
9
9
 
10
- const ABORT_DELAY = 5_000;
10
+ export const streamTimeout = 5_000;
11
11
 
12
12
  export default function handleRequest(
13
13
  request: Request,
@@ -28,11 +28,7 @@ export default function handleRequest(
28
28
  : "onShellReady";
29
29
 
30
30
  const { pipe, abort } = renderToPipeableStream(
31
- <ServerRouter
32
- context={routerContext}
33
- url={request.url}
34
- abortDelay={ABORT_DELAY}
35
- />,
31
+ <ServerRouter context={routerContext} url={request.url} />,
36
32
  {
37
33
  [readyOption]() {
38
34
  shellRendered = true;
@@ -65,6 +61,8 @@ export default function handleRequest(
65
61
  }
66
62
  );
67
63
 
68
- setTimeout(abort, ABORT_DELAY);
64
+ // Abort the rendering stream after the `streamTimeout` so it has tine to
65
+ // flush down the rejected boundaries
66
+ setTimeout(abort, streamTimeout + 1000);
69
67
  });
70
68
  }
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.0.2
2
+ * @react-router/dev v7.1.0-pre.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.0.2
2
+ * @react-router/dev v7.1.0-pre.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.0.2
2
+ * @react-router/dev v7.1.0-pre.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.0.2
2
+ * @react-router/dev v7.1.0-pre.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -47,7 +47,7 @@ module.exports = __toCommonJS(vite_exports);
47
47
  // vite/plugin.ts
48
48
  var import_node_crypto = require("crypto");
49
49
  var path4 = __toESM(require("path"));
50
- var url2 = __toESM(require("url"));
50
+ var url = __toESM(require("url"));
51
51
  var fse = __toESM(require("fs-extra"));
52
52
  var babel = __toESM(require("@babel/core"));
53
53
  var import_react_router2 = require("react-router");
@@ -119,11 +119,11 @@ async function createContext(viteConfig = {}) {
119
119
  const runner = new import_client.ViteNodeRunner({
120
120
  root: devServer.config.root,
121
121
  base: devServer.config.base,
122
- fetchModule(id2) {
123
- return server.fetchModule(id2);
122
+ fetchModule(id) {
123
+ return server.fetchModule(id);
124
124
  },
125
- resolveId(id2, importer) {
126
- return server.resolveId(id2, importer);
125
+ resolveId(id, importer) {
126
+ return server.resolveId(id, importer);
127
127
  }
128
128
  });
129
129
  return { devServer, server, runner };
@@ -195,24 +195,24 @@ ${message}`
195
195
  function configRoutesToRouteManifest(appDirectory, routes, rootId = "root") {
196
196
  let routeManifest = {};
197
197
  function walk(route, parentId) {
198
- let id2 = route.id || createRouteId(route.file);
198
+ let id = route.id || createRouteId(route.file);
199
199
  let manifestItem = {
200
- id: id2,
200
+ id,
201
201
  parentId,
202
202
  file: Path.isAbsolute(route.file) ? Path.relative(appDirectory, route.file) : route.file,
203
203
  path: route.path,
204
204
  index: route.index,
205
205
  caseSensitive: route.caseSensitive
206
206
  };
207
- if (routeManifest.hasOwnProperty(id2)) {
207
+ if (routeManifest.hasOwnProperty(id)) {
208
208
  throw new Error(
209
- `Unable to define routes with duplicate route id: "${id2}"`
209
+ `Unable to define routes with duplicate route id: "${id}"`
210
210
  );
211
211
  }
212
- routeManifest[id2] = manifestItem;
212
+ routeManifest[id] = manifestItem;
213
213
  if (route.children) {
214
214
  for (let child of route.children) {
215
- walk(child, id2);
215
+ walk(child, id);
216
216
  }
217
217
  }
218
218
  }
@@ -812,7 +812,7 @@ function fromNodeRequest(nodeReq, nodeRes) {
812
812
  nodeReq.originalUrl,
813
813
  "Expected `nodeReq.originalUrl` to be defined"
814
814
  );
815
- let url3 = new URL(nodeReq.originalUrl, origin);
815
+ let url2 = new URL(nodeReq.originalUrl, origin);
816
816
  let controller = new AbortController();
817
817
  let init = {
818
818
  method: nodeReq.method,
@@ -825,7 +825,7 @@ function fromNodeRequest(nodeReq, nodeRes) {
825
825
  init.body = (0, import_node.createReadableStreamFromReadable)(nodeReq);
826
826
  init.duplex = "half";
827
827
  }
828
- return new Request(url3.href, init);
828
+ return new Request(url2.href, init);
829
829
  }
830
830
  async function toNodeRequest(res, nodeRes) {
831
831
  nodeRes.statusCode = res.status;
@@ -871,8 +871,8 @@ var cssModulesRegExp = new RegExp(`\\.module${cssFileRegExp.source}`);
871
871
  var isCssFile = (file) => cssFileRegExp.test(file);
872
872
  var isCssModulesFile = (file) => cssModulesRegExp.test(file);
873
873
  var cssUrlParamsWithoutSideEffects = ["url", "inline", "raw", "inline-css"];
874
- var isCssUrlWithoutSideEffects = (url3) => {
875
- let queryString = url3.split("?")[1];
874
+ var isCssUrlWithoutSideEffects = (url2) => {
875
+ let queryString = url2.split("?")[1];
876
876
  if (!queryString) {
877
877
  return false;
878
878
  }
@@ -880,19 +880,22 @@ var isCssUrlWithoutSideEffects = (url3) => {
880
880
  for (let paramWithoutSideEffects of cssUrlParamsWithoutSideEffects) {
881
881
  if (
882
882
  // Parameter is blank and not explicitly set, i.e. "?url", not "?url="
883
- params.get(paramWithoutSideEffects) === "" && !url3.includes(`?${paramWithoutSideEffects}=`) && !url3.includes(`&${paramWithoutSideEffects}=`)
883
+ params.get(paramWithoutSideEffects) === "" && !url2.includes(`?${paramWithoutSideEffects}=`) && !url2.includes(`&${paramWithoutSideEffects}=`)
884
884
  ) {
885
885
  return true;
886
886
  }
887
887
  }
888
888
  return false;
889
889
  };
890
+ var injectQuery = (url2, query) => url2.includes("?") ? url2.replace("?", `?${query}&`) : `${url2}?${query}`;
890
891
  var getStylesForFiles = async ({
891
892
  viteDevServer,
892
893
  rootDirectory,
893
894
  cssModulesManifest,
894
895
  files
895
896
  }) => {
897
+ let vite2 = importViteEsmSync();
898
+ let viteMajor = parseInt(vite2.version.split(".")[0], 10);
896
899
  let styles = {};
897
900
  let deps = /* @__PURE__ */ new Set();
898
901
  try {
@@ -921,7 +924,15 @@ var getStylesForFiles = async ({
921
924
  for (let dep of deps) {
922
925
  if (dep.file && isCssFile(dep.file) && !isCssUrlWithoutSideEffects(dep.url)) {
923
926
  try {
924
- let css = isCssModulesFile(dep.file) ? cssModulesManifest[dep.file] : (await viteDevServer.ssrLoadModule(dep.url)).default;
927
+ let css = isCssModulesFile(dep.file) ? cssModulesManifest[dep.file] : (await viteDevServer.ssrLoadModule(
928
+ // We need the ?inline query in Vite v6 when loading CSS in SSR
929
+ // since it does not expose the default export for CSS in a
930
+ // server environment. This is to align with non-SSR
931
+ // environments. For backwards compatibility with v5 we keep
932
+ // using the URL without ?inline query because the HMR code was
933
+ // relying on the implicit SSR-client module graph relationship.
934
+ viteMajor >= 6 ? injectQuery(dep.url, "inline") : dep.url
935
+ )).default;
925
936
  if (css === void 0) {
926
937
  throw new Error();
927
938
  }
@@ -945,8 +956,8 @@ var findDeps = async (vite2, node, deps) => {
945
956
  await findDeps(vite2, node2, deps);
946
957
  }
947
958
  }
948
- async function addFromUrl(url3) {
949
- let node2 = await vite2.moduleGraph.getModuleByUrl(url3);
959
+ async function addFromUrl(url2) {
960
+ let node2 = await vite2.moduleGraph.getModuleByUrl(url2);
950
961
  if (node2) {
951
962
  await addFromNode(node2);
952
963
  }
@@ -954,7 +965,7 @@ var findDeps = async (vite2, node, deps) => {
954
965
  if (node.ssrTransformResult) {
955
966
  if (node.ssrTransformResult.deps) {
956
967
  node.ssrTransformResult.deps.forEach(
957
- (url3) => branches.push(addFromUrl(url3))
968
+ (url2) => branches.push(addFromUrl(url2))
958
969
  );
959
970
  }
960
971
  } else {
@@ -988,14 +999,14 @@ var getStylesForUrl = async ({
988
999
  entryClientFilePath,
989
1000
  cssModulesManifest,
990
1001
  build,
991
- url: url3
1002
+ url: url2
992
1003
  }) => {
993
- if (url3 === void 0 || url3.includes("?_data=")) {
1004
+ if (url2 === void 0 || url2.includes("?_data=")) {
994
1005
  return void 0;
995
1006
  }
996
1007
  let routes = createRoutes(build.routes);
997
1008
  let appPath = path3.relative(process.cwd(), reactRouterConfig.appDirectory);
998
- let documentRouteFiles = (0, import_react_router.matchRoutes)(routes, url3, build.basename)?.map(
1009
+ let documentRouteFiles = (0, import_react_router.matchRoutes)(routes, url2, build.basename)?.map(
999
1010
  (match) => path3.resolve(appPath, reactRouterConfig.routes[match.route.id].file)
1000
1011
  ) ?? [];
1001
1012
  let styles = await getStylesForFiles({
@@ -1012,10 +1023,15 @@ var getStylesForUrl = async ({
1012
1023
  return styles;
1013
1024
  };
1014
1025
 
1015
- // vite/vmod.ts
1016
- var id = (name) => `virtual:react-router/${name}`;
1017
- var resolve3 = (id2) => `\0${id2}`;
1018
- var url = (id2) => `/@id/__x00__${id2}`;
1026
+ // vite/virtual-module.ts
1027
+ function create(name) {
1028
+ let id = `virtual:react-router/${name}`;
1029
+ return {
1030
+ id,
1031
+ resolvedId: `\0${id}`,
1032
+ url: `/@id/__x00__${id}`
1033
+ };
1034
+ }
1019
1035
 
1020
1036
  // vite/combine-urls.ts
1021
1037
  function combineURLs(baseURL, relativeURL) {
@@ -1064,14 +1080,14 @@ var removeExports = (ast, exportsToRemove) => {
1064
1080
  }
1065
1081
  }
1066
1082
  if (path5.node.declaration?.type === "FunctionDeclaration") {
1067
- let id2 = path5.node.declaration.id;
1068
- if (id2 && exportsToRemove.includes(id2.name)) {
1083
+ let id = path5.node.declaration.id;
1084
+ if (id && exportsToRemove.includes(id.name)) {
1069
1085
  markedForRemoval.add(path5);
1070
1086
  }
1071
1087
  }
1072
1088
  if (path5.node.declaration?.type === "ClassDeclaration") {
1073
- let id2 = path5.node.declaration.id;
1074
- if (id2 && exportsToRemove.includes(id2.name)) {
1089
+ let id = path5.node.declaration.id;
1090
+ if (id && exportsToRemove.includes(id.name)) {
1075
1091
  markedForRemoval.add(path5);
1076
1092
  }
1077
1093
  }
@@ -1088,9 +1104,9 @@ var removeExports = (ast, exportsToRemove) => {
1088
1104
  (0, import_babel_dead_code_elimination.deadCodeElimination)(ast, previouslyReferencedIdentifiers);
1089
1105
  }
1090
1106
  };
1091
- function validateDestructuredExports(id2, exportsToRemove) {
1092
- if (id2.type === "ArrayPattern") {
1093
- for (let element of id2.elements) {
1107
+ function validateDestructuredExports(id, exportsToRemove) {
1108
+ if (id.type === "ArrayPattern") {
1109
+ for (let element of id.elements) {
1094
1110
  if (!element) {
1095
1111
  continue;
1096
1112
  }
@@ -1105,8 +1121,8 @@ function validateDestructuredExports(id2, exportsToRemove) {
1105
1121
  }
1106
1122
  }
1107
1123
  }
1108
- if (id2.type === "ObjectPattern") {
1109
- for (let property of id2.properties) {
1124
+ if (id.type === "ObjectPattern") {
1125
+ for (let property of id.properties) {
1110
1126
  if (!property) {
1111
1127
  continue;
1112
1128
  }
@@ -1130,16 +1146,16 @@ function invalidDestructureError(name) {
1130
1146
 
1131
1147
  // vite/with-props.ts
1132
1148
  var import_dedent2 = __toESM(require("dedent"));
1133
- var vmodId = id("with-props");
1149
+ var vmod = create("with-props");
1134
1150
  var NAMED_COMPONENT_EXPORTS = ["HydrateFallback", "ErrorBoundary"];
1135
1151
  var plugin = {
1136
1152
  name: "react-router-with-props",
1137
1153
  enforce: "pre",
1138
- resolveId(id2) {
1139
- if (id2 === vmodId) return resolve3(vmodId);
1154
+ resolveId(id) {
1155
+ if (id === vmod.id) return vmod.resolvedId;
1140
1156
  },
1141
- async load(id2) {
1142
- if (id2 !== resolve3(vmodId)) return;
1157
+ async load(id) {
1158
+ if (id !== vmod.resolvedId) return;
1143
1159
  return import_dedent2.default`
1144
1160
  import { createElement as h } from "react";
1145
1161
  import { useActionData, useLoaderData, useMatches, useParams, useRouteError } from "react-router";
@@ -1201,12 +1217,12 @@ var transform = (ast) => {
1201
1217
  const decl = path5.get("declaration");
1202
1218
  if (decl.isVariableDeclaration()) {
1203
1219
  decl.get("declarations").forEach((varDeclarator) => {
1204
- const id2 = varDeclarator.get("id");
1220
+ const id = varDeclarator.get("id");
1205
1221
  const init = varDeclarator.get("init");
1206
1222
  const expr = init.node;
1207
1223
  if (!expr) return;
1208
- if (!id2.isIdentifier()) return;
1209
- const { name } = id2.node;
1224
+ if (!id.isIdentifier()) return;
1225
+ const { name } = id.node;
1210
1226
  if (!NAMED_COMPONENT_EXPORTS.includes(name)) return;
1211
1227
  const uid = getHocUid(path5, `with${name}Props`);
1212
1228
  init.replaceWith(t.callExpression(uid, [expr]));
@@ -1214,9 +1230,9 @@ var transform = (ast) => {
1214
1230
  return;
1215
1231
  }
1216
1232
  if (decl.isFunctionDeclaration()) {
1217
- const { id: id2 } = decl.node;
1218
- if (!id2) return;
1219
- const { name } = id2;
1233
+ const { id } = decl.node;
1234
+ if (!id) return;
1235
+ const { name } = id;
1220
1236
  if (!NAMED_COMPONENT_EXPORTS.includes(name)) return;
1221
1237
  const uid = getHocUid(path5, `with${name}Props`);
1222
1238
  decl.replaceWith(
@@ -1237,7 +1253,7 @@ var transform = (ast) => {
1237
1253
  hocs.map(
1238
1254
  ([name, identifier]) => t.importSpecifier(identifier, t.identifier(name))
1239
1255
  ),
1240
- t.stringLiteral(vmodId)
1256
+ t.stringLiteral(vmod.id)
1241
1257
  )
1242
1258
  );
1243
1259
  }
@@ -1266,27 +1282,23 @@ var CLIENT_ROUTE_EXPORTS = [
1266
1282
  "meta",
1267
1283
  "shouldRevalidate"
1268
1284
  ];
1269
- var ROUTE_ENTRY_QUERY_STRING = "?route-entry=1";
1270
- var isRouteEntry = (id2) => {
1271
- return id2.endsWith(ROUTE_ENTRY_QUERY_STRING);
1272
- };
1273
- var serverBuildId = id("server-build");
1274
- var serverManifestId = id("server-manifest");
1275
- var browserManifestId = id("browser-manifest");
1276
- var hmrRuntimeId = id("hmr-runtime");
1277
- var injectHmrRuntimeId = id("inject-hmr-runtime");
1285
+ var BUILD_CLIENT_ROUTE_QUERY_STRING = "?__react-router-build-client-route";
1286
+ var virtualHmrRuntime = create("hmr-runtime");
1287
+ var virtualInjectHmrRuntime = create("inject-hmr-runtime");
1278
1288
  var resolveRelativeRouteFilePath = (route, reactRouterConfig) => {
1279
1289
  let vite2 = importViteEsmSync();
1280
1290
  let file = route.file;
1281
1291
  let fullPath = path4.resolve(reactRouterConfig.appDirectory, file);
1282
1292
  return vite2.normalizePath(fullPath);
1283
1293
  };
1284
- var vmods = [serverBuildId, serverManifestId, browserManifestId];
1294
+ var virtual = {
1295
+ serverBuild: create("server-build"),
1296
+ serverManifest: create("server-manifest"),
1297
+ browserManifest: create("browser-manifest")
1298
+ };
1285
1299
  var invalidateVirtualModules = (viteDevServer) => {
1286
- vmods.forEach((vmod) => {
1287
- let mod = viteDevServer.moduleGraph.getModuleById(
1288
- resolve3(vmod)
1289
- );
1300
+ Object.values(virtual).forEach((vmod2) => {
1301
+ let mod = viteDevServer.moduleGraph.getModuleById(vmod2.resolvedId);
1290
1302
  if (mod) {
1291
1303
  viteDevServer.moduleGraph.invalidateModule(mod);
1292
1304
  }
@@ -1301,7 +1313,7 @@ var resolveChunk = (ctx, viteManifest, absoluteFilePath) => {
1301
1313
  let rootRelativeFilePath = vite2.normalizePath(
1302
1314
  path4.relative(ctx.rootDirectory, absoluteFilePath)
1303
1315
  );
1304
- let entryChunk = viteManifest[rootRelativeFilePath + ROUTE_ENTRY_QUERY_STRING] ?? viteManifest[rootRelativeFilePath];
1316
+ let entryChunk = viteManifest[rootRelativeFilePath + BUILD_CLIENT_ROUTE_QUERY_STRING] ?? viteManifest[rootRelativeFilePath];
1305
1317
  if (!entryChunk) {
1306
1318
  let knownManifestKeys = Object.keys(viteManifest).map((key) => '"' + key + '"').join(", ");
1307
1319
  throw new Error(
@@ -1374,19 +1386,19 @@ var getRouteModuleExports = async (viteChildCompiler, ctx, routeFile, readRouteF
1374
1386
  let ssr = true;
1375
1387
  let { pluginContainer, moduleGraph } = viteChildCompiler;
1376
1388
  let routePath = path4.resolve(ctx.reactRouterConfig.appDirectory, routeFile);
1377
- let url3 = resolveFileUrl(ctx, routePath);
1389
+ let url2 = resolveFileUrl(ctx, routePath);
1378
1390
  let resolveId = async () => {
1379
- let result = await pluginContainer.resolveId(url3, void 0, { ssr });
1380
- if (!result) throw new Error(`Could not resolve module ID for ${url3}`);
1391
+ let result = await pluginContainer.resolveId(url2, void 0, { ssr });
1392
+ if (!result) throw new Error(`Could not resolve module ID for ${url2}`);
1381
1393
  return result.id;
1382
1394
  };
1383
- let [id2, code] = await Promise.all([
1395
+ let [id, code] = await Promise.all([
1384
1396
  resolveId(),
1385
1397
  readRouteFile?.() ?? fse.readFile(routePath, "utf-8"),
1386
1398
  // pluginContainer.transform(...) fails if we don't do this first:
1387
- moduleGraph.ensureEntryFromUrl(url3, ssr)
1399
+ moduleGraph.ensureEntryFromUrl(url2, ssr)
1388
1400
  ]);
1389
- let transformed = await pluginContainer.transform(code, id2, { ssr });
1401
+ let transformed = await pluginContainer.transform(code, id, { ssr });
1390
1402
  let [, exports2] = (0, import_es_module_lexer.parse)(transformed.code);
1391
1403
  let exportNames = exports2.map((e) => e.n);
1392
1404
  return exportNames;
@@ -1491,10 +1503,12 @@ var reactRouterVitePlugin = () => {
1491
1503
  resolveFileUrl(
1492
1504
  ctx,
1493
1505
  resolveRelativeRouteFilePath(route, ctx.reactRouterConfig)
1494
- ) + ROUTE_ENTRY_QUERY_STRING
1506
+ )
1495
1507
  )};`;
1496
1508
  }).join("\n")}
1497
- export { default as assets } from ${JSON.stringify(serverManifestId)};
1509
+ export { default as assets } from ${JSON.stringify(
1510
+ virtual.serverManifest.id
1511
+ )};
1498
1512
  export const assetsBuildDirectory = ${JSON.stringify(
1499
1513
  path4.relative(
1500
1514
  ctx.rootDirectory,
@@ -1597,8 +1611,8 @@ var reactRouterVitePlugin = () => {
1597
1611
  viteConfig.build.assetsDir,
1598
1612
  `manifest-${version}.js`
1599
1613
  );
1600
- let url3 = `${ctx.publicPath}${manifestPath}`;
1601
- let nonFingerprintedValues = { url: url3, version };
1614
+ let url2 = `${ctx.publicPath}${manifestPath}`;
1615
+ let nonFingerprintedValues = { url: url2, version };
1602
1616
  let reactRouterBrowserManifest = {
1603
1617
  ...fingerprintedValues,
1604
1618
  ...nonFingerprintedValues
@@ -1634,10 +1648,10 @@ var reactRouterVitePlugin = () => {
1634
1648
  caseSensitive: route.caseSensitive,
1635
1649
  module: combineURLs(
1636
1650
  ctx.publicPath,
1637
- `${resolveFileUrl(
1651
+ resolveFileUrl(
1638
1652
  ctx,
1639
1653
  resolveRelativeRouteFilePath(route, ctx.reactRouterConfig)
1640
- )}${ROUTE_ENTRY_QUERY_STRING}`
1654
+ )
1641
1655
  ),
1642
1656
  hasAction: sourceExports.includes("action"),
1643
1657
  hasLoader: sourceExports.includes("loader"),
@@ -1649,12 +1663,9 @@ var reactRouterVitePlugin = () => {
1649
1663
  }
1650
1664
  return {
1651
1665
  version: String(Math.random()),
1652
- url: combineURLs(ctx.publicPath, url(browserManifestId)),
1666
+ url: combineURLs(ctx.publicPath, virtual.browserManifest.url),
1653
1667
  hmr: {
1654
- runtime: combineURLs(
1655
- ctx.publicPath,
1656
- url(injectHmrRuntimeId)
1657
- )
1668
+ runtime: combineURLs(ctx.publicPath, virtualInjectHmrRuntime.url)
1658
1669
  },
1659
1670
  entry: {
1660
1671
  module: combineURLs(
@@ -1791,7 +1802,7 @@ var reactRouterVitePlugin = () => {
1791
1802
  (route) => `${path4.resolve(
1792
1803
  ctx.reactRouterConfig.appDirectory,
1793
1804
  route.file
1794
- )}${ROUTE_ENTRY_QUERY_STRING}`
1805
+ )}${BUILD_CLIENT_ROUTE_QUERY_STRING}`
1795
1806
  )
1796
1807
  ]
1797
1808
  }
@@ -1810,7 +1821,7 @@ var reactRouterVitePlugin = () => {
1810
1821
  rollupOptions: {
1811
1822
  ...baseRollupOptions,
1812
1823
  preserveEntrySignatures: "exports-only",
1813
- input: viteUserConfig.build?.rollupOptions?.input ?? serverBuildId,
1824
+ input: viteUserConfig.build?.rollupOptions?.input ?? virtual.serverBuild.id,
1814
1825
  output: {
1815
1826
  entryFileNames: ctx.reactRouterConfig.serverBuildFile,
1816
1827
  format: ctx.reactRouterConfig.serverModuleFormat
@@ -1873,15 +1884,15 @@ var reactRouterVitePlugin = () => {
1873
1884
  envFile: false,
1874
1885
  plugins: [
1875
1886
  ...(childCompilerConfigFile.config.plugins ?? []).flat().filter(
1876
- (plugin2) => typeof plugin2 === "object" && plugin2 !== null && "name" in plugin2 && plugin2.name !== "react-router" && plugin2.name !== "react-router-route-exports" && plugin2.name !== "react-router-hmr-updates"
1887
+ (plugin2) => typeof plugin2 === "object" && plugin2 !== null && "name" in plugin2 && plugin2.name !== "react-router" && plugin2.name !== "react-router:route-exports" && plugin2.name !== "react-router:hmr-updates"
1877
1888
  )
1878
1889
  ]
1879
1890
  });
1880
1891
  await viteChildCompiler.pluginContainer.buildStart({});
1881
1892
  },
1882
- async transform(code, id2) {
1883
- if (isCssModulesFile(id2)) {
1884
- cssModulesManifest[id2] = code;
1893
+ async transform(code, id) {
1894
+ if (isCssModulesFile(id)) {
1895
+ cssModulesManifest[id] = code;
1885
1896
  }
1886
1897
  },
1887
1898
  buildStart() {
@@ -1905,7 +1916,7 @@ var reactRouterVitePlugin = () => {
1905
1916
  (0, import_react_router2.unstable_setDevServerHooks)({
1906
1917
  // Give the request handler access to the critical CSS in dev to avoid a
1907
1918
  // flash of unstyled content since Vite injects CSS file contents via JS
1908
- getCriticalCss: async (build, url3) => {
1919
+ getCriticalCss: async (build, url2) => {
1909
1920
  return getStylesForUrl({
1910
1921
  rootDirectory: ctx.rootDirectory,
1911
1922
  entryClientFilePath: ctx.entryClientFilePath,
@@ -1913,7 +1924,7 @@ var reactRouterVitePlugin = () => {
1913
1924
  viteDevServer,
1914
1925
  cssModulesManifest,
1915
1926
  build,
1916
- url: url3
1927
+ url: url2
1917
1928
  });
1918
1929
  },
1919
1930
  // If an error is caught within the request handler, let Vite fix the
@@ -1961,7 +1972,7 @@ var reactRouterVitePlugin = () => {
1961
1972
  viteDevServer.middlewares.use(async (req, res, next) => {
1962
1973
  try {
1963
1974
  let build = await viteDevServer.ssrLoadModule(
1964
- serverBuildId
1975
+ virtual.serverBuild.id
1965
1976
  );
1966
1977
  let handler = (0, import_react_router2.createRequestHandler)(build, "development");
1967
1978
  let nodeHandler = async (nodeReq, nodeRes) => {
@@ -2061,11 +2072,11 @@ var reactRouterVitePlugin = () => {
2061
2072
  }
2062
2073
  },
2063
2074
  {
2064
- name: "react-router-route-entry",
2075
+ name: "react-router:build-client-route",
2065
2076
  enforce: "pre",
2066
- async transform(_code, id2, options) {
2067
- if (!isRouteEntry(id2)) return;
2068
- let routeModuleId = id2.replace(ROUTE_ENTRY_QUERY_STRING, "");
2077
+ async transform(_code, id, options) {
2078
+ if (!id.endsWith(BUILD_CLIENT_ROUTE_QUERY_STRING)) return;
2079
+ let routeModuleId = id.replace(BUILD_CLIENT_ROUTE_QUERY_STRING, "");
2069
2080
  let routeFileName = path4.basename(routeModuleId);
2070
2081
  let sourceExports = await getRouteModuleExports(
2071
2082
  viteChildCompiler,
@@ -2079,23 +2090,24 @@ var reactRouterVitePlugin = () => {
2079
2090
  }
2080
2091
  },
2081
2092
  {
2082
- name: "react-router-virtual-modules",
2093
+ name: "react-router:virtual-modules",
2083
2094
  enforce: "pre",
2084
- resolveId(id2) {
2085
- if (vmods.includes(id2)) return resolve3(id2);
2095
+ resolveId(id) {
2096
+ const vmod2 = Object.values(virtual).find((vmod3) => vmod3.id === id);
2097
+ if (vmod2) return vmod2.resolvedId;
2086
2098
  },
2087
- async load(id2) {
2088
- switch (id2) {
2089
- case resolve3(serverBuildId): {
2099
+ async load(id) {
2100
+ switch (id) {
2101
+ case virtual.serverBuild.resolvedId: {
2090
2102
  return await getServerEntry();
2091
2103
  }
2092
- case resolve3(serverManifestId): {
2104
+ case virtual.serverManifest.resolvedId: {
2093
2105
  let reactRouterManifest = ctx.isSsrBuild ? await ctx.getReactRouterServerManifest() : await getReactRouterManifestForDev();
2094
2106
  return `export default ${(0, import_jsesc.default)(reactRouterManifest, {
2095
2107
  es6: true
2096
2108
  })};`;
2097
2109
  }
2098
- case resolve3(browserManifestId): {
2110
+ case virtual.browserManifest.resolvedId: {
2099
2111
  if (viteCommand === "build") {
2100
2112
  throw new Error("This module only exists in development");
2101
2113
  }
@@ -2109,15 +2121,15 @@ var reactRouterVitePlugin = () => {
2109
2121
  }
2110
2122
  },
2111
2123
  {
2112
- name: "react-router-dot-server",
2124
+ name: "react-router:dot-server",
2113
2125
  enforce: "pre",
2114
- async resolveId(id2, importer, options) {
2126
+ async resolveId(id, importer, options) {
2115
2127
  let isOptimizeDeps = viteCommand === "serve" && options?.scan === true;
2116
2128
  if (isOptimizeDeps || options?.ssr) return;
2117
- let isResolving = options?.custom?.["react-router-dot-server"] ?? false;
2129
+ let isResolving = options?.custom?.["react-router:dot-server"] ?? false;
2118
2130
  if (isResolving) return;
2119
- options.custom = { ...options.custom, "react-router-dot-server": true };
2120
- let resolved = await this.resolve(id2, importer, options);
2131
+ options.custom = { ...options.custom, "react-router:dot-server": true };
2132
+ let resolved = await this.resolve(id, importer, options);
2121
2133
  if (!resolved) return;
2122
2134
  let serverFileRE = /\.server(\.[cm]?[jt]sx?)?$/;
2123
2135
  let serverDirRE = /\/\.server\//;
@@ -2140,12 +2152,12 @@ var reactRouterVitePlugin = () => {
2140
2152
  [
2141
2153
  import_picocolors3.default.red(`Server-only module referenced by client`),
2142
2154
  "",
2143
- ` '${id2}' imported by route '${importerShort}'`,
2155
+ ` '${id}' imported by route '${importerShort}'`,
2144
2156
  "",
2145
2157
  ` React Router automatically removes server-code from these exports:`,
2146
2158
  ` ${serverOnlyExports}`,
2147
2159
  "",
2148
- ` But other route exports in '${importerShort}' depend on '${id2}'.`,
2160
+ ` But other route exports in '${importerShort}' depend on '${id}'.`,
2149
2161
  "",
2150
2162
  " See https://remix.run/docs/en/main/guides/vite#splitting-up-client-and-server-code",
2151
2163
  ""
@@ -2156,7 +2168,7 @@ var reactRouterVitePlugin = () => {
2156
2168
  [
2157
2169
  import_picocolors3.default.red(`Server-only module referenced by client`),
2158
2170
  "",
2159
- ` '${id2}' imported by '${importerShort}'`,
2171
+ ` '${id}' imported by '${importerShort}'`,
2160
2172
  "",
2161
2173
  " See https://remix.run/docs/en/main/guides/vite#splitting-up-client-and-server-code",
2162
2174
  ""
@@ -2165,12 +2177,12 @@ var reactRouterVitePlugin = () => {
2165
2177
  }
2166
2178
  },
2167
2179
  {
2168
- name: "react-router-dot-client",
2169
- async transform(code, id2, options) {
2180
+ name: "react-router:dot-client",
2181
+ async transform(code, id, options) {
2170
2182
  if (!options?.ssr) return;
2171
2183
  let clientFileRE = /\.client(\.[cm]?[jt]sx?)?$/;
2172
2184
  let clientDirRE = /\/\.client\//;
2173
- if (clientFileRE.test(id2) || clientDirRE.test(id2)) {
2185
+ if (clientFileRE.test(id) || clientDirRE.test(id)) {
2174
2186
  let exports2 = (0, import_es_module_lexer.parse)(code)[1];
2175
2187
  return {
2176
2188
  code: exports2.map(
@@ -2183,9 +2195,9 @@ var reactRouterVitePlugin = () => {
2183
2195
  },
2184
2196
  plugin,
2185
2197
  {
2186
- name: "react-router-route-exports",
2187
- async transform(code, id2, options) {
2188
- let route = getRoute(ctx.reactRouterConfig, id2);
2198
+ name: "react-router:route-exports",
2199
+ async transform(code, id, options) {
2200
+ let route = getRoute(ctx.reactRouterConfig, id);
2189
2201
  if (!route) return;
2190
2202
  if (!options?.ssr && !ctx.reactRouterConfig.ssr) {
2191
2203
  let serverOnlyExports = (0, import_es_module_lexer.parse)(code)[1].map((exp) => exp.n).filter((exp) => SERVER_ONLY_ROUTE_EXPORTS.includes(exp));
@@ -2202,7 +2214,7 @@ var reactRouterVitePlugin = () => {
2202
2214
  }
2203
2215
  }
2204
2216
  }
2205
- let [filepath] = id2.split("?");
2217
+ let [filepath] = id.split("?");
2206
2218
  let ast = (0, import_parser.parse)(code, { sourceType: "module" });
2207
2219
  if (!options?.ssr) {
2208
2220
  removeExports(ast, SERVER_ONLY_ROUTE_EXPORTS);
@@ -2210,22 +2222,23 @@ var reactRouterVitePlugin = () => {
2210
2222
  transform(ast);
2211
2223
  return generate2(ast, {
2212
2224
  sourceMaps: true,
2213
- filename: id2,
2225
+ filename: id,
2214
2226
  sourceFileName: filepath
2215
2227
  });
2216
2228
  }
2217
2229
  },
2218
2230
  {
2219
- name: "react-router-inject-hmr-runtime",
2231
+ name: "react-router:inject-hmr-runtime",
2220
2232
  enforce: "pre",
2221
- resolveId(id2) {
2222
- if (id2 === injectHmrRuntimeId)
2223
- return resolve3(injectHmrRuntimeId);
2233
+ resolveId(id) {
2234
+ if (id === virtualInjectHmrRuntime.id) {
2235
+ return virtualInjectHmrRuntime.resolvedId;
2236
+ }
2224
2237
  },
2225
- async load(id2) {
2226
- if (id2 !== resolve3(injectHmrRuntimeId)) return;
2238
+ async load(id) {
2239
+ if (id !== virtualInjectHmrRuntime.resolvedId) return;
2227
2240
  return [
2228
- `import RefreshRuntime from "${hmrRuntimeId}"`,
2241
+ `import RefreshRuntime from "${virtualHmrRuntime.id}"`,
2229
2242
  "RefreshRuntime.injectIntoGlobalHook(window)",
2230
2243
  "window.$RefreshReg$ = () => {}",
2231
2244
  "window.$RefreshSig$ = () => (type) => type",
@@ -2234,13 +2247,13 @@ var reactRouterVitePlugin = () => {
2234
2247
  }
2235
2248
  },
2236
2249
  {
2237
- name: "react-router-hmr-runtime",
2250
+ name: "react-router:hmr-runtime",
2238
2251
  enforce: "pre",
2239
- resolveId(id2) {
2240
- if (id2 === hmrRuntimeId) return resolve3(hmrRuntimeId);
2252
+ resolveId(id) {
2253
+ if (id === virtualHmrRuntime.id) return virtualHmrRuntime.resolvedId;
2241
2254
  },
2242
- async load(id2) {
2243
- if (id2 !== resolve3(hmrRuntimeId)) return;
2255
+ async load(id) {
2256
+ if (id !== virtualHmrRuntime.resolvedId) return;
2244
2257
  let reactRefreshDir = path4.dirname(
2245
2258
  require.resolve("react-refresh/package.json")
2246
2259
  );
@@ -2260,11 +2273,11 @@ var reactRouterVitePlugin = () => {
2260
2273
  }
2261
2274
  },
2262
2275
  {
2263
- name: "react-router-react-refresh-babel",
2264
- async transform(code, id2, options) {
2276
+ name: "react-router:react-refresh-babel",
2277
+ async transform(code, id, options) {
2265
2278
  if (viteCommand !== "serve") return;
2266
- if (id2.includes("/node_modules/")) return;
2267
- let [filepath] = id2.split("?");
2279
+ if (id.includes("/node_modules/")) return;
2280
+ let [filepath] = id.split("?");
2268
2281
  let extensionsRE = /\.(jsx?|tsx?|mdx?)$/;
2269
2282
  if (!extensionsRE.test(filepath)) return;
2270
2283
  let devRuntime = "react/jsx-dev-runtime";
@@ -2272,13 +2285,10 @@ var reactRouterVitePlugin = () => {
2272
2285
  let isJSX = filepath.endsWith("x");
2273
2286
  let useFastRefresh = !ssr && (isJSX || code.includes(devRuntime));
2274
2287
  if (!useFastRefresh) return;
2275
- if (isRouteEntry(id2)) {
2276
- return { code: addRefreshWrapper(ctx.reactRouterConfig, code, id2) };
2277
- }
2278
2288
  let result = await babel.transformAsync(code, {
2279
2289
  babelrc: false,
2280
2290
  configFile: false,
2281
- filename: id2,
2291
+ filename: id,
2282
2292
  sourceFileName: filepath,
2283
2293
  parserOpts: {
2284
2294
  sourceType: "module",
@@ -2291,18 +2301,18 @@ var reactRouterVitePlugin = () => {
2291
2301
  code = result.code;
2292
2302
  let refreshContentRE = /\$Refresh(?:Reg|Sig)\$\(/;
2293
2303
  if (refreshContentRE.test(code)) {
2294
- code = addRefreshWrapper(ctx.reactRouterConfig, code, id2);
2304
+ code = addRefreshWrapper(ctx.reactRouterConfig, code, id);
2295
2305
  }
2296
2306
  return { code, map: result.map };
2297
2307
  }
2298
2308
  },
2299
2309
  {
2300
- name: "react-router-hmr-updates",
2310
+ name: "react-router:hmr-updates",
2301
2311
  async handleHotUpdate({ server, file, modules, read }) {
2302
2312
  let route = getRoute(ctx.reactRouterConfig, file);
2303
2313
  let hmrEventData = { route: null };
2304
2314
  if (route) {
2305
- let serverManifest = (await server.ssrLoadModule(serverManifestId)).default;
2315
+ let serverManifest = (await server.ssrLoadModule(virtual.serverManifest.id)).default;
2306
2316
  let oldRouteMetadata = serverManifest.routes[route.id];
2307
2317
  let newRouteMetadata = await getRouteMetadata(
2308
2318
  ctx,
@@ -2328,12 +2338,58 @@ var reactRouterVitePlugin = () => {
2328
2338
  });
2329
2339
  return modules;
2330
2340
  }
2341
+ },
2342
+ {
2343
+ name: "react-router-server-change-trigger-client-hmr",
2344
+ // This hook is only available in Vite v6+ so this is a no-op in v5.
2345
+ // Previously the server and client modules were shared in a single module
2346
+ // graph. This meant that changes to server code automatically resulted in
2347
+ // client HMR updates. In Vite v6+ these module graphs are separate from
2348
+ // each other so we need to manually trigger client HMR updates if server
2349
+ // code has changed.
2350
+ hotUpdate({ server, modules }) {
2351
+ if (this.environment.name !== "ssr" && modules.length <= 0) {
2352
+ return;
2353
+ }
2354
+ let clientModules = uniqueNodes(
2355
+ modules.flatMap(
2356
+ (mod) => getParentClientNodes(server.environments.client.moduleGraph, mod)
2357
+ )
2358
+ );
2359
+ for (let clientModule of clientModules) {
2360
+ server.environments.client.reloadModule(clientModule);
2361
+ }
2362
+ }
2331
2363
  }
2332
2364
  ];
2333
2365
  };
2334
- function addRefreshWrapper(reactRouterConfig, code, id2) {
2335
- let route = getRoute(reactRouterConfig, id2);
2336
- let acceptExports = route || isRouteEntry(id2) ? [
2366
+ function getParentClientNodes(clientModuleGraph, module2) {
2367
+ if (!module2.id) {
2368
+ return [];
2369
+ }
2370
+ let clientModule = clientModuleGraph.getModuleById(module2.id);
2371
+ if (clientModule) {
2372
+ return [clientModule];
2373
+ }
2374
+ return [...module2.importers].flatMap(
2375
+ (importer) => getParentClientNodes(clientModuleGraph, importer)
2376
+ );
2377
+ }
2378
+ function uniqueNodes(nodes) {
2379
+ let nodeUrls = /* @__PURE__ */ new Set();
2380
+ let unique = [];
2381
+ for (let node of nodes) {
2382
+ if (nodeUrls.has(node.url)) {
2383
+ continue;
2384
+ }
2385
+ nodeUrls.add(node.url);
2386
+ unique.push(node);
2387
+ }
2388
+ return unique;
2389
+ }
2390
+ function addRefreshWrapper(reactRouterConfig, code, id) {
2391
+ let route = getRoute(reactRouterConfig, id);
2392
+ let acceptExports = route ? [
2337
2393
  "clientAction",
2338
2394
  "clientLoader",
2339
2395
  "handle",
@@ -2343,10 +2399,10 @@ function addRefreshWrapper(reactRouterConfig, code, id2) {
2343
2399
  ] : [];
2344
2400
  return "\n\n" + withCommentBoundaries(
2345
2401
  "REACT REFRESH HEADER",
2346
- REACT_REFRESH_HEADER.replaceAll("__SOURCE__", JSON.stringify(id2))
2402
+ REACT_REFRESH_HEADER.replaceAll("__SOURCE__", JSON.stringify(id))
2347
2403
  ) + "\n\n" + withCommentBoundaries("REACT REFRESH BODY", code) + "\n\n" + withCommentBoundaries(
2348
2404
  "REACT REFRESH FOOTER",
2349
- REACT_REFRESH_FOOTER.replaceAll("__SOURCE__", JSON.stringify(id2)).replaceAll("__ACCEPT_EXPORTS__", JSON.stringify(acceptExports)).replaceAll("__ROUTE_ID__", JSON.stringify(route?.id))
2405
+ REACT_REFRESH_FOOTER.replaceAll("__SOURCE__", JSON.stringify(id)).replaceAll("__ACCEPT_EXPORTS__", JSON.stringify(acceptExports)).replaceAll("__ROUTE_ID__", JSON.stringify(route?.id))
2350
2406
  ) + "\n";
2351
2407
  }
2352
2408
  function withCommentBoundaries(label, text) {
@@ -2359,7 +2415,7 @@ ${text}
2359
2415
  ${end}`;
2360
2416
  }
2361
2417
  var REACT_REFRESH_HEADER = `
2362
- import RefreshRuntime from "${hmrRuntimeId}";
2418
+ import RefreshRuntime from "${virtualHmrRuntime.id}";
2363
2419
 
2364
2420
  const inWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
2365
2421
  let prevRefreshReg;
@@ -2445,7 +2501,7 @@ async function getPrerenderBuildAndHandler(viteConfig, reactRouterConfig, server
2445
2501
  serverBuildDirectory,
2446
2502
  reactRouterConfig.serverBuildFile
2447
2503
  );
2448
- let build = await import(url2.pathToFileURL(serverBuildPath).toString());
2504
+ let build = await import(url.pathToFileURL(serverBuildPath).toString());
2449
2505
  let { createRequestHandler: createHandler } = await import("react-router");
2450
2506
  return {
2451
2507
  build,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-router/dev",
3
- "version": "7.0.2",
3
+ "version": "7.1.0-pre.0",
4
4
  "description": "Dev tools and CLI for React Router",
5
5
  "homepage": "https://reactrouter.com",
6
6
  "bugs": {
@@ -80,8 +80,8 @@
80
80
  "semver": "^7.3.7",
81
81
  "set-cookie-parser": "^2.6.0",
82
82
  "valibot": "^0.41.0",
83
- "vite-node": "^1.6.0",
84
- "@react-router/node": "7.0.2"
83
+ "vite-node": "3.0.0-beta.2",
84
+ "@react-router/node": "7.1.0-pre.0"
85
85
  },
86
86
  "devDependencies": {
87
87
  "@types/babel__core": "^7.20.5",
@@ -93,7 +93,7 @@
93
93
  "@types/gunzip-maybe": "^1.4.0",
94
94
  "@types/jsesc": "^3.0.1",
95
95
  "@types/lodash": "^4.14.182",
96
- "@types/node": "^18.17.1",
96
+ "@types/node": "^20.0.0",
97
97
  "@types/npmcli__package-json": "^4.0.0",
98
98
  "@types/picomatch": "^2.3.0",
99
99
  "@types/prettier": "^2.7.3",
@@ -107,18 +107,18 @@
107
107
  "tiny-invariant": "^1.2.0",
108
108
  "tsup": "^8.3.0",
109
109
  "typescript": "^5.1.6",
110
- "vite": "^5.1.0",
110
+ "vite": "^6.0.0",
111
111
  "wireit": "0.14.9",
112
112
  "wrangler": "^3.28.2",
113
- "react-router": "^7.0.2",
114
- "@react-router/serve": "7.0.2"
113
+ "@react-router/serve": "7.1.0-pre.0",
114
+ "react-router": "^7.1.0-pre.0"
115
115
  },
116
116
  "peerDependencies": {
117
117
  "typescript": "^5.1.0",
118
- "vite": "^5.1.0",
118
+ "vite": "^5.1.0 || ^6.0.0",
119
119
  "wrangler": "^3.28.2",
120
- "@react-router/serve": "^7.0.2",
121
- "react-router": "^7.0.2"
120
+ "@react-router/serve": "^7.1.0-pre.0",
121
+ "react-router": "^7.1.0-pre.0"
122
122
  },
123
123
  "peerDependenciesMeta": {
124
124
  "@react-router/serve": {