@react-router/dev 8.0.1 → 8.2.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 +39 -0
- package/bin.cjs +11 -4
- package/dist/{build-ygYOQjbA.js → build-r3D94V53.js} +2 -2
- package/dist/cli/index.js +92 -48
- package/dist/config/defaults/entry.server.web.tsx +54 -0
- package/dist/{config-DvmRcD4Z.d.ts → config-t89niiFv.d.ts} +1 -0
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/{dev-BAYiWwCm.js → dev-BfZiothP.js} +2 -2
- package/dist/{routes-kAS9QOpS.js → routes-CdiIrVIn.js} +1 -1
- package/dist/routes.js +2 -2
- package/dist/{typegen-9e9g0hnu.js → typegen-CNpfI4aI.js} +31 -11
- package/dist/vite.js +42 -24
- package/package.json +24 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,44 @@
|
|
|
1
1
|
# `@react-router/dev`
|
|
2
2
|
|
|
3
|
+
## v8.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Add a Web Streams default server entry for non-Node Framework mode apps ([#15290](https://github.com/remix-run/react-router/pull/15290))
|
|
8
|
+
- Apps using `@react-router/node`, `@react-router/express`, or `@react-router/serve` continue to use the `renderToPipeableStream` default server entry
|
|
9
|
+
- Apps without those Node server adapter dependencies use a `renderToReadableStream` default server entry
|
|
10
|
+
- Non-Node apps with their own `entry.server.tsx` may be able to remove it in favor of the default if it is not doing anything custom
|
|
11
|
+
- Detect `nub` as a supported package manager when installing framework dependencies ([#15276](https://github.com/remix-run/react-router/pull/15276))
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Detect user `rolldownOptions` config in Vite 8+ ([#15278](https://github.com/remix-run/react-router/pull/15278))
|
|
16
|
+
|
|
17
|
+
### Unstable Changes
|
|
18
|
+
|
|
19
|
+
⚠️ _[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use_
|
|
20
|
+
|
|
21
|
+
- Add the [`future.unstable_enableNodeReadableStream`](https://reactrouter.com/upgrading/future#futureunstable_enablenodereadablestream) flag to opt Node Framework mode apps into using `renderToReadableStream` instead of `renderToPipeableStream` ([#15290](https://github.com/remix-run/react-router/pull/15290))
|
|
22
|
+
- This flag has no effect if you have your own `entry.server.tsx`
|
|
23
|
+
- Updated dependencies:
|
|
24
|
+
- [`react-router@8.2.0`](https://github.com/remix-run/react-router/releases/tag/react-router@8.2.0)
|
|
25
|
+
- [`@react-router/node@8.2.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@8.2.0)
|
|
26
|
+
- [`@react-router/serve@8.2.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/serve@8.2.0)
|
|
27
|
+
|
|
28
|
+
## v8.1.0
|
|
29
|
+
|
|
30
|
+
### Patch Changes
|
|
31
|
+
|
|
32
|
+
- 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))
|
|
33
|
+
- 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))
|
|
34
|
+
- 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))
|
|
35
|
+
- 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))
|
|
36
|
+
- This prevents non-Node SSR runtimes from resolving Node-specific package exports by default
|
|
37
|
+
- Updated dependencies:
|
|
38
|
+
- [`react-router@8.1.0`](https://github.com/remix-run/react-router/releases/tag/react-router@8.1.0)
|
|
39
|
+
- [`@react-router/node@8.1.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@8.1.0)
|
|
40
|
+
- [`@react-router/serve@8.1.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/serve@8.1.0)
|
|
41
|
+
|
|
3
42
|
## v8.0.1
|
|
4
43
|
|
|
5
44
|
### Patch Changes
|
package/bin.cjs
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
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
|
|
10
|
-
|
|
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
|
|
2
|
+
* @react-router/dev v8.2.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 {
|
|
11
|
+
import { _ as getVite, v as preloadVite } from "./typegen-CNpfI4aI.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
|
|
3
|
+
* @react-router/dev v8.2.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 {
|
|
12
|
+
import { _ as getVite, l as hasNodeDependency, n as watch, t as run$1, u as loadConfig, v as preloadVite } from "../typegen-CNpfI4aI.js";
|
|
13
13
|
import { createRequire } from "node:module";
|
|
14
|
-
import
|
|
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-
|
|
144
|
+
let { build } = await import("../build-r3D94V53.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-
|
|
153
|
+
let { dev } = await import("../dev-BfZiothP.js");
|
|
154
154
|
if (options.profile) await start();
|
|
155
155
|
exitHook(() => stop(console.info));
|
|
156
156
|
root = resolveRootDirectory(root, options);
|
|
@@ -231,12 +231,9 @@ async function generateEntry(entry, rootDirectory, flags = {}) {
|
|
|
231
231
|
}
|
|
232
232
|
await copyFile(defaultEntry, outputFile);
|
|
233
233
|
} else {
|
|
234
|
-
|
|
235
|
-
console.error(colors.red(`No default server entry detected.`));
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
234
|
+
let pkgJson = await readPackageJSON(rootDirectory);
|
|
238
235
|
let defaultEntryClient = path$1.resolve(defaultsDirectory, "entry.client.tsx");
|
|
239
|
-
let defaultEntryServer = path$1.resolve(defaultsDirectory, `entry.server.node.tsx`);
|
|
236
|
+
let defaultEntryServer = path$1.resolve(defaultsDirectory, hasNodeDependency(pkgJson.dependencies) && !configResult.value.future.unstable_enableNodeReadableStream ? `entry.server.node.tsx` : `entry.server.web.tsx`);
|
|
240
237
|
let isServerEntry = entry === "entry.server";
|
|
241
238
|
let contents = isServerEntry ? await createServerEntry(rootDirectory, appDirectory, defaultEntryServer) : await createClientEntry(rootDirectory, appDirectory, defaultEntryClient);
|
|
242
239
|
let useTypeScript = flags.typescript ?? true;
|
|
@@ -373,6 +370,18 @@ ${colors.blueBright("react-router")}
|
|
|
373
370
|
$ react-router typegen
|
|
374
371
|
$ react-router typegen --watch
|
|
375
372
|
`;
|
|
373
|
+
function getBooleanArg(value) {
|
|
374
|
+
return typeof value === "boolean" ? value : void 0;
|
|
375
|
+
}
|
|
376
|
+
function getBooleanStringArg(value) {
|
|
377
|
+
return typeof value === "boolean" || typeof value === "string" ? value : void 0;
|
|
378
|
+
}
|
|
379
|
+
function getNumberArg(value) {
|
|
380
|
+
return typeof value === "string" ? Number(value) : void 0;
|
|
381
|
+
}
|
|
382
|
+
function getStringArg(value) {
|
|
383
|
+
return typeof value === "string" ? value : void 0;
|
|
384
|
+
}
|
|
376
385
|
/**
|
|
377
386
|
* Programmatic interface for running the react-router CLI with the given command line
|
|
378
387
|
* arguments.
|
|
@@ -385,43 +394,78 @@ async function run(argv = process.argv.slice(2), { isMain = false } = {}) {
|
|
|
385
394
|
let nextArg = argv[argv.indexOf(arg) + 1];
|
|
386
395
|
return !nextArg || nextArg.startsWith("-");
|
|
387
396
|
};
|
|
388
|
-
let
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
397
|
+
let { values, positionals } = parseArgs({
|
|
398
|
+
args: argv,
|
|
399
|
+
allowPositionals: true,
|
|
400
|
+
options: {
|
|
401
|
+
assetsInlineLimit: { type: "string" },
|
|
402
|
+
clearScreen: { type: "boolean" },
|
|
403
|
+
config: {
|
|
404
|
+
type: "string",
|
|
405
|
+
short: "c"
|
|
406
|
+
},
|
|
407
|
+
cors: { type: "boolean" },
|
|
408
|
+
emptyOutDir: { type: "boolean" },
|
|
409
|
+
force: { type: "boolean" },
|
|
410
|
+
help: {
|
|
411
|
+
type: "boolean",
|
|
412
|
+
short: "h"
|
|
413
|
+
},
|
|
414
|
+
host: { type: isBooleanFlag("--host") ? "boolean" : "string" },
|
|
415
|
+
json: { type: "boolean" },
|
|
416
|
+
logLevel: {
|
|
417
|
+
type: "string",
|
|
418
|
+
short: "l"
|
|
419
|
+
},
|
|
420
|
+
minify: { type: "string" },
|
|
421
|
+
mode: {
|
|
422
|
+
type: "string",
|
|
423
|
+
short: "m"
|
|
424
|
+
},
|
|
425
|
+
"no-typescript": { type: "boolean" },
|
|
426
|
+
open: { type: isBooleanFlag("--open") ? "boolean" : "string" },
|
|
427
|
+
port: {
|
|
428
|
+
type: "string",
|
|
429
|
+
short: "p"
|
|
430
|
+
},
|
|
431
|
+
profile: { type: "boolean" },
|
|
432
|
+
sourcemapClient: { type: isBooleanFlag("--sourcemapClient") ? "boolean" : "string" },
|
|
433
|
+
sourcemapServer: { type: isBooleanFlag("--sourcemapServer") ? "boolean" : "string" },
|
|
434
|
+
strictPort: { type: "boolean" },
|
|
435
|
+
token: { type: "string" },
|
|
436
|
+
typescript: { type: "boolean" },
|
|
437
|
+
version: {
|
|
438
|
+
type: "boolean",
|
|
439
|
+
short: "v"
|
|
440
|
+
},
|
|
441
|
+
watch: { type: "boolean" }
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
let input = positionals;
|
|
445
|
+
let flags = {
|
|
446
|
+
assetsInlineLimit: getNumberArg(values.assetsInlineLimit),
|
|
447
|
+
clearScreen: getBooleanArg(values.clearScreen),
|
|
448
|
+
config: getStringArg(values.config),
|
|
449
|
+
cors: getBooleanArg(values.cors),
|
|
450
|
+
emptyOutDir: getBooleanArg(values.emptyOutDir),
|
|
451
|
+
force: getBooleanArg(values.force),
|
|
452
|
+
help: getBooleanArg(values.help),
|
|
453
|
+
host: getBooleanStringArg(values.host),
|
|
454
|
+
json: getBooleanArg(values.json),
|
|
455
|
+
logLevel: getStringArg(values.logLevel),
|
|
456
|
+
minify: getStringArg(values.minify),
|
|
457
|
+
mode: getStringArg(values.mode),
|
|
458
|
+
open: getBooleanStringArg(values.open),
|
|
459
|
+
port: getNumberArg(values.port),
|
|
460
|
+
profile: getBooleanArg(values.profile),
|
|
461
|
+
sourcemapClient: getBooleanStringArg(values.sourcemapClient),
|
|
462
|
+
sourcemapServer: getBooleanStringArg(values.sourcemapServer),
|
|
463
|
+
strictPort: getBooleanArg(values.strictPort),
|
|
464
|
+
token: getStringArg(values.token),
|
|
465
|
+
typescript: getBooleanArg(values.typescript),
|
|
466
|
+
version: getBooleanArg(values.version),
|
|
467
|
+
watch: getBooleanArg(values.watch)
|
|
468
|
+
};
|
|
425
469
|
if (flags.help) {
|
|
426
470
|
console.log(helpText);
|
|
427
471
|
return;
|
|
@@ -431,7 +475,7 @@ async function run(argv = process.argv.slice(2), { isMain = false } = {}) {
|
|
|
431
475
|
return;
|
|
432
476
|
}
|
|
433
477
|
flags.interactive = flags.interactive ?? isMain;
|
|
434
|
-
if (
|
|
478
|
+
if (values["no-typescript"]) flags.typescript = false;
|
|
435
479
|
switch (input[0]) {
|
|
436
480
|
case "routes":
|
|
437
481
|
await routes(input[1], flags);
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { EntryContext, RouterContextProvider } from "react-router";
|
|
2
|
+
import { ServerRouter } from "react-router";
|
|
3
|
+
import { isbot } from "isbot";
|
|
4
|
+
import { renderToReadableStream } from "react-dom/server";
|
|
5
|
+
|
|
6
|
+
export const streamTimeout = 5_000;
|
|
7
|
+
|
|
8
|
+
export default async function handleRequest(
|
|
9
|
+
request: Request,
|
|
10
|
+
responseStatusCode: number,
|
|
11
|
+
responseHeaders: Headers,
|
|
12
|
+
routerContext: EntryContext,
|
|
13
|
+
_loadContext: RouterContextProvider,
|
|
14
|
+
) {
|
|
15
|
+
// https://httpwg.org/specs/rfc9110.html#HEAD
|
|
16
|
+
if (request.method.toUpperCase() === "HEAD") {
|
|
17
|
+
return new Response(null, {
|
|
18
|
+
status: responseStatusCode,
|
|
19
|
+
headers: responseHeaders,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let shellRendered = false;
|
|
24
|
+
let userAgent = request.headers.get("user-agent");
|
|
25
|
+
|
|
26
|
+
const body = await renderToReadableStream(
|
|
27
|
+
<ServerRouter context={routerContext} url={request.url} />,
|
|
28
|
+
{
|
|
29
|
+
signal: AbortSignal.timeout(streamTimeout + 1000),
|
|
30
|
+
onError(error: unknown) {
|
|
31
|
+
responseStatusCode = 500;
|
|
32
|
+
// Log streaming rendering errors from inside the shell. Don't log
|
|
33
|
+
// errors encountered during initial shell rendering since they'll
|
|
34
|
+
// reject and get logged in handleDocumentRequest.
|
|
35
|
+
if (shellRendered) {
|
|
36
|
+
console.error(error);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
);
|
|
41
|
+
shellRendered = true;
|
|
42
|
+
|
|
43
|
+
// Ensure requests from bots and SPA Mode renders wait for all content to load before responding
|
|
44
|
+
// https://react.dev/reference/react-dom/server/renderToPipeableStream#waiting-for-all-content-to-load-for-crawlers-and-static-generation
|
|
45
|
+
if ((userAgent && isbot(userAgent)) || routerContext.isSpaMode) {
|
|
46
|
+
await body.allReady;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
responseHeaders.set("Content-Type", "text/html");
|
|
50
|
+
return new Response(body, {
|
|
51
|
+
headers: responseHeaders,
|
|
52
|
+
status: responseStatusCode,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
@@ -38,6 +38,7 @@ type ServerBundlesBuildManifest = BaseBuildManifest & {
|
|
|
38
38
|
};
|
|
39
39
|
type ServerModuleFormat = "esm" | "cjs";
|
|
40
40
|
interface FutureConfig {
|
|
41
|
+
unstable_enableNodeReadableStream: boolean;
|
|
41
42
|
unstable_optimizeDeps: boolean;
|
|
42
43
|
}
|
|
43
44
|
type SplitRouteModulesOption = boolean | "enforce";
|
package/dist/config.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
|
|
2
|
-
import { i as ServerBundlesFunction, n as Preset, r as ReactRouterConfig, t as BuildManifest } from "./config-
|
|
2
|
+
import { i as ServerBundlesFunction, n as Preset, r as ReactRouterConfig, t as BuildManifest } from "./config-t89niiFv.js";
|
|
3
3
|
export type { BuildManifest, ReactRouterConfig as Config, Preset, ServerBundlesFunction };
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v8.0
|
|
2
|
+
* @react-router/dev v8.2.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 {
|
|
11
|
+
import { _ as getVite, v as preloadVite } from "./typegen-CNpfI4aI.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
|
package/dist/routes.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v8.0
|
|
2
|
+
* @react-router/dev v8.2.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-
|
|
11
|
+
import { a as prefix, i as layout, n as getAppDirectory, o as relative, r as index, s as route } from "./routes-CdiIrVIn.js";
|
|
12
12
|
export { getAppDirectory, index, layout, prefix, relative, route };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v8.0
|
|
2
|
+
* @react-router/dev v8.2.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-
|
|
11
|
+
import { c as setAppDirectory, l as validateRouteConfig, t as configRoutesToRouteManifest, u as invariant } from "./routes-CdiIrVIn.js";
|
|
12
12
|
import { createRequire } from "node:module";
|
|
13
13
|
import colors from "picocolors";
|
|
14
14
|
import fs from "node:fs";
|
|
@@ -66,6 +66,16 @@ function defineOptimizeDepsCompilerOptions(options) {
|
|
|
66
66
|
let vite = getVite();
|
|
67
67
|
return parseInt(vite.version.split(".")[0], 10) >= 8 ? { rolldownOptions: options.rolldown } : { esbuildOptions: options.esbuild };
|
|
68
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Read the user-supplied build options from either `rollupOptions` (Vite <=7)
|
|
71
|
+
* or `rolldownOptions` (Vite >=8).
|
|
72
|
+
*/
|
|
73
|
+
function getUserBuildRollupOptions(environment) {
|
|
74
|
+
if (environment?.build) {
|
|
75
|
+
if ("rollupOptions" in environment.build) return environment.build.rollupOptions;
|
|
76
|
+
if ("rolldownOptions" in environment.build) return environment.build.rolldownOptions;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
69
79
|
//#endregion
|
|
70
80
|
//#region vite/ssr-externals.ts
|
|
71
81
|
const ssrExternals = isReactRouterRepo() ? [
|
|
@@ -95,7 +105,7 @@ async function createContext$1({ root, mode, customLogger }) {
|
|
|
95
105
|
optimizeDeps: { noDiscovery: true },
|
|
96
106
|
css: { postcss: {} },
|
|
97
107
|
configFile: false,
|
|
98
|
-
|
|
108
|
+
envDir: false,
|
|
99
109
|
plugins: [],
|
|
100
110
|
environments: { __config_loader: {
|
|
101
111
|
consumer: "server",
|
|
@@ -118,7 +128,7 @@ async function createContext$1({ root, mode, customLogger }) {
|
|
|
118
128
|
/**
|
|
119
129
|
* Determine which package manager the user prefers.
|
|
120
130
|
*
|
|
121
|
-
* npm, pnpm and
|
|
131
|
+
* npm, pnpm, Yarn, Bun, and nub set the user agent environment variable
|
|
122
132
|
* that can be used to determine which package manager ran
|
|
123
133
|
* the command.
|
|
124
134
|
*/
|
|
@@ -131,6 +141,7 @@ const detectPackageManager = () => {
|
|
|
131
141
|
if (pkgManager === "pnpm") return "pnpm";
|
|
132
142
|
if (pkgManager === "yarn") return "yarn";
|
|
133
143
|
if (pkgManager === "bun") return "bun";
|
|
144
|
+
if (pkgManager === "nub") return "nub";
|
|
134
145
|
return;
|
|
135
146
|
} catch {
|
|
136
147
|
return;
|
|
@@ -283,7 +294,10 @@ async function resolveConfig({ root, viteRunnerContext, reactRouterConfigFile, s
|
|
|
283
294
|
if ("unstable_trailingSlashAwareDataRequests" in futureConfig || "v8_trailingSlashAwareDataRequests" in futureConfig) return err("The `future.v8_trailingSlashAwareDataRequests` flag has been removed because trailing slash-aware data requests are now the default behavior");
|
|
284
295
|
if ("unstable_subResourceIntegrity" in futureConfig) return err("The `future.unstable_subResourceIntegrity` flag has been stabilized and moved to a top-level `config.subResourceIntegrity` field");
|
|
285
296
|
}
|
|
286
|
-
let future = {
|
|
297
|
+
let future = {
|
|
298
|
+
unstable_enableNodeReadableStream: userAndPresetConfigs.future?.unstable_enableNodeReadableStream ?? false,
|
|
299
|
+
unstable_optimizeDeps: userAndPresetConfigs.future?.unstable_optimizeDeps ?? false
|
|
300
|
+
};
|
|
287
301
|
let allowedActionOrigins = userAndPresetConfigs.allowedActionOrigins ?? false;
|
|
288
302
|
let splitRouteModules = userAndPresetConfigs.splitRouteModules ?? true;
|
|
289
303
|
let subResourceIntegrity = userAndPresetConfigs.subResourceIntegrity ?? false;
|
|
@@ -432,7 +446,6 @@ async function resolveEntryFiles({ rootDirectory, reactRouterConfig }) {
|
|
|
432
446
|
if (!packageJsonPath) throw new Error(`Could not find package.json in ${rootDirectory} or any of its parent directories. Please add a package.json, or provide a custom entry.server.tsx/jsx file in your app directory.`);
|
|
433
447
|
let packageJsonDirectory = path.dirname(packageJsonPath);
|
|
434
448
|
let deps = (await readPackageJSON(packageJsonDirectory)).dependencies ?? {};
|
|
435
|
-
if (!deps["@react-router/node"]) throw new Error(`Could not determine server runtime. Please install @react-router/node, or provide a custom entry.server.tsx/jsx file in your app directory.`);
|
|
436
449
|
if (!deps["isbot"]) {
|
|
437
450
|
console.log("adding `isbot@5` to your package.json, you should commit this change");
|
|
438
451
|
await updatePackage(packageJsonPath, (pkg) => {
|
|
@@ -445,7 +458,7 @@ async function resolveEntryFiles({ rootDirectory, reactRouterConfig }) {
|
|
|
445
458
|
stdio: "inherit"
|
|
446
459
|
});
|
|
447
460
|
}
|
|
448
|
-
entryServerFile = `entry.server.node.tsx`;
|
|
461
|
+
entryServerFile = hasNodeDependency(deps) && !reactRouterConfig.future.unstable_enableNodeReadableStream ? `entry.server.node.tsx` : `entry.server.web.tsx`;
|
|
449
462
|
}
|
|
450
463
|
return {
|
|
451
464
|
entryClientFilePath: userEntryClientFile ? path.resolve(reactRouterConfig.appDirectory, userEntryClientFile) : path.resolve(defaultsDirectory, entryClientFile),
|
|
@@ -478,6 +491,9 @@ const entryExts = [
|
|
|
478
491
|
".mjs",
|
|
479
492
|
".mts"
|
|
480
493
|
];
|
|
494
|
+
function hasNodeDependency(deps) {
|
|
495
|
+
return !deps || Boolean(deps["@react-router/node"] || deps["@react-router/express"] || deps["@react-router/serve"]);
|
|
496
|
+
}
|
|
481
497
|
function isEntryFile(entryBasename, filename) {
|
|
482
498
|
return entryExts.some((ext) => filename === `${entryBasename}${ext}`);
|
|
483
499
|
}
|
|
@@ -543,10 +559,14 @@ var babel_exports = /* @__PURE__ */ __exportAll({
|
|
|
543
559
|
generate: () => generate,
|
|
544
560
|
parse: () => parse$1,
|
|
545
561
|
t: () => t$1,
|
|
546
|
-
traverse: () => traverse
|
|
562
|
+
traverse: () => traverse,
|
|
563
|
+
unwrapDefault: () => unwrapDefault
|
|
547
564
|
});
|
|
548
|
-
|
|
549
|
-
|
|
565
|
+
function unwrapDefault(value) {
|
|
566
|
+
return value.default ?? value;
|
|
567
|
+
}
|
|
568
|
+
const traverse = unwrapDefault(_traverse);
|
|
569
|
+
const generate = unwrapDefault(_generate);
|
|
550
570
|
//#endregion
|
|
551
571
|
//#region typegen/params.ts
|
|
552
572
|
function parse(fullpath) {
|
|
@@ -862,4 +882,4 @@ async function watch(rootDirectory, { mode, logger, rsc }) {
|
|
|
862
882
|
return { close: async () => await ctx.configLoader.close() };
|
|
863
883
|
}
|
|
864
884
|
//#endregion
|
|
865
|
-
export { t$1 as a, createConfigLoader as c,
|
|
885
|
+
export { getVite as _, t$1 as a, createConfigLoader as c, resolveEntryFiles as d, resolveRSCEntryFiles as f, getUserBuildRollupOptions as g, defineOptimizeDepsCompilerOptions as h, parse$1 as i, hasNodeDependency as l, defineCompilerOptions as m, watch as n, traverse as o, ssrExternals as p, generate as r, configRouteToBranchRoute as s, run as t, loadConfig as u, preloadVite as v };
|
package/dist/vite.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v8.0
|
|
2
|
+
* @react-router/dev v8.2.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
|
|
12
|
-
import { u as invariant } from "./routes-
|
|
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-CNpfI4aI.js";
|
|
12
|
+
import { u as invariant } from "./routes-CdiIrVIn.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
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
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
|
-
|
|
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 (!hasNodeDependency(pkgJson.dependencies)) {
|
|
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: {
|
|
@@ -2579,7 +2597,7 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
|
|
|
2579
2597
|
ssrEmitAssets: true,
|
|
2580
2598
|
copyPublicDir: false,
|
|
2581
2599
|
rollupOptions: {
|
|
2582
|
-
input: viteUserConfig.environments?.ssr?.
|
|
2600
|
+
input: getUserBuildRollupOptions(viteUserConfig.environments?.ssr)?.input ?? virtual$1.serverBuild.id,
|
|
2583
2601
|
output: {
|
|
2584
2602
|
entryFileNames: serverBuildFile,
|
|
2585
2603
|
format: serverModuleFormat
|
|
@@ -2596,7 +2614,7 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
|
|
|
2596
2614
|
let code = readFileSync(routeFilePath, "utf-8");
|
|
2597
2615
|
return [`${routeFilePath}${BUILD_CLIENT_ROUTE_QUERY_STRING}`, ...ctx.reactRouterConfig.splitRouteModules && !isRootRoute ? routeChunkExportNames.map((exportName) => code.includes(exportName) ? getRouteChunkModuleId(routeFilePath, exportName) : null) : []].filter(isNonNullable);
|
|
2598
2616
|
})],
|
|
2599
|
-
output: viteUserConfig?.environments?.client?.
|
|
2617
|
+
output: getUserBuildRollupOptions(viteUserConfig?.environments?.client)?.output ?? { entryFileNames: ({ moduleIds }) => {
|
|
2600
2618
|
let routeChunkModuleId = moduleIds.find(isRouteChunkModuleId);
|
|
2601
2619
|
let routeChunkName = routeChunkModuleId ? getRouteChunkNameFromModuleId(routeChunkModuleId)?.replace("unstable_", "") : null;
|
|
2602
2620
|
let routeChunkSuffix = routeChunkName ? `-${kebabCase(routeChunkName)}` : "";
|
package/package.json
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-router/dev",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "8.0
|
|
4
|
+
"version": "8.2.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
|
|
108
|
+
"@react-router/node": "8.2.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": "
|
|
114
|
-
"
|
|
130
|
+
"@react-router/serve": "8.2.0",
|
|
131
|
+
"react-router": "^8.2.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
|
|
123
|
-
"react-router": "^8.0
|
|
139
|
+
"@react-router/serve": "^8.2.0",
|
|
140
|
+
"react-router": "^8.2.0"
|
|
124
141
|
},
|
|
125
142
|
"peerDependenciesMeta": {
|
|
126
143
|
"@vitejs/plugin-rsc": {
|