@c0va23/react-router-dev 7.10.1 → 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/CHANGELOG.md CHANGED
@@ -1,5 +1,80 @@
1
1
  # `@react-router/dev`
2
2
 
3
+ ## 7.13.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Bump @remix-run/node-fetch-server dep ([#14704](https://github.com/remix-run/react-router/pull/14704))
8
+ - Updated dependencies:
9
+ - `react-router@7.13.0`
10
+ - `@react-router/node@7.13.0`
11
+ - `@react-router/serve@7.13.0`
12
+
13
+ ## 7.12.0
14
+
15
+ ### Minor Changes
16
+
17
+ - Add additional layer of CSRF protection by rejecting submissions to UI routes from external origins. If you need to permit access to specific external origins, you can specify them in the `react-router.config.ts` config `allowedActionOrigins` field. ([#14708](https://github.com/remix-run/react-router/pull/14708))
18
+
19
+ ### Patch Changes
20
+
21
+ - Fix `Maximum call stack size exceeded` errors when HMR is triggered against code with cyclic imports ([#14522](https://github.com/remix-run/react-router/pull/14522))
22
+
23
+ - fix(vite): Skip SSR middleware in preview server for SPA mode ([#14673](https://github.com/remix-run/react-router/pull/14673))
24
+
25
+ - \[UNSTABLE] Add a new `future.unstable_trailingSlashAwareDataRequests` flag to provide consistent behavior of `request.pathname` inside `middleware`, `loader`, and `action` functions on document and data requests when a trailing slash is present in the browser URL. ([#14644](https://github.com/remix-run/react-router/pull/14644))
26
+
27
+ Currently, your HTTP and `request` pathnames would be as follows for `/a/b/c` and `/a/b/c/`
28
+
29
+ | URL `/a/b/c` | **HTTP pathname** | **`request` pathname\`** |
30
+ | ------------ | ----------------- | ------------------------ |
31
+ | **Document** | `/a/b/c` | `/a/b/c` ✅ |
32
+ | **Data** | `/a/b/c.data` | `/a/b/c` ✅ |
33
+
34
+ | URL `/a/b/c/` | **HTTP pathname** | **`request` pathname\`** |
35
+ | ------------- | ----------------- | ------------------------ |
36
+ | **Document** | `/a/b/c/` | `/a/b/c/` ✅ |
37
+ | **Data** | `/a/b/c.data` | `/a/b/c` ⚠️ |
38
+
39
+ With this flag enabled, these pathnames will be made consistent though a new `_.data` format for client-side `.data` requests:
40
+
41
+ | URL `/a/b/c` | **HTTP pathname** | **`request` pathname\`** |
42
+ | ------------ | ----------------- | ------------------------ |
43
+ | **Document** | `/a/b/c` | `/a/b/c` ✅ |
44
+ | **Data** | `/a/b/c.data` | `/a/b/c` ✅ |
45
+
46
+ | URL `/a/b/c/` | **HTTP pathname** | **`request` pathname\`** |
47
+ | ------------- | ------------------ | ------------------------ |
48
+ | **Document** | `/a/b/c/` | `/a/b/c/` ✅ |
49
+ | **Data** | `/a/b/c/_.data` ⬅️ | `/a/b/c/` ✅ |
50
+
51
+ This a bug fix but we are putting it behind an opt-in flag because it has the potential to be a "breaking bug fix" if you are relying on the URL format for any other application or caching logic.
52
+
53
+ Enabling this flag also changes the format of client side `.data` requests from `/_root.data` to `/_.data` when navigating to `/` to align with the new format. This does not impact the `request` pathname which is still `/` in all cases.
54
+
55
+ - Updated dependencies:
56
+ - `react-router@7.12.0`
57
+ - `@react-router/node@7.12.0`
58
+ - `@react-router/serve@7.12.0`
59
+
60
+ ## 7.11.0
61
+
62
+ ### Minor Changes
63
+
64
+ - feat: add `vite preview` support ([#14507](https://github.com/remix-run/react-router/pull/14507))
65
+
66
+ ### Patch Changes
67
+
68
+ - rsc framework mode manual chunking for react and react-router deps ([#14655](https://github.com/remix-run/react-router/pull/14655))
69
+ - add support for throwing redirect Response's at RSC render time ([#14596](https://github.com/remix-run/react-router/pull/14596))
70
+ - support custom entrypoints for RSC framework mode ([#14643](https://github.com/remix-run/react-router/pull/14643))
71
+ - `routeRSCServerRequest` replace `fetchServer` with `serverResponse` ([#14597](https://github.com/remix-run/react-router/pull/14597))
72
+ - rsc framewlrk mode - optimize react-server-dom-webpack if in project package.json ([#14656](https://github.com/remix-run/react-router/pull/14656))
73
+ - Updated dependencies:
74
+ - `react-router@7.11.0`
75
+ - `@react-router/serve@7.11.0`
76
+ - `@react-router/node@7.11.0`
77
+
3
78
  ## 7.10.1
4
79
 
5
80
  ### Patch Changes
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.13.0
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
@@ -506,10 +506,12 @@ async function resolveConfig({
506
506
  let future = {
507
507
  unstable_optimizeDeps: userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,
508
508
  unstable_subResourceIntegrity: userAndPresetConfigs.future?.unstable_subResourceIntegrity ?? false,
509
+ unstable_trailingSlashAwareDataRequests: userAndPresetConfigs.future?.unstable_trailingSlashAwareDataRequests ?? false,
509
510
  v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
510
511
  v8_splitRouteModules: userAndPresetConfigs.future?.v8_splitRouteModules ?? false,
511
512
  v8_viteEnvironmentApi: userAndPresetConfigs.future?.v8_viteEnvironmentApi ?? false
512
513
  };
514
+ let allowedActionOrigins = userAndPresetConfigs.allowedActionOrigins ?? false;
513
515
  let reactRouterConfig = deepFreeze({
514
516
  appDirectory,
515
517
  basename: basename3,
@@ -523,6 +525,7 @@ async function resolveConfig({
523
525
  serverBundles,
524
526
  serverModuleFormat,
525
527
  ssr,
528
+ allowedActionOrigins,
526
529
  unstable_routeConfig: routeConfig
527
530
  });
528
531
  for (let preset of reactRouterUserConfig.presets ?? []) {
@@ -956,6 +959,7 @@ function generateServerBuild(ctx) {
956
959
  export const routeDiscovery: ServerBuild["routeDiscovery"];
957
960
  export const routes: ServerBuild["routes"];
958
961
  export const ssr: ServerBuild["ssr"];
962
+ export const allowedActionOrigins: ServerBuild["allowedActionOrigins"];
959
963
  export const unstable_getCriticalCss: ServerBuild["unstable_getCriticalCss"];
960
964
  }
961
965
  `;
@@ -1373,11 +1377,9 @@ var init_has_rsc_plugin = __esm({
1373
1377
  });
1374
1378
 
1375
1379
  // vite/node-adapter.ts
1376
- var import_node_fetch_server;
1377
1380
  var init_node_adapter = __esm({
1378
1381
  "vite/node-adapter.ts"() {
1379
1382
  "use strict";
1380
- import_node_fetch_server = require("@remix-run/node-fetch-server");
1381
1383
  init_invariant();
1382
1384
  }
1383
1385
  });
@@ -1790,7 +1792,7 @@ function resolveEnvironmentsOptions(environmentResolvers, resolverOptions) {
1790
1792
  function isNonNullable(x) {
1791
1793
  return x != null;
1792
1794
  }
1793
- var import_node_crypto, import_node_fs3, import_promises2, path7, url, babel2, import_node_fetch_server2, import_react_router2, import_es_module_lexer, import_pick3, import_jsesc, import_picocolors5, import_kebabCase, CLIENT_NON_COMPONENT_EXPORTS, CLIENT_ROUTE_EXPORTS, BUILD_CLIENT_ROUTE_QUERY_STRING, SSR_BUNDLE_PREFIX, virtualHmrRuntime, virtualInjectHmrRuntime, virtual, getServerBuildDirectory, getClientBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER;
1795
+ var import_node_crypto, import_node_fs3, import_promises2, path7, url, babel2, import_react_router2, import_es_module_lexer, import_pick3, import_jsesc, import_picocolors5, import_kebabCase, CLIENT_NON_COMPONENT_EXPORTS, CLIENT_ROUTE_EXPORTS, BUILD_CLIENT_ROUTE_QUERY_STRING, SSR_BUNDLE_PREFIX, virtualHmrRuntime, virtualInjectHmrRuntime, virtual, getServerBuildDirectory, getClientBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER;
1794
1796
  var init_plugin = __esm({
1795
1797
  "vite/plugin.ts"() {
1796
1798
  "use strict";
@@ -1800,7 +1802,6 @@ var init_plugin = __esm({
1800
1802
  path7 = __toESM(require("path"));
1801
1803
  url = __toESM(require("url"));
1802
1804
  babel2 = __toESM(require("@babel/core"));
1803
- import_node_fetch_server2 = require("@remix-run/node-fetch-server");
1804
1805
  import_react_router2 = require("react-router");
1805
1806
  import_es_module_lexer = require("es-module-lexer");
1806
1807
  import_pick3 = __toESM(require("lodash/pick"));
@@ -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.d.ts CHANGED
@@ -39,6 +39,7 @@ type ServerModuleFormat = "esm" | "cjs";
39
39
  interface FutureConfig {
40
40
  unstable_optimizeDeps: boolean;
41
41
  unstable_subResourceIntegrity: boolean;
42
+ unstable_trailingSlashAwareDataRequests: boolean;
42
43
  /**
43
44
  * Enable route middleware
44
45
  */
@@ -147,6 +148,47 @@ type ReactRouterConfig = {
147
148
  * SPA without server-rendering. Default's to `true`.
148
149
  */
149
150
  ssr?: boolean;
151
+ /**
152
+ * An array of allowed origin hosts for action submissions to UI routes (does not apply
153
+ * to resource routes). Supports micromatch glob patterns (`*` to match one segment,
154
+ * `**` to match multiple).
155
+ *
156
+ * ```tsx
157
+ * export default {
158
+ * allowedActionOrigins: [
159
+ * "example.com",
160
+ * "*.example.com", // sub.example.com
161
+ * "**.example.com", // sub.domain.example.com
162
+ * ],
163
+ * } satisfies Config;
164
+ * ```
165
+ *
166
+ * If you need to set this value at runtime, you can do in by setting the value
167
+ * on the server build in your custom server. For example, when using `express`:
168
+ *
169
+ * ```ts
170
+ * import express from "express";
171
+ * import { createRequestHandler } from "@react-router/express";
172
+ * import type { ServerBuild } from "react-router";
173
+ *
174
+ * export const app = express();
175
+ *
176
+ * async function getBuild() {
177
+ * let build: ServerBuild = await import(
178
+ * "virtual:react-router/server-build"
179
+ * );
180
+ * return {
181
+ * ...build,
182
+ * allowedActionOrigins:
183
+ * process.env.NODE_ENV === "development"
184
+ * ? undefined
185
+ * : ["staging.example.com", "www.example.com"],
186
+ * };
187
+ * }
188
+ *
189
+ * app.use(createRequestHandler({ build: getBuild }));
190
+ */
191
+ allowedActionOrigins?: string[];
150
192
  };
151
193
  type ResolvedReactRouterConfig = Readonly<{
152
194
  /**
@@ -212,6 +254,11 @@ type ResolvedReactRouterConfig = Readonly<{
212
254
  * SPA without server-rendering. Default's to `true`.
213
255
  */
214
256
  ssr: boolean;
257
+ /**
258
+ * The allowed origins for actions / mutations. Does not apply to routes
259
+ * without a component. micromatch glob patterns are supported.
260
+ */
261
+ allowedActionOrigins: string[] | false;
215
262
  /**
216
263
  * The resolved array of route config entries exported from `routes.ts`
217
264
  */
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.10.1
2
+ * @react-router/dev v7.13.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.13.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.13.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -45,12 +45,8 @@ __export(cloudflare_exports, {
45
45
  module.exports = __toCommonJS(cloudflare_exports);
46
46
 
47
47
  // vite/cloudflare-dev-proxy.ts
48
- var import_node_fetch_server2 = require("@remix-run/node-fetch-server");
49
48
  var import_react_router = require("react-router");
50
49
 
51
- // vite/node-adapter.ts
52
- var import_node_fetch_server = require("@remix-run/node-fetch-server");
53
-
54
50
  // invariant.ts
55
51
  function invariant(value, message) {
56
52
  if (value === false || value === null || typeof value === "undefined") {
@@ -62,13 +58,14 @@ function invariant(value, message) {
62
58
  }
63
59
 
64
60
  // vite/node-adapter.ts
65
- function fromNodeRequest(nodeReq, nodeRes) {
61
+ async function fromNodeRequest(nodeReq, nodeRes) {
66
62
  invariant(
67
63
  nodeReq.originalUrl,
68
64
  "Expected `nodeReq.originalUrl` to be defined"
69
65
  );
70
66
  nodeReq.url = nodeReq.originalUrl;
71
- return (0, import_node_fetch_server.createRequest)(nodeReq, nodeRes);
67
+ const { createRequest } = await import("@remix-run/node-fetch-server");
68
+ return createRequest(nodeReq, nodeRes);
72
69
  }
73
70
 
74
71
  // vite/vite.ts
@@ -535,10 +532,12 @@ async function resolveConfig({
535
532
  let future = {
536
533
  unstable_optimizeDeps: userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,
537
534
  unstable_subResourceIntegrity: userAndPresetConfigs.future?.unstable_subResourceIntegrity ?? false,
535
+ unstable_trailingSlashAwareDataRequests: userAndPresetConfigs.future?.unstable_trailingSlashAwareDataRequests ?? false,
538
536
  v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
539
537
  v8_splitRouteModules: userAndPresetConfigs.future?.v8_splitRouteModules ?? false,
540
538
  v8_viteEnvironmentApi: userAndPresetConfigs.future?.v8_viteEnvironmentApi ?? false
541
539
  };
540
+ let allowedActionOrigins = userAndPresetConfigs.allowedActionOrigins ?? false;
542
541
  let reactRouterConfig = deepFreeze({
543
542
  appDirectory,
544
543
  basename,
@@ -552,6 +551,7 @@ async function resolveConfig({
552
551
  serverBundles,
553
552
  serverModuleFormat,
554
553
  ssr,
554
+ allowedActionOrigins,
555
555
  unstable_routeConfig: routeConfig
556
556
  });
557
557
  for (let preset of reactRouterUserConfig.presets ?? []) {
@@ -817,6 +817,7 @@ var cloudflareDevProxyVitePlugin = (options = {}) => {
817
817
  }
818
818
  },
819
819
  configureServer: async (viteDevServer) => {
820
+ const { sendResponse } = await import("@remix-run/node-fetch-server");
820
821
  let context;
821
822
  let getContext = async () => {
822
823
  let { getPlatformProxy } = await importWrangler();
@@ -833,11 +834,11 @@ var cloudflareDevProxyVitePlugin = (options = {}) => {
833
834
  serverBuildId
834
835
  );
835
836
  let handler = (0, import_react_router.createRequestHandler)(build, "development");
836
- let req = fromNodeRequest(nodeReq, nodeRes);
837
+ let req = await fromNodeRequest(nodeReq, nodeRes);
837
838
  context ??= await getContext();
838
839
  let loadContext = getLoadContext ? await getLoadContext({ request: req, context }) : context;
839
840
  let res = await handler(req, loadContext);
840
- await (0, import_node_fetch_server2.sendResponse)(nodeRes, res);
841
+ await sendResponse(nodeRes, res);
841
842
  } catch (error) {
842
843
  next(error);
843
844
  }
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.10.1
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"));
@@ -562,10 +561,12 @@ async function resolveConfig({
562
561
  let future = {
563
562
  unstable_optimizeDeps: userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,
564
563
  unstable_subResourceIntegrity: userAndPresetConfigs.future?.unstable_subResourceIntegrity ?? false,
564
+ unstable_trailingSlashAwareDataRequests: userAndPresetConfigs.future?.unstable_trailingSlashAwareDataRequests ?? false,
565
565
  v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
566
566
  v8_splitRouteModules: userAndPresetConfigs.future?.v8_splitRouteModules ?? false,
567
567
  v8_viteEnvironmentApi: userAndPresetConfigs.future?.v8_viteEnvironmentApi ?? false
568
568
  };
569
+ let allowedActionOrigins = userAndPresetConfigs.allowedActionOrigins ?? false;
569
570
  let reactRouterConfig = deepFreeze({
570
571
  appDirectory,
571
572
  basename: basename3,
@@ -579,6 +580,7 @@ async function resolveConfig({
579
580
  serverBundles,
580
581
  serverModuleFormat,
581
582
  ssr,
583
+ allowedActionOrigins,
582
584
  unstable_routeConfig: routeConfig
583
585
  });
584
586
  for (let preset of reactRouterUserConfig.presets ?? []) {
@@ -639,11 +641,11 @@ async function createConfigLoader({
639
641
  fsWatcher = import_chokidar.default.watch([root, appDirectory], {
640
642
  ignoreInitial: true,
641
643
  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
644
+ let dirname4 = import_pathe3.default.dirname(path9);
645
+ return !dirname4.startsWith(appDirectory) && // Ensure we're only watching files outside of the app directory
644
646
  // that are at the root level, not nested in subdirectories
645
647
  path9 !== root && // Watch the root directory itself
646
- dirname5 !== root;
648
+ dirname4 !== root;
647
649
  }
648
650
  });
649
651
  fsWatcher.on("all", async (...args) => {
@@ -775,6 +777,30 @@ async function resolveEntryFiles({
775
777
  let entryServerFilePath = userEntryServerFile ? import_pathe3.default.resolve(reactRouterConfig.appDirectory, userEntryServerFile) : import_pathe3.default.resolve(defaultsDirectory, entryServerFile);
776
778
  return { entryClientFilePath, entryServerFilePath };
777
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
+ }
778
804
  function omitRoutes(config) {
779
805
  return {
780
806
  ...config,
@@ -942,6 +968,7 @@ function generateServerBuild(ctx) {
942
968
  export const routeDiscovery: ServerBuild["routeDiscovery"];
943
969
  export const routes: ServerBuild["routes"];
944
970
  export const ssr: ServerBuild["ssr"];
971
+ export const allowedActionOrigins: ServerBuild["allowedActionOrigins"];
945
972
  export const unstable_getCriticalCss: ServerBuild["unstable_getCriticalCss"];
946
973
  }
947
974
  `;
@@ -1297,14 +1324,14 @@ async function watch(rootDirectory, { mode, logger, rsc }) {
1297
1324
  }
1298
1325
 
1299
1326
  // vite/node-adapter.ts
1300
- var import_node_fetch_server = require("@remix-run/node-fetch-server");
1301
- function fromNodeRequest(nodeReq, nodeRes) {
1327
+ async function fromNodeRequest(nodeReq, nodeRes) {
1302
1328
  invariant(
1303
1329
  nodeReq.originalUrl,
1304
1330
  "Expected `nodeReq.originalUrl` to be defined"
1305
1331
  );
1306
1332
  nodeReq.url = nodeReq.originalUrl;
1307
- return (0, import_node_fetch_server.createRequest)(nodeReq, nodeRes);
1333
+ const { createRequest } = await import("@remix-run/node-fetch-server");
1334
+ return createRequest(nodeReq, nodeRes);
1308
1335
  }
1309
1336
 
1310
1337
  // vite/styles.ts
@@ -2897,7 +2924,9 @@ var reactRouterVitePlugin = () => {
2897
2924
  href: "${ctx.publicPath}@react-router/critical.css?pathname=" + pathname,
2898
2925
  };
2899
2926
  }
2900
- ` : ""}`;
2927
+ ` : ""}
2928
+ export const allowedActionOrigins = ${JSON.stringify(ctx.reactRouterConfig.allowedActionOrigins)};
2929
+ `;
2901
2930
  };
2902
2931
  let loadViteManifest = async (directory) => {
2903
2932
  let manifestContents = await (0, import_promises2.readFile)(
@@ -3495,12 +3524,13 @@ var reactRouterVitePlugin = () => {
3495
3524
  }
3496
3525
  let handler = (0, import_react_router2.createRequestHandler)(build, "development");
3497
3526
  let nodeHandler = async (nodeReq, nodeRes) => {
3498
- let req2 = fromNodeRequest(nodeReq, nodeRes);
3527
+ let req2 = await fromNodeRequest(nodeReq, nodeRes);
3499
3528
  let res2 = await handler(
3500
3529
  req2,
3501
3530
  await reactRouterDevLoadContext(req2)
3502
3531
  );
3503
- await (0, import_node_fetch_server2.sendResponse)(nodeRes, res2);
3532
+ const { sendResponse } = await import("@remix-run/node-fetch-server");
3533
+ await sendResponse(nodeRes, res2);
3504
3534
  };
3505
3535
  await nodeHandler(req, res);
3506
3536
  } catch (error) {
@@ -3510,6 +3540,38 @@ var reactRouterVitePlugin = () => {
3510
3540
  }
3511
3541
  };
3512
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
+ },
3513
3575
  writeBundle: {
3514
3576
  // After the SSR build is finished, we inspect the Vite manifest for
3515
3577
  // the SSR build and move server-only assets to client assets directory
@@ -4047,10 +4109,8 @@ var reactRouterVitePlugin = () => {
4047
4109
  if (this.environment.name !== "ssr" && modules.length <= 0) {
4048
4110
  return;
4049
4111
  }
4050
- let clientModules = uniqueNodes(
4051
- modules.flatMap(
4052
- (mod) => getParentClientNodes(server.environments.client.moduleGraph, mod)
4053
- )
4112
+ let clientModules = modules.flatMap(
4113
+ (mod) => getParentClientNodes(server.environments.client.moduleGraph, mod)
4054
4114
  );
4055
4115
  for (let clientModule of clientModules) {
4056
4116
  server.environments.client.reloadModule(clientModule);
@@ -4061,30 +4121,22 @@ var reactRouterVitePlugin = () => {
4061
4121
  warnOnClientSourceMaps()
4062
4122
  ];
4063
4123
  };
4064
- function getParentClientNodes(clientModuleGraph, module2) {
4124
+ function getParentClientNodes(clientModuleGraph, module2, seenNodes = /* @__PURE__ */ new Set()) {
4065
4125
  if (!module2.id) {
4066
4126
  return [];
4067
4127
  }
4128
+ if (seenNodes.has(module2.url)) {
4129
+ return [];
4130
+ }
4131
+ seenNodes.add(module2.url);
4068
4132
  let clientModule = clientModuleGraph.getModuleById(module2.id);
4069
4133
  if (clientModule) {
4070
4134
  return [clientModule];
4071
4135
  }
4072
4136
  return [...module2.importers].flatMap(
4073
- (importer) => getParentClientNodes(clientModuleGraph, importer)
4137
+ (importer) => getParentClientNodes(clientModuleGraph, importer, seenNodes)
4074
4138
  );
4075
4139
  }
4076
- function uniqueNodes(nodes) {
4077
- let nodeUrls = /* @__PURE__ */ new Set();
4078
- let unique = [];
4079
- for (let node of nodes) {
4080
- if (nodeUrls.has(node.url)) {
4081
- continue;
4082
- }
4083
- nodeUrls.add(node.url);
4084
- unique.push(node);
4085
- }
4086
- return unique;
4087
- }
4088
4140
  function addRefreshWrapper(reactRouterConfig, code, id) {
4089
4141
  let route = getRoute(reactRouterConfig, id);
4090
4142
  let acceptExports = route ? CLIENT_NON_COMPONENT_EXPORTS : [];
@@ -4359,7 +4411,21 @@ function getStaticPrerenderPaths(routes) {
4359
4411
  };
4360
4412
  }
4361
4413
  async function prerenderData(handler, prerenderPath, onlyRoutes, clientBuildDirectory, reactRouterConfig, viteConfig, requestInit) {
4362
- 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, "/");
4363
4429
  let url2 = new URL(`http://localhost${normalizedPath}`);
4364
4430
  if (onlyRoutes?.length) {
4365
4431
  url2.searchParams.set("_routes", onlyRoutes.join(","));
@@ -4986,7 +5052,6 @@ var import_es_module_lexer3 = require("es-module-lexer");
4986
5052
  var Path5 = __toESM(require("pathe"));
4987
5053
  var babel2 = __toESM(require("@babel/core"));
4988
5054
  var import_picocolors5 = __toESM(require("picocolors"));
4989
- var import_fs = require("fs");
4990
5055
  var import_promises3 = require("fs/promises");
4991
5056
  var import_pathe6 = __toESM(require("pathe"));
4992
5057
 
@@ -5321,13 +5386,16 @@ function isRootRouteFile({
5321
5386
 
5322
5387
  // vite/rsc/plugin.ts
5323
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
+ );
5324
5392
  let configLoader;
5325
5393
  let typegenWatcherPromise;
5326
5394
  let viteCommand;
5327
5395
  let resolvedViteConfig;
5328
5396
  let routeIdByFile;
5329
5397
  let logger;
5330
- const defaultEntries2 = getDefaultEntries();
5398
+ let entries;
5331
5399
  let config;
5332
5400
  let rootRouteFile;
5333
5401
  function updateConfig(newConfig) {
@@ -5390,22 +5458,34 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5390
5458
  logger = vite2.createLogger(viteUserConfig.logLevel, {
5391
5459
  prefix: "[react-router]"
5392
5460
  });
5461
+ entries = await resolveRSCEntryFiles({
5462
+ reactRouterConfig: config
5463
+ });
5464
+ let viteNormalizePath = (await import("vite")).normalizePath;
5393
5465
  return {
5394
5466
  resolve: {
5395
5467
  dedupe: [
5396
5468
  // https://react.dev/warnings/invalid-hook-call-warning#duplicate-react
5397
5469
  "react",
5470
+ "react/jsx-runtime",
5471
+ "react/jsx-dev-runtime",
5398
5472
  "react-dom",
5473
+ "react-dom/client",
5399
5474
  // Avoid router duplicates since mismatching routers cause `Error:
5400
5475
  // You must render this element inside a <Remix> element`.
5401
5476
  "react-router",
5402
5477
  "react-router/dom",
5403
- ...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"] : []
5404
5484
  ]
5405
5485
  },
5406
5486
  optimizeDeps: {
5407
5487
  entries: getOptimizeDepsEntries({
5408
- entryClientFilePath: defaultEntries2.client,
5488
+ entryClientFilePath: entries.client,
5409
5489
  reactRouterConfig: config
5410
5490
  }),
5411
5491
  esbuildOptions: {
@@ -5419,8 +5499,17 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5419
5499
  "react/jsx-runtime",
5420
5500
  "react/jsx-dev-runtime",
5421
5501
  "react-dom",
5422
- "react-dom/client",
5423
- "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"
5424
5513
  ]
5425
5514
  },
5426
5515
  esbuild: {
@@ -5432,27 +5521,30 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5432
5521
  build: {
5433
5522
  rollupOptions: {
5434
5523
  input: {
5435
- 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
+ }
5436
5538
  }
5437
5539
  },
5438
5540
  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
5541
  }
5446
5542
  },
5447
5543
  rsc: {
5448
5544
  build: {
5449
5545
  rollupOptions: {
5450
5546
  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
5547
+ index: entries.rsc
5456
5548
  },
5457
5549
  output: {
5458
5550
  entryFileNames: config.serverBuildFile,
@@ -5460,13 +5552,18 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5460
5552
  }
5461
5553
  },
5462
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
+ ]
5463
5560
  }
5464
5561
  },
5465
5562
  ssr: {
5466
5563
  build: {
5467
5564
  rollupOptions: {
5468
5565
  input: {
5469
- index: defaultEntries2.ssr
5566
+ index: entries.ssr
5470
5567
  },
5471
5568
  output: {
5472
5569
  // Note: We don't set `entryFileNames` here because it's
@@ -5477,6 +5574,11 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5477
5574
  }
5478
5575
  },
5479
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
+ ]
5480
5582
  }
5481
5583
  }
5482
5584
  },
@@ -5580,12 +5682,6 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5580
5682
  (await typegenWatcherPromise)?.close();
5581
5683
  }
5582
5684
  },
5583
- {
5584
- name: "react-router/rsc/virtual-rsc-entry",
5585
- resolveId(id) {
5586
- if (id === virtual2.rscEntry.id) return defaultEntries2.rsc;
5587
- }
5588
- },
5589
5685
  {
5590
5686
  name: "react-router/rsc/virtual-route-config",
5591
5687
  resolveId(id) {
@@ -5661,7 +5757,7 @@ ${errors.map((x) => ` - ${x}`).join("\n")}
5661
5757
  const reactRefreshDir = import_pathe6.default.dirname(
5662
5758
  require.resolve("react-refresh/package.json")
5663
5759
  );
5664
- const reactRefreshRuntimePath = import_pathe6.default.join(
5760
+ const reactRefreshRuntimePath = (0, import_pathe6.join)(
5665
5761
  reactRefreshDir,
5666
5762
  "cjs/react-refresh-runtime.development.js"
5667
5763
  );
@@ -5788,7 +5884,6 @@ var virtual2 = {
5788
5884
  injectHmrRuntime: create("unstable_rsc/inject-hmr-runtime"),
5789
5885
  hmrRuntime: create("unstable_rsc/runtime"),
5790
5886
  basename: create("unstable_rsc/basename"),
5791
- rscEntry: create("unstable_rsc/rsc-entry"),
5792
5887
  reactRouterServeConfig: create("unstable_rsc/react-router-serve-config")
5793
5888
  };
5794
5889
  function invalidateVirtualModules2(viteDevServer) {
@@ -5804,33 +5899,6 @@ function invalidateVirtualModules2(viteDevServer) {
5804
5899
  function getRootDirectory(viteUserConfig) {
5805
5900
  return viteUserConfig.root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd();
5806
5901
  }
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
5902
  function getModulesWithImporters(modules) {
5835
5903
  const visited = /* @__PURE__ */ new Set();
5836
5904
  const result = /* @__PURE__ */ new Set();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c0va23/react-router-dev",
3
- "version": "7.10.1",
3
+ "version": "7.13.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/**",
@@ -67,7 +72,7 @@
67
72
  "@babel/preset-typescript": "^7.27.1",
68
73
  "@babel/traverse": "^7.27.7",
69
74
  "@babel/types": "^7.27.7",
70
- "@remix-run/node-fetch-server": "^0.9.0",
75
+ "@remix-run/node-fetch-server": "^0.13.0",
71
76
  "arg": "^5.0.1",
72
77
  "babel-dead-code-elimination": "^1.0.6",
73
78
  "chokidar": "^4.0.0",
@@ -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.13.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": "^7.13.0",
120
+ "@react-router/serve": "7.13.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.13.0",
129
+ "react-router": "^7.13.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" {}