@react-router/dev 0.0.0-experimental-479e73b7b → 0.0.0-experimental-2a01b6fd8

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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-479e73b7b
2
+ * @react-router/dev v0.0.0-experimental-2a01b6fd8
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 { _ as getVite, v as preloadVite } from "./typegen-DSDdbRfE.js";
11
+ import { _ as getVite, v as preloadVite } from "./typegen-CydnYlE9.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 v0.0.0-experimental-479e73b7b
3
+ * @react-router/dev v0.0.0-experimental-2a01b6fd8
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * @license MIT
11
11
  */
12
- import { _ as getVite, l as hasNodeDependency, n as watch, t as run$1, u as loadConfig, v as preloadVite } from "../typegen-DSDdbRfE.js";
12
+ import { _ as getVite, l as hasNodeDependency, n as watch, t as run$1, u as loadConfig, v as preloadVite } from "../typegen-CydnYlE9.js";
13
13
  import { createRequire } from "node:module";
14
14
  import { parseArgs } from "node:util";
15
15
  import semver from "semver";
@@ -23,10 +23,6 @@ import { readPackageJSON } from "pkg-types";
23
23
  import "react-router";
24
24
  import developmentConditionEnabled from "#development-condition-enabled";
25
25
  import { spawn } from "node:child_process";
26
- import * as babel from "@babel/core";
27
- import babelPluginSyntaxJSX from "@babel/plugin-syntax-jsx";
28
- import babelPresetTypeScript from "@babel/preset-typescript";
29
- import prettier from "prettier";
30
26
  import process$1 from "node:process";
31
27
  import packageJson from "@react-router/dev/package.json" with { type: "json" };
32
28
  //#region config/format.ts
@@ -72,24 +68,6 @@ function formatRoutesAsJsx(routeManifest) {
72
68
  return output;
73
69
  }
74
70
  //#endregion
75
- //#region cli/useJavascript.ts
76
- async function transpile(tsx, options = {}) {
77
- let mjs = babel.transformSync(tsx, {
78
- compact: false,
79
- cwd: options.cwd,
80
- filename: options.filename,
81
- plugins: [babelPluginSyntaxJSX],
82
- presets: [[babelPresetTypeScript, { jsx: "preserve" }]],
83
- retainLines: true
84
- });
85
- if (!mjs || !mjs.code) throw new Error("Could not parse TypeScript");
86
- /**
87
- * Babel's `compact` and `retainLines` options are both bad at formatting code.
88
- * Use Prettier for nicer formatting.
89
- */
90
- return await prettier.format(mjs.code, { parser: "babel" });
91
- }
92
- //#endregion
93
71
  //#region vite/profiler.ts
94
72
  const getSession = () => global.__reactRouter_profile_session;
95
73
  const start = async (callback) => {
@@ -180,7 +158,7 @@ async function routes(rootDirectory, flags = {}) {
180
158
  }
181
159
  async function build(root, options = {}) {
182
160
  root = resolveRootDirectory(root, options);
183
- let { build } = await import("../build-BZ8ZGxs4.js");
161
+ let { build } = await import("../build-BY8q9ar7.js");
184
162
  if (options.profile) await start();
185
163
  try {
186
164
  await build(root, options);
@@ -190,7 +168,7 @@ async function build(root, options = {}) {
190
168
  }
191
169
  async function dev(root, options = {}) {
192
170
  if (developmentConditionEnabled) {
193
- let { dev } = await import("../dev-6WvjrRMD.js");
171
+ let { dev } = await import("../dev-D4wCelLk.js");
194
172
  if (options.profile) await start();
195
173
  exitHook(() => stop(console.info));
196
174
  root = resolveRootDirectory(root, options);
@@ -273,20 +251,13 @@ async function generateEntry(entry, rootDirectory, flags = {}) {
273
251
  await copyFile(defaultEntry, outputFile);
274
252
  } else {
275
253
  let pkgJson = await readPackageJSON(rootDirectory);
276
- let defaultEntryClient = path$1.resolve(defaultsDirectory, "entry.client.tsx");
277
- let defaultEntryServer = path$1.resolve(defaultsDirectory, hasNodeDependency(pkgJson.dependencies) && !configResult.value.future.unstable_enableNodeReadableStream ? `entry.server.node.tsx` : `entry.server.web.tsx`);
278
- let isServerEntry = entry === "entry.server";
279
- let contents = isServerEntry ? await createServerEntry(rootDirectory, appDirectory, defaultEntryServer) : await createClientEntry(rootDirectory, appDirectory, defaultEntryClient);
280
- let useTypeScript = flags.typescript ?? true;
281
- let outputEntry = `${entry}.${useTypeScript ? "tsx" : "jsx"}`;
254
+ let outputExtension = flags.typescript ?? true ? "tsx" : "jsx";
255
+ let defaultEntryClient = path$1.resolve(defaultsDirectory, `entry.client.${outputExtension}`);
256
+ let defaultEntryServer = path$1.resolve(defaultsDirectory, hasNodeDependency(pkgJson.dependencies) && !configResult.value.future.unstable_enableNodeReadableStream ? `entry.server.node.${outputExtension}` : `entry.server.web.${outputExtension}`);
257
+ let contents = entry === "entry.server" ? await createServerEntry(rootDirectory, appDirectory, defaultEntryServer) : await createClientEntry(rootDirectory, appDirectory, defaultEntryClient);
258
+ let outputEntry = `${entry}.${outputExtension}`;
282
259
  outputFile = path$1.resolve(appDirectory, outputEntry);
283
- if (!useTypeScript) {
284
- let javascript = await transpile(contents, {
285
- cwd: rootDirectory,
286
- filename: isServerEntry ? defaultEntryServer : defaultEntryClient
287
- });
288
- await writeFile(outputFile, javascript, "utf-8");
289
- } else await writeFile(outputFile, contents, "utf-8");
260
+ await writeFile(outputFile, contents, "utf-8");
290
261
  }
291
262
  console.log(colors.blue(`Entry file ${entry} created at ${path$1.relative(rootDirectory, outputFile)}.`));
292
263
  }
@@ -379,7 +350,7 @@ ${colors.blueBright("react-router")}
379
350
  --json Print the routes as JSON
380
351
  \`reveal\` Options:
381
352
  --config, -c Use specified Vite config file (string)
382
- --no-typescript Generate plain JavaScript files
353
+ --no-typescript Generate plain JavaScript files (deprecated; will be removed in v9)
383
354
  \`typegen\` Options:
384
355
  --watch Automatically regenerate types whenever route config (\`routes.ts\`) or route modules change
385
356
 
@@ -516,7 +487,10 @@ async function run(argv = process.argv.slice(2), { isMain = false } = {}) {
516
487
  return;
517
488
  }
518
489
  flags.interactive = flags.interactive ?? isMain;
519
- if (values["no-typescript"]) flags.typescript = false;
490
+ if (values["no-typescript"]) {
491
+ console.warn(colors.yellow("The --no-typescript flag is deprecated and will be removed in React Router v9."));
492
+ flags.typescript = false;
493
+ }
520
494
  switch (input[0]) {
521
495
  case "routes":
522
496
  await routes(input[1], flags);
@@ -0,0 +1,12 @@
1
+ import { startTransition, StrictMode } from "react";
2
+ import { hydrateRoot } from "react-dom/client";
3
+ import { HydratedRouter } from "react-router/dom";
4
+
5
+ startTransition(() => {
6
+ hydrateRoot(
7
+ document,
8
+ <StrictMode>
9
+ <HydratedRouter />
10
+ </StrictMode>,
11
+ );
12
+ });
@@ -0,0 +1,82 @@
1
+ import { PassThrough } from "node:stream";
2
+
3
+ import { createReadableStreamFromReadable } from "@react-router/node";
4
+ import { ServerRouter } from "react-router";
5
+ import { isbot } from "isbot";
6
+
7
+ import { renderToPipeableStream } from "react-dom/server";
8
+
9
+ export const streamTimeout = 5_000;
10
+
11
+ export default function handleRequest(
12
+ request,
13
+ responseStatusCode,
14
+ responseHeaders,
15
+ routerContext,
16
+ loadContext,
17
+ ) {
18
+ // https://httpwg.org/specs/rfc9110.html#HEAD
19
+ if (request.method.toUpperCase() === "HEAD") {
20
+ return new Response(null, {
21
+ status: responseStatusCode,
22
+ headers: responseHeaders,
23
+ });
24
+ }
25
+
26
+ return new Promise((resolve, reject) => {
27
+ let shellRendered = false;
28
+ let userAgent = request.headers.get("user-agent");
29
+
30
+ // Ensure requests from bots and SPA Mode renders wait for all content to load before responding
31
+ // https://react.dev/reference/react-dom/server/renderToPipeableStream#waiting-for-all-content-to-load-for-crawlers-and-static-generation
32
+ let readyOption =
33
+ (userAgent && isbot(userAgent)) || routerContext.isSpaMode
34
+ ? "onAllReady"
35
+ : "onShellReady";
36
+
37
+ // Abort the rendering stream after the `streamTimeout` so it has time to
38
+ // flush down the rejected boundaries
39
+ let timeoutId = setTimeout(() => abort(), streamTimeout + 1000);
40
+
41
+ const { pipe, abort } = renderToPipeableStream(
42
+ <ServerRouter context={routerContext} url={request.url} />,
43
+ {
44
+ [readyOption]() {
45
+ shellRendered = true;
46
+ const body = new PassThrough({
47
+ final(callback) {
48
+ // Clear the timeout to prevent retaining the closure and memory leak
49
+ clearTimeout(timeoutId);
50
+ timeoutId = undefined;
51
+ callback();
52
+ },
53
+ });
54
+ const stream = createReadableStreamFromReadable(body);
55
+
56
+ responseHeaders.set("Content-Type", "text/html");
57
+
58
+ pipe(body);
59
+
60
+ resolve(
61
+ new Response(stream, {
62
+ headers: responseHeaders,
63
+ status: responseStatusCode,
64
+ }),
65
+ );
66
+ },
67
+ onShellError(error) {
68
+ reject(error);
69
+ },
70
+ onError(error) {
71
+ responseStatusCode = 500;
72
+ // Log streaming rendering errors from inside the shell. Don't log
73
+ // errors encountered during initial shell rendering since they'll
74
+ // reject and get logged in handleDocumentRequest.
75
+ if (shellRendered) {
76
+ console.error(error);
77
+ }
78
+ },
79
+ },
80
+ );
81
+ });
82
+ }
@@ -0,0 +1,53 @@
1
+ import { ServerRouter } from "react-router";
2
+ import { isbot } from "isbot";
3
+ import { renderToReadableStream } from "react-dom/server";
4
+
5
+ export const streamTimeout = 5_000;
6
+
7
+ export default async function handleRequest(
8
+ request,
9
+ responseStatusCode,
10
+ responseHeaders,
11
+ routerContext,
12
+ _loadContext,
13
+ ) {
14
+ // https://httpwg.org/specs/rfc9110.html#HEAD
15
+ if (request.method.toUpperCase() === "HEAD") {
16
+ return new Response(null, {
17
+ status: responseStatusCode,
18
+ headers: responseHeaders,
19
+ });
20
+ }
21
+
22
+ let shellRendered = false;
23
+ let userAgent = request.headers.get("user-agent");
24
+
25
+ const body = await renderToReadableStream(
26
+ <ServerRouter context={routerContext} url={request.url} />,
27
+ {
28
+ signal: AbortSignal.timeout(streamTimeout + 1000),
29
+ onError(error) {
30
+ responseStatusCode = 500;
31
+ // Log streaming rendering errors from inside the shell. Don't log
32
+ // errors encountered during initial shell rendering since they'll
33
+ // reject and get logged in handleDocumentRequest.
34
+ if (shellRendered) {
35
+ console.error(error);
36
+ }
37
+ },
38
+ },
39
+ );
40
+ shellRendered = true;
41
+
42
+ // Ensure requests from bots and SPA Mode renders wait for all content to load before responding
43
+ // https://react.dev/reference/react-dom/server/renderToPipeableStream#waiting-for-all-content-to-load-for-crawlers-and-static-generation
44
+ if ((userAgent && isbot(userAgent)) || routerContext.isSpaMode) {
45
+ await body.allReady;
46
+ }
47
+
48
+ responseHeaders.set("Content-Type", "text/html");
49
+ return new Response(body, {
50
+ headers: responseHeaders,
51
+ status: responseStatusCode,
52
+ });
53
+ }
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-479e73b7b
2
+ * @react-router/dev v0.0.0-experimental-2a01b6fd8
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-479e73b7b
2
+ * @react-router/dev v0.0.0-experimental-2a01b6fd8
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 { _ as getVite, v as preloadVite } from "./typegen-DSDdbRfE.js";
11
+ import { _ as getVite, v as preloadVite } from "./typegen-CydnYlE9.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 v0.0.0-experimental-479e73b7b
2
+ * @react-router/dev v0.0.0-experimental-2a01b6fd8
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-479e73b7b
2
+ * @react-router/dev v0.0.0-experimental-2a01b6fd8
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-D18xtDiC.js";
11
+ import { a as prefix, i as layout, n as getAppDirectory, o as relative, r as index, s as route } from "./routes-BLQxq7lr.js";
12
12
  export { getAppDirectory, index, layout, prefix, relative, route };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-479e73b7b
2
+ * @react-router/dev v0.0.0-experimental-2a01b6fd8
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-D18xtDiC.js";
11
+ import { c as setAppDirectory, l as validateRouteConfig, t as configRoutesToRouteManifest, u as invariant } from "./routes-BLQxq7lr.js";
12
12
  import { createRequire } from "node:module";
13
13
  import colors from "picocolors";
14
14
  import fs from "node:fs";
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-479e73b7b
2
+ * @react-router/dev v0.0.0-experimental-2a01b6fd8
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -8,8 +8,8 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- import { _ as getVite, a as t, c as createConfigLoader, d as resolveEntryFiles, f as resolveRSCEntryFiles, g as getUserBuildRollupOptions, h as defineOptimizeDepsCompilerOptions, i as parse$1, l as hasNodeDependency, m as defineCompilerOptions, n as watch, o as traverse, p as ssrExternals, r as generate, s as configRouteToBranchRoute, v as preloadVite } from "./typegen-DSDdbRfE.js";
12
- import { u as invariant } from "./routes-D18xtDiC.js";
11
+ import { _ as getVite, a as t, c as createConfigLoader, d as resolveEntryFiles, f as resolveRSCEntryFiles, g as getUserBuildRollupOptions, h as defineOptimizeDepsCompilerOptions, i as parse$1, l as hasNodeDependency, m as defineCompilerOptions, n as watch, o as traverse, p as ssrExternals, r as generate, s as configRouteToBranchRoute, v as preloadVite } from "./typegen-CydnYlE9.js";
12
+ import { u as invariant } from "./routes-BLQxq7lr.js";
13
13
  import { createRequire } from "node:module";
14
14
  import colors from "picocolors";
15
15
  import { existsSync, readFileSync, readdirSync } from "node:fs";
@@ -21,9 +21,9 @@ import { createRequestHandler, matchRoutes, unstable_setDevServerHooks } from "r
21
21
  import * as Path from "pathe";
22
22
  import path$1, { join } from "pathe";
23
23
  import pick from "lodash/pick.js";
24
- import * as babel from "@babel/core";
25
24
  import { createHash } from "node:crypto";
26
25
  import * as url from "node:url";
26
+ import * as babel from "@babel/core";
27
27
  import { createRequest, sendResponse } from "@remix-run/node-fetch-server";
28
28
  import { init, parse } from "es-module-lexer";
29
29
  import jsesc from "jsesc";
@@ -2724,7 +2724,7 @@ const nodeRequire = createRequire(import.meta.url);
2724
2724
  function hasDependency({ name, rootDirectory }) {
2725
2725
  try {
2726
2726
  return Boolean(nodeRequire.resolve(name, { paths: [rootDirectory] }));
2727
- } catch (e) {
2727
+ } catch {
2728
2728
  return false;
2729
2729
  }
2730
2730
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@react-router/dev",
3
3
  "type": "module",
4
- "version": "0.0.0-experimental-479e73b7b",
4
+ "version": "0.0.0-experimental-2a01b6fd8",
5
5
  "description": "Dev tools and CLI for React Router",
6
6
  "keywords": [
7
7
  "react",
@@ -88,8 +88,6 @@
88
88
  "@babel/core": "^7.29.7",
89
89
  "@babel/generator": "^7.29.7",
90
90
  "@babel/parser": "^7.29.7",
91
- "@babel/plugin-syntax-jsx": "^7.29.7",
92
- "@babel/preset-typescript": "^7.29.7",
93
91
  "@babel/traverse": "^7.29.7",
94
92
  "@babel/types": "^7.29.7",
95
93
  "@remix-run/node-fetch-server": "^0.13.3",
@@ -105,14 +103,15 @@
105
103
  "pathe": "^2.0.3",
106
104
  "picocolors": "^1.1.1",
107
105
  "pkg-types": "^2.3.1",
108
- "prettier": "^3.8.3",
109
106
  "react-refresh": "^0.18.0",
110
107
  "semver": "^7.8.1",
111
108
  "tinyglobby": "^0.2.16",
112
109
  "valibot": "^1.4.1",
113
- "@react-router/node": "0.0.0-experimental-479e73b7b"
110
+ "@react-router/node": "0.0.0-experimental-2a01b6fd8"
114
111
  },
115
112
  "devDependencies": {
113
+ "@babel/plugin-syntax-jsx": "^7.29.7",
114
+ "@babel/preset-typescript": "^7.29.7",
116
115
  "@types/babel__core": "^7.20.5",
117
116
  "@types/babel__generator": "^7.27.0",
118
117
  "@types/babel__traverse": "^7.28.0",
@@ -127,13 +126,14 @@
127
126
  "esbuild-register": "^3.6.0",
128
127
  "execa": "9.6.1",
129
128
  "fast-glob": "3.3.3",
129
+ "prettier": "^3.8.3",
130
130
  "tsdown": "^0.22.0",
131
131
  "typescript": "^6.0.3",
132
132
  "vite": "^7.0.0",
133
133
  "wireit": "0.14.12",
134
134
  "wrangler": "^4.95.0",
135
- "@react-router/serve": "0.0.0-experimental-479e73b7b",
136
- "react-router": "^0.0.0-experimental-479e73b7b"
135
+ "@react-router/serve": "0.0.0-experimental-2a01b6fd8",
136
+ "react-router": "^0.0.0-experimental-2a01b6fd8"
137
137
  },
138
138
  "peerDependencies": {
139
139
  "@vitejs/plugin-rsc": "~0.5.26",
@@ -141,8 +141,8 @@
141
141
  "typescript": "^5.1.0 || ^6.0.0 || ^7.0.0",
142
142
  "vite": "^7.0.0 || ^8.0.0",
143
143
  "wrangler": "^4.0.0",
144
- "@react-router/serve": "^0.0.0-experimental-479e73b7b",
145
- "react-router": "^0.0.0-experimental-479e73b7b"
144
+ "react-router": "^0.0.0-experimental-2a01b6fd8",
145
+ "@react-router/serve": "^0.0.0-experimental-2a01b6fd8"
146
146
  },
147
147
  "peerDependenciesMeta": {
148
148
  "@vitejs/plugin-rsc": {