@react-router/dev 8.0.1 → 8.1.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,19 @@
1
1
  # `@react-router/dev`
2
2
 
3
+ ## v8.1.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Fix a regression with the new prerendering plugin where the `react-router.config.ts` `buildEnd` hook would run before prerendering was completed ([#15211](https://github.com/remix-run/react-router/pull/15211))
8
+ - Fixed `react-router typegen` crashes under the Bun runtime when Babel default imports are already unwrapped ([#15214](https://github.com/remix-run/react-router/pull/15214))
9
+ - Replace the deprecated `envFile:false` Vite config with `envDir:false` to eliminate a deprecation warning when using vite@8.1.0+ ([#15230](https://github.com/remix-run/react-router/pull/15230))
10
+ - Only add the `"node"` Vite server condition for Framework mode apps that declare a Node server adapter dependency ([#15242](https://github.com/remix-run/react-router/pull/15242))
11
+ - This prevents non-Node SSR runtimes from resolving Node-specific package exports by default
12
+ - Updated dependencies:
13
+ - [`react-router@8.1.0`](https://github.com/remix-run/react-router/releases/tag/react-router@8.1.0)
14
+ - [`@react-router/node@8.1.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@8.1.0)
15
+ - [`@react-router/serve@8.1.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/serve@8.1.0)
16
+
3
17
  ## v8.0.1
4
18
 
5
19
  ### Patch Changes
package/bin.cjs CHANGED
@@ -1,13 +1,20 @@
1
1
  #!/usr/bin/env node
2
- void (async () => {
3
- let { default: arg } = await import("arg");
2
+ let { parseArgs } = require("node:util");
3
+
4
+ const commands = new Set(["build", "dev", "reveal", "routes", "typegen"]);
4
5
 
6
+ void (async () => {
5
7
  // Minimal replication of our actual parsing in `run.ts`. If not already set,
6
8
  // default `NODE_ENV` so React loads the proper version in its CJS entry script.
7
9
  // We have to do this before importing `run.ts` since that is what imports
8
10
  // `react` (indirectly via `react-router`)
9
- let args = arg({}, { argv: process.argv.slice(2), permissive: true });
10
- if (args._.length === 0 || args._[0] === "dev") {
11
+ let { positionals } = parseArgs({
12
+ args: process.argv.slice(2),
13
+ allowPositionals: true,
14
+ strict: false,
15
+ });
16
+ let command = positionals.find((positional) => commands.has(positional));
17
+ if (!command || command === "dev") {
11
18
  process.env.NODE_ENV = process.env.NODE_ENV ?? "development";
12
19
  } else {
13
20
  process.env.NODE_ENV = process.env.NODE_ENV ?? "production";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v8.0.1
2
+ * @react-router/dev v8.1.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- import { g as preloadVite, h as getVite } from "./typegen-9e9g0hnu.js";
11
+ import { g as preloadVite, h as getVite } from "./typegen-BdAwfkLl.js";
12
12
  //#region vite/build.ts
13
13
  async function build(root, viteBuildOptions) {
14
14
  await preloadVite();
package/dist/cli/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * @react-router/dev v8.0.1
3
+ * @react-router/dev v8.1.0
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
@@ -9,9 +9,9 @@
9
9
  *
10
10
  * @license MIT
11
11
  */
12
- import { g as preloadVite, h as getVite, l as loadConfig, n as watch, t as run$1 } from "../typegen-9e9g0hnu.js";
12
+ import { g as preloadVite, h as getVite, l as loadConfig, n as watch, t as run$1 } from "../typegen-BdAwfkLl.js";
13
13
  import { createRequire } from "node:module";
14
- import arg from "arg";
14
+ import { parseArgs } from "node:util";
15
15
  import semver from "semver";
16
16
  import colors from "picocolors";
17
17
  import fs, { existsSync } from "node:fs";
@@ -141,7 +141,7 @@ async function routes(rootDirectory, flags = {}) {
141
141
  }
142
142
  async function build(root, options = {}) {
143
143
  root = resolveRootDirectory(root, options);
144
- let { build } = await import("../build-ygYOQjbA.js");
144
+ let { build } = await import("../build-9Do1SAoZ.js");
145
145
  if (options.profile) await start();
146
146
  try {
147
147
  await build(root, options);
@@ -150,7 +150,7 @@ async function build(root, options = {}) {
150
150
  }
151
151
  }
152
152
  async function dev(root, options = {}) {
153
- let { dev } = await import("../dev-BAYiWwCm.js");
153
+ let { dev } = await import("../dev-Bnoz8B89.js");
154
154
  if (options.profile) await start();
155
155
  exitHook(() => stop(console.info));
156
156
  root = resolveRootDirectory(root, options);
@@ -373,6 +373,18 @@ ${colors.blueBright("react-router")}
373
373
  $ react-router typegen
374
374
  $ react-router typegen --watch
375
375
  `;
376
+ function getBooleanArg(value) {
377
+ return typeof value === "boolean" ? value : void 0;
378
+ }
379
+ function getBooleanStringArg(value) {
380
+ return typeof value === "boolean" || typeof value === "string" ? value : void 0;
381
+ }
382
+ function getNumberArg(value) {
383
+ return typeof value === "string" ? Number(value) : void 0;
384
+ }
385
+ function getStringArg(value) {
386
+ return typeof value === "string" ? value : void 0;
387
+ }
376
388
  /**
377
389
  * Programmatic interface for running the react-router CLI with the given command line
378
390
  * arguments.
@@ -385,43 +397,78 @@ async function run(argv = process.argv.slice(2), { isMain = false } = {}) {
385
397
  let nextArg = argv[argv.indexOf(arg) + 1];
386
398
  return !nextArg || nextArg.startsWith("-");
387
399
  };
388
- let args = arg({
389
- "--force": Boolean,
390
- "--help": Boolean,
391
- "-h": "--help",
392
- "--json": Boolean,
393
- "--token": String,
394
- "--typescript": Boolean,
395
- "--no-typescript": Boolean,
396
- "--version": Boolean,
397
- "-v": "--version",
398
- "--port": Number,
399
- "-p": "--port",
400
- "--config": String,
401
- "-c": "--config",
402
- "--assetsInlineLimit": Number,
403
- "--clearScreen": Boolean,
404
- "--cors": Boolean,
405
- "--emptyOutDir": Boolean,
406
- "--host": isBooleanFlag("--host") ? Boolean : String,
407
- "--logLevel": String,
408
- "-l": "--logLevel",
409
- "--minify": String,
410
- "--mode": String,
411
- "-m": "--mode",
412
- "--open": isBooleanFlag("--open") ? Boolean : String,
413
- "--strictPort": Boolean,
414
- "--profile": Boolean,
415
- "--sourcemapClient": isBooleanFlag("--sourcemapClient") ? Boolean : String,
416
- "--sourcemapServer": isBooleanFlag("--sourcemapServer") ? Boolean : String,
417
- "--watch": Boolean
418
- }, { argv });
419
- let input = args._;
420
- let flags = Object.entries(args).reduce((acc, [key, value]) => {
421
- key = key.replace(/^--/, "");
422
- acc[key] = value;
423
- return acc;
424
- }, {});
400
+ let { values, positionals } = parseArgs({
401
+ args: argv,
402
+ allowPositionals: true,
403
+ options: {
404
+ assetsInlineLimit: { type: "string" },
405
+ clearScreen: { type: "boolean" },
406
+ config: {
407
+ type: "string",
408
+ short: "c"
409
+ },
410
+ cors: { type: "boolean" },
411
+ emptyOutDir: { type: "boolean" },
412
+ force: { type: "boolean" },
413
+ help: {
414
+ type: "boolean",
415
+ short: "h"
416
+ },
417
+ host: { type: isBooleanFlag("--host") ? "boolean" : "string" },
418
+ json: { type: "boolean" },
419
+ logLevel: {
420
+ type: "string",
421
+ short: "l"
422
+ },
423
+ minify: { type: "string" },
424
+ mode: {
425
+ type: "string",
426
+ short: "m"
427
+ },
428
+ "no-typescript": { type: "boolean" },
429
+ open: { type: isBooleanFlag("--open") ? "boolean" : "string" },
430
+ port: {
431
+ type: "string",
432
+ short: "p"
433
+ },
434
+ profile: { type: "boolean" },
435
+ sourcemapClient: { type: isBooleanFlag("--sourcemapClient") ? "boolean" : "string" },
436
+ sourcemapServer: { type: isBooleanFlag("--sourcemapServer") ? "boolean" : "string" },
437
+ strictPort: { type: "boolean" },
438
+ token: { type: "string" },
439
+ typescript: { type: "boolean" },
440
+ version: {
441
+ type: "boolean",
442
+ short: "v"
443
+ },
444
+ watch: { type: "boolean" }
445
+ }
446
+ });
447
+ let input = positionals;
448
+ let flags = {
449
+ assetsInlineLimit: getNumberArg(values.assetsInlineLimit),
450
+ clearScreen: getBooleanArg(values.clearScreen),
451
+ config: getStringArg(values.config),
452
+ cors: getBooleanArg(values.cors),
453
+ emptyOutDir: getBooleanArg(values.emptyOutDir),
454
+ force: getBooleanArg(values.force),
455
+ help: getBooleanArg(values.help),
456
+ host: getBooleanStringArg(values.host),
457
+ json: getBooleanArg(values.json),
458
+ logLevel: getStringArg(values.logLevel),
459
+ minify: getStringArg(values.minify),
460
+ mode: getStringArg(values.mode),
461
+ open: getBooleanStringArg(values.open),
462
+ port: getNumberArg(values.port),
463
+ profile: getBooleanArg(values.profile),
464
+ sourcemapClient: getBooleanStringArg(values.sourcemapClient),
465
+ sourcemapServer: getBooleanStringArg(values.sourcemapServer),
466
+ strictPort: getBooleanArg(values.strictPort),
467
+ token: getStringArg(values.token),
468
+ typescript: getBooleanArg(values.typescript),
469
+ version: getBooleanArg(values.version),
470
+ watch: getBooleanArg(values.watch)
471
+ };
425
472
  if (flags.help) {
426
473
  console.log(helpText);
427
474
  return;
@@ -431,7 +478,7 @@ async function run(argv = process.argv.slice(2), { isMain = false } = {}) {
431
478
  return;
432
479
  }
433
480
  flags.interactive = flags.interactive ?? isMain;
434
- if (args["--no-typescript"]) flags.typescript = false;
481
+ if (values["no-typescript"]) flags.typescript = false;
435
482
  switch (input[0]) {
436
483
  case "routes":
437
484
  await routes(input[1], flags);
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v8.0.1
2
+ * @react-router/dev v8.1.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v8.0.1
2
+ * @react-router/dev v8.1.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- import { g as preloadVite, h as getVite } from "./typegen-9e9g0hnu.js";
11
+ import { g as preloadVite, h as getVite } from "./typegen-BdAwfkLl.js";
12
12
  import { n as start, r as stop, t as getSession } from "./cli/index.js";
13
13
  import colors from "picocolors";
14
14
  //#region vite/dev.ts
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v8.0.1
2
+ * @react-router/dev v8.1.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 v8.0.1
2
+ * @react-router/dev v8.1.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -8,5 +8,5 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- import { a as prefix, i as layout, n as getAppDirectory, o as relative, r as index, s as route } from "./routes-kAS9QOpS.js";
11
+ import { a as prefix, i as layout, n as getAppDirectory, o as relative, r as index, s as route } from "./routes-DGRRTCk8.js";
12
12
  export { getAppDirectory, index, layout, prefix, relative, route };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v8.0.1
2
+ * @react-router/dev v8.1.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- import { c as setAppDirectory, l as validateRouteConfig, t as configRoutesToRouteManifest, u as invariant } from "./routes-kAS9QOpS.js";
11
+ import { c as setAppDirectory, l as validateRouteConfig, t as configRoutesToRouteManifest, u as invariant } from "./routes-DGRRTCk8.js";
12
12
  import { createRequire } from "node:module";
13
13
  import colors from "picocolors";
14
14
  import fs from "node:fs";
@@ -95,7 +95,7 @@ async function createContext$1({ root, mode, customLogger }) {
95
95
  optimizeDeps: { noDiscovery: true },
96
96
  css: { postcss: {} },
97
97
  configFile: false,
98
- envFile: false,
98
+ envDir: false,
99
99
  plugins: [],
100
100
  environments: { __config_loader: {
101
101
  consumer: "server",
@@ -543,10 +543,14 @@ var babel_exports = /* @__PURE__ */ __exportAll({
543
543
  generate: () => generate,
544
544
  parse: () => parse$1,
545
545
  t: () => t$1,
546
- traverse: () => traverse
546
+ traverse: () => traverse,
547
+ unwrapDefault: () => unwrapDefault
547
548
  });
548
- const traverse = _traverse.default;
549
- const generate = _generate.default;
549
+ function unwrapDefault(value) {
550
+ return value.default ?? value;
551
+ }
552
+ const traverse = unwrapDefault(_traverse);
553
+ const generate = unwrapDefault(_generate);
550
554
  //#endregion
551
555
  //#region typegen/params.ts
552
556
  function parse(fullpath) {
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v8.0.1
2
+ * @react-router/dev v8.1.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -8,14 +8,15 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- import { a as t, c as createConfigLoader, d as resolveRSCEntryFiles, f as ssrExternals, g as preloadVite, h as getVite, i as parse$1, m as defineOptimizeDepsCompilerOptions, n as watch, o as traverse, p as defineCompilerOptions, r as generate, s as configRouteToBranchRoute, u as resolveEntryFiles } from "./typegen-9e9g0hnu.js";
12
- import { u as invariant } from "./routes-kAS9QOpS.js";
11
+ import { a as t, c as createConfigLoader, d as resolveRSCEntryFiles, f as ssrExternals, g as preloadVite, h as getVite, i as parse$1, m as defineOptimizeDepsCompilerOptions, n as watch, o as traverse, p as defineCompilerOptions, r as generate, s as configRouteToBranchRoute, u as resolveEntryFiles } from "./typegen-BdAwfkLl.js";
12
+ import { u as invariant } from "./routes-DGRRTCk8.js";
13
13
  import { createRequire } from "node:module";
14
14
  import colors from "picocolors";
15
15
  import { existsSync, readFileSync, readdirSync } from "node:fs";
16
16
  import { cp, mkdir, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
17
17
  import * as path$2 from "node:path";
18
18
  import path from "node:path";
19
+ import { readPackageJSON } from "pkg-types";
19
20
  import { createRequestHandler, matchRoutes, unstable_setDevServerHooks } from "react-router";
20
21
  import * as Path from "pathe";
21
22
  import path$1, { join } from "pathe";
@@ -1532,23 +1533,11 @@ const reactRouterVitePlugin = () => {
1532
1533
  async buildApp(builder) {
1533
1534
  invariant(viteConfig);
1534
1535
  viteConfig.logger.info("Using Vite Environment API");
1535
- try {
1536
- let { reactRouterConfig } = ctx;
1537
- await cleanBuildDirectory(viteConfig, ctx);
1538
- await builder.build(builder.environments.client);
1539
- let serverEnvironments = getServerEnvironmentValues(ctx, builder.environments);
1540
- await Promise.all(serverEnvironments.map(builder.build));
1541
- await cleanViteManifests(environments, ctx);
1542
- let { buildManifest } = ctx;
1543
- invariant(buildManifest, "Expected build manifest");
1544
- await reactRouterConfig.buildEnd?.({
1545
- buildManifest,
1546
- reactRouterConfig,
1547
- viteConfig
1548
- });
1549
- } finally {
1550
- await closePluginResources();
1551
- }
1536
+ await cleanBuildDirectory(viteConfig, ctx);
1537
+ await builder.build(builder.environments.client);
1538
+ let serverEnvironments = getServerEnvironmentValues(ctx, builder.environments);
1539
+ await Promise.all(serverEnvironments.map(builder.build));
1540
+ await cleanViteManifests(environments, ctx);
1552
1541
  }
1553
1542
  }
1554
1543
  };
@@ -1592,7 +1581,7 @@ const reactRouterVitePlugin = () => {
1592
1581
  hmr: false
1593
1582
  },
1594
1583
  configFile: false,
1595
- envFile: false,
1584
+ envDir: false,
1596
1585
  plugins: [childCompilerPlugins.filter((plugin) => typeof plugin === "object" && plugin !== null && "name" in plugin && plugin.name !== "react-router" && plugin.name !== "react-router:route-exports" && plugin.name !== "react-router:hmr-updates" && plugin.name !== "react-router:validate-plugin-order").map((plugin) => ({
1597
1586
  ...plugin,
1598
1587
  configureServer: void 0,
@@ -2202,6 +2191,30 @@ const reactRouterVitePlugin = () => {
2202
2191
  }
2203
2192
  }
2204
2193
  }),
2194
+ {
2195
+ name: "react-router-build-end",
2196
+ sharedDuringBuild: true,
2197
+ config: {
2198
+ order: "post",
2199
+ handler({ builder: { buildApp } = {} }) {
2200
+ return { builder: { async buildApp(builder) {
2201
+ try {
2202
+ await buildApp?.(builder);
2203
+ invariant(viteConfig);
2204
+ let { buildManifest, reactRouterConfig } = ctx;
2205
+ invariant(buildManifest, "Expected build manifest");
2206
+ await reactRouterConfig.buildEnd?.({
2207
+ buildManifest,
2208
+ reactRouterConfig,
2209
+ viteConfig
2210
+ });
2211
+ } finally {
2212
+ await closePluginResources();
2213
+ }
2214
+ } } };
2215
+ }
2216
+ }
2217
+ },
2205
2218
  validatePluginOrder(),
2206
2219
  warnOnClientSourceMaps()
2207
2220
  ];
@@ -2545,6 +2558,7 @@ function mergeEnvironmentOptions(base, ...overrides) {
2545
2558
  }
2546
2559
  async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
2547
2560
  let { serverBuildFile, serverModuleFormat } = ctx.reactRouterConfig;
2561
+ let pkgJson = await readPackageJSON(ctx.rootDirectory).catch(() => ({}));
2548
2562
  let packageRoot = path$2.dirname(nodeRequire$1.resolve("@react-router/dev/package.json"));
2549
2563
  let { moduleSyncEnabled } = await import(`file:///${path$2.join(packageRoot, "module-sync-enabled/index.mjs")}`);
2550
2564
  let vite = getVite();
@@ -2567,7 +2581,11 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
2567
2581
  let maybeModuleSyncConditions = [...moduleSyncEnabled ? ["module-sync"] : []];
2568
2582
  let maybeDevelopmentConditions = viteCommand === "build" ? [] : ["development"];
2569
2583
  let maybeDefaultServerConditions = vite.defaultServerConditions || [];
2570
- let defaultExternalConditions = ["node"];
2584
+ let defaultExternalConditions = vite.defaultExternalConditions ?? ["node"];
2585
+ if (!(!pkgJson.dependencies || pkgJson.dependencies["@react-router/node"] || pkgJson.dependencies["@react-router/express"] || pkgJson.dependencies["@react-router/serve"])) {
2586
+ maybeDefaultServerConditions = maybeDefaultServerConditions.filter((c) => c !== "node");
2587
+ defaultExternalConditions = defaultExternalConditions.filter((c) => c !== "node");
2588
+ }
2571
2589
  let baseConditions = [...maybeDevelopmentConditions, ...maybeModuleSyncConditions];
2572
2590
  return mergeEnvironmentOptions(getBaseOptions({ viteUserConfig }), {
2573
2591
  resolve: {
package/package.json CHANGED
@@ -1,8 +1,15 @@
1
1
  {
2
2
  "name": "@react-router/dev",
3
3
  "type": "module",
4
- "version": "8.0.1",
4
+ "version": "8.1.0",
5
5
  "description": "Dev tools and CLI for React Router",
6
+ "keywords": [
7
+ "react",
8
+ "router",
9
+ "react-router",
10
+ "vite",
11
+ "vite-plugin"
12
+ ],
6
13
  "homepage": "https://reactrouter.com",
7
14
  "bugs": {
8
15
  "url": "https://github.com/remix-run/react-router/issues"
@@ -41,6 +48,17 @@
41
48
  "bin": {
42
49
  "react-router": "bin.cjs"
43
50
  },
51
+ "compatiblePackages": {
52
+ "schemaVersion": 1,
53
+ "rolldown": {
54
+ "type": "incompatible",
55
+ "reason": "Uses Vite-specific APIs"
56
+ },
57
+ "rollup": {
58
+ "type": "incompatible",
59
+ "reason": "Uses Vite-specific APIs"
60
+ }
61
+ },
44
62
  "wireit": {
45
63
  "build": {
46
64
  "command": "tsdown",
@@ -70,7 +88,6 @@
70
88
  "@babel/traverse": "^7.29.7",
71
89
  "@babel/types": "^7.29.7",
72
90
  "@remix-run/node-fetch-server": "^0.13.3",
73
- "arg": "^5.0.1",
74
91
  "babel-dead-code-elimination": "^1.0.12",
75
92
  "chokidar": "^5.0.0",
76
93
  "dedent": "^1.7.2",
@@ -88,7 +105,7 @@
88
105
  "semver": "^7.8.1",
89
106
  "tinyglobby": "^0.2.16",
90
107
  "valibot": "^1.4.1",
91
- "@react-router/node": "8.0.1"
108
+ "@react-router/node": "8.1.0"
92
109
  },
93
110
  "devDependencies": {
94
111
  "@types/babel__core": "^7.20.5",
@@ -110,8 +127,8 @@
110
127
  "vite": "^7.0.0",
111
128
  "wireit": "0.14.12",
112
129
  "wrangler": "^4.95.0",
113
- "react-router": "^8.0.1",
114
- "@react-router/serve": "8.0.1"
130
+ "@react-router/serve": "8.1.0",
131
+ "react-router": "^8.1.0"
115
132
  },
116
133
  "peerDependencies": {
117
134
  "@vitejs/plugin-rsc": "~0.5.26",
@@ -119,8 +136,8 @@
119
136
  "typescript": "^5.1.0 || ^6.0.0",
120
137
  "vite": "^7.0.0 || ^8.0.0",
121
138
  "wrangler": "^4.0.0",
122
- "@react-router/serve": "^8.0.1",
123
- "react-router": "^8.0.1"
139
+ "react-router": "^8.1.0",
140
+ "@react-router/serve": "^8.1.0"
124
141
  },
125
142
  "peerDependenciesMeta": {
126
143
  "@vitejs/plugin-rsc": {