@react-router/dev 0.0.0-experimental-89dc2043e → 0.0.0-experimental-6844c5934

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/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-89dc2043e
2
+ * @react-router/dev v0.0.0-experimental-6844c5934
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
  }
@@ -641,7 +641,7 @@ function generate(ctx, route) {
641
641
  const indent = i === 0 ? "" : " ".repeat(2);
642
642
  let source = noExtension(rel);
643
643
  if (!source.startsWith("../")) source = "./" + source;
644
- return `${indent}import type { Info as Parent${i} } from "${source}"`;
644
+ return `${indent}import type { Info as Parent${i} } from "${source}.js"`;
645
645
  }).join("\n");
646
646
  return import_dedent.default`
647
647
  // React Router generated types for route:
@@ -651,14 +651,16 @@ function generate(ctx, route) {
651
651
 
652
652
  ${parentTypeImports}
653
653
 
654
- type Module = typeof import("../${Pathe2.filename(route.file)}")
654
+ type Module = typeof import("../${Pathe2.filename(route.file)}.js")
655
655
 
656
656
  export type Info = {
657
657
  parents: [${parents.map((_, i) => `Parent${i}`).join(", ")}],
658
658
  id: "${route.id}"
659
659
  file: "${route.file}"
660
660
  path: "${route.path}"
661
- params: {${formatParamProperties(urlpath)}}
661
+ params: {${formatParamProperties(
662
+ urlpath
663
+ )}} & { [key: string]: string | undefined }
662
664
  module: Module
663
665
  loaderData: T.CreateLoaderData<Module>
664
666
  actionData: T.CreateActionData<Module>
@@ -810,7 +812,7 @@ function fromNodeRequest(nodeReq, nodeRes) {
810
812
  nodeReq.originalUrl,
811
813
  "Expected `nodeReq.originalUrl` to be defined"
812
814
  );
813
- let url3 = new URL(nodeReq.originalUrl, origin);
815
+ let url2 = new URL(nodeReq.originalUrl, origin);
814
816
  let controller = new AbortController();
815
817
  let init = {
816
818
  method: nodeReq.method,
@@ -823,7 +825,7 @@ function fromNodeRequest(nodeReq, nodeRes) {
823
825
  init.body = (0, import_node.createReadableStreamFromReadable)(nodeReq);
824
826
  init.duplex = "half";
825
827
  }
826
- return new Request(url3.href, init);
828
+ return new Request(url2.href, init);
827
829
  }
828
830
  async function toNodeRequest(res, nodeRes) {
829
831
  nodeRes.statusCode = res.status;
@@ -869,8 +871,8 @@ var cssModulesRegExp = new RegExp(`\\.module${cssFileRegExp.source}`);
869
871
  var isCssFile = (file) => cssFileRegExp.test(file);
870
872
  var isCssModulesFile = (file) => cssModulesRegExp.test(file);
871
873
  var cssUrlParamsWithoutSideEffects = ["url", "inline", "raw", "inline-css"];
872
- var isCssUrlWithoutSideEffects = (url3) => {
873
- let queryString = url3.split("?")[1];
874
+ var isCssUrlWithoutSideEffects = (url2) => {
875
+ let queryString = url2.split("?")[1];
874
876
  if (!queryString) {
875
877
  return false;
876
878
  }
@@ -878,19 +880,22 @@ var isCssUrlWithoutSideEffects = (url3) => {
878
880
  for (let paramWithoutSideEffects of cssUrlParamsWithoutSideEffects) {
879
881
  if (
880
882
  // Parameter is blank and not explicitly set, i.e. "?url", not "?url="
881
- params.get(paramWithoutSideEffects) === "" && !url3.includes(`?${paramWithoutSideEffects}=`) && !url3.includes(`&${paramWithoutSideEffects}=`)
883
+ params.get(paramWithoutSideEffects) === "" && !url2.includes(`?${paramWithoutSideEffects}=`) && !url2.includes(`&${paramWithoutSideEffects}=`)
882
884
  ) {
883
885
  return true;
884
886
  }
885
887
  }
886
888
  return false;
887
889
  };
890
+ var injectQuery = (url2, query) => url2.includes("?") ? url2.replace("?", `?${query}&`) : `${url2}?${query}`;
888
891
  var getStylesForFiles = async ({
889
892
  viteDevServer,
890
893
  rootDirectory,
891
894
  cssModulesManifest,
892
895
  files
893
896
  }) => {
897
+ let vite2 = importViteEsmSync();
898
+ let viteMajor = parseInt(vite2.version.split(".")[0], 10);
894
899
  let styles = {};
895
900
  let deps = /* @__PURE__ */ new Set();
896
901
  try {
@@ -919,7 +924,15 @@ var getStylesForFiles = async ({
919
924
  for (let dep of deps) {
920
925
  if (dep.file && isCssFile(dep.file) && !isCssUrlWithoutSideEffects(dep.url)) {
921
926
  try {
922
- 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;
923
936
  if (css === void 0) {
924
937
  throw new Error();
925
938
  }
@@ -943,8 +956,8 @@ var findDeps = async (vite2, node, deps) => {
943
956
  await findDeps(vite2, node2, deps);
944
957
  }
945
958
  }
946
- async function addFromUrl(url3) {
947
- let node2 = await vite2.moduleGraph.getModuleByUrl(url3);
959
+ async function addFromUrl(url2) {
960
+ let node2 = await vite2.moduleGraph.getModuleByUrl(url2);
948
961
  if (node2) {
949
962
  await addFromNode(node2);
950
963
  }
@@ -952,7 +965,7 @@ var findDeps = async (vite2, node, deps) => {
952
965
  if (node.ssrTransformResult) {
953
966
  if (node.ssrTransformResult.deps) {
954
967
  node.ssrTransformResult.deps.forEach(
955
- (url3) => branches.push(addFromUrl(url3))
968
+ (url2) => branches.push(addFromUrl(url2))
956
969
  );
957
970
  }
958
971
  } else {
@@ -986,14 +999,14 @@ var getStylesForUrl = async ({
986
999
  entryClientFilePath,
987
1000
  cssModulesManifest,
988
1001
  build,
989
- url: url3
1002
+ url: url2
990
1003
  }) => {
991
- if (url3 === void 0 || url3.includes("?_data=")) {
1004
+ if (url2 === void 0 || url2.includes("?_data=")) {
992
1005
  return void 0;
993
1006
  }
994
1007
  let routes = createRoutes(build.routes);
995
1008
  let appPath = path3.relative(process.cwd(), reactRouterConfig.appDirectory);
996
- 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(
997
1010
  (match) => path3.resolve(appPath, reactRouterConfig.routes[match.route.id].file)
998
1011
  ) ?? [];
999
1012
  let styles = await getStylesForFiles({
@@ -1010,10 +1023,15 @@ var getStylesForUrl = async ({
1010
1023
  return styles;
1011
1024
  };
1012
1025
 
1013
- // vite/vmod.ts
1014
- var id = (name) => `virtual:react-router/${name}`;
1015
- var resolve3 = (id2) => `\0${id2}`;
1016
- 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
+ }
1017
1035
 
1018
1036
  // vite/combine-urls.ts
1019
1037
  function combineURLs(baseURL, relativeURL) {
@@ -1062,14 +1080,14 @@ var removeExports = (ast, exportsToRemove) => {
1062
1080
  }
1063
1081
  }
1064
1082
  if (path5.node.declaration?.type === "FunctionDeclaration") {
1065
- let id2 = path5.node.declaration.id;
1066
- if (id2 && exportsToRemove.includes(id2.name)) {
1083
+ let id = path5.node.declaration.id;
1084
+ if (id && exportsToRemove.includes(id.name)) {
1067
1085
  markedForRemoval.add(path5);
1068
1086
  }
1069
1087
  }
1070
1088
  if (path5.node.declaration?.type === "ClassDeclaration") {
1071
- let id2 = path5.node.declaration.id;
1072
- if (id2 && exportsToRemove.includes(id2.name)) {
1089
+ let id = path5.node.declaration.id;
1090
+ if (id && exportsToRemove.includes(id.name)) {
1073
1091
  markedForRemoval.add(path5);
1074
1092
  }
1075
1093
  }
@@ -1086,9 +1104,9 @@ var removeExports = (ast, exportsToRemove) => {
1086
1104
  (0, import_babel_dead_code_elimination.deadCodeElimination)(ast, previouslyReferencedIdentifiers);
1087
1105
  }
1088
1106
  };
1089
- function validateDestructuredExports(id2, exportsToRemove) {
1090
- if (id2.type === "ArrayPattern") {
1091
- for (let element of id2.elements) {
1107
+ function validateDestructuredExports(id, exportsToRemove) {
1108
+ if (id.type === "ArrayPattern") {
1109
+ for (let element of id.elements) {
1092
1110
  if (!element) {
1093
1111
  continue;
1094
1112
  }
@@ -1103,8 +1121,8 @@ function validateDestructuredExports(id2, exportsToRemove) {
1103
1121
  }
1104
1122
  }
1105
1123
  }
1106
- if (id2.type === "ObjectPattern") {
1107
- for (let property of id2.properties) {
1124
+ if (id.type === "ObjectPattern") {
1125
+ for (let property of id.properties) {
1108
1126
  if (!property) {
1109
1127
  continue;
1110
1128
  }
@@ -1128,16 +1146,16 @@ function invalidDestructureError(name) {
1128
1146
 
1129
1147
  // vite/with-props.ts
1130
1148
  var import_dedent2 = __toESM(require("dedent"));
1131
- var vmodId = id("with-props");
1149
+ var vmod = create("with-props");
1132
1150
  var NAMED_COMPONENT_EXPORTS = ["HydrateFallback", "ErrorBoundary"];
1133
1151
  var plugin = {
1134
1152
  name: "react-router-with-props",
1135
1153
  enforce: "pre",
1136
- resolveId(id2) {
1137
- if (id2 === vmodId) return resolve3(vmodId);
1154
+ resolveId(id) {
1155
+ if (id === vmod.id) return vmod.resolvedId;
1138
1156
  },
1139
- async load(id2) {
1140
- if (id2 !== resolve3(vmodId)) return;
1157
+ async load(id) {
1158
+ if (id !== vmod.resolvedId) return;
1141
1159
  return import_dedent2.default`
1142
1160
  import { createElement as h } from "react";
1143
1161
  import { useActionData, useLoaderData, useMatches, useParams, useRouteError } from "react-router";
@@ -1199,12 +1217,12 @@ var transform = (ast) => {
1199
1217
  const decl = path5.get("declaration");
1200
1218
  if (decl.isVariableDeclaration()) {
1201
1219
  decl.get("declarations").forEach((varDeclarator) => {
1202
- const id2 = varDeclarator.get("id");
1220
+ const id = varDeclarator.get("id");
1203
1221
  const init = varDeclarator.get("init");
1204
1222
  const expr = init.node;
1205
1223
  if (!expr) return;
1206
- if (!id2.isIdentifier()) return;
1207
- const { name } = id2.node;
1224
+ if (!id.isIdentifier()) return;
1225
+ const { name } = id.node;
1208
1226
  if (!NAMED_COMPONENT_EXPORTS.includes(name)) return;
1209
1227
  const uid = getHocUid(path5, `with${name}Props`);
1210
1228
  init.replaceWith(t.callExpression(uid, [expr]));
@@ -1212,9 +1230,9 @@ var transform = (ast) => {
1212
1230
  return;
1213
1231
  }
1214
1232
  if (decl.isFunctionDeclaration()) {
1215
- const { id: id2 } = decl.node;
1216
- if (!id2) return;
1217
- const { name } = id2;
1233
+ const { id } = decl.node;
1234
+ if (!id) return;
1235
+ const { name } = id;
1218
1236
  if (!NAMED_COMPONENT_EXPORTS.includes(name)) return;
1219
1237
  const uid = getHocUid(path5, `with${name}Props`);
1220
1238
  decl.replaceWith(
@@ -1235,7 +1253,7 @@ var transform = (ast) => {
1235
1253
  hocs.map(
1236
1254
  ([name, identifier]) => t.importSpecifier(identifier, t.identifier(name))
1237
1255
  ),
1238
- t.stringLiteral(vmodId)
1256
+ t.stringLiteral(vmod.id)
1239
1257
  )
1240
1258
  );
1241
1259
  }
@@ -1264,27 +1282,23 @@ var CLIENT_ROUTE_EXPORTS = [
1264
1282
  "meta",
1265
1283
  "shouldRevalidate"
1266
1284
  ];
1267
- var ROUTE_ENTRY_QUERY_STRING = "?route-entry=1";
1268
- var isRouteEntry = (id2) => {
1269
- return id2.endsWith(ROUTE_ENTRY_QUERY_STRING);
1270
- };
1271
- var serverBuildId = id("server-build");
1272
- var serverManifestId = id("server-manifest");
1273
- var browserManifestId = id("browser-manifest");
1274
- var hmrRuntimeId = id("hmr-runtime");
1275
- 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");
1276
1288
  var resolveRelativeRouteFilePath = (route, reactRouterConfig) => {
1277
1289
  let vite2 = importViteEsmSync();
1278
1290
  let file = route.file;
1279
1291
  let fullPath = path4.resolve(reactRouterConfig.appDirectory, file);
1280
1292
  return vite2.normalizePath(fullPath);
1281
1293
  };
1282
- var vmods = [serverBuildId, serverManifestId, browserManifestId];
1294
+ var virtual = {
1295
+ serverBuild: create("server-build"),
1296
+ serverManifest: create("server-manifest"),
1297
+ browserManifest: create("browser-manifest")
1298
+ };
1283
1299
  var invalidateVirtualModules = (viteDevServer) => {
1284
- vmods.forEach((vmod) => {
1285
- let mod = viteDevServer.moduleGraph.getModuleById(
1286
- resolve3(vmod)
1287
- );
1300
+ Object.values(virtual).forEach((vmod2) => {
1301
+ let mod = viteDevServer.moduleGraph.getModuleById(vmod2.resolvedId);
1288
1302
  if (mod) {
1289
1303
  viteDevServer.moduleGraph.invalidateModule(mod);
1290
1304
  }
@@ -1299,7 +1313,7 @@ var resolveChunk = (ctx, viteManifest, absoluteFilePath) => {
1299
1313
  let rootRelativeFilePath = vite2.normalizePath(
1300
1314
  path4.relative(ctx.rootDirectory, absoluteFilePath)
1301
1315
  );
1302
- let entryChunk = viteManifest[rootRelativeFilePath + ROUTE_ENTRY_QUERY_STRING] ?? viteManifest[rootRelativeFilePath];
1316
+ let entryChunk = viteManifest[rootRelativeFilePath + BUILD_CLIENT_ROUTE_QUERY_STRING] ?? viteManifest[rootRelativeFilePath];
1303
1317
  if (!entryChunk) {
1304
1318
  let knownManifestKeys = Object.keys(viteManifest).map((key) => '"' + key + '"').join(", ");
1305
1319
  throw new Error(
@@ -1372,19 +1386,19 @@ var getRouteModuleExports = async (viteChildCompiler, ctx, routeFile, readRouteF
1372
1386
  let ssr = true;
1373
1387
  let { pluginContainer, moduleGraph } = viteChildCompiler;
1374
1388
  let routePath = path4.resolve(ctx.reactRouterConfig.appDirectory, routeFile);
1375
- let url3 = resolveFileUrl(ctx, routePath);
1389
+ let url2 = resolveFileUrl(ctx, routePath);
1376
1390
  let resolveId = async () => {
1377
- let result = await pluginContainer.resolveId(url3, void 0, { ssr });
1378
- 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}`);
1379
1393
  return result.id;
1380
1394
  };
1381
- let [id2, code] = await Promise.all([
1395
+ let [id, code] = await Promise.all([
1382
1396
  resolveId(),
1383
1397
  readRouteFile?.() ?? fse.readFile(routePath, "utf-8"),
1384
1398
  // pluginContainer.transform(...) fails if we don't do this first:
1385
- moduleGraph.ensureEntryFromUrl(url3, ssr)
1399
+ moduleGraph.ensureEntryFromUrl(url2, ssr)
1386
1400
  ]);
1387
- let transformed = await pluginContainer.transform(code, id2, { ssr });
1401
+ let transformed = await pluginContainer.transform(code, id, { ssr });
1388
1402
  let [, exports2] = (0, import_es_module_lexer.parse)(transformed.code);
1389
1403
  let exportNames = exports2.map((e) => e.n);
1390
1404
  return exportNames;
@@ -1489,10 +1503,12 @@ var reactRouterVitePlugin = () => {
1489
1503
  resolveFileUrl(
1490
1504
  ctx,
1491
1505
  resolveRelativeRouteFilePath(route, ctx.reactRouterConfig)
1492
- ) + ROUTE_ENTRY_QUERY_STRING
1506
+ )
1493
1507
  )};`;
1494
1508
  }).join("\n")}
1495
- export { default as assets } from ${JSON.stringify(serverManifestId)};
1509
+ export { default as assets } from ${JSON.stringify(
1510
+ virtual.serverManifest.id
1511
+ )};
1496
1512
  export const assetsBuildDirectory = ${JSON.stringify(
1497
1513
  path4.relative(
1498
1514
  ctx.rootDirectory,
@@ -1595,8 +1611,8 @@ var reactRouterVitePlugin = () => {
1595
1611
  viteConfig.build.assetsDir,
1596
1612
  `manifest-${version}.js`
1597
1613
  );
1598
- let url3 = `${ctx.publicPath}${manifestPath}`;
1599
- let nonFingerprintedValues = { url: url3, version };
1614
+ let url2 = `${ctx.publicPath}${manifestPath}`;
1615
+ let nonFingerprintedValues = { url: url2, version };
1600
1616
  let reactRouterBrowserManifest = {
1601
1617
  ...fingerprintedValues,
1602
1618
  ...nonFingerprintedValues
@@ -1632,10 +1648,10 @@ var reactRouterVitePlugin = () => {
1632
1648
  caseSensitive: route.caseSensitive,
1633
1649
  module: combineURLs(
1634
1650
  ctx.publicPath,
1635
- `${resolveFileUrl(
1651
+ resolveFileUrl(
1636
1652
  ctx,
1637
1653
  resolveRelativeRouteFilePath(route, ctx.reactRouterConfig)
1638
- )}${ROUTE_ENTRY_QUERY_STRING}`
1654
+ )
1639
1655
  ),
1640
1656
  hasAction: sourceExports.includes("action"),
1641
1657
  hasLoader: sourceExports.includes("loader"),
@@ -1647,12 +1663,9 @@ var reactRouterVitePlugin = () => {
1647
1663
  }
1648
1664
  return {
1649
1665
  version: String(Math.random()),
1650
- url: combineURLs(ctx.publicPath, url(browserManifestId)),
1666
+ url: combineURLs(ctx.publicPath, virtual.browserManifest.url),
1651
1667
  hmr: {
1652
- runtime: combineURLs(
1653
- ctx.publicPath,
1654
- url(injectHmrRuntimeId)
1655
- )
1668
+ runtime: combineURLs(ctx.publicPath, virtualInjectHmrRuntime.url)
1656
1669
  },
1657
1670
  entry: {
1658
1671
  module: combineURLs(
@@ -1789,7 +1802,7 @@ var reactRouterVitePlugin = () => {
1789
1802
  (route) => `${path4.resolve(
1790
1803
  ctx.reactRouterConfig.appDirectory,
1791
1804
  route.file
1792
- )}${ROUTE_ENTRY_QUERY_STRING}`
1805
+ )}${BUILD_CLIENT_ROUTE_QUERY_STRING}`
1793
1806
  )
1794
1807
  ]
1795
1808
  }
@@ -1808,7 +1821,7 @@ var reactRouterVitePlugin = () => {
1808
1821
  rollupOptions: {
1809
1822
  ...baseRollupOptions,
1810
1823
  preserveEntrySignatures: "exports-only",
1811
- input: viteUserConfig.build?.rollupOptions?.input ?? serverBuildId,
1824
+ input: viteUserConfig.build?.rollupOptions?.input ?? virtual.serverBuild.id,
1812
1825
  output: {
1813
1826
  entryFileNames: ctx.reactRouterConfig.serverBuildFile,
1814
1827
  format: ctx.reactRouterConfig.serverModuleFormat
@@ -1871,15 +1884,15 @@ var reactRouterVitePlugin = () => {
1871
1884
  envFile: false,
1872
1885
  plugins: [
1873
1886
  ...(childCompilerConfigFile.config.plugins ?? []).flat().filter(
1874
- (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"
1875
1888
  )
1876
1889
  ]
1877
1890
  });
1878
1891
  await viteChildCompiler.pluginContainer.buildStart({});
1879
1892
  },
1880
- async transform(code, id2) {
1881
- if (isCssModulesFile(id2)) {
1882
- cssModulesManifest[id2] = code;
1893
+ async transform(code, id) {
1894
+ if (isCssModulesFile(id)) {
1895
+ cssModulesManifest[id] = code;
1883
1896
  }
1884
1897
  },
1885
1898
  buildStart() {
@@ -1903,7 +1916,7 @@ var reactRouterVitePlugin = () => {
1903
1916
  (0, import_react_router2.unstable_setDevServerHooks)({
1904
1917
  // Give the request handler access to the critical CSS in dev to avoid a
1905
1918
  // flash of unstyled content since Vite injects CSS file contents via JS
1906
- getCriticalCss: async (build, url3) => {
1919
+ getCriticalCss: async (build, url2) => {
1907
1920
  return getStylesForUrl({
1908
1921
  rootDirectory: ctx.rootDirectory,
1909
1922
  entryClientFilePath: ctx.entryClientFilePath,
@@ -1911,7 +1924,7 @@ var reactRouterVitePlugin = () => {
1911
1924
  viteDevServer,
1912
1925
  cssModulesManifest,
1913
1926
  build,
1914
- url: url3
1927
+ url: url2
1915
1928
  });
1916
1929
  },
1917
1930
  // If an error is caught within the request handler, let Vite fix the
@@ -1959,7 +1972,7 @@ var reactRouterVitePlugin = () => {
1959
1972
  viteDevServer.middlewares.use(async (req, res, next) => {
1960
1973
  try {
1961
1974
  let build = await viteDevServer.ssrLoadModule(
1962
- serverBuildId
1975
+ virtual.serverBuild.id
1963
1976
  );
1964
1977
  let handler = (0, import_react_router2.createRequestHandler)(build, "development");
1965
1978
  let nodeHandler = async (nodeReq, nodeRes) => {
@@ -2059,11 +2072,11 @@ var reactRouterVitePlugin = () => {
2059
2072
  }
2060
2073
  },
2061
2074
  {
2062
- name: "react-router-route-entry",
2075
+ name: "react-router:build-client-route",
2063
2076
  enforce: "pre",
2064
- async transform(_code, id2, options) {
2065
- if (!isRouteEntry(id2)) return;
2066
- 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, "");
2067
2080
  let routeFileName = path4.basename(routeModuleId);
2068
2081
  let sourceExports = await getRouteModuleExports(
2069
2082
  viteChildCompiler,
@@ -2077,23 +2090,24 @@ var reactRouterVitePlugin = () => {
2077
2090
  }
2078
2091
  },
2079
2092
  {
2080
- name: "react-router-virtual-modules",
2093
+ name: "react-router:virtual-modules",
2081
2094
  enforce: "pre",
2082
- resolveId(id2) {
2083
- 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;
2084
2098
  },
2085
- async load(id2) {
2086
- switch (id2) {
2087
- case resolve3(serverBuildId): {
2099
+ async load(id) {
2100
+ switch (id) {
2101
+ case virtual.serverBuild.resolvedId: {
2088
2102
  return await getServerEntry();
2089
2103
  }
2090
- case resolve3(serverManifestId): {
2104
+ case virtual.serverManifest.resolvedId: {
2091
2105
  let reactRouterManifest = ctx.isSsrBuild ? await ctx.getReactRouterServerManifest() : await getReactRouterManifestForDev();
2092
2106
  return `export default ${(0, import_jsesc.default)(reactRouterManifest, {
2093
2107
  es6: true
2094
2108
  })};`;
2095
2109
  }
2096
- case resolve3(browserManifestId): {
2110
+ case virtual.browserManifest.resolvedId: {
2097
2111
  if (viteCommand === "build") {
2098
2112
  throw new Error("This module only exists in development");
2099
2113
  }
@@ -2107,15 +2121,15 @@ var reactRouterVitePlugin = () => {
2107
2121
  }
2108
2122
  },
2109
2123
  {
2110
- name: "react-router-dot-server",
2124
+ name: "react-router:dot-server",
2111
2125
  enforce: "pre",
2112
- async resolveId(id2, importer, options) {
2126
+ async resolveId(id, importer, options) {
2113
2127
  let isOptimizeDeps = viteCommand === "serve" && options?.scan === true;
2114
2128
  if (isOptimizeDeps || options?.ssr) return;
2115
- let isResolving = options?.custom?.["react-router-dot-server"] ?? false;
2129
+ let isResolving = options?.custom?.["react-router:dot-server"] ?? false;
2116
2130
  if (isResolving) return;
2117
- options.custom = { ...options.custom, "react-router-dot-server": true };
2118
- 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);
2119
2133
  if (!resolved) return;
2120
2134
  let serverFileRE = /\.server(\.[cm]?[jt]sx?)?$/;
2121
2135
  let serverDirRE = /\/\.server\//;
@@ -2138,12 +2152,12 @@ var reactRouterVitePlugin = () => {
2138
2152
  [
2139
2153
  import_picocolors3.default.red(`Server-only module referenced by client`),
2140
2154
  "",
2141
- ` '${id2}' imported by route '${importerShort}'`,
2155
+ ` '${id}' imported by route '${importerShort}'`,
2142
2156
  "",
2143
2157
  ` React Router automatically removes server-code from these exports:`,
2144
2158
  ` ${serverOnlyExports}`,
2145
2159
  "",
2146
- ` But other route exports in '${importerShort}' depend on '${id2}'.`,
2160
+ ` But other route exports in '${importerShort}' depend on '${id}'.`,
2147
2161
  "",
2148
2162
  " See https://remix.run/docs/en/main/guides/vite#splitting-up-client-and-server-code",
2149
2163
  ""
@@ -2154,7 +2168,7 @@ var reactRouterVitePlugin = () => {
2154
2168
  [
2155
2169
  import_picocolors3.default.red(`Server-only module referenced by client`),
2156
2170
  "",
2157
- ` '${id2}' imported by '${importerShort}'`,
2171
+ ` '${id}' imported by '${importerShort}'`,
2158
2172
  "",
2159
2173
  " See https://remix.run/docs/en/main/guides/vite#splitting-up-client-and-server-code",
2160
2174
  ""
@@ -2163,12 +2177,12 @@ var reactRouterVitePlugin = () => {
2163
2177
  }
2164
2178
  },
2165
2179
  {
2166
- name: "react-router-dot-client",
2167
- async transform(code, id2, options) {
2180
+ name: "react-router:dot-client",
2181
+ async transform(code, id, options) {
2168
2182
  if (!options?.ssr) return;
2169
2183
  let clientFileRE = /\.client(\.[cm]?[jt]sx?)?$/;
2170
2184
  let clientDirRE = /\/\.client\//;
2171
- if (clientFileRE.test(id2) || clientDirRE.test(id2)) {
2185
+ if (clientFileRE.test(id) || clientDirRE.test(id)) {
2172
2186
  let exports2 = (0, import_es_module_lexer.parse)(code)[1];
2173
2187
  return {
2174
2188
  code: exports2.map(
@@ -2181,9 +2195,9 @@ var reactRouterVitePlugin = () => {
2181
2195
  },
2182
2196
  plugin,
2183
2197
  {
2184
- name: "react-router-route-exports",
2185
- async transform(code, id2, options) {
2186
- 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);
2187
2201
  if (!route) return;
2188
2202
  if (!options?.ssr && !ctx.reactRouterConfig.ssr) {
2189
2203
  let serverOnlyExports = (0, import_es_module_lexer.parse)(code)[1].map((exp) => exp.n).filter((exp) => SERVER_ONLY_ROUTE_EXPORTS.includes(exp));
@@ -2200,7 +2214,7 @@ var reactRouterVitePlugin = () => {
2200
2214
  }
2201
2215
  }
2202
2216
  }
2203
- let [filepath] = id2.split("?");
2217
+ let [filepath] = id.split("?");
2204
2218
  let ast = (0, import_parser.parse)(code, { sourceType: "module" });
2205
2219
  if (!options?.ssr) {
2206
2220
  removeExports(ast, SERVER_ONLY_ROUTE_EXPORTS);
@@ -2208,22 +2222,23 @@ var reactRouterVitePlugin = () => {
2208
2222
  transform(ast);
2209
2223
  return generate2(ast, {
2210
2224
  sourceMaps: true,
2211
- filename: id2,
2225
+ filename: id,
2212
2226
  sourceFileName: filepath
2213
2227
  });
2214
2228
  }
2215
2229
  },
2216
2230
  {
2217
- name: "react-router-inject-hmr-runtime",
2231
+ name: "react-router:inject-hmr-runtime",
2218
2232
  enforce: "pre",
2219
- resolveId(id2) {
2220
- if (id2 === injectHmrRuntimeId)
2221
- return resolve3(injectHmrRuntimeId);
2233
+ resolveId(id) {
2234
+ if (id === virtualInjectHmrRuntime.id) {
2235
+ return virtualInjectHmrRuntime.resolvedId;
2236
+ }
2222
2237
  },
2223
- async load(id2) {
2224
- if (id2 !== resolve3(injectHmrRuntimeId)) return;
2238
+ async load(id) {
2239
+ if (id !== virtualInjectHmrRuntime.resolvedId) return;
2225
2240
  return [
2226
- `import RefreshRuntime from "${hmrRuntimeId}"`,
2241
+ `import RefreshRuntime from "${virtualHmrRuntime.id}"`,
2227
2242
  "RefreshRuntime.injectIntoGlobalHook(window)",
2228
2243
  "window.$RefreshReg$ = () => {}",
2229
2244
  "window.$RefreshSig$ = () => (type) => type",
@@ -2232,13 +2247,13 @@ var reactRouterVitePlugin = () => {
2232
2247
  }
2233
2248
  },
2234
2249
  {
2235
- name: "react-router-hmr-runtime",
2250
+ name: "react-router:hmr-runtime",
2236
2251
  enforce: "pre",
2237
- resolveId(id2) {
2238
- if (id2 === hmrRuntimeId) return resolve3(hmrRuntimeId);
2252
+ resolveId(id) {
2253
+ if (id === virtualHmrRuntime.id) return virtualHmrRuntime.resolvedId;
2239
2254
  },
2240
- async load(id2) {
2241
- if (id2 !== resolve3(hmrRuntimeId)) return;
2255
+ async load(id) {
2256
+ if (id !== virtualHmrRuntime.resolvedId) return;
2242
2257
  let reactRefreshDir = path4.dirname(
2243
2258
  require.resolve("react-refresh/package.json")
2244
2259
  );
@@ -2258,11 +2273,11 @@ var reactRouterVitePlugin = () => {
2258
2273
  }
2259
2274
  },
2260
2275
  {
2261
- name: "react-router-react-refresh-babel",
2262
- async transform(code, id2, options) {
2276
+ name: "react-router:react-refresh-babel",
2277
+ async transform(code, id, options) {
2263
2278
  if (viteCommand !== "serve") return;
2264
- if (id2.includes("/node_modules/")) return;
2265
- let [filepath] = id2.split("?");
2279
+ if (id.includes("/node_modules/")) return;
2280
+ let [filepath] = id.split("?");
2266
2281
  let extensionsRE = /\.(jsx?|tsx?|mdx?)$/;
2267
2282
  if (!extensionsRE.test(filepath)) return;
2268
2283
  let devRuntime = "react/jsx-dev-runtime";
@@ -2270,13 +2285,10 @@ var reactRouterVitePlugin = () => {
2270
2285
  let isJSX = filepath.endsWith("x");
2271
2286
  let useFastRefresh = !ssr && (isJSX || code.includes(devRuntime));
2272
2287
  if (!useFastRefresh) return;
2273
- if (isRouteEntry(id2)) {
2274
- return { code: addRefreshWrapper(ctx.reactRouterConfig, code, id2) };
2275
- }
2276
2288
  let result = await babel.transformAsync(code, {
2277
2289
  babelrc: false,
2278
2290
  configFile: false,
2279
- filename: id2,
2291
+ filename: id,
2280
2292
  sourceFileName: filepath,
2281
2293
  parserOpts: {
2282
2294
  sourceType: "module",
@@ -2289,18 +2301,18 @@ var reactRouterVitePlugin = () => {
2289
2301
  code = result.code;
2290
2302
  let refreshContentRE = /\$Refresh(?:Reg|Sig)\$\(/;
2291
2303
  if (refreshContentRE.test(code)) {
2292
- code = addRefreshWrapper(ctx.reactRouterConfig, code, id2);
2304
+ code = addRefreshWrapper(ctx.reactRouterConfig, code, id);
2293
2305
  }
2294
2306
  return { code, map: result.map };
2295
2307
  }
2296
2308
  },
2297
2309
  {
2298
- name: "react-router-hmr-updates",
2310
+ name: "react-router:hmr-updates",
2299
2311
  async handleHotUpdate({ server, file, modules, read }) {
2300
2312
  let route = getRoute(ctx.reactRouterConfig, file);
2301
2313
  let hmrEventData = { route: null };
2302
2314
  if (route) {
2303
- let serverManifest = (await server.ssrLoadModule(serverManifestId)).default;
2315
+ let serverManifest = (await server.ssrLoadModule(virtual.serverManifest.id)).default;
2304
2316
  let oldRouteMetadata = serverManifest.routes[route.id];
2305
2317
  let newRouteMetadata = await getRouteMetadata(
2306
2318
  ctx,
@@ -2326,12 +2338,58 @@ var reactRouterVitePlugin = () => {
2326
2338
  });
2327
2339
  return modules;
2328
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
+ }
2329
2363
  }
2330
2364
  ];
2331
2365
  };
2332
- function addRefreshWrapper(reactRouterConfig, code, id2) {
2333
- let route = getRoute(reactRouterConfig, id2);
2334
- 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 ? [
2335
2393
  "clientAction",
2336
2394
  "clientLoader",
2337
2395
  "handle",
@@ -2341,10 +2399,10 @@ function addRefreshWrapper(reactRouterConfig, code, id2) {
2341
2399
  ] : [];
2342
2400
  return "\n\n" + withCommentBoundaries(
2343
2401
  "REACT REFRESH HEADER",
2344
- REACT_REFRESH_HEADER.replaceAll("__SOURCE__", JSON.stringify(id2))
2402
+ REACT_REFRESH_HEADER.replaceAll("__SOURCE__", JSON.stringify(id))
2345
2403
  ) + "\n\n" + withCommentBoundaries("REACT REFRESH BODY", code) + "\n\n" + withCommentBoundaries(
2346
2404
  "REACT REFRESH FOOTER",
2347
- 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))
2348
2406
  ) + "\n";
2349
2407
  }
2350
2408
  function withCommentBoundaries(label, text) {
@@ -2357,7 +2415,7 @@ ${text}
2357
2415
  ${end}`;
2358
2416
  }
2359
2417
  var REACT_REFRESH_HEADER = `
2360
- import RefreshRuntime from "${hmrRuntimeId}";
2418
+ import RefreshRuntime from "${virtualHmrRuntime.id}";
2361
2419
 
2362
2420
  const inWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
2363
2421
  let prevRefreshReg;
@@ -2443,7 +2501,7 @@ async function getPrerenderBuildAndHandler(viteConfig, reactRouterConfig, server
2443
2501
  serverBuildDirectory,
2444
2502
  reactRouterConfig.serverBuildFile
2445
2503
  );
2446
- let build = await import(url2.pathToFileURL(serverBuildPath).toString());
2504
+ let build = await import(url.pathToFileURL(serverBuildPath).toString());
2447
2505
  let { createRequestHandler: createHandler } = await import("react-router");
2448
2506
  return {
2449
2507
  build,