@c0va23/react-router-dev 7.9.6 → 7.13.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/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.9.6
2
+ * @react-router/dev v7.13.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -52,7 +52,6 @@ var import_promises2 = require("fs/promises");
52
52
  var path6 = __toESM(require("path"));
53
53
  var url = __toESM(require("url"));
54
54
  var babel = __toESM(require("@babel/core"));
55
- var import_node_fetch_server2 = require("@remix-run/node-fetch-server");
56
55
  var import_react_router2 = require("react-router");
57
56
  var import_es_module_lexer = require("es-module-lexer");
58
57
  var import_pick3 = __toESM(require("lodash/pick"));
@@ -68,7 +67,6 @@ var import_picocolors2 = require("picocolors");
68
67
  // config/config.ts
69
68
  var import_node_fs = __toESM(require("fs"));
70
69
  var import_node_child_process = require("child_process");
71
- var import_package_json = __toESM(require("@npmcli/package-json"));
72
70
 
73
71
  // vite/vite.ts
74
72
  var import_pathe2 = __toESM(require("pathe"));
@@ -549,13 +547,26 @@ async function resolveConfig({
549
547
  );
550
548
  }
551
549
  }
550
+ let futureConfig = userAndPresetConfigs.future;
551
+ if (futureConfig?.unstable_splitRouteModules !== void 0) {
552
+ return err(
553
+ 'The "future.unstable_splitRouteModules" flag has been stabilized as "future.v8_splitRouteModules"'
554
+ );
555
+ }
556
+ if (futureConfig?.unstable_viteEnvironmentApi !== void 0) {
557
+ return err(
558
+ 'The "future.unstable_viteEnvironmentApi" flag has been stabilized as "future.v8_viteEnvironmentApi"'
559
+ );
560
+ }
552
561
  let future = {
553
- v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
554
562
  unstable_optimizeDeps: userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,
555
- unstable_splitRouteModules: userAndPresetConfigs.future?.unstable_splitRouteModules ?? false,
556
563
  unstable_subResourceIntegrity: userAndPresetConfigs.future?.unstable_subResourceIntegrity ?? false,
557
- unstable_viteEnvironmentApi: userAndPresetConfigs.future?.unstable_viteEnvironmentApi ?? false
564
+ unstable_trailingSlashAwareDataRequests: userAndPresetConfigs.future?.unstable_trailingSlashAwareDataRequests ?? false,
565
+ v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
566
+ v8_splitRouteModules: userAndPresetConfigs.future?.v8_splitRouteModules ?? false,
567
+ v8_viteEnvironmentApi: userAndPresetConfigs.future?.v8_viteEnvironmentApi ?? false
558
568
  };
569
+ let allowedActionOrigins = userAndPresetConfigs.allowedActionOrigins ?? false;
559
570
  let reactRouterConfig = deepFreeze({
560
571
  appDirectory,
561
572
  basename: basename3,
@@ -569,6 +580,7 @@ async function resolveConfig({
569
580
  serverBundles,
570
581
  serverModuleFormat,
571
582
  ssr,
583
+ allowedActionOrigins,
572
584
  unstable_routeConfig: routeConfig
573
585
  });
574
586
  for (let preset of reactRouterUserConfig.presets ?? []) {
@@ -629,11 +641,11 @@ async function createConfigLoader({
629
641
  fsWatcher = import_chokidar.default.watch([root, appDirectory], {
630
642
  ignoreInitial: true,
631
643
  ignored: (path9) => {
632
- let dirname5 = import_pathe3.default.dirname(path9);
633
- return !dirname5.startsWith(appDirectory) && // Ensure we're only watching files outside of the app directory
644
+ let dirname4 = import_pathe3.default.dirname(path9);
645
+ return !dirname4.startsWith(appDirectory) && // Ensure we're only watching files outside of the app directory
634
646
  // that are at the root level, not nested in subdirectories
635
647
  path9 !== root && // Watch the root directory itself
636
- dirname5 !== root;
648
+ dirname4 !== root;
637
649
  }
638
650
  });
639
651
  fsWatcher.on("all", async (...args) => {
@@ -735,9 +747,10 @@ async function resolveEntryFiles({
735
747
  `Could not find package.json in ${rootDirectory} or any of its parent directories. Please add a package.json, or provide a custom entry.server.tsx/jsx file in your app directory.`
736
748
  );
737
749
  }
750
+ let { readPackageJSON, sortPackage, updatePackage } = await import("pkg-types");
738
751
  let packageJsonDirectory = import_pathe3.default.dirname(packageJsonPath);
739
- let pkgJson = await import_package_json.default.load(packageJsonDirectory);
740
- let deps = pkgJson.content.dependencies ?? {};
752
+ let pkgJson = await readPackageJSON(packageJsonDirectory);
753
+ let deps = pkgJson.dependencies ?? {};
741
754
  if (!deps["@react-router/node"]) {
742
755
  throw new Error(
743
756
  `Could not determine server runtime. Please install @react-router/node, or provide a custom entry.server.tsx/jsx file in your app directory.`
@@ -747,13 +760,11 @@ async function resolveEntryFiles({
747
760
  console.log(
748
761
  "adding `isbot@5` to your package.json, you should commit this change"
749
762
  );
750
- pkgJson.update({
751
- dependencies: {
752
- ...pkgJson.content.dependencies,
753
- isbot: "^5"
754
- }
763
+ await updatePackage(packageJsonPath, (pkg) => {
764
+ pkg.dependencies ??= {};
765
+ pkg.dependencies.isbot = "^5";
766
+ sortPackage(pkg);
755
767
  });
756
- await pkgJson.save();
757
768
  let packageManager = detectPackageManager() ?? "npm";
758
769
  (0, import_node_child_process.execSync)(`${packageManager} install`, {
759
770
  cwd: packageJsonDirectory,
@@ -766,6 +777,30 @@ async function resolveEntryFiles({
766
777
  let entryServerFilePath = userEntryServerFile ? import_pathe3.default.resolve(reactRouterConfig.appDirectory, userEntryServerFile) : import_pathe3.default.resolve(defaultsDirectory, entryServerFile);
767
778
  return { entryClientFilePath, entryServerFilePath };
768
779
  }
780
+ async function resolveRSCEntryFiles({
781
+ reactRouterConfig
782
+ }) {
783
+ let { appDirectory } = reactRouterConfig;
784
+ let defaultsDirectory = import_pathe3.default.resolve(
785
+ import_pathe3.default.dirname(require.resolve("@react-router/dev/package.json")),
786
+ "dist",
787
+ "config",
788
+ "default-rsc-entries"
789
+ );
790
+ let userEntryClientFile = findEntry(appDirectory, "entry.client", {
791
+ absolute: true
792
+ });
793
+ let userEntryRSCFile = findEntry(appDirectory, "entry.rsc", {
794
+ absolute: true
795
+ });
796
+ let userEntrySSRFile = findEntry(appDirectory, "entry.ssr", {
797
+ absolute: true
798
+ });
799
+ let client = userEntryClientFile ?? import_pathe3.default.join(defaultsDirectory, "entry.client.tsx");
800
+ let rsc = userEntryRSCFile ?? import_pathe3.default.join(defaultsDirectory, "entry.rsc.tsx");
801
+ let ssr = userEntrySSRFile ?? import_pathe3.default.join(defaultsDirectory, "entry.ssr.tsx");
802
+ return { client, rsc, ssr };
803
+ }
769
804
  function omitRoutes(config) {
770
805
  return {
771
806
  ...config,
@@ -933,6 +968,7 @@ function generateServerBuild(ctx) {
933
968
  export const routeDiscovery: ServerBuild["routeDiscovery"];
934
969
  export const routes: ServerBuild["routes"];
935
970
  export const ssr: ServerBuild["ssr"];
971
+ export const allowedActionOrigins: ServerBuild["allowedActionOrigins"];
936
972
  export const unstable_getCriticalCss: ServerBuild["unstable_getCriticalCss"];
937
973
  }
938
974
  `;
@@ -1288,14 +1324,14 @@ async function watch(rootDirectory, { mode, logger, rsc }) {
1288
1324
  }
1289
1325
 
1290
1326
  // vite/node-adapter.ts
1291
- var import_node_fetch_server = require("@remix-run/node-fetch-server");
1292
- function fromNodeRequest(nodeReq, nodeRes) {
1327
+ async function fromNodeRequest(nodeReq, nodeRes) {
1293
1328
  invariant(
1294
1329
  nodeReq.originalUrl,
1295
1330
  "Expected `nodeReq.originalUrl` to be defined"
1296
1331
  );
1297
1332
  nodeReq.url = nodeReq.originalUrl;
1298
- return (0, import_node_fetch_server.createRequest)(nodeReq, nodeRes);
1333
+ const { createRequest } = await import("@remix-run/node-fetch-server");
1334
+ return createRequest(nodeReq, nodeRes);
1299
1335
  }
1300
1336
 
1301
1337
  // vite/styles.ts
@@ -2737,7 +2773,7 @@ var getServerBundleRouteIds = (vitePluginContext, ctx) => {
2737
2773
  if (!ctx.buildManifest) {
2738
2774
  return void 0;
2739
2775
  }
2740
- let environmentName = ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? vitePluginContext.environment.name : ctx.environmentBuildContext?.name;
2776
+ let environmentName = ctx.reactRouterConfig.future.v8_viteEnvironmentApi ? vitePluginContext.environment.name : ctx.environmentBuildContext?.name;
2741
2777
  if (!environmentName || !isSsrBundleEnvironmentName(environmentName)) {
2742
2778
  return void 0;
2743
2779
  }
@@ -2787,7 +2823,7 @@ var reactRouterVitePlugin = () => {
2787
2823
  }
2788
2824
  return;
2789
2825
  }
2790
- let injectedPluginContext = !reactRouterConfig.future.unstable_viteEnvironmentApi && viteCommand === "build" ? extractPluginContext(viteUserConfig) : void 0;
2826
+ let injectedPluginContext = !reactRouterConfig.future.v8_viteEnvironmentApi && viteCommand === "build" ? extractPluginContext(viteUserConfig) : void 0;
2791
2827
  let { entryClientFilePath, entryServerFilePath } = await resolveEntryFiles({
2792
2828
  rootDirectory,
2793
2829
  reactRouterConfig
@@ -2881,14 +2917,16 @@ var reactRouterVitePlugin = () => {
2881
2917
  }`;
2882
2918
  }).join(",\n ")}
2883
2919
  };
2884
- ${ctx.reactRouterConfig.future.unstable_viteEnvironmentApi && viteCommand === "serve" ? `
2920
+ ${ctx.reactRouterConfig.future.v8_viteEnvironmentApi && viteCommand === "serve" ? `
2885
2921
  export const unstable_getCriticalCss = ({ pathname }) => {
2886
2922
  return {
2887
2923
  rel: "stylesheet",
2888
2924
  href: "${ctx.publicPath}@react-router/critical.css?pathname=" + pathname,
2889
2925
  };
2890
2926
  }
2891
- ` : ""}`;
2927
+ ` : ""}
2928
+ export const allowedActionOrigins = ${JSON.stringify(ctx.reactRouterConfig.allowedActionOrigins)};
2929
+ `;
2892
2930
  };
2893
2931
  let loadViteManifest = async (directory) => {
2894
2932
  let manifestContents = await (0, import_promises2.readFile)(
@@ -2959,7 +2997,7 @@ var reactRouterVitePlugin = () => {
2959
2997
  viteChildCompiler,
2960
2998
  ctx
2961
2999
  );
2962
- let enforceSplitRouteModules = ctx.reactRouterConfig.future.unstable_splitRouteModules === "enforce";
3000
+ let enforceSplitRouteModules = ctx.reactRouterConfig.future.v8_splitRouteModules === "enforce";
2963
3001
  for (let route of Object.values(ctx.reactRouterConfig.routes)) {
2964
3002
  let routeFile = path6.join(ctx.reactRouterConfig.appDirectory, route.file);
2965
3003
  let sourceExports = routeManifestExports[route.id];
@@ -3071,7 +3109,7 @@ var reactRouterVitePlugin = () => {
3071
3109
  viteChildCompiler,
3072
3110
  ctx
3073
3111
  );
3074
- let enforceSplitRouteModules = ctx.reactRouterConfig.future.unstable_splitRouteModules === "enforce";
3112
+ let enforceSplitRouteModules = ctx.reactRouterConfig.future.v8_splitRouteModules === "enforce";
3075
3113
  for (let [key, route] of Object.entries(ctx.reactRouterConfig.routes)) {
3076
3114
  let routeFile = route.file;
3077
3115
  let sourceExports = routeManifestExports[key];
@@ -3190,17 +3228,17 @@ var reactRouterVitePlugin = () => {
3190
3228
  logger: vite2.createLogger("warn", { prefix: "[react-router]" })
3191
3229
  });
3192
3230
  }
3231
+ await loadDotenv({
3232
+ rootDirectory,
3233
+ viteUserConfig,
3234
+ mode
3235
+ });
3193
3236
  reactRouterConfigLoader = await createConfigLoader({
3194
3237
  rootDirectory,
3195
3238
  mode,
3196
3239
  watch: viteCommand === "serve"
3197
3240
  });
3198
3241
  await updatePluginContext();
3199
- await loadDotenv({
3200
- rootDirectory,
3201
- viteUserConfig,
3202
- mode
3203
- });
3204
3242
  let environments = await getEnvironmentsOptions(ctx, viteCommand, {
3205
3243
  viteUserConfig
3206
3244
  });
@@ -3266,7 +3304,7 @@ var reactRouterVitePlugin = () => {
3266
3304
  // will throw an error that the file is not allowed to be read.
3267
3305
  // https://vitejs.dev/config/server-options#server-fs-allow
3268
3306
  server: viteUserConfig.server?.fs?.allow ? { fs: { allow: defaultEntries } } : void 0,
3269
- ...ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? {
3307
+ ...ctx.reactRouterConfig.future.v8_viteEnvironmentApi ? {
3270
3308
  environments,
3271
3309
  build: {
3272
3310
  // This isn't honored by the SSR environment config (which seems
@@ -3305,7 +3343,7 @@ var reactRouterVitePlugin = () => {
3305
3343
  };
3306
3344
  },
3307
3345
  configEnvironment(name, options) {
3308
- if (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi && (ctx.buildManifest?.serverBundles ? isSsrBundleEnvironmentName(name) : name === "ssr")) {
3346
+ if (ctx.reactRouterConfig.future.v8_viteEnvironmentApi && (ctx.buildManifest?.serverBundles ? isSsrBundleEnvironmentName(name) : name === "ssr")) {
3309
3347
  const vite2 = getVite();
3310
3348
  return {
3311
3349
  resolve: {
@@ -3441,7 +3479,7 @@ var reactRouterVitePlugin = () => {
3441
3479
  }
3442
3480
  }
3443
3481
  );
3444
- if (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi) {
3482
+ if (ctx.reactRouterConfig.future.v8_viteEnvironmentApi) {
3445
3483
  viteDevServer.middlewares.use(async (req, res, next) => {
3446
3484
  let [reqPathname, reqSearch] = (req.url ?? "").split("?");
3447
3485
  if (reqPathname.endsWith("/@react-router/critical.css")) {
@@ -3469,7 +3507,7 @@ var reactRouterVitePlugin = () => {
3469
3507
  viteDevServer.middlewares.use(async (req, res, next) => {
3470
3508
  try {
3471
3509
  let build;
3472
- if (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi) {
3510
+ if (ctx.reactRouterConfig.future.v8_viteEnvironmentApi) {
3473
3511
  let vite2 = getVite();
3474
3512
  let ssrEnvironment = viteDevServer.environments.ssr;
3475
3513
  if (!vite2.isRunnableDevEnvironment(ssrEnvironment)) {
@@ -3486,12 +3524,13 @@ var reactRouterVitePlugin = () => {
3486
3524
  }
3487
3525
  let handler = (0, import_react_router2.createRequestHandler)(build, "development");
3488
3526
  let nodeHandler = async (nodeReq, nodeRes) => {
3489
- let req2 = fromNodeRequest(nodeReq, nodeRes);
3527
+ let req2 = await fromNodeRequest(nodeReq, nodeRes);
3490
3528
  let res2 = await handler(
3491
3529
  req2,
3492
3530
  await reactRouterDevLoadContext(req2)
3493
3531
  );
3494
- await (0, import_node_fetch_server2.sendResponse)(nodeRes, res2);
3532
+ const { sendResponse } = await import("@remix-run/node-fetch-server");
3533
+ await sendResponse(nodeRes, res2);
3495
3534
  };
3496
3535
  await nodeHandler(req, res);
3497
3536
  } catch (error) {
@@ -3501,22 +3540,54 @@ var reactRouterVitePlugin = () => {
3501
3540
  }
3502
3541
  };
3503
3542
  },
3543
+ configurePreviewServer(previewServer) {
3544
+ return () => {
3545
+ if (!ctx.reactRouterConfig.ssr) {
3546
+ return;
3547
+ }
3548
+ previewServer.middlewares.use(async (req, res, next) => {
3549
+ try {
3550
+ let serverBuildDirectory = getServerBuildDirectory(
3551
+ ctx.reactRouterConfig
3552
+ );
3553
+ let serverBuildFile = path6.resolve(
3554
+ serverBuildDirectory,
3555
+ "index.js"
3556
+ );
3557
+ let build = await import(url.pathToFileURL(serverBuildFile).href);
3558
+ let handler = (0, import_react_router2.createRequestHandler)(build, "production");
3559
+ let nodeHandler = async (nodeReq, nodeRes) => {
3560
+ let req2 = await fromNodeRequest(nodeReq, nodeRes);
3561
+ let res2 = await handler(
3562
+ req2,
3563
+ await reactRouterDevLoadContext(req2)
3564
+ );
3565
+ const { sendResponse } = await import("@remix-run/node-fetch-server");
3566
+ await sendResponse(nodeRes, res2);
3567
+ };
3568
+ await nodeHandler(req, res);
3569
+ } catch (error) {
3570
+ next(error);
3571
+ }
3572
+ });
3573
+ };
3574
+ },
3504
3575
  writeBundle: {
3505
3576
  // After the SSR build is finished, we inspect the Vite manifest for
3506
3577
  // the SSR build and move server-only assets to client assets directory
3507
3578
  async handler() {
3508
3579
  let { future } = ctx.reactRouterConfig;
3509
- if (future.unstable_viteEnvironmentApi ? this.environment.name === "client" : !viteConfigEnv.isSsrBuild) {
3580
+ if (future.v8_viteEnvironmentApi ? this.environment.name === "client" : !viteConfigEnv.isSsrBuild) {
3510
3581
  return;
3511
3582
  }
3512
3583
  invariant(viteConfig);
3513
3584
  let clientBuildDirectory = getClientBuildDirectory(
3514
3585
  ctx.reactRouterConfig
3515
3586
  );
3516
- let serverBuildDirectory = future.unstable_viteEnvironmentApi ? this.environment.config?.build?.outDir : ctx.environmentBuildContext?.options.build?.outDir ?? getServerBuildDirectory(ctx.reactRouterConfig);
3587
+ let serverBuildDirectory = future.v8_viteEnvironmentApi ? this.environment.config?.build?.outDir : ctx.environmentBuildContext?.options.build?.outDir ?? getServerBuildDirectory(ctx.reactRouterConfig);
3517
3588
  let ssrViteManifest = await loadViteManifest(serverBuildDirectory);
3518
3589
  let ssrAssetPaths = getViteManifestAssetPaths(ssrViteManifest);
3519
- let userSsrEmitAssets = (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig.environments?.ssr?.build?.ssrEmitAssets ?? viteUserConfig.environments?.ssr?.build?.emitAssets : null) ?? viteUserConfig.build?.ssrEmitAssets ?? false;
3590
+ let userSsrEmitAssets = (ctx.reactRouterConfig.future.v8_viteEnvironmentApi ? viteUserConfig.environments?.ssr?.build?.ssrEmitAssets ?? viteUserConfig.environments?.ssr?.build?.emitAssets : null) ?? viteUserConfig.build?.ssrEmitAssets ?? false;
3520
3591
  let movedAssetPaths = [];
3521
3592
  let removedAssetPaths = [];
3522
3593
  let copiedAssetPaths = [];
@@ -3730,7 +3801,7 @@ var reactRouterVitePlugin = () => {
3730
3801
  reason: "Split round modules disabled"
3731
3802
  });
3732
3803
  }
3733
- let enforceSplitRouteModules = ctx.reactRouterConfig.future.unstable_splitRouteModules === "enforce";
3804
+ let enforceSplitRouteModules = ctx.reactRouterConfig.future.v8_splitRouteModules === "enforce";
3734
3805
  if (enforceSplitRouteModules && chunkName === "main" && chunk) {
3735
3806
  let exportNames = getExportNames(chunk.code);
3736
3807
  validateRouteChunks({
@@ -4038,10 +4109,8 @@ var reactRouterVitePlugin = () => {
4038
4109
  if (this.environment.name !== "ssr" && modules.length <= 0) {
4039
4110
  return;
4040
4111
  }
4041
- let clientModules = uniqueNodes(
4042
- modules.flatMap(
4043
- (mod) => getParentClientNodes(server.environments.client.moduleGraph, mod)
4044
- )
4112
+ let clientModules = modules.flatMap(
4113
+ (mod) => getParentClientNodes(server.environments.client.moduleGraph, mod)
4045
4114
  );
4046
4115
  for (let clientModule of clientModules) {
4047
4116
  server.environments.client.reloadModule(clientModule);
@@ -4052,30 +4121,22 @@ var reactRouterVitePlugin = () => {
4052
4121
  warnOnClientSourceMaps()
4053
4122
  ];
4054
4123
  };
4055
- function getParentClientNodes(clientModuleGraph, module2) {
4124
+ function getParentClientNodes(clientModuleGraph, module2, seenNodes = /* @__PURE__ */ new Set()) {
4056
4125
  if (!module2.id) {
4057
4126
  return [];
4058
4127
  }
4128
+ if (seenNodes.has(module2.url)) {
4129
+ return [];
4130
+ }
4131
+ seenNodes.add(module2.url);
4059
4132
  let clientModule = clientModuleGraph.getModuleById(module2.id);
4060
4133
  if (clientModule) {
4061
4134
  return [clientModule];
4062
4135
  }
4063
4136
  return [...module2.importers].flatMap(
4064
- (importer) => getParentClientNodes(clientModuleGraph, importer)
4137
+ (importer) => getParentClientNodes(clientModuleGraph, importer, seenNodes)
4065
4138
  );
4066
4139
  }
4067
- function uniqueNodes(nodes) {
4068
- let nodeUrls = /* @__PURE__ */ new Set();
4069
- let unique = [];
4070
- for (let node of nodes) {
4071
- if (nodeUrls.has(node.url)) {
4072
- continue;
4073
- }
4074
- nodeUrls.add(node.url);
4075
- unique.push(node);
4076
- }
4077
- return unique;
4078
- }
4079
4140
  function addRefreshWrapper(reactRouterConfig, code, id) {
4080
4141
  let route = getRoute(reactRouterConfig, id);
4081
4142
  let acceptExports = route ? CLIENT_NON_COMPONENT_EXPORTS : [];
@@ -4350,7 +4411,21 @@ function getStaticPrerenderPaths(routes) {
4350
4411
  };
4351
4412
  }
4352
4413
  async function prerenderData(handler, prerenderPath, onlyRoutes, clientBuildDirectory, reactRouterConfig, viteConfig, requestInit) {
4353
- let normalizedPath = `${reactRouterConfig.basename}${prerenderPath === "/" ? "/_root.data" : `${prerenderPath.replace(/\/$/, "")}.data`}`.replace(/\/\/+/g, "/");
4414
+ let dataRequestPath;
4415
+ if (reactRouterConfig.future.unstable_trailingSlashAwareDataRequests) {
4416
+ if (prerenderPath.endsWith("/")) {
4417
+ dataRequestPath = `${prerenderPath}_.data`;
4418
+ } else {
4419
+ dataRequestPath = `${prerenderPath}.data`;
4420
+ }
4421
+ } else {
4422
+ if (prerenderPath === "/") {
4423
+ dataRequestPath = "/_root.data";
4424
+ } else {
4425
+ dataRequestPath = `${prerenderPath.replace(/\/$/, "")}.data`;
4426
+ }
4427
+ }
4428
+ let normalizedPath = `${reactRouterConfig.basename}${dataRequestPath}`.replace(/\/\/+/g, "/");
4354
4429
  let url2 = new URL(`http://localhost${normalizedPath}`);
4355
4430
  if (onlyRoutes?.length) {
4356
4431
  url2.searchParams.set("_routes", onlyRoutes.join(","));
@@ -4642,7 +4717,7 @@ async function detectRouteChunksIfEnabled(cache, ctx, id, input) {
4642
4717
  }
4643
4718
  };
4644
4719
  }
4645
- if (!ctx.reactRouterConfig.future.unstable_splitRouteModules) {
4720
+ if (!ctx.reactRouterConfig.future.v8_splitRouteModules) {
4646
4721
  return noRouteChunks();
4647
4722
  }
4648
4723
  if (isRootRouteModuleId(ctx, id)) {
@@ -4656,7 +4731,7 @@ async function detectRouteChunksIfEnabled(cache, ctx, id, input) {
4656
4731
  return detectRouteChunks(code, cache, cacheKey);
4657
4732
  }
4658
4733
  async function getRouteChunkIfEnabled(cache, ctx, id, chunkName, input) {
4659
- if (!ctx.reactRouterConfig.future.unstable_splitRouteModules) {
4734
+ if (!ctx.reactRouterConfig.future.v8_splitRouteModules) {
4660
4735
  return null;
4661
4736
  }
4662
4737
  let code = await resolveRouteFileCode(ctx, input);
@@ -4760,7 +4835,7 @@ async function getBuildManifest({
4760
4835
  if (typeof serverBundleId !== "string") {
4761
4836
  throw new Error(`The "serverBundles" function must return a string`);
4762
4837
  }
4763
- if (reactRouterConfig.future.unstable_viteEnvironmentApi) {
4838
+ if (reactRouterConfig.future.v8_viteEnvironmentApi) {
4764
4839
  if (!/^[a-zA-Z0-9_]+$/.test(serverBundleId)) {
4765
4840
  throw new Error(
4766
4841
  `The "serverBundles" function must only return strings containing alphanumeric characters and underscores.`
@@ -4848,8 +4923,8 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
4848
4923
  return mergeEnvironmentOptions(getBaseOptions({ viteUserConfig }), {
4849
4924
  resolve: {
4850
4925
  external: (
4851
- // If `unstable_viteEnvironmentApi` is `true`, `resolve.external` is set in the `configEnvironment` hook
4852
- ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? void 0 : ssrExternals
4926
+ // If `v8_viteEnvironmentApi` is `true`, `resolve.external` is set in the `configEnvironment` hook
4927
+ ctx.reactRouterConfig.future.v8_viteEnvironmentApi ? void 0 : ssrExternals
4853
4928
  ),
4854
4929
  conditions: [...baseConditions, ...maybeDefaultServerConditions],
4855
4930
  externalConditions: [...baseConditions, ...defaultExternalConditions]
@@ -4864,7 +4939,7 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
4864
4939
  copyPublicDir: false,
4865
4940
  // The client only uses assets in the public directory
4866
4941
  rollupOptions: {
4867
- input: (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig.environments?.ssr?.build?.rollupOptions?.input : viteUserConfig.build?.rollupOptions?.input) ?? virtual.serverBuild.id,
4942
+ input: (ctx.reactRouterConfig.future.v8_viteEnvironmentApi ? viteUserConfig.environments?.ssr?.build?.rollupOptions?.input : viteUserConfig.build?.rollupOptions?.input) ?? virtual.serverBuild.id,
4868
4943
  output: {
4869
4944
  entryFileNames: serverBuildFile,
4870
4945
  format: serverModuleFormat
@@ -4889,14 +4964,14 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
4889
4964
  let code = (0, import_node_fs2.readFileSync)(routeFilePath, "utf-8");
4890
4965
  return [
4891
4966
  `${routeFilePath}${BUILD_CLIENT_ROUTE_QUERY_STRING}`,
4892
- ...ctx.reactRouterConfig.future.unstable_splitRouteModules && !isRootRoute ? routeChunkExportNames.map(
4967
+ ...ctx.reactRouterConfig.future.v8_splitRouteModules && !isRootRoute ? routeChunkExportNames.map(
4893
4968
  (exportName) => code.includes(exportName) ? getRouteChunkModuleId(routeFilePath, exportName) : null
4894
4969
  ) : []
4895
4970
  ].filter(isNonNullable);
4896
4971
  }
4897
4972
  )
4898
4973
  ],
4899
- output: (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig?.environments?.client?.build?.rollupOptions?.output : viteUserConfig?.build?.rollupOptions?.output) ?? {
4974
+ output: (ctx.reactRouterConfig.future.v8_viteEnvironmentApi ? viteUserConfig?.environments?.client?.build?.rollupOptions?.output : viteUserConfig?.build?.rollupOptions?.output) ?? {
4900
4975
  entryFileNames: ({ moduleIds }) => {
4901
4976
  let routeChunkModuleId = moduleIds.find(isRouteChunkModuleId);
4902
4977
  let routeChunkName = routeChunkModuleId ? getRouteChunkNameFromModuleId(routeChunkModuleId)?.replace(
@@ -4904,7 +4979,7 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
4904
4979
  ""
4905
4980
  ) : null;
4906
4981
  let routeChunkSuffix = routeChunkName ? `-${(0, import_kebabCase.default)(routeChunkName)}` : "";
4907
- let assetsDir = (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig?.environments?.client?.build?.assetsDir : null) ?? viteUserConfig?.build?.assetsDir ?? "assets";
4982
+ let assetsDir = (ctx.reactRouterConfig.future.v8_viteEnvironmentApi ? viteUserConfig?.environments?.client?.build?.assetsDir : null) ?? viteUserConfig?.build?.assetsDir ?? "assets";
4908
4983
  return path6.posix.join(
4909
4984
  assetsDir,
4910
4985
  `[name]${routeChunkSuffix}-[hash].js`
@@ -4977,7 +5052,6 @@ var import_es_module_lexer3 = require("es-module-lexer");
4977
5052
  var Path5 = __toESM(require("pathe"));
4978
5053
  var babel2 = __toESM(require("@babel/core"));
4979
5054
  var import_picocolors5 = __toESM(require("picocolors"));
4980
- var import_fs = require("fs");
4981
5055
  var import_promises3 = require("fs/promises");
4982
5056
  var import_pathe6 = __toESM(require("pathe"));
4983
5057
 
@@ -5312,13 +5386,16 @@ function isRootRouteFile({
5312
5386
 
5313
5387
  // vite/rsc/plugin.ts
5314
5388
  function reactRouterRSCVitePlugin() {
5389
+ let runningWithinTheReactRouterMonoRepo = Boolean(
5390
+ arguments && arguments.length === 1 && typeof arguments[0] === "object" && arguments[0] && "__runningWithinTheReactRouterMonoRepo" in arguments[0] && arguments[0].__runningWithinTheReactRouterMonoRepo === true
5391
+ );
5315
5392
  let configLoader;
5316
5393
  let typegenWatcherPromise;
5317
5394
  let viteCommand;
5318
5395
  let resolvedViteConfig;
5319
5396
  let routeIdByFile;
5320
5397
  let logger;
5321
- const defaultEntries2 = getDefaultEntries();
5398
+ let entries;
5322
5399
  let config;
5323
5400
  let rootRouteFile;
5324
5401
  function updateConfig(newConfig) {
@@ -5337,6 +5414,11 @@ function reactRouterRSCVitePlugin() {
5337
5414
  viteCommand = command;
5338
5415
  const rootDirectory = getRootDirectory(viteUserConfig);
5339
5416
  const watch2 = command === "serve";
5417
+ await loadDotenv({
5418
+ rootDirectory,
5419
+ viteUserConfig,
5420
+ mode
5421
+ });
5340
5422
  configLoader = await createConfigLoader({
5341
5423
  rootDirectory,
5342
5424
  mode,
@@ -5349,12 +5431,12 @@ function reactRouterRSCVitePlugin() {
5349
5431
  if (userConfig.routeDiscovery) errors.push("routeDiscovery");
5350
5432
  if (userConfig.serverBundles) errors.push("serverBundles");
5351
5433
  if (userConfig.ssr === false) errors.push("ssr: false");
5352
- if (userConfig.future?.unstable_splitRouteModules)
5353
- errors.push("future.unstable_splitRouteModules");
5354
- if (userConfig.future?.unstable_viteEnvironmentApi === false)
5355
- errors.push("future.unstable_viteEnvironmentApi: false");
5356
5434
  if (userConfig.future?.v8_middleware === false)
5357
5435
  errors.push("future.v8_middleware: false");
5436
+ if (userConfig.future?.v8_splitRouteModules)
5437
+ errors.push("future.v8_splitRouteModules");
5438
+ if (userConfig.future?.v8_viteEnvironmentApi === false)
5439
+ errors.push("future.v8_viteEnvironmentApi: false");
5358
5440
  if (userConfig.future?.unstable_subResourceIntegrity)
5359
5441
  errors.push("future.unstable_subResourceIntegrity");
5360
5442
  if (errors.length) {
@@ -5372,31 +5454,38 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5372
5454
  "When using the React Router `basename` and the Vite `base` config, the `basename` config must begin with `base` for the default Vite dev server."
5373
5455
  );
5374
5456
  }
5375
- await loadDotenv({
5376
- rootDirectory,
5377
- viteUserConfig,
5378
- mode
5379
- });
5380
5457
  const vite2 = await import("vite");
5381
5458
  logger = vite2.createLogger(viteUserConfig.logLevel, {
5382
5459
  prefix: "[react-router]"
5383
5460
  });
5461
+ entries = await resolveRSCEntryFiles({
5462
+ reactRouterConfig: config
5463
+ });
5464
+ let viteNormalizePath = (await import("vite")).normalizePath;
5384
5465
  return {
5385
5466
  resolve: {
5386
5467
  dedupe: [
5387
5468
  // https://react.dev/warnings/invalid-hook-call-warning#duplicate-react
5388
5469
  "react",
5470
+ "react/jsx-runtime",
5471
+ "react/jsx-dev-runtime",
5389
5472
  "react-dom",
5473
+ "react-dom/client",
5390
5474
  // Avoid router duplicates since mismatching routers cause `Error:
5391
5475
  // You must render this element inside a <Remix> element`.
5392
5476
  "react-router",
5393
5477
  "react-router/dom",
5394
- ...hasDependency({ name: "react-router-dom", rootDirectory }) ? ["react-router-dom"] : []
5478
+ "react-router/internal/react-server-client",
5479
+ ...hasDependency({ name: "react-router-dom", rootDirectory }) ? ["react-router-dom"] : [],
5480
+ ...hasDependency({
5481
+ name: "react-server-dom-webpack",
5482
+ rootDirectory
5483
+ }) ? ["react-server-dom-webpack"] : []
5395
5484
  ]
5396
5485
  },
5397
5486
  optimizeDeps: {
5398
5487
  entries: getOptimizeDepsEntries({
5399
- entryClientFilePath: defaultEntries2.client,
5488
+ entryClientFilePath: entries.client,
5400
5489
  reactRouterConfig: config
5401
5490
  }),
5402
5491
  esbuildOptions: {
@@ -5410,8 +5499,17 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5410
5499
  "react/jsx-runtime",
5411
5500
  "react/jsx-dev-runtime",
5412
5501
  "react-dom",
5413
- "react-dom/client",
5414
- "react-router/internal/react-server-client"
5502
+ ...hasDependency({
5503
+ name: "react-server-dom-webpack",
5504
+ rootDirectory
5505
+ }) ? ["react-server-dom-webpack"] : [],
5506
+ ...runningWithinTheReactRouterMonoRepo ? [] : [
5507
+ "react-router",
5508
+ "react-router/dom",
5509
+ "react-router/internal/react-server-client"
5510
+ ],
5511
+ "react-router > cookie",
5512
+ "react-router > set-cookie-parser"
5415
5513
  ]
5416
5514
  },
5417
5515
  esbuild: {
@@ -5423,27 +5521,30 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5423
5521
  build: {
5424
5522
  rollupOptions: {
5425
5523
  input: {
5426
- index: defaultEntries2.client
5524
+ index: entries.client
5525
+ },
5526
+ output: {
5527
+ manualChunks(id) {
5528
+ const normalized = viteNormalizePath(id);
5529
+ if (normalized.includes("node_modules/react/") || normalized.includes("node_modules/react-dom/") || normalized.includes(
5530
+ "node_modules/react-server-dom-webpack/"
5531
+ ) || normalized.includes("node_modules/@vitejs/plugin-rsc/")) {
5532
+ return "react";
5533
+ }
5534
+ if (normalized.includes("node_modules/react-router/")) {
5535
+ return "router";
5536
+ }
5537
+ }
5427
5538
  }
5428
5539
  },
5429
5540
  outDir: (0, import_pathe6.join)(config.buildDirectory, "client")
5430
- },
5431
- optimizeDeps: {
5432
- include: [
5433
- "react-router > cookie",
5434
- "react-router > set-cookie-parser"
5435
- ]
5436
5541
  }
5437
5542
  },
5438
5543
  rsc: {
5439
5544
  build: {
5440
5545
  rollupOptions: {
5441
5546
  input: {
5442
- // We use a virtual entry here so that consumers can import
5443
- // it as `virtual:react-router/unstable_rsc/rsc-entry`
5444
- // without needing to know the actual file path, which is
5445
- // important when using the default entries.
5446
- index: defaultEntries2.rsc
5547
+ index: entries.rsc
5447
5548
  },
5448
5549
  output: {
5449
5550
  entryFileNames: config.serverBuildFile,
@@ -5451,13 +5552,18 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5451
5552
  }
5452
5553
  },
5453
5554
  outDir: (0, import_pathe6.join)(config.buildDirectory, "server")
5555
+ },
5556
+ resolve: {
5557
+ noExternal: [
5558
+ "@react-router/dev/config/default-rsc-entries/entry.ssr"
5559
+ ]
5454
5560
  }
5455
5561
  },
5456
5562
  ssr: {
5457
5563
  build: {
5458
5564
  rollupOptions: {
5459
5565
  input: {
5460
- index: defaultEntries2.ssr
5566
+ index: entries.ssr
5461
5567
  },
5462
5568
  output: {
5463
5569
  // Note: We don't set `entryFileNames` here because it's
@@ -5468,6 +5574,11 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5468
5574
  }
5469
5575
  },
5470
5576
  outDir: (0, import_pathe6.join)(config.buildDirectory, "server/__ssr_build")
5577
+ },
5578
+ resolve: {
5579
+ noExternal: [
5580
+ "@react-router/dev/config/default-rsc-entries/entry.rsc"
5581
+ ]
5471
5582
  }
5472
5583
  }
5473
5584
  },
@@ -5571,12 +5682,6 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5571
5682
  (await typegenWatcherPromise)?.close();
5572
5683
  }
5573
5684
  },
5574
- {
5575
- name: "react-router/rsc/virtual-rsc-entry",
5576
- resolveId(id) {
5577
- if (id === virtual2.rscEntry.id) return defaultEntries2.rsc;
5578
- }
5579
- },
5580
5685
  {
5581
5686
  name: "react-router/rsc/virtual-route-config",
5582
5687
  resolveId(id) {
@@ -5652,7 +5757,7 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5652
5757
  const reactRefreshDir = import_pathe6.default.dirname(
5653
5758
  require.resolve("react-refresh/package.json")
5654
5759
  );
5655
- const reactRefreshRuntimePath = import_pathe6.default.join(
5760
+ const reactRefreshRuntimePath = (0, import_pathe6.join)(
5656
5761
  reactRefreshDir,
5657
5762
  "cjs/react-refresh-runtime.development.js"
5658
5763
  );
@@ -5779,7 +5884,6 @@ var virtual2 = {
5779
5884
  injectHmrRuntime: create("unstable_rsc/inject-hmr-runtime"),
5780
5885
  hmrRuntime: create("unstable_rsc/runtime"),
5781
5886
  basename: create("unstable_rsc/basename"),
5782
- rscEntry: create("unstable_rsc/rsc-entry"),
5783
5887
  reactRouterServeConfig: create("unstable_rsc/react-router-serve-config")
5784
5888
  };
5785
5889
  function invalidateVirtualModules2(viteDevServer) {
@@ -5795,33 +5899,6 @@ function invalidateVirtualModules2(viteDevServer) {
5795
5899
  function getRootDirectory(viteUserConfig) {
5796
5900
  return viteUserConfig.root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd();
5797
5901
  }
5798
- function getDevPackageRoot() {
5799
- const currentDir = (0, import_pathe6.dirname)(__dirname);
5800
- let dir = currentDir;
5801
- while (dir !== (0, import_pathe6.dirname)(dir)) {
5802
- try {
5803
- const packageJsonPath = (0, import_pathe6.join)(dir, "package.json");
5804
- (0, import_fs.readFileSync)(packageJsonPath, "utf-8");
5805
- return dir;
5806
- } catch {
5807
- dir = (0, import_pathe6.dirname)(dir);
5808
- }
5809
- }
5810
- throw new Error("Could not find package.json");
5811
- }
5812
- function getDefaultEntries() {
5813
- const defaultEntriesDir2 = (0, import_pathe6.join)(
5814
- getDevPackageRoot(),
5815
- "dist",
5816
- "config",
5817
- "default-rsc-entries"
5818
- );
5819
- return {
5820
- rsc: (0, import_pathe6.join)(defaultEntriesDir2, "entry.rsc.tsx"),
5821
- ssr: (0, import_pathe6.join)(defaultEntriesDir2, "entry.ssr.tsx"),
5822
- client: (0, import_pathe6.join)(defaultEntriesDir2, "entry.client.tsx")
5823
- };
5824
- }
5825
5902
  function getModulesWithImporters(modules) {
5826
5903
  const visited = /* @__PURE__ */ new Set();
5827
5904
  const result = /* @__PURE__ */ new Set();