@react-router/dev 0.0.0-experimental-6129054f2 → 0.0.0-experimental-21239dcc5

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,24 @@
1
1
  # `@react-router/dev`
2
2
 
3
+ ## 7.9.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Fix preset future flags being ignored during config resolution ([#14369](https://github.com/remix-run/react-router/pull/14369))
8
+
9
+ Fixes a bug where future flags defined by presets were completely ignored. The config resolution was incorrectly reading from `reactRouterUserConfig.future` instead of the merged `userAndPresetConfigs.future`, causing all preset-defined future flags to be lost.
10
+
11
+ This fix ensures presets can properly enable experimental features as intended by the preset system design.
12
+
13
+ - Add unstable support for RSC Framework Mode ([#14336](https://github.com/remix-run/react-router/pull/14336))
14
+
15
+ - Switch internal vite plugin Response logic to use `@remix-run/node-fetch-server` ([#13927](https://github.com/remix-run/react-router/pull/13927))
16
+
17
+ - Updated dependencies:
18
+ - `react-router@7.9.2`
19
+ - `@react-router/serve@7.9.2`
20
+ - `@react-router/node@7.9.2`
21
+
3
22
  ## 7.9.1
4
23
 
5
24
  ### Patch Changes
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-6129054f2
3
+ * @react-router/dev v0.0.0-experimental-21239dcc5
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
@@ -484,11 +484,11 @@ async function resolveConfig({
484
484
  }
485
485
  }
486
486
  let future = {
487
- v8_middleware: reactRouterUserConfig.future?.v8_middleware ?? false,
488
- unstable_optimizeDeps: reactRouterUserConfig.future?.unstable_optimizeDeps ?? false,
489
- unstable_splitRouteModules: reactRouterUserConfig.future?.unstable_splitRouteModules ?? false,
490
- unstable_subResourceIntegrity: reactRouterUserConfig.future?.unstable_subResourceIntegrity ?? false,
491
- unstable_viteEnvironmentApi: reactRouterUserConfig.future?.unstable_viteEnvironmentApi ?? false
487
+ v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
488
+ unstable_optimizeDeps: userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,
489
+ unstable_splitRouteModules: userAndPresetConfigs.future?.unstable_splitRouteModules ?? false,
490
+ unstable_subResourceIntegrity: userAndPresetConfigs.future?.unstable_subResourceIntegrity ?? false,
491
+ unstable_viteEnvironmentApi: userAndPresetConfigs.future?.unstable_viteEnvironmentApi ?? false
492
492
  };
493
493
  let reactRouterConfig = deepFreeze({
494
494
  appDirectory,
@@ -1511,15 +1511,6 @@ var init_warn_on_client_source_maps = __esm({
1511
1511
  }
1512
1512
  });
1513
1513
 
1514
- // vite/pmap.js
1515
- var pMapSkip;
1516
- var init_pmap = __esm({
1517
- "vite/pmap.js"() {
1518
- "use strict";
1519
- pMapSkip = Symbol("skip");
1520
- }
1521
- });
1522
-
1523
1514
  // vite/plugin.ts
1524
1515
  async function resolveViteConfig({
1525
1516
  configFile,
@@ -1794,7 +1785,6 @@ var init_plugin = __esm({
1794
1785
  init_load_dotenv();
1795
1786
  init_validate_plugin_order();
1796
1787
  init_warn_on_client_source_maps();
1797
- init_pmap();
1798
1788
  CLIENT_NON_COMPONENT_EXPORTS = [
1799
1789
  "clientAction",
1800
1790
  "clientLoader",
package/dist/config.d.ts CHANGED
@@ -58,9 +58,6 @@ type BuildEndHook = (args: {
58
58
  reactRouterConfig: ResolvedReactRouterConfig;
59
59
  viteConfig: Vite.ResolvedConfig;
60
60
  }) => void | Promise<void>;
61
- type PrerenderPaths = boolean | Array<string> | ((args: {
62
- getStaticPaths: () => string[];
63
- }) => Array<string> | Promise<Array<string>>);
64
61
  /**
65
62
  * Config to be exported via the default export from `react-router.config.ts`.
66
63
  */
@@ -96,17 +93,10 @@ type ReactRouterConfig = {
96
93
  /**
97
94
  * An array of URLs to prerender to HTML files at build time. Can also be a
98
95
  * function returning an array to dynamically generate URLs.
99
- *
100
- * `unstable_concurrency` defaults to 1, which means "no concurrency" - fully serial execution.
101
- * Setting it to a value more than 1 enables concurrent prerendering.
102
- * Setting it to a value higher than one can increase the speed of the build,
103
- * but may consume more resources, and send more concurrent requests to the
104
- * server/CMS.
105
- */
106
- prerender?: PrerenderPaths | {
107
- paths: PrerenderPaths;
108
- unstable_concurrency?: number;
109
- };
96
+ */
97
+ prerender?: boolean | Array<string> | ((args: {
98
+ getStaticPaths: () => string[];
99
+ }) => Array<string> | Promise<Array<string>>);
110
100
  /**
111
101
  * An array of React Router plugin config presets to ease integration with
112
102
  * other platforms and tools.
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-6129054f2
2
+ * @react-router/dev v0.0.0-experimental-21239dcc5
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-6129054f2
2
+ * @react-router/dev v0.0.0-experimental-21239dcc5
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-6129054f2
2
+ * @react-router/dev v0.0.0-experimental-21239dcc5
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -514,11 +514,11 @@ async function resolveConfig({
514
514
  }
515
515
  }
516
516
  let future = {
517
- v8_middleware: reactRouterUserConfig.future?.v8_middleware ?? false,
518
- unstable_optimizeDeps: reactRouterUserConfig.future?.unstable_optimizeDeps ?? false,
519
- unstable_splitRouteModules: reactRouterUserConfig.future?.unstable_splitRouteModules ?? false,
520
- unstable_subResourceIntegrity: reactRouterUserConfig.future?.unstable_subResourceIntegrity ?? false,
521
- unstable_viteEnvironmentApi: reactRouterUserConfig.future?.unstable_viteEnvironmentApi ?? false
517
+ v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
518
+ unstable_optimizeDeps: userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,
519
+ unstable_splitRouteModules: userAndPresetConfigs.future?.unstable_splitRouteModules ?? false,
520
+ unstable_subResourceIntegrity: userAndPresetConfigs.future?.unstable_subResourceIntegrity ?? false,
521
+ unstable_viteEnvironmentApi: userAndPresetConfigs.future?.unstable_viteEnvironmentApi ?? false
522
522
  };
523
523
  let reactRouterConfig = deepFreeze({
524
524
  appDirectory,
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-6129054f2
2
+ * @react-router/dev v0.0.0-experimental-21239dcc5
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -541,11 +541,11 @@ async function resolveConfig({
541
541
  }
542
542
  }
543
543
  let future = {
544
- v8_middleware: reactRouterUserConfig.future?.v8_middleware ?? false,
545
- unstable_optimizeDeps: reactRouterUserConfig.future?.unstable_optimizeDeps ?? false,
546
- unstable_splitRouteModules: reactRouterUserConfig.future?.unstable_splitRouteModules ?? false,
547
- unstable_subResourceIntegrity: reactRouterUserConfig.future?.unstable_subResourceIntegrity ?? false,
548
- unstable_viteEnvironmentApi: reactRouterUserConfig.future?.unstable_viteEnvironmentApi ?? false
544
+ v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
545
+ unstable_optimizeDeps: userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,
546
+ unstable_splitRouteModules: userAndPresetConfigs.future?.unstable_splitRouteModules ?? false,
547
+ unstable_subResourceIntegrity: userAndPresetConfigs.future?.unstable_subResourceIntegrity ?? false,
548
+ unstable_viteEnvironmentApi: userAndPresetConfigs.future?.unstable_viteEnvironmentApi ?? false
549
549
  };
550
550
  let reactRouterConfig = deepFreeze({
551
551
  appDirectory,
@@ -2412,129 +2412,6 @@ function warnOnClientSourceMaps() {
2412
2412
  };
2413
2413
  }
2414
2414
 
2415
- // vite/pmap.js
2416
- async function pMap(iterable, mapper, {
2417
- concurrency = Number.POSITIVE_INFINITY,
2418
- stopOnError = true,
2419
- signal
2420
- } = {}) {
2421
- return new Promise((resolve_, reject_) => {
2422
- if (iterable[Symbol.iterator] === void 0 && iterable[Symbol.asyncIterator] === void 0) {
2423
- throw new TypeError(`Expected \`input\` to be either an \`Iterable\` or \`AsyncIterable\`, got (${typeof iterable})`);
2424
- }
2425
- if (typeof mapper !== "function") {
2426
- throw new TypeError("Mapper function is required");
2427
- }
2428
- if (!(Number.isSafeInteger(concurrency) && concurrency >= 1 || concurrency === Number.POSITIVE_INFINITY)) {
2429
- throw new TypeError(`Expected \`concurrency\` to be an integer from 1 and up or \`Infinity\`, got \`${concurrency}\` (${typeof concurrency})`);
2430
- }
2431
- const result = [];
2432
- const errors = [];
2433
- const skippedIndexesMap = /* @__PURE__ */ new Map();
2434
- let isRejected = false;
2435
- let isResolved = false;
2436
- let isIterableDone = false;
2437
- let resolvingCount = 0;
2438
- let currentIndex = 0;
2439
- const iterator = iterable[Symbol.iterator] === void 0 ? iterable[Symbol.asyncIterator]() : iterable[Symbol.iterator]();
2440
- const signalListener = () => {
2441
- reject(signal.reason);
2442
- };
2443
- const cleanup = () => {
2444
- signal?.removeEventListener("abort", signalListener);
2445
- };
2446
- const resolve6 = (value) => {
2447
- resolve_(value);
2448
- cleanup();
2449
- };
2450
- const reject = (reason) => {
2451
- isRejected = true;
2452
- isResolved = true;
2453
- reject_(reason);
2454
- cleanup();
2455
- };
2456
- if (signal) {
2457
- if (signal.aborted) {
2458
- reject(signal.reason);
2459
- }
2460
- signal.addEventListener("abort", signalListener, { once: true });
2461
- }
2462
- const next = async () => {
2463
- if (isResolved) {
2464
- return;
2465
- }
2466
- const nextItem = await iterator.next();
2467
- const index = currentIndex;
2468
- currentIndex++;
2469
- if (nextItem.done) {
2470
- isIterableDone = true;
2471
- if (resolvingCount === 0 && !isResolved) {
2472
- if (!stopOnError && errors.length > 0) {
2473
- reject(new AggregateError(errors));
2474
- return;
2475
- }
2476
- isResolved = true;
2477
- if (skippedIndexesMap.size === 0) {
2478
- resolve6(result);
2479
- return;
2480
- }
2481
- const pureResult = [];
2482
- for (const [index2, value] of result.entries()) {
2483
- if (skippedIndexesMap.get(index2) === pMapSkip) {
2484
- continue;
2485
- }
2486
- pureResult.push(value);
2487
- }
2488
- resolve6(pureResult);
2489
- }
2490
- return;
2491
- }
2492
- resolvingCount++;
2493
- (async () => {
2494
- try {
2495
- const element = await nextItem.value;
2496
- if (isResolved) {
2497
- return;
2498
- }
2499
- const value = await mapper(element, index);
2500
- if (value === pMapSkip) {
2501
- skippedIndexesMap.set(index, value);
2502
- }
2503
- result[index] = value;
2504
- resolvingCount--;
2505
- await next();
2506
- } catch (error) {
2507
- if (stopOnError) {
2508
- reject(error);
2509
- } else {
2510
- errors.push(error);
2511
- resolvingCount--;
2512
- try {
2513
- await next();
2514
- } catch (error2) {
2515
- reject(error2);
2516
- }
2517
- }
2518
- }
2519
- })();
2520
- };
2521
- (async () => {
2522
- for (let index = 0; index < concurrency; index++) {
2523
- try {
2524
- await next();
2525
- } catch (error) {
2526
- reject(error);
2527
- break;
2528
- }
2529
- if (isIterableDone || isRejected) {
2530
- break;
2531
- }
2532
- }
2533
- })();
2534
- });
2535
- }
2536
- var pMapSkip = Symbol("skip");
2537
-
2538
2415
  // vite/plugin.ts
2539
2416
  function extractPluginContext(viteConfig) {
2540
2417
  return viteConfig["__reactRouterPluginContext"];
@@ -4302,76 +4179,67 @@ async function handlePrerender(viteConfig, reactRouterConfig, serverBuildDirecto
4302
4179
  }
4303
4180
  }
4304
4181
  let buildRoutes = createPrerenderRoutes(build.routes);
4305
- await pMap(
4306
- build.prerender,
4307
- async (path9) => {
4308
- let matches = (0, import_react_router2.matchRoutes)(
4309
- buildRoutes,
4310
- `/${path9}/`.replace(/^\/\/+/, "/")
4311
- );
4312
- if (!matches) {
4313
- return;
4314
- }
4315
- let leafRoute = matches ? matches[matches.length - 1].route : null;
4316
- let manifestRoute = leafRoute ? build.routes[leafRoute.id]?.module : null;
4317
- let isResourceRoute = manifestRoute && !manifestRoute.default && !manifestRoute.ErrorBoundary;
4318
- if (isResourceRoute) {
4319
- invariant(leafRoute);
4320
- invariant(manifestRoute);
4321
- if (manifestRoute.loader) {
4322
- await prerenderData(
4323
- handler,
4324
- path9,
4325
- [leafRoute.id],
4326
- clientBuildDirectory,
4327
- reactRouterConfig,
4328
- viteConfig
4329
- );
4330
- await prerenderResourceRoute(
4331
- handler,
4332
- path9,
4333
- clientBuildDirectory,
4334
- reactRouterConfig,
4335
- viteConfig
4336
- );
4337
- } else {
4338
- viteConfig.logger.warn(
4339
- `\u26A0\uFE0F Skipping prerendering for resource route without a loader: ${leafRoute?.id}`
4340
- );
4341
- }
4182
+ for (let path9 of build.prerender) {
4183
+ let matches = (0, import_react_router2.matchRoutes)(buildRoutes, `/${path9}/`.replace(/^\/\/+/, "/"));
4184
+ if (!matches) {
4185
+ continue;
4186
+ }
4187
+ let leafRoute = matches ? matches[matches.length - 1].route : null;
4188
+ let manifestRoute = leafRoute ? build.routes[leafRoute.id]?.module : null;
4189
+ let isResourceRoute = manifestRoute && !manifestRoute.default && !manifestRoute.ErrorBoundary;
4190
+ if (isResourceRoute) {
4191
+ invariant(leafRoute);
4192
+ invariant(manifestRoute);
4193
+ if (manifestRoute.loader) {
4194
+ await prerenderData(
4195
+ handler,
4196
+ path9,
4197
+ [leafRoute.id],
4198
+ clientBuildDirectory,
4199
+ reactRouterConfig,
4200
+ viteConfig
4201
+ );
4202
+ await prerenderResourceRoute(
4203
+ handler,
4204
+ path9,
4205
+ clientBuildDirectory,
4206
+ reactRouterConfig,
4207
+ viteConfig
4208
+ );
4342
4209
  } else {
4343
- let hasLoaders = matches.some(
4344
- (m) => build.assets.routes[m.route.id]?.hasLoader
4210
+ viteConfig.logger.warn(
4211
+ `\u26A0\uFE0F Skipping prerendering for resource route without a loader: ${leafRoute?.id}`
4345
4212
  );
4346
- let data;
4347
- if (!isResourceRoute && hasLoaders) {
4348
- data = await prerenderData(
4349
- handler,
4350
- path9,
4351
- null,
4352
- clientBuildDirectory,
4353
- reactRouterConfig,
4354
- viteConfig
4355
- );
4356
- }
4357
- await prerenderRoute(
4213
+ }
4214
+ } else {
4215
+ let hasLoaders = matches.some(
4216
+ (m) => build.assets.routes[m.route.id]?.hasLoader
4217
+ );
4218
+ let data;
4219
+ if (!isResourceRoute && hasLoaders) {
4220
+ data = await prerenderData(
4358
4221
  handler,
4359
4222
  path9,
4223
+ null,
4360
4224
  clientBuildDirectory,
4361
4225
  reactRouterConfig,
4362
- viteConfig,
4363
- data ? {
4364
- headers: {
4365
- "X-React-Router-Prerender-Data": encodeURI(data)
4366
- }
4367
- } : void 0
4226
+ viteConfig
4368
4227
  );
4369
4228
  }
4370
- },
4371
- {
4372
- concurrency: typeof reactRouterConfig.prerender === "object" && "paths" in reactRouterConfig.prerender ? reactRouterConfig.prerender.unstable_concurrency || 1 : 1
4229
+ await prerenderRoute(
4230
+ handler,
4231
+ path9,
4232
+ clientBuildDirectory,
4233
+ reactRouterConfig,
4234
+ viteConfig,
4235
+ data ? {
4236
+ headers: {
4237
+ "X-React-Router-Prerender-Data": encodeURI(data)
4238
+ }
4239
+ } : void 0
4240
+ );
4373
4241
  }
4374
- );
4242
+ }
4375
4243
  }
4376
4244
  function getStaticPrerenderPaths(routes) {
4377
4245
  let paths = ["/"];
@@ -4487,40 +4355,31 @@ ${content.toString("utf8")}`
4487
4355
  );
4488
4356
  }
4489
4357
  async function getPrerenderPaths(prerender, ssr, routes, logWarning = false) {
4490
- if (prerender == null || prerender === false) {
4491
- return [];
4492
- }
4493
- let pathsConfig;
4494
- if (typeof prerender === "object" && "paths" in prerender) {
4495
- pathsConfig = prerender.paths;
4496
- } else {
4497
- pathsConfig = prerender;
4498
- }
4499
- if (pathsConfig === false) {
4500
- return [];
4501
- }
4502
- let prerenderRoutes = createPrerenderRoutes(routes);
4503
- if (pathsConfig === true) {
4504
- let { paths, paramRoutes } = getStaticPrerenderPaths(prerenderRoutes);
4505
- if (logWarning && !ssr && paramRoutes.length > 0) {
4506
- console.warn(
4507
- import_picocolors4.default.yellow(
4508
- [
4509
- "\u26A0\uFE0F Paths with dynamic/splat params cannot be prerendered when using `prerender: true`. You may want to use the `prerender()` API to prerender the following paths:",
4510
- ...paramRoutes.map((p) => " - " + p)
4511
- ].join("\n")
4512
- )
4513
- );
4358
+ let prerenderPaths = [];
4359
+ if (prerender != null && prerender !== false) {
4360
+ let prerenderRoutes = createPrerenderRoutes(routes);
4361
+ if (prerender === true) {
4362
+ let { paths, paramRoutes } = getStaticPrerenderPaths(prerenderRoutes);
4363
+ if (logWarning && !ssr && paramRoutes.length > 0) {
4364
+ console.warn(
4365
+ import_picocolors4.default.yellow(
4366
+ [
4367
+ "\u26A0\uFE0F Paths with dynamic/splat params cannot be prerendered when using `prerender: true`. You may want to use the `prerender()` API to prerender the following paths:",
4368
+ ...paramRoutes.map((p) => " - " + p)
4369
+ ].join("\n")
4370
+ )
4371
+ );
4372
+ }
4373
+ prerenderPaths = paths;
4374
+ } else if (typeof prerender === "function") {
4375
+ prerenderPaths = await prerender({
4376
+ getStaticPaths: () => getStaticPrerenderPaths(prerenderRoutes).paths
4377
+ });
4378
+ } else {
4379
+ prerenderPaths = prerender || ["/"];
4514
4380
  }
4515
- return paths;
4516
- }
4517
- if (typeof pathsConfig === "function") {
4518
- let paths = await pathsConfig({
4519
- getStaticPaths: () => getStaticPrerenderPaths(prerenderRoutes).paths
4520
- });
4521
- return paths;
4522
4381
  }
4523
- return pathsConfig;
4382
+ return prerenderPaths;
4524
4383
  }
4525
4384
  function groupRoutesByParentId2(manifest) {
4526
4385
  let routes = {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-router/dev",
3
- "version": "0.0.0-experimental-6129054f2",
3
+ "version": "0.0.0-experimental-21239dcc5",
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
  "tinyglobby": "^0.2.14",
87
87
  "valibot": "^0.41.0",
88
88
  "vite-node": "^3.2.2",
89
- "@react-router/node": "0.0.0-experimental-6129054f2"
89
+ "@react-router/node": "0.0.0-experimental-21239dcc5"
90
90
  },
91
91
  "devDependencies": {
92
92
  "@types/babel__core": "^7.20.5",
@@ -109,16 +109,16 @@
109
109
  "vite": "^6.1.0",
110
110
  "wireit": "0.14.9",
111
111
  "wrangler": "^4.23.0",
112
- "react-router": "^0.0.0-experimental-6129054f2",
113
- "@react-router/serve": "0.0.0-experimental-6129054f2"
112
+ "@react-router/serve": "0.0.0-experimental-21239dcc5",
113
+ "react-router": "^0.0.0-experimental-21239dcc5"
114
114
  },
115
115
  "peerDependencies": {
116
116
  "@vitejs/plugin-rsc": "*",
117
117
  "typescript": "^5.1.0",
118
118
  "vite": "^5.1.0 || ^6.0.0 || ^7.0.0",
119
119
  "wrangler": "^3.28.2 || ^4.0.0",
120
- "@react-router/serve": "^0.0.0-experimental-6129054f2",
121
- "react-router": "^0.0.0-experimental-6129054f2"
120
+ "@react-router/serve": "^0.0.0-experimental-21239dcc5",
121
+ "react-router": "^0.0.0-experimental-21239dcc5"
122
122
  },
123
123
  "peerDependenciesMeta": {
124
124
  "@vitejs/plugin-rsc": {