@react-router/dev 7.10.1 → 7.11.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,23 @@
1
1
  # `@react-router/dev`
2
2
 
3
+ ## 7.11.0-pre.0
4
+
5
+ ### Minor Changes
6
+
7
+ - feat: add `vite preview` support ([#14507](https://github.com/remix-run/react-router/pull/14507))
8
+
9
+ ### Patch Changes
10
+
11
+ - rsc framework mode manual chunking for react and react-router deps ([#14655](https://github.com/remix-run/react-router/pull/14655))
12
+ - add support for throwing redirect Response's at RSC render time ([#14596](https://github.com/remix-run/react-router/pull/14596))
13
+ - support custom entrypoints for RSC framework mode ([#14643](https://github.com/remix-run/react-router/pull/14643))
14
+ - `routeRSCServerRequest` replace `fetchServer` with `serverResponse` ([#14597](https://github.com/remix-run/react-router/pull/14597))
15
+ - rsc framewlrk mode - optimize react-server-dom-webpack if in project package.json ([#14656](https://github.com/remix-run/react-router/pull/14656))
16
+ - Updated dependencies:
17
+ - `react-router@7.11.0-pre.0`
18
+ - `@react-router/serve@7.11.0-pre.0`
19
+ - `@react-router/node@7.11.0-pre.0`
20
+
3
21
  ## 7.10.1
4
22
 
5
23
  ### Patch Changes
@@ -229,7 +247,6 @@
229
247
  - Stabilize middleware and context APIs. ([#14215](https://github.com/remix-run/react-router/pull/14215))
230
248
 
231
249
  We have removed the `unstable_` prefix from the following APIs and they are now considered stable and ready for production use:
232
-
233
250
  - [`RouterContextProvider`](https://reactrouter.com/api/utils/RouterContextProvider)
234
251
  - [`createContext`](https://reactrouter.com/api/utils/createContext)
235
252
  - `createBrowserRouter` [`getContext`](https://reactrouter.com/api/data-routers/createBrowserRouter#optsgetcontext) option
@@ -972,7 +989,6 @@
972
989
  ```
973
990
 
974
991
  This initial implementation targets type inference for:
975
-
976
992
  - `Params` : Path parameters from your routing config in `routes.ts` including file-based routing
977
993
  - `LoaderData` : Loader data from `loader` and/or `clientLoader` within your route module
978
994
  - `ActionData` : Action data from `action` and/or `clientAction` within your route module
@@ -987,7 +1003,6 @@
987
1003
  ```
988
1004
 
989
1005
  Check out our docs for more:
990
-
991
1006
  - [_Explanations > Type Safety_](https://reactrouter.com/dev/guides/explanation/type-safety)
992
1007
  - [_How-To > Setting up type safety_](https://reactrouter.com/dev/guides/how-to/setting-up-type-safety)
993
1008
 
@@ -1187,7 +1202,6 @@
1187
1202
  - Vite: Provide `Unstable_ServerBundlesFunction` and `Unstable_VitePluginConfig` types ([#8654](https://github.com/remix-run/remix/pull/8654))
1188
1203
 
1189
1204
  - Vite: add `--sourcemapClient` and `--sourcemapServer` flags to `remix vite:build` ([#8613](https://github.com/remix-run/remix/pull/8613))
1190
-
1191
1205
  - `--sourcemapClient`
1192
1206
 
1193
1207
  - `--sourcemapClient=inline`
@@ -1524,7 +1538,6 @@
1524
1538
  - Add support for `clientLoader`/`clientAction`/`HydrateFallback` route exports ([RFC](https://github.com/remix-run/remix/discussions/7634)) ([#8173](https://github.com/remix-run/remix/pull/8173))
1525
1539
 
1526
1540
  Remix now supports loaders/actions that run on the client (in addition to, or instead of the loader/action that runs on the server). While we still recommend server loaders/actions for the majority of your data needs in a Remix app - these provide some levers you can pull for more advanced use-cases such as:
1527
-
1528
1541
  - Leveraging a data source local to the browser (i.e., `localStorage`)
1529
1542
  - Managing a client-side cache of server data (like `IndexedDB`)
1530
1543
  - Bypassing the Remix server in a BFF setup and hitting your API directly from the browser
@@ -1928,7 +1941,6 @@
1928
1941
  - Output esbuild metafiles for bundle analysis ([#6772](https://github.com/remix-run/remix/pull/6772))
1929
1942
 
1930
1943
  Written to server build directory (`build/` by default):
1931
-
1932
1944
  - `metafile.css.json`
1933
1945
  - `metafile.js.json` (browser JS)
1934
1946
  - `metafile.server.json` (server JS)
@@ -2026,7 +2038,6 @@
2026
2038
  - built-in tls support ([#6483](https://github.com/remix-run/remix/pull/6483))
2027
2039
 
2028
2040
  New options:
2029
-
2030
2041
  - `--tls-key` / `tlsKey`: TLS key
2031
2042
  - `--tls-cert` / `tlsCert`: TLS Certificate
2032
2043
 
@@ -2297,7 +2308,6 @@
2297
2308
  ```
2298
2309
 
2299
2310
  The dev server will:
2300
-
2301
2311
  - force `NODE_ENV=development` and warn you if it was previously set to something else
2302
2312
  - rebuild your app whenever your Remix app code changes
2303
2313
  - restart your app server whenever rebuilds succeed
package/dist/cli/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * @react-router/dev v7.10.1
3
+ * @react-router/dev v7.11.0-pre.0
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
@@ -6,22 +6,36 @@ import {
6
6
  loadServerAction,
7
7
  renderToReadableStream,
8
8
  } from "@vitejs/plugin-rsc/rsc";
9
- import { unstable_matchRSCServerRequest as matchRSCServerRequest } from "react-router";
9
+ import {
10
+ RouterContextProvider,
11
+ unstable_matchRSCServerRequest as matchRSCServerRequest,
12
+ } from "react-router";
10
13
 
14
+ // Import the routes generated by routes.ts
11
15
  import routes from "virtual:react-router/unstable_rsc/routes";
12
16
  import basename from "virtual:react-router/unstable_rsc/basename";
13
17
  import unstable_reactRouterServeConfig from "virtual:react-router/unstable_rsc/react-router-serve-config";
14
18
 
15
- export async function fetchServer(request: Request) {
16
- return await matchRSCServerRequest({
19
+ export { unstable_reactRouterServeConfig };
20
+
21
+ export function fetchServer(
22
+ request: Request,
23
+ requestContext?: RouterContextProvider,
24
+ ) {
25
+ return matchRSCServerRequest({
26
+ basename,
27
+ // Provide the React Server touchpoints.
17
28
  createTemporaryReferenceSet,
18
29
  decodeAction,
19
30
  decodeFormState,
20
31
  decodeReply,
21
32
  loadServerAction,
33
+ // The incoming request.
22
34
  request,
35
+ requestContext,
36
+ // The app routes.
23
37
  routes,
24
- basename,
38
+ // Encode the match with the React Server implementation.
25
39
  generateResponse(match, options) {
26
40
  return new Response(renderToReadableStream(match.payload, options), {
27
41
  status: match.statusCode,
@@ -31,14 +45,22 @@ export async function fetchServer(request: Request) {
31
45
  });
32
46
  }
33
47
 
34
- export { unstable_reactRouterServeConfig };
48
+ export default {
49
+ async fetch(request: Request, requestContext?: RouterContextProvider) {
50
+ if (requestContext && !(requestContext instanceof RouterContextProvider)) {
51
+ requestContext = undefined;
52
+ }
35
53
 
36
- export default async function handler(request: Request) {
37
- const ssr = await import.meta.viteRsc.loadModule<
38
- typeof import("./entry.ssr")
39
- >("ssr", "index");
40
- return ssr.default(request, fetchServer);
41
- }
54
+ const ssr = await import.meta.viteRsc.loadModule<
55
+ typeof import("./entry.ssr.tsx")
56
+ >("ssr", "index");
57
+
58
+ return await ssr.generateHTML(
59
+ request,
60
+ await fetchServer(request, requestContext),
61
+ );
62
+ },
63
+ };
42
64
 
43
65
  if (import.meta.hot) {
44
66
  import.meta.hot.accept();
@@ -1,31 +1,38 @@
1
1
  import { createFromReadableStream } from "@vitejs/plugin-rsc/ssr";
2
- // @ts-expect-error
3
- import * as ReactDomServer from "react-dom/server.edge";
2
+ // @ts-expect-error - no types for this, can import from root once on latest 19
3
+ import { renderToReadableStream } from "react-dom/server.edge";
4
4
  import {
5
- unstable_RSCStaticRouter as RSCStaticRouter,
6
5
  unstable_routeRSCServerRequest as routeRSCServerRequest,
6
+ unstable_RSCStaticRouter as RSCStaticRouter,
7
7
  } from "react-router";
8
8
 
9
- export default async function handler(
9
+ export async function generateHTML(
10
10
  request: Request,
11
- fetchServer: (request: Request) => Promise<Response>,
12
- ) {
13
- const bootstrapScriptContent =
14
- await import.meta.viteRsc.loadBootstrapScriptContent("index");
15
-
16
- return routeRSCServerRequest({
11
+ serverResponse: Response,
12
+ ): Promise<Response> {
13
+ return await routeRSCServerRequest({
14
+ // The incoming request.
17
15
  request,
18
- fetchServer,
16
+ // The response from the RSC server.
17
+ serverResponse,
18
+ // Provide the React Server touchpoints.
19
19
  createFromReadableStream,
20
- async renderHTML(getPayload) {
21
- const payload = getPayload();
20
+ // Render the router to HTML.
21
+ async renderHTML(getPayload, options) {
22
+ const payload = await getPayload();
23
+ const formState =
24
+ payload.type === "render" ? await payload.formState : undefined;
25
+
26
+ const bootstrapScriptContent =
27
+ await import.meta.viteRsc.loadBootstrapScriptContent("index");
22
28
 
23
- return ReactDomServer.renderToReadableStream(
29
+ return await renderToReadableStream(
24
30
  <RSCStaticRouter getPayload={getPayload} />,
25
31
  {
32
+ ...options,
26
33
  bootstrapScriptContent,
34
+ formState,
27
35
  signal: request.signal,
28
- formState: await payload.formState,
29
36
  },
30
37
  );
31
38
  },
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.10.1
2
+ * @react-router/dev v7.11.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.10.1
2
+ * @react-router/dev v7.11.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.10.1
2
+ * @react-router/dev v7.11.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.10.1
2
+ * @react-router/dev v7.11.0-pre.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -639,11 +639,11 @@ async function createConfigLoader({
639
639
  fsWatcher = import_chokidar.default.watch([root, appDirectory], {
640
640
  ignoreInitial: true,
641
641
  ignored: (path9) => {
642
- let dirname5 = import_pathe3.default.dirname(path9);
643
- return !dirname5.startsWith(appDirectory) && // Ensure we're only watching files outside of the app directory
642
+ let dirname4 = import_pathe3.default.dirname(path9);
643
+ return !dirname4.startsWith(appDirectory) && // Ensure we're only watching files outside of the app directory
644
644
  // that are at the root level, not nested in subdirectories
645
645
  path9 !== root && // Watch the root directory itself
646
- dirname5 !== root;
646
+ dirname4 !== root;
647
647
  }
648
648
  });
649
649
  fsWatcher.on("all", async (...args) => {
@@ -775,6 +775,30 @@ async function resolveEntryFiles({
775
775
  let entryServerFilePath = userEntryServerFile ? import_pathe3.default.resolve(reactRouterConfig.appDirectory, userEntryServerFile) : import_pathe3.default.resolve(defaultsDirectory, entryServerFile);
776
776
  return { entryClientFilePath, entryServerFilePath };
777
777
  }
778
+ async function resolveRSCEntryFiles({
779
+ reactRouterConfig
780
+ }) {
781
+ let { appDirectory } = reactRouterConfig;
782
+ let defaultsDirectory = import_pathe3.default.resolve(
783
+ import_pathe3.default.dirname(require.resolve("@react-router/dev/package.json")),
784
+ "dist",
785
+ "config",
786
+ "default-rsc-entries"
787
+ );
788
+ let userEntryClientFile = findEntry(appDirectory, "entry.client", {
789
+ absolute: true
790
+ });
791
+ let userEntryRSCFile = findEntry(appDirectory, "entry.rsc", {
792
+ absolute: true
793
+ });
794
+ let userEntrySSRFile = findEntry(appDirectory, "entry.ssr", {
795
+ absolute: true
796
+ });
797
+ let client = userEntryClientFile ?? import_pathe3.default.join(defaultsDirectory, "entry.client.tsx");
798
+ let rsc = userEntryRSCFile ?? import_pathe3.default.join(defaultsDirectory, "entry.rsc.tsx");
799
+ let ssr = userEntrySSRFile ?? import_pathe3.default.join(defaultsDirectory, "entry.ssr.tsx");
800
+ return { client, rsc, ssr };
801
+ }
778
802
  function omitRoutes(config) {
779
803
  return {
780
804
  ...config,
@@ -3510,6 +3534,34 @@ var reactRouterVitePlugin = () => {
3510
3534
  }
3511
3535
  };
3512
3536
  },
3537
+ configurePreviewServer(previewServer) {
3538
+ return () => {
3539
+ previewServer.middlewares.use(async (req, res, next) => {
3540
+ try {
3541
+ let serverBuildDirectory = getServerBuildDirectory(
3542
+ ctx.reactRouterConfig
3543
+ );
3544
+ let serverBuildFile = path6.resolve(
3545
+ serverBuildDirectory,
3546
+ "index.js"
3547
+ );
3548
+ let build = await import(url.pathToFileURL(serverBuildFile).href);
3549
+ let handler = (0, import_react_router2.createRequestHandler)(build, "production");
3550
+ let nodeHandler = async (nodeReq, nodeRes) => {
3551
+ let req2 = fromNodeRequest(nodeReq, nodeRes);
3552
+ let res2 = await handler(
3553
+ req2,
3554
+ await reactRouterDevLoadContext(req2)
3555
+ );
3556
+ await (0, import_node_fetch_server2.sendResponse)(nodeRes, res2);
3557
+ };
3558
+ await nodeHandler(req, res);
3559
+ } catch (error) {
3560
+ next(error);
3561
+ }
3562
+ });
3563
+ };
3564
+ },
3513
3565
  writeBundle: {
3514
3566
  // After the SSR build is finished, we inspect the Vite manifest for
3515
3567
  // the SSR build and move server-only assets to client assets directory
@@ -4986,7 +5038,6 @@ var import_es_module_lexer3 = require("es-module-lexer");
4986
5038
  var Path5 = __toESM(require("pathe"));
4987
5039
  var babel2 = __toESM(require("@babel/core"));
4988
5040
  var import_picocolors5 = __toESM(require("picocolors"));
4989
- var import_fs = require("fs");
4990
5041
  var import_promises3 = require("fs/promises");
4991
5042
  var import_pathe6 = __toESM(require("pathe"));
4992
5043
 
@@ -5321,13 +5372,16 @@ function isRootRouteFile({
5321
5372
 
5322
5373
  // vite/rsc/plugin.ts
5323
5374
  function reactRouterRSCVitePlugin() {
5375
+ let runningWithinTheReactRouterMonoRepo = Boolean(
5376
+ arguments && arguments.length === 1 && typeof arguments[0] === "object" && arguments[0] && "__runningWithinTheReactRouterMonoRepo" in arguments[0] && arguments[0].__runningWithinTheReactRouterMonoRepo === true
5377
+ );
5324
5378
  let configLoader;
5325
5379
  let typegenWatcherPromise;
5326
5380
  let viteCommand;
5327
5381
  let resolvedViteConfig;
5328
5382
  let routeIdByFile;
5329
5383
  let logger;
5330
- const defaultEntries2 = getDefaultEntries();
5384
+ let entries;
5331
5385
  let config;
5332
5386
  let rootRouteFile;
5333
5387
  function updateConfig(newConfig) {
@@ -5390,22 +5444,34 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5390
5444
  logger = vite2.createLogger(viteUserConfig.logLevel, {
5391
5445
  prefix: "[react-router]"
5392
5446
  });
5447
+ entries = await resolveRSCEntryFiles({
5448
+ reactRouterConfig: config
5449
+ });
5450
+ let viteNormalizePath = (await import("vite")).normalizePath;
5393
5451
  return {
5394
5452
  resolve: {
5395
5453
  dedupe: [
5396
5454
  // https://react.dev/warnings/invalid-hook-call-warning#duplicate-react
5397
5455
  "react",
5456
+ "react/jsx-runtime",
5457
+ "react/jsx-dev-runtime",
5398
5458
  "react-dom",
5459
+ "react-dom/client",
5399
5460
  // Avoid router duplicates since mismatching routers cause `Error:
5400
5461
  // You must render this element inside a <Remix> element`.
5401
5462
  "react-router",
5402
5463
  "react-router/dom",
5403
- ...hasDependency({ name: "react-router-dom", rootDirectory }) ? ["react-router-dom"] : []
5464
+ "react-router/internal/react-server-client",
5465
+ ...hasDependency({ name: "react-router-dom", rootDirectory }) ? ["react-router-dom"] : [],
5466
+ ...hasDependency({
5467
+ name: "react-server-dom-webpack",
5468
+ rootDirectory
5469
+ }) ? ["react-server-dom-webpack"] : []
5404
5470
  ]
5405
5471
  },
5406
5472
  optimizeDeps: {
5407
5473
  entries: getOptimizeDepsEntries({
5408
- entryClientFilePath: defaultEntries2.client,
5474
+ entryClientFilePath: entries.client,
5409
5475
  reactRouterConfig: config
5410
5476
  }),
5411
5477
  esbuildOptions: {
@@ -5419,8 +5485,17 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5419
5485
  "react/jsx-runtime",
5420
5486
  "react/jsx-dev-runtime",
5421
5487
  "react-dom",
5422
- "react-dom/client",
5423
- "react-router/internal/react-server-client"
5488
+ ...hasDependency({
5489
+ name: "react-server-dom-webpack",
5490
+ rootDirectory
5491
+ }) ? ["react-server-dom-webpack"] : [],
5492
+ ...runningWithinTheReactRouterMonoRepo ? [] : [
5493
+ "react-router",
5494
+ "react-router/dom",
5495
+ "react-router/internal/react-server-client"
5496
+ ],
5497
+ "react-router > cookie",
5498
+ "react-router > set-cookie-parser"
5424
5499
  ]
5425
5500
  },
5426
5501
  esbuild: {
@@ -5432,27 +5507,30 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5432
5507
  build: {
5433
5508
  rollupOptions: {
5434
5509
  input: {
5435
- index: defaultEntries2.client
5510
+ index: entries.client
5511
+ },
5512
+ output: {
5513
+ manualChunks(id) {
5514
+ const normalized = viteNormalizePath(id);
5515
+ if (normalized.includes("node_modules/react/") || normalized.includes("node_modules/react-dom/") || normalized.includes(
5516
+ "node_modules/react-server-dom-webpack/"
5517
+ ) || normalized.includes("node_modules/@vitejs/plugin-rsc/")) {
5518
+ return "react";
5519
+ }
5520
+ if (normalized.includes("node_modules/react-router/")) {
5521
+ return "router";
5522
+ }
5523
+ }
5436
5524
  }
5437
5525
  },
5438
5526
  outDir: (0, import_pathe6.join)(config.buildDirectory, "client")
5439
- },
5440
- optimizeDeps: {
5441
- include: [
5442
- "react-router > cookie",
5443
- "react-router > set-cookie-parser"
5444
- ]
5445
5527
  }
5446
5528
  },
5447
5529
  rsc: {
5448
5530
  build: {
5449
5531
  rollupOptions: {
5450
5532
  input: {
5451
- // We use a virtual entry here so that consumers can import
5452
- // it as `virtual:react-router/unstable_rsc/rsc-entry`
5453
- // without needing to know the actual file path, which is
5454
- // important when using the default entries.
5455
- index: defaultEntries2.rsc
5533
+ index: entries.rsc
5456
5534
  },
5457
5535
  output: {
5458
5536
  entryFileNames: config.serverBuildFile,
@@ -5460,13 +5538,18 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5460
5538
  }
5461
5539
  },
5462
5540
  outDir: (0, import_pathe6.join)(config.buildDirectory, "server")
5541
+ },
5542
+ resolve: {
5543
+ noExternal: [
5544
+ "@react-router/dev/config/default-rsc-entries/entry.ssr"
5545
+ ]
5463
5546
  }
5464
5547
  },
5465
5548
  ssr: {
5466
5549
  build: {
5467
5550
  rollupOptions: {
5468
5551
  input: {
5469
- index: defaultEntries2.ssr
5552
+ index: entries.ssr
5470
5553
  },
5471
5554
  output: {
5472
5555
  // Note: We don't set `entryFileNames` here because it's
@@ -5477,6 +5560,11 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5477
5560
  }
5478
5561
  },
5479
5562
  outDir: (0, import_pathe6.join)(config.buildDirectory, "server/__ssr_build")
5563
+ },
5564
+ resolve: {
5565
+ noExternal: [
5566
+ "@react-router/dev/config/default-rsc-entries/entry.rsc"
5567
+ ]
5480
5568
  }
5481
5569
  }
5482
5570
  },
@@ -5580,12 +5668,6 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5580
5668
  (await typegenWatcherPromise)?.close();
5581
5669
  }
5582
5670
  },
5583
- {
5584
- name: "react-router/rsc/virtual-rsc-entry",
5585
- resolveId(id) {
5586
- if (id === virtual2.rscEntry.id) return defaultEntries2.rsc;
5587
- }
5588
- },
5589
5671
  {
5590
5672
  name: "react-router/rsc/virtual-route-config",
5591
5673
  resolveId(id) {
@@ -5661,7 +5743,7 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5661
5743
  const reactRefreshDir = import_pathe6.default.dirname(
5662
5744
  require.resolve("react-refresh/package.json")
5663
5745
  );
5664
- const reactRefreshRuntimePath = import_pathe6.default.join(
5746
+ const reactRefreshRuntimePath = (0, import_pathe6.join)(
5665
5747
  reactRefreshDir,
5666
5748
  "cjs/react-refresh-runtime.development.js"
5667
5749
  );
@@ -5788,7 +5870,6 @@ var virtual2 = {
5788
5870
  injectHmrRuntime: create("unstable_rsc/inject-hmr-runtime"),
5789
5871
  hmrRuntime: create("unstable_rsc/runtime"),
5790
5872
  basename: create("unstable_rsc/basename"),
5791
- rscEntry: create("unstable_rsc/rsc-entry"),
5792
5873
  reactRouterServeConfig: create("unstable_rsc/react-router-serve-config")
5793
5874
  };
5794
5875
  function invalidateVirtualModules2(viteDevServer) {
@@ -5804,33 +5885,6 @@ function invalidateVirtualModules2(viteDevServer) {
5804
5885
  function getRootDirectory(viteUserConfig) {
5805
5886
  return viteUserConfig.root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd();
5806
5887
  }
5807
- function getDevPackageRoot() {
5808
- const currentDir = (0, import_pathe6.dirname)(__dirname);
5809
- let dir = currentDir;
5810
- while (dir !== (0, import_pathe6.dirname)(dir)) {
5811
- try {
5812
- const packageJsonPath = (0, import_pathe6.join)(dir, "package.json");
5813
- (0, import_fs.readFileSync)(packageJsonPath, "utf-8");
5814
- return dir;
5815
- } catch {
5816
- dir = (0, import_pathe6.dirname)(dir);
5817
- }
5818
- }
5819
- throw new Error("Could not find package.json");
5820
- }
5821
- function getDefaultEntries() {
5822
- const defaultEntriesDir2 = (0, import_pathe6.join)(
5823
- getDevPackageRoot(),
5824
- "dist",
5825
- "config",
5826
- "default-rsc-entries"
5827
- );
5828
- return {
5829
- rsc: (0, import_pathe6.join)(defaultEntriesDir2, "entry.rsc.tsx"),
5830
- ssr: (0, import_pathe6.join)(defaultEntriesDir2, "entry.ssr.tsx"),
5831
- client: (0, import_pathe6.join)(defaultEntriesDir2, "entry.client.tsx")
5832
- };
5833
- }
5834
5888
  function getModulesWithImporters(modules) {
5835
5889
  const visited = /* @__PURE__ */ new Set();
5836
5890
  const result = /* @__PURE__ */ new Set();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-router/dev",
3
- "version": "7.10.1",
3
+ "version": "7.11.0-pre.0",
4
4
  "description": "Dev tools and CLI for React Router",
5
5
  "homepage": "https://reactrouter.com",
6
6
  "bugs": {
@@ -13,6 +13,9 @@
13
13
  },
14
14
  "license": "MIT",
15
15
  "exports": {
16
+ "./config/default-rsc-entries/entry.client": "./dist/config/default-rsc-entries/entry.client.tsx",
17
+ "./config/default-rsc-entries/entry.rsc": "./dist/config/default-rsc-entries/entry.rsc.tsx",
18
+ "./config/default-rsc-entries/entry.ssr": "./dist/config/default-rsc-entries/entry.ssr.tsx",
16
19
  "./config": {
17
20
  "types": "./dist/config.d.ts",
18
21
  "default": "./dist/config.js"
@@ -21,6 +24,7 @@
21
24
  "types": "./dist/routes.d.ts",
22
25
  "default": "./dist/routes.js"
23
26
  },
27
+ "./rsc-types": "./rsc-types.d.ts",
24
28
  "./vite": {
25
29
  "types": "./dist/vite.d.ts",
26
30
  "default": "./dist/vite.js"
@@ -44,6 +48,7 @@
44
48
  "build": {
45
49
  "command": "tsup",
46
50
  "files": [
51
+ "../../pnpm-workspace.yaml",
47
52
  "cli/**",
48
53
  "config/**",
49
54
  "module-sync-enabled/**",
@@ -87,7 +92,7 @@
87
92
  "tinyglobby": "^0.2.14",
88
93
  "valibot": "^1.2.0",
89
94
  "vite-node": "^3.2.2",
90
- "@react-router/node": "7.10.1"
95
+ "@react-router/node": "7.11.0-pre.0"
91
96
  },
92
97
  "devDependencies": {
93
98
  "@types/babel__core": "^7.20.5",
@@ -95,31 +100,33 @@
95
100
  "@types/babel__traverse": "^7.20.7",
96
101
  "@types/dedent": "^0.7.0",
97
102
  "@types/express": "^4.17.9",
103
+ "@types/jest": "^29.5.4",
98
104
  "@types/jsesc": "^3.0.1",
99
105
  "@types/lodash": "^4.14.182",
100
106
  "@types/node": "^20.0.0",
101
107
  "@types/npmcli__package-json": "^4.0.0",
102
108
  "@types/semver": "^7.7.0",
103
- "@vitejs/plugin-rsc": "0.4.30",
109
+ "@vitejs/plugin-rsc": "~0.5.7",
104
110
  "esbuild-register": "^3.6.0",
105
111
  "execa": "5.1.1",
106
112
  "express": "^4.19.2",
107
113
  "fast-glob": "3.2.11",
108
114
  "tsup": "^8.3.0",
109
- "typescript": "^5.1.6",
115
+ "typescript": "^5.4.5",
110
116
  "vite": "^6.3.0",
111
117
  "wireit": "0.14.9",
112
118
  "wrangler": "^4.23.0",
113
- "@react-router/serve": "7.10.1",
114
- "react-router": "^7.10.1"
119
+ "@react-router/serve": "7.11.0-pre.0",
120
+ "react-router": "^7.11.0-pre.0"
115
121
  },
116
122
  "peerDependencies": {
117
- "@vitejs/plugin-rsc": "*",
123
+ "@vitejs/plugin-rsc": "~0.5.7",
124
+ "react-server-dom-webpack": "^19.2.3",
118
125
  "typescript": "^5.1.0",
119
126
  "vite": "^5.1.0 || ^6.0.0 || ^7.0.0",
120
127
  "wrangler": "^3.28.2 || ^4.0.0",
121
- "@react-router/serve": "^7.10.1",
122
- "react-router": "^7.10.1"
128
+ "@react-router/serve": "^7.11.0-pre.0",
129
+ "react-router": "^7.11.0-pre.0"
123
130
  },
124
131
  "peerDependenciesMeta": {
125
132
  "@vitejs/plugin-rsc": {
@@ -131,6 +138,9 @@
131
138
  "typescript": {
132
139
  "optional": true
133
140
  },
141
+ "react-server-dom-webpack": {
142
+ "optional": true
143
+ },
134
144
  "wrangler": {
135
145
  "optional": true
136
146
  }
@@ -142,6 +152,7 @@
142
152
  "dist/",
143
153
  "module-sync-enabled/",
144
154
  "bin.js",
155
+ "rsc-types.d.ts",
145
156
  "CHANGELOG.md",
146
157
  "LICENSE.md",
147
158
  "README.md"
package/rsc-types.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ declare module "virtual:react-router/unstable_rsc/routes" {
2
+ import type { unstable_RSCRouteConfig as RSCRouteConfig } from "react-router";
3
+
4
+ const routes: RSCRouteConfig;
5
+ export default routes;
6
+ }
7
+
8
+ declare module "virtual:react-router/unstable_rsc/basename" {
9
+ const basename: string;
10
+ export default basename;
11
+ }
12
+
13
+ declare module "virtual:react-router/unstable_rsc/react-router-serve-config" {
14
+ const unstable_reactRouterServeConfig: {
15
+ publicPath: string;
16
+ assetsBuildDirectory: string;
17
+ };
18
+ export default unstable_reactRouterServeConfig;
19
+ }
20
+
21
+ declare module "virtual:react-router/unstable_rsc/inject-hmr-runtime" {}