@react-router/dev 7.7.1 → 7.8.0-pre.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # `@react-router/dev`
2
2
 
3
+ ## 7.8.0-pre.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Fix rename without mkdir in Vite plugin ([#14105](https://github.com/remix-run/react-router/pull/14105))
8
+ - Updated dependencies:
9
+ - `react-router@7.8.0-pre.0`
10
+ - `@react-router/node@7.8.0-pre.0`
11
+ - `@react-router/serve@7.8.0-pre.0`
12
+
3
13
  ## 7.7.1
4
14
 
5
15
  ### Patch Changes
@@ -698,7 +708,6 @@
698
708
  ```
699
709
 
700
710
  This initial implementation targets type inference for:
701
-
702
711
  - `Params` : Path parameters from your routing config in `routes.ts` including file-based routing
703
712
  - `LoaderData` : Loader data from `loader` and/or `clientLoader` within your route module
704
713
  - `ActionData` : Action data from `action` and/or `clientAction` within your route module
@@ -713,7 +722,6 @@
713
722
  ```
714
723
 
715
724
  Check out our docs for more:
716
-
717
725
  - [_Explanations > Type Safety_](https://reactrouter.com/dev/guides/explanation/type-safety)
718
726
  - [_How-To > Setting up type safety_](https://reactrouter.com/dev/guides/how-to/setting-up-type-safety)
719
727
 
@@ -913,7 +921,6 @@
913
921
  - Vite: Provide `Unstable_ServerBundlesFunction` and `Unstable_VitePluginConfig` types ([#8654](https://github.com/remix-run/remix/pull/8654))
914
922
 
915
923
  - Vite: add `--sourcemapClient` and `--sourcemapServer` flags to `remix vite:build` ([#8613](https://github.com/remix-run/remix/pull/8613))
916
-
917
924
  - `--sourcemapClient`
918
925
 
919
926
  - `--sourcemapClient=inline`
@@ -1250,7 +1257,6 @@
1250
1257
  - Add support for `clientLoader`/`clientAction`/`HydrateFallback` route exports ([RFC](https://github.com/remix-run/remix/discussions/7634)) ([#8173](https://github.com/remix-run/remix/pull/8173))
1251
1258
 
1252
1259
  Remix now supports loaders/actions that run on the client (in addition to, or instead of the loader/action that runs on the server). While we still recommend server loaders/actions for the majority of your data needs in a Remix app - these provide some levers you can pull for more advanced use-cases such as:
1253
-
1254
1260
  - Leveraging a data source local to the browser (i.e., `localStorage`)
1255
1261
  - Managing a client-side cache of server data (like `IndexedDB`)
1256
1262
  - Bypassing the Remix server in a BFF setup and hitting your API directly from the browser
@@ -1654,7 +1660,6 @@
1654
1660
  - Output esbuild metafiles for bundle analysis ([#6772](https://github.com/remix-run/remix/pull/6772))
1655
1661
 
1656
1662
  Written to server build directory (`build/` by default):
1657
-
1658
1663
  - `metafile.css.json`
1659
1664
  - `metafile.js.json` (browser JS)
1660
1665
  - `metafile.server.json` (server JS)
@@ -1752,7 +1757,6 @@
1752
1757
  - built-in tls support ([#6483](https://github.com/remix-run/remix/pull/6483))
1753
1758
 
1754
1759
  New options:
1755
-
1756
1760
  - `--tls-key` / `tlsKey`: TLS key
1757
1761
  - `--tls-cert` / `tlsCert`: TLS Certificate
1758
1762
 
@@ -2023,7 +2027,6 @@
2023
2027
  ```
2024
2028
 
2025
2029
  The dev server will:
2026
-
2027
2030
  - force `NODE_ENV=development` and warn you if it was previously set to something else
2028
2031
  - rebuild your app whenever your Remix app code changes
2029
2032
  - restart your app server whenever rebuilds succeed
package/dist/cli/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * @react-router/dev v7.7.1
3
+ * @react-router/dev v7.8.0-pre.0
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
@@ -223,9 +223,12 @@ ${message}`
223
223
  ].flat().join("\n\n")
224
224
  };
225
225
  }
226
- return { valid: true };
226
+ return {
227
+ valid: true,
228
+ routeConfig
229
+ };
227
230
  }
228
- function configRoutesToRouteManifest(appDirectory, routes2, rootId = "root") {
231
+ function configRoutesToRouteManifest(appDirectory, routes2) {
229
232
  let routeManifest = {};
230
233
  function walk(route, parentId) {
231
234
  let id = route.id || createRouteId(route.file);
@@ -250,7 +253,7 @@ function configRoutesToRouteManifest(appDirectory, routes2, rootId = "root") {
250
253
  }
251
254
  }
252
255
  for (let route of routes2) {
253
- walk(route, rootId);
256
+ walk(route);
254
257
  }
255
258
  return routeManifest;
256
259
  }
@@ -424,11 +427,11 @@ async function resolveConfig({
424
427
  `Could not find a root route module in the app directory as "${rootRouteDisplayPath}"`
425
428
  );
426
429
  }
427
- let routes2 = {};
428
- if (!skipRoutes) {
429
- routes2 = {
430
- root: { path: "", id: "root", file: rootRouteFile }
431
- };
430
+ let routes2;
431
+ let routeConfig = [];
432
+ if (skipRoutes) {
433
+ routes2 = {};
434
+ } else {
432
435
  let routeConfigFile = findEntry(appDirectory, "routes");
433
436
  try {
434
437
  if (!routeConfigFile) {
@@ -444,18 +447,22 @@ async function resolveConfig({
444
447
  let routeConfigExport = (await viteNodeContext.runner.executeFile(
445
448
  import_pathe3.default.join(appDirectory, routeConfigFile)
446
449
  )).default;
447
- let routeConfig = await routeConfigExport;
448
450
  let result = validateRouteConfig({
449
451
  routeConfigFile,
450
- routeConfig
452
+ routeConfig: await routeConfigExport
451
453
  });
452
454
  if (!result.valid) {
453
455
  return err(result.message);
454
456
  }
455
- routes2 = {
456
- ...routes2,
457
- ...configRoutesToRouteManifest(appDirectory, routeConfig)
458
- };
457
+ routeConfig = [
458
+ {
459
+ id: "root",
460
+ path: "",
461
+ file: rootRouteFile,
462
+ children: result.routeConfig
463
+ }
464
+ ];
465
+ routes2 = configRoutesToRouteManifest(appDirectory, routeConfig);
459
466
  } catch (error) {
460
467
  return err(
461
468
  [
@@ -488,7 +495,8 @@ async function resolveConfig({
488
495
  serverBuildFile,
489
496
  serverBundles,
490
497
  serverModuleFormat,
491
- ssr
498
+ ssr,
499
+ unstable_routeConfig: routeConfig
492
500
  });
493
501
  for (let preset of reactRouterUserConfig.presets ?? []) {
494
502
  await preset.reactRouterConfigResolved?.({ reactRouterConfig });
@@ -1816,7 +1824,7 @@ async function viteAppBuild(root, {
1816
1824
  },
1817
1825
  configResolved(config) {
1818
1826
  let hasReactRouterPlugin = config.plugins.find(
1819
- (plugin) => plugin.name === "react-router"
1827
+ (plugin) => plugin.name === "react-router" || plugin.name === "react-router/rsc/config"
1820
1828
  );
1821
1829
  if (!hasReactRouterPlugin) {
1822
1830
  throw new Error(
@@ -1955,7 +1963,9 @@ async function dev(root, {
1955
1963
  clearScreen,
1956
1964
  logLevel
1957
1965
  });
1958
- if (!server.config.plugins.find((plugin) => plugin.name === "react-router")) {
1966
+ if (!server.config.plugins.find(
1967
+ (plugin) => plugin.name === "react-router" || plugin.name === "react-router/rsc/config"
1968
+ )) {
1959
1969
  console.error(
1960
1970
  import_picocolors6.default.red("React Router Vite plugin not found in Vite config")
1961
1971
  );
@@ -0,0 +1,36 @@
1
+ import { startTransition, StrictMode } from "react";
2
+ import { hydrateRoot } from "react-dom/client";
3
+ import {
4
+ createFromReadableStream,
5
+ createTemporaryReferenceSet,
6
+ encodeReply,
7
+ setServerCallback,
8
+ } from "@vitejs/plugin-rsc/browser";
9
+ import {
10
+ unstable_createCallServer as createCallServer,
11
+ unstable_getRSCStream as getRSCStream,
12
+ unstable_RSCHydratedRouter as RSCHydratedRouter,
13
+ } from "react-router";
14
+ import type { unstable_RSCPayload as RSCPayload } from "react-router";
15
+
16
+ setServerCallback(
17
+ createCallServer({
18
+ createFromReadableStream,
19
+ createTemporaryReferenceSet,
20
+ encodeReply,
21
+ }),
22
+ );
23
+
24
+ createFromReadableStream<RSCPayload>(getRSCStream()).then((payload) => {
25
+ startTransition(() => {
26
+ hydrateRoot(
27
+ document,
28
+ <StrictMode>
29
+ <RSCHydratedRouter
30
+ payload={payload}
31
+ createFromReadableStream={createFromReadableStream}
32
+ />
33
+ </StrictMode>,
34
+ );
35
+ });
36
+ });
@@ -0,0 +1,34 @@
1
+ import {
2
+ createTemporaryReferenceSet,
3
+ decodeAction,
4
+ decodeReply,
5
+ loadServerAction,
6
+ renderToReadableStream,
7
+ } from "@vitejs/plugin-rsc/rsc";
8
+ import { unstable_matchRSCServerRequest as matchRSCServerRequest } from "react-router";
9
+
10
+ import routes from "virtual:react-router/unstable_rsc/routes";
11
+
12
+ export async function fetchServer(request: Request) {
13
+ return await matchRSCServerRequest({
14
+ createTemporaryReferenceSet,
15
+ decodeReply,
16
+ decodeAction,
17
+ loadServerAction,
18
+ request,
19
+ routes,
20
+ generateResponse(match, options) {
21
+ return new Response(renderToReadableStream(match.payload, options), {
22
+ status: match.statusCode,
23
+ headers: match.headers,
24
+ });
25
+ },
26
+ });
27
+ }
28
+
29
+ export default async function handler(request: Request) {
30
+ const ssr = await import.meta.viteRsc.loadModule<
31
+ typeof import("./entry.ssr")
32
+ >("ssr", "index");
33
+ return ssr.default(request, fetchServer);
34
+ }
@@ -0,0 +1,29 @@
1
+ import { createFromReadableStream } from "@vitejs/plugin-rsc/ssr";
2
+ // @ts-expect-error
3
+ import * as ReactDomServer from "react-dom/server.edge";
4
+ import {
5
+ unstable_RSCStaticRouter as RSCStaticRouter,
6
+ unstable_routeRSCServerRequest as routeRSCServerRequest,
7
+ } from "react-router";
8
+
9
+ export default async function handler(
10
+ request: Request,
11
+ fetchServer: (request: Request) => Promise<Response>,
12
+ ) {
13
+ const bootstrapScriptContent =
14
+ await import.meta.viteRsc.loadBootstrapScriptContent("index");
15
+ return routeRSCServerRequest({
16
+ request,
17
+ fetchServer,
18
+ createFromReadableStream,
19
+ renderHTML(getPayload) {
20
+ return ReactDomServer.renderToReadableStream(
21
+ <RSCStaticRouter getPayload={getPayload} />,
22
+ {
23
+ bootstrapScriptContent,
24
+ signal: request.signal,
25
+ },
26
+ );
27
+ },
28
+ });
29
+ }
package/dist/config.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as Vite from 'vite';
2
- import { R as RouteManifest, a as RouteManifestEntry } from './routes-DHIOx0R9.js';
2
+ import { R as RouteManifest, a as RouteManifestEntry, b as RouteConfigEntry } from './routes-CZR-bKRt.js';
3
3
  import 'valibot';
4
4
 
5
5
  declare const excludedConfigPresetKeys: readonly ["presets"];
@@ -202,6 +202,10 @@ type ResolvedReactRouterConfig = Readonly<{
202
202
  * SPA without server-rendering. Default's to `true`.
203
203
  */
204
204
  ssr: boolean;
205
+ /**
206
+ * The resolved array of route config entries exported from `routes.ts`
207
+ */
208
+ unstable_routeConfig: RouteConfigEntry[];
205
209
  }>;
206
210
 
207
211
  export type { BuildManifest, ReactRouterConfig as Config, Preset, ServerBundlesFunction };
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.7.1
2
+ * @react-router/dev v7.8.0-pre.0
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -0,0 +1,9 @@
1
+ import * as Vite from 'vite';
2
+
3
+ declare function reactRouterRSCVitePlugin(): Vite.PluginOption[];
4
+
5
+ declare const __INTERNAL_DO_NOT_USE_OR_YOU_WILL_GET_A_STRONGLY_WORDED_LETTER__: {
6
+ unstable_reactRouterRSC: typeof reactRouterRSCVitePlugin;
7
+ };
8
+
9
+ export { __INTERNAL_DO_NOT_USE_OR_YOU_WILL_GET_A_STRONGLY_WORDED_LETTER__ };