@react-router/dev 0.0.0-experimental-35027c3be → 0.0.0-experimental-47c4c03cf

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,56 @@
1
1
  # `@react-router/dev`
2
2
 
3
+ ## 7.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Generate types for `virtual:react-router/server-build` module ([#13152](https://github.com/remix-run/react-router/pull/13152))
8
+
9
+ ### Patch Changes
10
+
11
+ - When `future.unstable_splitRouteModules` is set to `"enforce"`, allow both splittable and unsplittable root route exports since it's always in a single chunk. ([#13238](https://github.com/remix-run/react-router/pull/13238))
12
+ - When `future.unstable_viteEnvironmentApi` is enabled, allow plugins that override the default SSR environment (such as `@cloudflare/vite-plugin`) to be placed before or after the React Router plugin. ([#13183](https://github.com/remix-run/react-router/pull/13183))
13
+ - Fix conflicts with other Vite plugins that use the `configureServer` and/or `configurePreviewServer` hooks ([#13184](https://github.com/remix-run/react-router/pull/13184))
14
+ - Updated dependencies:
15
+ - `react-router@7.4.0`
16
+ - `@react-router/node@7.4.0`
17
+ - `@react-router/serve@7.4.0`
18
+
19
+ ## 7.3.0
20
+
21
+ ### Patch Changes
22
+
23
+ - Fix support for custom client `build.rollupOptions.output.entryFileNames` ([#13098](https://github.com/remix-run/react-router/pull/13098))
24
+
25
+ - Fix usage of `prerender` option when `serverBundles` option has been configured or provided by a preset, e.g. `vercelPreset` from `@vercel/react-router` ([#13082](https://github.com/remix-run/react-router/pull/13082))
26
+
27
+ - Fix support for custom `build.assetsDir` ([#13077](https://github.com/remix-run/react-router/pull/13077))
28
+
29
+ - Remove unused dependencies ([#13134](https://github.com/remix-run/react-router/pull/13134))
30
+
31
+ - Stub all routes except root in "SPA Mode" server builds to avoid issues when route modules or their dependencies import non-SSR-friendly modules ([#13023](https://github.com/remix-run/react-router/pull/13023))
32
+
33
+ - Fix errors with `future.unstable_viteEnvironmentApi` when the `ssr` environment has been configured by another plugin to be a custom `Vite.DevEnvironment` rather than the default `Vite.RunnableDevEnvironment` ([#13008](https://github.com/remix-run/react-router/pull/13008))
34
+
35
+ - Remove unused Vite file system watcher ([#13133](https://github.com/remix-run/react-router/pull/13133))
36
+
37
+ - Fix support for custom SSR build input when `serverBundles` option has been configured ([#13107](https://github.com/remix-run/react-router/pull/13107))
38
+
39
+ Note that for consumers using the `future.unstable_viteEnvironmentApi` and `serverBundles` options together, hyphens are no longer supported in server bundle IDs since they also need to be valid Vite environment names.
40
+
41
+ - Fix dev server when using HTTPS by stripping HTTP/2 pseudo headers from dev server requests ([#12830](https://github.com/remix-run/react-router/pull/12830))
42
+
43
+ - Lazy load Cloudflare platform proxy on first dev server request when using the `cloudflareDevProxy` Vite plugin to avoid creating unnecessary workerd processes ([#13016](https://github.com/remix-run/react-router/pull/13016))
44
+
45
+ - When `future.unstable_viteEnvironmentApi` is enabled and the `ssr` environment has `optimizeDeps.noDiscovery` disabled, define `optimizeDeps.entries` and `optimizeDeps.include` ([#13007](https://github.com/remix-run/react-router/pull/13007))
46
+
47
+ - Fix duplicated entries in typegen for layout routes and their corresponding index route ([#13140](https://github.com/remix-run/react-router/pull/13140))
48
+
49
+ - Updated dependencies:
50
+ - `react-router@7.3.0`
51
+ - `@react-router/node@7.3.0`
52
+ - `@react-router/serve@7.3.0`
53
+
3
54
  ## 7.2.0
4
55
 
5
56
  ### Minor Changes
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  Dev tools and CLI for React Router that enables framework features through bundler integration like server rendering, code splitting, HMR, etc.
2
2
 
3
3
  ```sh
4
- npm install @react-router/dev
4
+ npm install @react-router/dev --save-dev
5
5
  ```
package/dist/cli/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * @react-router/dev v0.0.0-experimental-35027c3be
3
+ * @react-router/dev v0.0.0-experimental-47c4c03cf
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
@@ -419,7 +419,6 @@ async function resolveConfig({
419
419
  unstable_middleware: reactRouterUserConfig.future?.unstable_middleware ?? false,
420
420
  unstable_optimizeDeps: reactRouterUserConfig.future?.unstable_optimizeDeps ?? false,
421
421
  unstable_splitRouteModules: reactRouterUserConfig.future?.unstable_splitRouteModules ?? false,
422
- unstable_subResourceIntegrity: reactRouterUserConfig.future?.unstable_subResourceIntegrity ?? false,
423
422
  unstable_viteEnvironmentApi: reactRouterUserConfig.future?.unstable_viteEnvironmentApi ?? false
424
423
  };
425
424
  let reactRouterConfig = deepFreeze({
@@ -861,7 +860,7 @@ async function writeAll(ctx) {
861
860
  });
862
861
  const registerPath = Path4.join(typegenDir, "+register.ts");
863
862
  import_node_fs3.default.writeFileSync(registerPath, register(ctx));
864
- const virtualPath = Path4.join(typegenDir, "+virtual.ts");
863
+ const virtualPath = Path4.join(typegenDir, "+virtual.d.ts");
865
864
  import_node_fs3.default.writeFileSync(virtualPath, virtual);
866
865
  }
867
866
  function register(ctx) {
@@ -1048,6 +1047,7 @@ var init_route_chunks = __esm({
1048
1047
  routeChunkExportNames = [
1049
1048
  "clientAction",
1050
1049
  "clientLoader",
1050
+ "unstable_clientMiddleware",
1051
1051
  "HydrateFallback"
1052
1052
  ];
1053
1053
  mainChunkName = "main";
@@ -1057,6 +1057,7 @@ var init_route_chunks = __esm({
1057
1057
  main: `${routeChunkQueryStringPrefix}main`,
1058
1058
  clientAction: `${routeChunkQueryStringPrefix}clientAction`,
1059
1059
  clientLoader: `${routeChunkQueryStringPrefix}clientLoader`,
1060
+ unstable_clientMiddleware: `${routeChunkQueryStringPrefix}unstable_clientMiddleware`,
1060
1061
  HydrateFallback: `${routeChunkQueryStringPrefix}HydrateFallback`
1061
1062
  };
1062
1063
  }
@@ -1099,12 +1100,12 @@ async function resolveViteConfig({
1099
1100
  function extractPluginContext(viteConfig) {
1100
1101
  return viteConfig["__reactRouterPluginContext"];
1101
1102
  }
1102
- function isSeverBundleEnvironmentName(name) {
1103
+ function isSsrBundleEnvironmentName(name) {
1103
1104
  return name.startsWith(SSR_BUNDLE_PREFIX);
1104
1105
  }
1105
1106
  function getServerEnvironmentEntries(ctx, record) {
1106
1107
  return Object.entries(record).filter(
1107
- ([name]) => ctx.buildManifest?.serverBundles ? isSeverBundleEnvironmentName(name) : name === "ssr"
1108
+ ([name]) => ctx.buildManifest?.serverBundles ? isSsrBundleEnvironmentName(name) : name === "ssr"
1108
1109
  );
1109
1110
  }
1110
1111
  function getServerEnvironmentKeys(ctx, record) {
@@ -1198,13 +1199,8 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
1198
1199
  return mergeEnvironmentOptions(getBaseOptions({ viteUserConfig }), {
1199
1200
  resolve: {
1200
1201
  external: (
1201
- // This check is required to honor the "noExternal: true" config
1202
- // provided by vite-plugin-cloudflare within this repo. When compiling
1203
- // for Cloudflare, all server dependencies are externalized, but our
1204
- // `ssrExternals` config inadvertently overrides this. This doesn't
1205
- // impact consumers because for them `ssrExternals` is undefined and
1206
- // Cloudflare's "noExternal: true" config remains intact.
1207
- ctx.reactRouterConfig.future.unstable_viteEnvironmentApi && viteUserConfig.environments?.ssr?.resolve?.noExternal === true ? void 0 : ssrExternals
1202
+ // If `unstable_viteEnvironmentApi` is `true`, `resolve.external` is set in the `configEnvironment` hook
1203
+ ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? void 0 : ssrExternals
1208
1204
  ),
1209
1205
  conditions,
1210
1206
  externalConditions: conditions
@@ -1254,7 +1250,10 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
1254
1250
  output: (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig?.environments?.client?.build?.rollupOptions?.output : viteUserConfig?.build?.rollupOptions?.output) ?? {
1255
1251
  entryFileNames: ({ moduleIds }) => {
1256
1252
  let routeChunkModuleId = moduleIds.find(isRouteChunkModuleId);
1257
- let routeChunkName = routeChunkModuleId ? getRouteChunkNameFromModuleId(routeChunkModuleId) : null;
1253
+ let routeChunkName = routeChunkModuleId ? getRouteChunkNameFromModuleId(routeChunkModuleId)?.replace(
1254
+ "unstable_",
1255
+ ""
1256
+ ) : null;
1258
1257
  let routeChunkSuffix = routeChunkName ? `-${(0, import_kebabCase.default)(routeChunkName)}` : "";
1259
1258
  return path7.posix.join(
1260
1259
  (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig?.environments?.client?.build?.assetsDir : viteUserConfig?.build?.assetsDir) ?? "assets",
@@ -1289,21 +1288,7 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
1289
1288
  environmentOptionsResolvers.ssr = ({ viteUserConfig }) => mergeEnvironmentOptions(getBaseServerOptions({ viteUserConfig }), {
1290
1289
  build: {
1291
1290
  outDir: getServerBuildDirectory(ctx.reactRouterConfig)
1292
- },
1293
- optimizeDeps: ctx.reactRouterConfig.future.unstable_viteEnvironmentApi && viteUserConfig.environments?.ssr?.optimizeDeps?.noDiscovery === false ? {
1294
- entries: [
1295
- vite2.normalizePath(ctx.entryServerFilePath),
1296
- ...Object.values(ctx.reactRouterConfig.routes).map(
1297
- (route) => resolveRelativeRouteFilePath(route, ctx.reactRouterConfig)
1298
- )
1299
- ],
1300
- include: [
1301
- "react",
1302
- "react/jsx-dev-runtime",
1303
- "react-dom/server",
1304
- "react-router"
1305
- ]
1306
- } : void 0
1291
+ }
1307
1292
  });
1308
1293
  }
1309
1294
  if (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi && viteCommand === "serve") {
@@ -1323,12 +1308,11 @@ function resolveEnvironmentsOptions(environmentResolvers, resolverOptions) {
1323
1308
  function isNonNullable(x) {
1324
1309
  return x != null;
1325
1310
  }
1326
- var import_node_crypto, fs4, path7, url, fse, babel2, import_react_router2, import_es_module_lexer, import_pick3, import_jsesc, import_picocolors4, import_kebabCase, CLIENT_NON_COMPONENT_EXPORTS, CLIENT_ROUTE_EXPORTS, BUILD_CLIENT_ROUTE_QUERY_STRING, SSR_BUNDLE_PREFIX, CSS_DEV_HELPER_ENVIRONMENT_NAME, virtualHmrRuntime, virtualInjectHmrRuntime, resolveRelativeRouteFilePath, virtual2, getServerBuildDirectory, getClientBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER;
1311
+ var import_node_crypto, path7, url, fse, babel2, import_react_router2, import_es_module_lexer, import_pick3, import_jsesc, import_picocolors4, import_kebabCase, CLIENT_NON_COMPONENT_EXPORTS, CLIENT_ROUTE_EXPORTS, BUILD_CLIENT_ROUTE_QUERY_STRING, SSR_BUNDLE_PREFIX, CSS_DEV_HELPER_ENVIRONMENT_NAME, virtualHmrRuntime, virtualInjectHmrRuntime, virtual2, getServerBuildDirectory, getClientBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER;
1327
1312
  var init_plugin = __esm({
1328
1313
  "vite/plugin.ts"() {
1329
1314
  "use strict";
1330
1315
  import_node_crypto = require("crypto");
1331
- fs4 = __toESM(require("fs"));
1332
1316
  path7 = __toESM(require("path"));
1333
1317
  url = __toESM(require("url"));
1334
1318
  fse = __toESM(require("fs-extra"));
@@ -1374,12 +1358,6 @@ var init_plugin = __esm({
1374
1358
  CSS_DEV_HELPER_ENVIRONMENT_NAME = "__react_router_css_dev_helper__";
1375
1359
  virtualHmrRuntime = create("hmr-runtime");
1376
1360
  virtualInjectHmrRuntime = create("inject-hmr-runtime");
1377
- resolveRelativeRouteFilePath = (route, reactRouterConfig) => {
1378
- let vite2 = getVite();
1379
- let file = route.file;
1380
- let fullPath = path7.resolve(reactRouterConfig.appDirectory, file);
1381
- return vite2.normalizePath(fullPath);
1382
- };
1383
1361
  virtual2 = {
1384
1362
  serverBuild: create("server-build"),
1385
1363
  serverManifest: create("server-manifest"),
package/dist/config.d.ts CHANGED
@@ -46,7 +46,6 @@ interface FutureConfig {
46
46
  * Automatically split route modules into multiple chunks when possible.
47
47
  */
48
48
  unstable_splitRouteModules: boolean | "enforce";
49
- unstable_subResourceIntegrity: boolean;
50
49
  /**
51
50
  * Use Vite Environment API (experimental)
52
51
  */
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-35027c3be
2
+ * @react-router/dev v0.0.0-experimental-47c4c03cf
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 v0.0.0-experimental-35027c3be
2
+ * @react-router/dev v0.0.0-experimental-47c4c03cf
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -45,7 +45,12 @@ const enqueueUpdate = debounce(async () => {
45
45
 
46
46
  let needsRevalidation = new Set(
47
47
  Array.from(routeUpdates.values())
48
- .filter((route) => route.hasLoader || route.hasClientLoader)
48
+ .filter(
49
+ (route) =>
50
+ route.hasLoader ||
51
+ route.hasClientLoader ||
52
+ route.hasClientMiddleware
53
+ )
49
54
  .map((route) => route.id)
50
55
  );
51
56
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-35027c3be
2
+ * @react-router/dev v0.0.0-experimental-47c4c03cf
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -512,7 +512,6 @@ async function resolveConfig({
512
512
  unstable_middleware: reactRouterUserConfig.future?.unstable_middleware ?? false,
513
513
  unstable_optimizeDeps: reactRouterUserConfig.future?.unstable_optimizeDeps ?? false,
514
514
  unstable_splitRouteModules: reactRouterUserConfig.future?.unstable_splitRouteModules ?? false,
515
- unstable_subResourceIntegrity: reactRouterUserConfig.future?.unstable_subResourceIntegrity ?? false,
516
515
  unstable_viteEnvironmentApi: reactRouterUserConfig.future?.unstable_viteEnvironmentApi ?? false
517
516
  };
518
517
  let reactRouterConfig = deepFreeze({
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-35027c3be
2
+ * @react-router/dev v0.0.0-experimental-47c4c03cf
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -46,7 +46,6 @@ module.exports = __toCommonJS(vite_exports);
46
46
 
47
47
  // vite/plugin.ts
48
48
  var import_node_crypto = require("crypto");
49
- var fs3 = __toESM(require("fs"));
50
49
  var path6 = __toESM(require("path"));
51
50
  var url = __toESM(require("url"));
52
51
  var fse = __toESM(require("fs-extra"));
@@ -476,7 +475,6 @@ async function resolveConfig({
476
475
  unstable_middleware: reactRouterUserConfig.future?.unstable_middleware ?? false,
477
476
  unstable_optimizeDeps: reactRouterUserConfig.future?.unstable_optimizeDeps ?? false,
478
477
  unstable_splitRouteModules: reactRouterUserConfig.future?.unstable_splitRouteModules ?? false,
479
- unstable_subResourceIntegrity: reactRouterUserConfig.future?.unstable_subResourceIntegrity ?? false,
480
478
  unstable_viteEnvironmentApi: reactRouterUserConfig.future?.unstable_viteEnvironmentApi ?? false
481
479
  };
482
480
  let reactRouterConfig = deepFreeze({
@@ -827,7 +825,7 @@ async function writeAll(ctx) {
827
825
  });
828
826
  const registerPath = Path4.join(typegenDir, "+register.ts");
829
827
  import_node_fs2.default.writeFileSync(registerPath, register(ctx));
830
- const virtualPath = Path4.join(typegenDir, "+virtual.ts");
828
+ const virtualPath = Path4.join(typegenDir, "+virtual.d.ts");
831
829
  import_node_fs2.default.writeFileSync(virtualPath, virtual);
832
830
  }
833
831
  function register(ctx) {
@@ -1819,6 +1817,7 @@ function detectRouteChunks(code, cache, cacheKey) {
1819
1817
  var routeChunkExportNames = [
1820
1818
  "clientAction",
1821
1819
  "clientLoader",
1820
+ "unstable_clientMiddleware",
1822
1821
  "HydrateFallback"
1823
1822
  ];
1824
1823
  var mainChunkName = "main";
@@ -1834,6 +1833,7 @@ var routeChunkQueryStrings = {
1834
1833
  main: `${routeChunkQueryStringPrefix}main`,
1835
1834
  clientAction: `${routeChunkQueryStringPrefix}clientAction`,
1836
1835
  clientLoader: `${routeChunkQueryStringPrefix}clientLoader`,
1836
+ unstable_clientMiddleware: `${routeChunkQueryStringPrefix}unstable_clientMiddleware`,
1837
1837
  HydrateFallback: `${routeChunkQueryStringPrefix}HydrateFallback`
1838
1838
  };
1839
1839
  function getRouteChunkModuleId(filePath, chunkName) {
@@ -2016,12 +2016,9 @@ function isSsrBundleEnvironmentName(name) {
2016
2016
  return name.startsWith(SSR_BUNDLE_PREFIX);
2017
2017
  }
2018
2018
  var CSS_DEV_HELPER_ENVIRONMENT_NAME = "__react_router_css_dev_helper__";
2019
- function isSeverBundleEnvironmentName(name) {
2020
- return name.startsWith(SSR_BUNDLE_PREFIX);
2021
- }
2022
2019
  function getServerEnvironmentEntries(ctx, record) {
2023
2020
  return Object.entries(record).filter(
2024
- ([name]) => ctx.buildManifest?.serverBundles ? isSeverBundleEnvironmentName(name) : name === "ssr"
2021
+ ([name]) => ctx.buildManifest?.serverBundles ? isSsrBundleEnvironmentName(name) : name === "ssr"
2025
2022
  );
2026
2023
  }
2027
2024
  function getServerEnvironmentValues(ctx, record) {
@@ -2400,34 +2397,6 @@ var reactRouterVitePlugin = () => {
2400
2397
  );
2401
2398
  return /* @__PURE__ */ new Set([...cssUrlPaths, ...chunkAssetPaths]);
2402
2399
  };
2403
- let generateSriManifest = async (ctx2) => {
2404
- let clientBuildDirectory = getClientBuildDirectory(ctx2.reactRouterConfig);
2405
- let entries = fs3.readdirSync(clientBuildDirectory, {
2406
- withFileTypes: true,
2407
- recursive: true
2408
- });
2409
- let sriManifest = {};
2410
- for (const entry of entries) {
2411
- if (entry.isFile() && entry.name.endsWith(".js")) {
2412
- let contents;
2413
- try {
2414
- contents = await fse.readFile(
2415
- path6.join(entry.path, entry.name),
2416
- "utf-8"
2417
- );
2418
- } catch (e) {
2419
- logger.error(`Failed to read file for SRI generation: ${entry.name}`);
2420
- throw e;
2421
- }
2422
- let hash = (0, import_node_crypto.createHash)("sha384").update(contents).digest().toString("base64");
2423
- let filepath = getVite().normalizePath(
2424
- path6.relative(clientBuildDirectory, path6.join(entry.path, entry.name))
2425
- );
2426
- sriManifest[`${ctx2.publicPath}${filepath}`] = `sha384-${hash}`;
2427
- }
2428
- }
2429
- return sriManifest;
2430
- };
2431
2400
  let generateReactRouterManifestsForBuild = async ({
2432
2401
  routeIds
2433
2402
  }) => {
@@ -2453,6 +2422,9 @@ var reactRouterVitePlugin = () => {
2453
2422
  let isRootRoute = route.parentId === void 0;
2454
2423
  let hasClientAction = sourceExports.includes("clientAction");
2455
2424
  let hasClientLoader = sourceExports.includes("clientLoader");
2425
+ let hasClientMiddleware = sourceExports.includes(
2426
+ "unstable_clientMiddleware"
2427
+ );
2456
2428
  let hasHydrateFallback = sourceExports.includes("HydrateFallback");
2457
2429
  let { hasRouteChunkByExportName } = await detectRouteChunksIfEnabled(
2458
2430
  cache,
@@ -2467,6 +2439,7 @@ var reactRouterVitePlugin = () => {
2467
2439
  valid: {
2468
2440
  clientAction: !hasClientAction || hasRouteChunkByExportName.clientAction,
2469
2441
  clientLoader: !hasClientLoader || hasRouteChunkByExportName.clientLoader,
2442
+ unstable_clientMiddleware: !hasClientMiddleware || hasRouteChunkByExportName.unstable_clientMiddleware,
2470
2443
  HydrateFallback: !hasHydrateFallback || hasRouteChunkByExportName.HydrateFallback
2471
2444
  }
2472
2445
  });
@@ -2481,6 +2454,7 @@ var reactRouterVitePlugin = () => {
2481
2454
  hasLoader: sourceExports.includes("loader"),
2482
2455
  hasClientAction,
2483
2456
  hasClientLoader,
2457
+ hasClientMiddleware,
2484
2458
  hasErrorBoundary: sourceExports.includes("ErrorBoundary"),
2485
2459
  ...getReactRouterManifestBuildAssets(
2486
2460
  ctx,
@@ -2501,6 +2475,11 @@ var reactRouterVitePlugin = () => {
2501
2475
  viteManifest,
2502
2476
  getRouteChunkModuleId(routeFile, "clientLoader")
2503
2477
  ) : void 0,
2478
+ clientMiddlewareModule: hasRouteChunkByExportName.unstable_clientMiddleware ? getPublicModulePathForEntry(
2479
+ ctx,
2480
+ viteManifest,
2481
+ getRouteChunkModuleId(routeFile, "unstable_clientMiddleware")
2482
+ ) : void 0,
2504
2483
  hydrateFallbackModule: hasRouteChunkByExportName.HydrateFallback ? getPublicModulePathForEntry(
2505
2484
  ctx,
2506
2485
  viteManifest,
@@ -2522,8 +2501,7 @@ var reactRouterVitePlugin = () => {
2522
2501
  let nonFingerprintedValues = { url: url2, version };
2523
2502
  let reactRouterBrowserManifest = {
2524
2503
  ...fingerprintedValues,
2525
- ...nonFingerprintedValues,
2526
- sri: void 0
2504
+ ...nonFingerprintedValues
2527
2505
  };
2528
2506
  await writeFileSafe(
2529
2507
  path6.join(getClientBuildDirectory(ctx.reactRouterConfig), manifestPath),
@@ -2531,14 +2509,9 @@ var reactRouterVitePlugin = () => {
2531
2509
  reactRouterBrowserManifest
2532
2510
  )};`
2533
2511
  );
2534
- let sri = void 0;
2535
- if (ctx.reactRouterConfig.future.unstable_subResourceIntegrity) {
2536
- sri = await generateSriManifest(ctx);
2537
- }
2538
2512
  let reactRouterServerManifest = {
2539
2513
  ...reactRouterBrowserManifest,
2540
- routes: serverRoutes,
2541
- sri
2514
+ routes: serverRoutes
2542
2515
  };
2543
2516
  return {
2544
2517
  reactRouterBrowserManifest,
@@ -2558,6 +2531,9 @@ var reactRouterVitePlugin = () => {
2558
2531
  let sourceExports = routeManifestExports[key];
2559
2532
  let hasClientAction = sourceExports.includes("clientAction");
2560
2533
  let hasClientLoader = sourceExports.includes("clientLoader");
2534
+ let hasClientMiddleware = sourceExports.includes(
2535
+ "unstable_clientMiddleware"
2536
+ );
2561
2537
  let hasHydrateFallback = sourceExports.includes("HydrateFallback");
2562
2538
  let routeModulePath = combineURLs(
2563
2539
  ctx.publicPath,
@@ -2579,6 +2555,7 @@ var reactRouterVitePlugin = () => {
2579
2555
  valid: {
2580
2556
  clientAction: !hasClientAction || hasRouteChunkByExportName.clientAction,
2581
2557
  clientLoader: !hasClientLoader || hasRouteChunkByExportName.clientLoader,
2558
+ unstable_clientMiddleware: !hasClientMiddleware || hasRouteChunkByExportName.unstable_clientMiddleware,
2582
2559
  HydrateFallback: !hasHydrateFallback || hasRouteChunkByExportName.HydrateFallback
2583
2560
  }
2584
2561
  });
@@ -2593,16 +2570,17 @@ var reactRouterVitePlugin = () => {
2593
2570
  // Split route modules are a build-time optimization
2594
2571
  clientActionModule: void 0,
2595
2572
  clientLoaderModule: void 0,
2573
+ clientMiddlewareModule: void 0,
2596
2574
  hydrateFallbackModule: void 0,
2597
2575
  hasAction: sourceExports.includes("action"),
2598
2576
  hasLoader: sourceExports.includes("loader"),
2599
2577
  hasClientAction,
2600
2578
  hasClientLoader,
2579
+ hasClientMiddleware,
2601
2580
  hasErrorBoundary: sourceExports.includes("ErrorBoundary"),
2602
2581
  imports: []
2603
2582
  };
2604
2583
  }
2605
- let sri = void 0;
2606
2584
  let reactRouterManifestForDev = {
2607
2585
  version: String(Math.random()),
2608
2586
  url: combineURLs(ctx.publicPath, virtual2.browserManifest.url),
@@ -2616,7 +2594,6 @@ var reactRouterVitePlugin = () => {
2616
2594
  ),
2617
2595
  imports: []
2618
2596
  },
2619
- sri,
2620
2597
  routes
2621
2598
  };
2622
2599
  currentReactRouterManifestForDev = reactRouterManifestForDev;
@@ -2796,6 +2773,41 @@ var reactRouterVitePlugin = () => {
2796
2773
  }
2797
2774
  };
2798
2775
  },
2776
+ configEnvironment(name, options) {
2777
+ if (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi && (ctx.buildManifest?.serverBundles ? isSsrBundleEnvironmentName(name) : name === "ssr")) {
2778
+ const vite2 = getVite();
2779
+ return {
2780
+ resolve: {
2781
+ external: (
2782
+ // This check is required to honor the "noExternal: true" config
2783
+ // provided by vite-plugin-cloudflare within this repo. When compiling
2784
+ // for Cloudflare, all server dependencies are pre-bundled, but our
2785
+ // `ssrExternals` config inadvertently overrides this. This doesn't
2786
+ // impact consumers because for them `ssrExternals` is undefined and
2787
+ // Cloudflare's "noExternal: true" config remains intact.
2788
+ options.resolve?.noExternal === true ? void 0 : ssrExternals
2789
+ )
2790
+ },
2791
+ optimizeDeps: options.optimizeDeps?.noDiscovery === false ? {
2792
+ entries: [
2793
+ vite2.normalizePath(ctx.entryServerFilePath),
2794
+ ...Object.values(ctx.reactRouterConfig.routes).map(
2795
+ (route) => resolveRelativeRouteFilePath(
2796
+ route,
2797
+ ctx.reactRouterConfig
2798
+ )
2799
+ )
2800
+ ],
2801
+ include: [
2802
+ "react",
2803
+ "react/jsx-dev-runtime",
2804
+ "react-dom/server",
2805
+ "react-router"
2806
+ ]
2807
+ } : void 0
2808
+ };
2809
+ }
2810
+ },
2799
2811
  async configResolved(resolvedViteConfig) {
2800
2812
  await import_es_module_lexer.init;
2801
2813
  viteConfig = resolvedViteConfig;
@@ -2828,6 +2840,9 @@ var reactRouterVitePlugin = () => {
2828
2840
  );
2829
2841
  }
2830
2842
  }
2843
+ const childCompilerPlugins = await asyncFlatten(
2844
+ childCompilerConfigFile.config.plugins ?? []
2845
+ );
2831
2846
  viteChildCompiler = await vite2.createServer({
2832
2847
  ...viteUserConfig,
2833
2848
  // Ensure child compiler cannot overwrite the default cache directory
@@ -2841,9 +2856,13 @@ var reactRouterVitePlugin = () => {
2841
2856
  configFile: false,
2842
2857
  envFile: false,
2843
2858
  plugins: [
2844
- ...(childCompilerConfigFile.config.plugins ?? []).flat().filter(
2859
+ childCompilerPlugins.filter(
2845
2860
  (plugin2) => typeof plugin2 === "object" && plugin2 !== null && "name" in plugin2 && plugin2.name !== "react-router" && plugin2.name !== "react-router:route-exports" && plugin2.name !== "react-router:hmr-updates"
2846
- ),
2861
+ ).map((plugin2) => ({
2862
+ ...plugin2,
2863
+ configureServer: void 0,
2864
+ configurePreviewServer: void 0
2865
+ })),
2847
2866
  {
2848
2867
  name: "react-router:override-optimize-deps",
2849
2868
  config(userConfig) {
@@ -2972,6 +2991,7 @@ var reactRouterVitePlugin = () => {
2972
2991
  let vite2 = getVite();
2973
2992
  let ssrEnvironment = viteDevServer.environments.ssr;
2974
2993
  if (!vite2.isRunnableDevEnvironment(ssrEnvironment)) {
2994
+ next();
2975
2995
  return;
2976
2996
  }
2977
2997
  build = await ssrEnvironment.runner.import(
@@ -3189,6 +3209,9 @@ var reactRouterVitePlugin = () => {
3189
3209
  valid: {
3190
3210
  clientAction: !exportNames.includes("clientAction"),
3191
3211
  clientLoader: !exportNames.includes("clientLoader"),
3212
+ unstable_clientMiddleware: !exportNames.includes(
3213
+ "unstable_clientMiddleware"
3214
+ ),
3192
3215
  HydrateFallback: !exportNames.includes("HydrateFallback")
3193
3216
  }
3194
3217
  });
@@ -3461,6 +3484,8 @@ var reactRouterVitePlugin = () => {
3461
3484
  "hasAction",
3462
3485
  "hasClientAction",
3463
3486
  "clientActionModule",
3487
+ "hasClientMiddleware",
3488
+ "clientMiddlewareModule",
3464
3489
  "hasErrorBoundary",
3465
3490
  "hydrateFallbackModule"
3466
3491
  ].some((key) => oldRouteMetadata[key] !== newRouteMetadata[key])) {
@@ -3614,11 +3639,13 @@ async function getRouteMetadata(cache, ctx, viteChildCompiler, route, readRouteF
3614
3639
  // Ensure the Vite dev server responds with a JS module
3615
3640
  clientActionModule: hasRouteChunkByExportName.clientAction ? `${getRouteChunkModuleId(moduleUrl, "clientAction")}` : void 0,
3616
3641
  clientLoaderModule: hasRouteChunkByExportName.clientLoader ? `${getRouteChunkModuleId(moduleUrl, "clientLoader")}` : void 0,
3642
+ clientMiddlewareModule: hasRouteChunkByExportName.unstable_clientMiddleware ? `${getRouteChunkModuleId(moduleUrl, "unstable_clientMiddleware")}` : void 0,
3617
3643
  hydrateFallbackModule: hasRouteChunkByExportName.HydrateFallback ? `${getRouteChunkModuleId(moduleUrl, "HydrateFallback")}` : void 0,
3618
3644
  hasAction: sourceExports.includes("action"),
3619
3645
  hasClientAction: sourceExports.includes("clientAction"),
3620
3646
  hasLoader: sourceExports.includes("loader"),
3621
3647
  hasClientLoader: sourceExports.includes("clientLoader"),
3648
+ hasClientMiddleware: sourceExports.includes("unstable_clientMiddleware"),
3622
3649
  hasErrorBoundary: sourceExports.includes("ErrorBoundary"),
3623
3650
  imports: []
3624
3651
  };
@@ -3807,7 +3834,7 @@ async function prerenderData(handler, prerenderPath, onlyRoutes, clientBuildDire
3807
3834
  let data = await response.text();
3808
3835
  if (response.status !== 200) {
3809
3836
  throw new Error(
3810
- `Prerender (data): Received a ${response.status} status code from \`entry.server.tsx\` while prerendering the \`${path6}\` path.
3837
+ `Prerender (data): Received a ${response.status} status code from \`entry.server.tsx\` while prerendering the \`${prerenderPath}\` path.
3811
3838
  ${normalizedPath}`
3812
3839
  );
3813
3840
  }
@@ -4041,6 +4068,9 @@ var resolveRouteFileCode = async (ctx, input) => {
4041
4068
  input.readRouteFile
4042
4069
  );
4043
4070
  };
4071
+ function isRootRouteModuleId(ctx, id) {
4072
+ return normalizeRelativeFilePath(id, ctx.reactRouterConfig) === ctx.reactRouterConfig.routes.root.file;
4073
+ }
4044
4074
  async function detectRouteChunksIfEnabled(cache, ctx, id, input) {
4045
4075
  function noRouteChunks() {
4046
4076
  return {
@@ -4049,6 +4079,7 @@ async function detectRouteChunksIfEnabled(cache, ctx, id, input) {
4049
4079
  hasRouteChunkByExportName: {
4050
4080
  clientAction: false,
4051
4081
  clientLoader: false,
4082
+ unstable_clientMiddleware: false,
4052
4083
  HydrateFallback: false
4053
4084
  }
4054
4085
  };
@@ -4056,7 +4087,7 @@ async function detectRouteChunksIfEnabled(cache, ctx, id, input) {
4056
4087
  if (!ctx.reactRouterConfig.future.unstable_splitRouteModules) {
4057
4088
  return noRouteChunks();
4058
4089
  }
4059
- if (normalizeRelativeFilePath(id, ctx.reactRouterConfig) === ctx.reactRouterConfig.routes.root.file) {
4090
+ if (isRootRouteModuleId(ctx, id)) {
4060
4091
  return noRouteChunks();
4061
4092
  }
4062
4093
  let code = await resolveRouteFileCode(ctx, input);
@@ -4079,6 +4110,9 @@ function validateRouteChunks({
4079
4110
  id,
4080
4111
  valid
4081
4112
  }) {
4113
+ if (isRootRouteModuleId(ctx, id)) {
4114
+ return;
4115
+ }
4082
4116
  let invalidChunks = Object.entries(valid).filter(([_, isValid]) => !isValid).map(([chunkName]) => chunkName);
4083
4117
  if (invalidChunks.length === 0) {
4084
4118
  return;
@@ -4250,13 +4284,8 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
4250
4284
  return mergeEnvironmentOptions(getBaseOptions({ viteUserConfig }), {
4251
4285
  resolve: {
4252
4286
  external: (
4253
- // This check is required to honor the "noExternal: true" config
4254
- // provided by vite-plugin-cloudflare within this repo. When compiling
4255
- // for Cloudflare, all server dependencies are externalized, but our
4256
- // `ssrExternals` config inadvertently overrides this. This doesn't
4257
- // impact consumers because for them `ssrExternals` is undefined and
4258
- // Cloudflare's "noExternal: true" config remains intact.
4259
- ctx.reactRouterConfig.future.unstable_viteEnvironmentApi && viteUserConfig.environments?.ssr?.resolve?.noExternal === true ? void 0 : ssrExternals
4287
+ // If `unstable_viteEnvironmentApi` is `true`, `resolve.external` is set in the `configEnvironment` hook
4288
+ ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? void 0 : ssrExternals
4260
4289
  ),
4261
4290
  conditions,
4262
4291
  externalConditions: conditions
@@ -4306,7 +4335,10 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
4306
4335
  output: (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig?.environments?.client?.build?.rollupOptions?.output : viteUserConfig?.build?.rollupOptions?.output) ?? {
4307
4336
  entryFileNames: ({ moduleIds }) => {
4308
4337
  let routeChunkModuleId = moduleIds.find(isRouteChunkModuleId);
4309
- let routeChunkName = routeChunkModuleId ? getRouteChunkNameFromModuleId(routeChunkModuleId) : null;
4338
+ let routeChunkName = routeChunkModuleId ? getRouteChunkNameFromModuleId(routeChunkModuleId)?.replace(
4339
+ "unstable_",
4340
+ ""
4341
+ ) : null;
4310
4342
  let routeChunkSuffix = routeChunkName ? `-${(0, import_kebabCase.default)(routeChunkName)}` : "";
4311
4343
  return path6.posix.join(
4312
4344
  (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig?.environments?.client?.build?.assetsDir : viteUserConfig?.build?.assetsDir) ?? "assets",
@@ -4341,21 +4373,7 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
4341
4373
  environmentOptionsResolvers.ssr = ({ viteUserConfig }) => mergeEnvironmentOptions(getBaseServerOptions({ viteUserConfig }), {
4342
4374
  build: {
4343
4375
  outDir: getServerBuildDirectory(ctx.reactRouterConfig)
4344
- },
4345
- optimizeDeps: ctx.reactRouterConfig.future.unstable_viteEnvironmentApi && viteUserConfig.environments?.ssr?.optimizeDeps?.noDiscovery === false ? {
4346
- entries: [
4347
- vite2.normalizePath(ctx.entryServerFilePath),
4348
- ...Object.values(ctx.reactRouterConfig.routes).map(
4349
- (route) => resolveRelativeRouteFilePath(route, ctx.reactRouterConfig)
4350
- )
4351
- ],
4352
- include: [
4353
- "react",
4354
- "react/jsx-dev-runtime",
4355
- "react-dom/server",
4356
- "react-router"
4357
- ]
4358
- } : void 0
4376
+ }
4359
4377
  });
4360
4378
  }
4361
4379
  if (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi && viteCommand === "serve") {
@@ -4385,6 +4403,12 @@ async function getEnvironmentsOptions(ctx, viteCommand, resolverOptions) {
4385
4403
  function isNonNullable(x) {
4386
4404
  return x != null;
4387
4405
  }
4406
+ async function asyncFlatten(arr) {
4407
+ do {
4408
+ arr = (await Promise.all(arr)).flat(Infinity);
4409
+ } while (arr.some((v2) => v2?.then));
4410
+ return arr;
4411
+ }
4388
4412
  // Annotate the CommonJS export names for ESM import in node:
4389
4413
  0 && (module.exports = {
4390
4414
  reactRouter
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-router/dev",
3
- "version": "0.0.0-experimental-35027c3be",
3
+ "version": "0.0.0-experimental-47c4c03cf",
4
4
  "description": "Dev tools and CLI for React Router",
5
5
  "homepage": "https://reactrouter.com",
6
6
  "bugs": {
@@ -86,7 +86,7 @@
86
86
  "set-cookie-parser": "^2.6.0",
87
87
  "valibot": "^0.41.0",
88
88
  "vite-node": "3.0.0-beta.2",
89
- "@react-router/node": "0.0.0-experimental-35027c3be"
89
+ "@react-router/node": "0.0.0-experimental-47c4c03cf"
90
90
  },
91
91
  "devDependencies": {
92
92
  "@types/babel__core": "^7.20.5",
@@ -110,15 +110,15 @@
110
110
  "vite": "^6.1.0",
111
111
  "wireit": "0.14.9",
112
112
  "wrangler": "^3.109.2",
113
- "@react-router/serve": "0.0.0-experimental-35027c3be",
114
- "react-router": "^0.0.0-experimental-35027c3be"
113
+ "react-router": "^0.0.0-experimental-47c4c03cf",
114
+ "@react-router/serve": "0.0.0-experimental-47c4c03cf"
115
115
  },
116
116
  "peerDependencies": {
117
117
  "typescript": "^5.1.0",
118
118
  "vite": "^5.1.0 || ^6.0.0",
119
119
  "wrangler": "^3.28.2",
120
- "@react-router/serve": "^0.0.0-experimental-35027c3be",
121
- "react-router": "^0.0.0-experimental-35027c3be"
120
+ "@react-router/serve": "^0.0.0-experimental-47c4c03cf",
121
+ "react-router": "^0.0.0-experimental-47c4c03cf"
122
122
  },
123
123
  "peerDependenciesMeta": {
124
124
  "@react-router/serve": {