@react-router/dev 7.0.2 → 7.1.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 +20 -1
- package/bin.js +13 -0
- package/dist/cli/index.js +41 -32
- package/dist/config/defaults/entry.server.node.tsx +5 -7
- package/dist/config.js +1 -1
- package/dist/routes.js +1 -1
- package/dist/vite/cloudflare.js +1 -1
- package/dist/vite.js +204 -148
- package/package.json +10 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# `@react-router/dev`
|
|
2
2
|
|
|
3
|
+
## 7.1.0-pre.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Add support for Vite v6 ([#12469](https://github.com/remix-run/react-router/pull/12469))
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Properly initialize `NODE_ENV` if not already set for compatibility with React 19 ([#12578](https://github.com/remix-run/react-router/pull/12578))
|
|
12
|
+
- Remove the leftover/unused `abortDelay` prop from `ServerRouter` and update the default `entry.server.tsx` to use the new `streamTimeout` value for Single Fetch ([#12478](https://github.com/remix-run/react-router/pull/12478))
|
|
13
|
+
|
|
14
|
+
- The `abortDelay` functionality was removed in v7 as it was coupled to the `defer` implementation from Remix v2, but this removal of this prop was missed
|
|
15
|
+
- If you were still using this prop in your `entry.server` file, it's likely your app is not aborting streams as you would expect and you will need to adopt the new [`streamTimeout`](https://reactrouter.com/explanation/special-files#streamtimeout) value introduced with Single Fetch
|
|
16
|
+
|
|
17
|
+
- Updated dependencies:
|
|
18
|
+
- `react-router@7.1.0-pre.0`
|
|
19
|
+
- `@react-router/node@7.1.0-pre.0`
|
|
20
|
+
- `@react-router/serve@7.1.0-pre.0`
|
|
21
|
+
|
|
3
22
|
## 7.0.2
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
|
@@ -44,7 +63,7 @@
|
|
|
44
63
|
+import { cloudflareDevProxy } from "@react-router/dev/vite/cloudflare";
|
|
45
64
|
```
|
|
46
65
|
|
|
47
|
-
- Remove
|
|
66
|
+
- Remove single_fetch future flag. ([#11522](https://github.com/remix-run/react-router/pull/11522))
|
|
48
67
|
|
|
49
68
|
- update minimum node version to 18 ([#11690](https://github.com/remix-run/react-router/pull/11690))
|
|
50
69
|
|
package/bin.js
CHANGED
|
@@ -1,2 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
let arg = require("arg");
|
|
3
|
+
|
|
4
|
+
// Minimal replication of our actual parsing in `run.ts`. If not already set,
|
|
5
|
+
// default `NODE_ENV` so React loads the proper version in it's CJS entry script.
|
|
6
|
+
// We have to do this before importing `run.ts` since that is what imports
|
|
7
|
+
// `react` (indirectly via `react-router`)
|
|
8
|
+
let args = arg({}, { argv: process.argv.slice(2) });
|
|
9
|
+
if (args._[0] === "dev") {
|
|
10
|
+
process.env.NODE_ENV = process.env.NODE_ENV ?? "development";
|
|
11
|
+
} else {
|
|
12
|
+
process.env.NODE_ENV = process.env.NODE_ENV ?? "production";
|
|
13
|
+
}
|
|
14
|
+
|
|
2
15
|
require("./dist/cli/index");
|
package/dist/cli/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* @react-router/dev v7.0.
|
|
3
|
+
* @react-router/dev v7.1.0-pre.0
|
|
4
4
|
*
|
|
5
5
|
* Copyright (c) Remix Software Inc.
|
|
6
6
|
*
|
|
@@ -100,11 +100,11 @@ async function createContext(viteConfig = {}) {
|
|
|
100
100
|
const runner = new import_client.ViteNodeRunner({
|
|
101
101
|
root: devServer.config.root,
|
|
102
102
|
base: devServer.config.base,
|
|
103
|
-
fetchModule(
|
|
104
|
-
return server.fetchModule(
|
|
103
|
+
fetchModule(id) {
|
|
104
|
+
return server.fetchModule(id);
|
|
105
105
|
},
|
|
106
|
-
resolveId(
|
|
107
|
-
return server.resolveId(
|
|
106
|
+
resolveId(id, importer) {
|
|
107
|
+
return server.resolveId(id, importer);
|
|
108
108
|
}
|
|
109
109
|
});
|
|
110
110
|
return { devServer, server, runner };
|
|
@@ -160,24 +160,24 @@ ${message}`
|
|
|
160
160
|
function configRoutesToRouteManifest(appDirectory, routes2, rootId = "root") {
|
|
161
161
|
let routeManifest = {};
|
|
162
162
|
function walk(route, parentId) {
|
|
163
|
-
let
|
|
163
|
+
let id = route.id || createRouteId(route.file);
|
|
164
164
|
let manifestItem = {
|
|
165
|
-
id
|
|
165
|
+
id,
|
|
166
166
|
parentId,
|
|
167
167
|
file: Path.isAbsolute(route.file) ? Path.relative(appDirectory, route.file) : route.file,
|
|
168
168
|
path: route.path,
|
|
169
169
|
index: route.index,
|
|
170
170
|
caseSensitive: route.caseSensitive
|
|
171
171
|
};
|
|
172
|
-
if (routeManifest.hasOwnProperty(
|
|
172
|
+
if (routeManifest.hasOwnProperty(id)) {
|
|
173
173
|
throw new Error(
|
|
174
|
-
`Unable to define routes with duplicate route id: "${
|
|
174
|
+
`Unable to define routes with duplicate route id: "${id}"`
|
|
175
175
|
);
|
|
176
176
|
}
|
|
177
|
-
routeManifest[
|
|
177
|
+
routeManifest[id] = manifestItem;
|
|
178
178
|
if (route.children) {
|
|
179
179
|
for (let child of route.children) {
|
|
180
|
-
walk(child,
|
|
180
|
+
walk(child, id);
|
|
181
181
|
}
|
|
182
182
|
}
|
|
183
183
|
}
|
|
@@ -808,17 +808,24 @@ var init_styles = __esm({
|
|
|
808
808
|
path3 = __toESM(require("path"));
|
|
809
809
|
import_react_router = require("react-router");
|
|
810
810
|
init_resolve_file_url();
|
|
811
|
+
init_import_vite_esm_sync();
|
|
811
812
|
cssFileRegExp = /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/;
|
|
812
813
|
cssModulesRegExp = new RegExp(`\\.module${cssFileRegExp.source}`);
|
|
813
814
|
}
|
|
814
815
|
});
|
|
815
816
|
|
|
816
|
-
// vite/
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
817
|
+
// vite/virtual-module.ts
|
|
818
|
+
function create(name) {
|
|
819
|
+
let id = `virtual:react-router/${name}`;
|
|
820
|
+
return {
|
|
821
|
+
id,
|
|
822
|
+
resolvedId: `\0${id}`,
|
|
823
|
+
url: `/@id/__x00__${id}`
|
|
824
|
+
};
|
|
825
|
+
}
|
|
826
|
+
var init_virtual_module = __esm({
|
|
827
|
+
"vite/virtual-module.ts"() {
|
|
820
828
|
"use strict";
|
|
821
|
-
id = (name) => `virtual:react-router/${name}`;
|
|
822
829
|
}
|
|
823
830
|
});
|
|
824
831
|
|
|
@@ -840,14 +847,14 @@ var init_remove_exports = __esm({
|
|
|
840
847
|
});
|
|
841
848
|
|
|
842
849
|
// vite/with-props.ts
|
|
843
|
-
var import_dedent2,
|
|
850
|
+
var import_dedent2, vmod;
|
|
844
851
|
var init_with_props = __esm({
|
|
845
852
|
"vite/with-props.ts"() {
|
|
846
853
|
"use strict";
|
|
847
854
|
import_dedent2 = __toESM(require("dedent"));
|
|
848
855
|
init_babel();
|
|
849
|
-
|
|
850
|
-
|
|
856
|
+
init_virtual_module();
|
|
857
|
+
vmod = create("with-props");
|
|
851
858
|
}
|
|
852
859
|
});
|
|
853
860
|
|
|
@@ -912,7 +919,7 @@ function findConfig(dir, basename2, extensions) {
|
|
|
912
919
|
}
|
|
913
920
|
return void 0;
|
|
914
921
|
}
|
|
915
|
-
var import_node_crypto, path4, url, fse, babel, import_react_router2, import_es_module_lexer, import_jsesc, import_picocolors3,
|
|
922
|
+
var import_node_crypto, path4, url, fse, babel, import_react_router2, import_es_module_lexer, import_jsesc, import_picocolors3, virtualHmrRuntime, virtualInjectHmrRuntime, virtual, getServerBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER, REACT_REFRESH_FOOTER;
|
|
916
923
|
var init_plugin = __esm({
|
|
917
924
|
"vite/plugin.ts"() {
|
|
918
925
|
"use strict";
|
|
@@ -930,18 +937,20 @@ var init_plugin = __esm({
|
|
|
930
937
|
init_babel();
|
|
931
938
|
init_node_adapter();
|
|
932
939
|
init_styles();
|
|
933
|
-
|
|
940
|
+
init_virtual_module();
|
|
934
941
|
init_resolve_file_url();
|
|
935
942
|
init_combine_urls();
|
|
936
943
|
init_remove_exports();
|
|
937
944
|
init_import_vite_esm_sync();
|
|
938
945
|
init_config();
|
|
939
946
|
init_with_props();
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
947
|
+
virtualHmrRuntime = create("hmr-runtime");
|
|
948
|
+
virtualInjectHmrRuntime = create("inject-hmr-runtime");
|
|
949
|
+
virtual = {
|
|
950
|
+
serverBuild: create("server-build"),
|
|
951
|
+
serverManifest: create("server-manifest"),
|
|
952
|
+
browserManifest: create("browser-manifest")
|
|
953
|
+
};
|
|
945
954
|
getServerBuildDirectory = (ctx) => path4.join(
|
|
946
955
|
ctx.reactRouterConfig.buildDirectory,
|
|
947
956
|
"server",
|
|
@@ -956,7 +965,7 @@ var init_plugin = __esm({
|
|
|
956
965
|
defaultEntries = fse.readdirSync(defaultEntriesDir).map((filename3) => path4.join(defaultEntriesDir, filename3));
|
|
957
966
|
invariant(defaultEntries.length > 0, "No default entries found");
|
|
958
967
|
REACT_REFRESH_HEADER = `
|
|
959
|
-
import RefreshRuntime from "${
|
|
968
|
+
import RefreshRuntime from "${virtualHmrRuntime.id}";
|
|
960
969
|
|
|
961
970
|
const inWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
|
|
962
971
|
let prevRefreshReg;
|
|
@@ -1039,8 +1048,8 @@ __export(build_exports, {
|
|
|
1039
1048
|
});
|
|
1040
1049
|
function getAddressableRoutes(routes2) {
|
|
1041
1050
|
let nonAddressableIds = /* @__PURE__ */ new Set();
|
|
1042
|
-
for (let
|
|
1043
|
-
let route = routes2[
|
|
1051
|
+
for (let id in routes2) {
|
|
1052
|
+
let route = routes2[id];
|
|
1044
1053
|
if (route.index) {
|
|
1045
1054
|
invariant(
|
|
1046
1055
|
route.parentId,
|
|
@@ -1049,7 +1058,7 @@ function getAddressableRoutes(routes2) {
|
|
|
1049
1058
|
nonAddressableIds.add(route.parentId);
|
|
1050
1059
|
}
|
|
1051
1060
|
if (typeof route.path !== "string" && !route.index) {
|
|
1052
|
-
nonAddressableIds.add(
|
|
1061
|
+
nonAddressableIds.add(id);
|
|
1053
1062
|
}
|
|
1054
1063
|
}
|
|
1055
1064
|
return Object.values(routes2).filter(
|
|
@@ -1080,12 +1089,12 @@ async function getServerBuilds(ctx) {
|
|
|
1080
1089
|
let { normalizePath } = await import("vite");
|
|
1081
1090
|
let resolvedAppDirectory = import_node_path2.default.resolve(rootDirectory, appDirectory);
|
|
1082
1091
|
let rootRelativeRoutes = Object.fromEntries(
|
|
1083
|
-
Object.entries(routes2).map(([
|
|
1092
|
+
Object.entries(routes2).map(([id, route]) => {
|
|
1084
1093
|
let filePath = import_node_path2.default.join(resolvedAppDirectory, route.file);
|
|
1085
1094
|
let rootRelativeFilePath = normalizePath(
|
|
1086
1095
|
import_node_path2.default.relative(rootDirectory, filePath)
|
|
1087
1096
|
);
|
|
1088
|
-
return [
|
|
1097
|
+
return [id, { ...route, file: rootRelativeFilePath }];
|
|
1089
1098
|
})
|
|
1090
1099
|
);
|
|
1091
1100
|
let buildManifest = {
|
|
@@ -7,7 +7,7 @@ import { isbot } from "isbot";
|
|
|
7
7
|
import type { RenderToPipeableStreamOptions } from "react-dom/server";
|
|
8
8
|
import { renderToPipeableStream } from "react-dom/server";
|
|
9
9
|
|
|
10
|
-
const
|
|
10
|
+
export const streamTimeout = 5_000;
|
|
11
11
|
|
|
12
12
|
export default function handleRequest(
|
|
13
13
|
request: Request,
|
|
@@ -28,11 +28,7 @@ export default function handleRequest(
|
|
|
28
28
|
: "onShellReady";
|
|
29
29
|
|
|
30
30
|
const { pipe, abort } = renderToPipeableStream(
|
|
31
|
-
<ServerRouter
|
|
32
|
-
context={routerContext}
|
|
33
|
-
url={request.url}
|
|
34
|
-
abortDelay={ABORT_DELAY}
|
|
35
|
-
/>,
|
|
31
|
+
<ServerRouter context={routerContext} url={request.url} />,
|
|
36
32
|
{
|
|
37
33
|
[readyOption]() {
|
|
38
34
|
shellRendered = true;
|
|
@@ -65,6 +61,8 @@ export default function handleRequest(
|
|
|
65
61
|
}
|
|
66
62
|
);
|
|
67
63
|
|
|
68
|
-
|
|
64
|
+
// Abort the rendering stream after the `streamTimeout` so it has tine to
|
|
65
|
+
// flush down the rejected boundaries
|
|
66
|
+
setTimeout(abort, streamTimeout + 1000);
|
|
69
67
|
});
|
|
70
68
|
}
|
package/dist/config.js
CHANGED
package/dist/routes.js
CHANGED
package/dist/vite/cloudflare.js
CHANGED
package/dist/vite.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v7.0.
|
|
2
|
+
* @react-router/dev v7.1.0-pre.0
|
|
3
3
|
*
|
|
4
4
|
* Copyright (c) Remix Software Inc.
|
|
5
5
|
*
|
|
@@ -47,7 +47,7 @@ module.exports = __toCommonJS(vite_exports);
|
|
|
47
47
|
// vite/plugin.ts
|
|
48
48
|
var import_node_crypto = require("crypto");
|
|
49
49
|
var path4 = __toESM(require("path"));
|
|
50
|
-
var
|
|
50
|
+
var url = __toESM(require("url"));
|
|
51
51
|
var fse = __toESM(require("fs-extra"));
|
|
52
52
|
var babel = __toESM(require("@babel/core"));
|
|
53
53
|
var import_react_router2 = require("react-router");
|
|
@@ -119,11 +119,11 @@ async function createContext(viteConfig = {}) {
|
|
|
119
119
|
const runner = new import_client.ViteNodeRunner({
|
|
120
120
|
root: devServer.config.root,
|
|
121
121
|
base: devServer.config.base,
|
|
122
|
-
fetchModule(
|
|
123
|
-
return server.fetchModule(
|
|
122
|
+
fetchModule(id) {
|
|
123
|
+
return server.fetchModule(id);
|
|
124
124
|
},
|
|
125
|
-
resolveId(
|
|
126
|
-
return server.resolveId(
|
|
125
|
+
resolveId(id, importer) {
|
|
126
|
+
return server.resolveId(id, importer);
|
|
127
127
|
}
|
|
128
128
|
});
|
|
129
129
|
return { devServer, server, runner };
|
|
@@ -195,24 +195,24 @@ ${message}`
|
|
|
195
195
|
function configRoutesToRouteManifest(appDirectory, routes, rootId = "root") {
|
|
196
196
|
let routeManifest = {};
|
|
197
197
|
function walk(route, parentId) {
|
|
198
|
-
let
|
|
198
|
+
let id = route.id || createRouteId(route.file);
|
|
199
199
|
let manifestItem = {
|
|
200
|
-
id
|
|
200
|
+
id,
|
|
201
201
|
parentId,
|
|
202
202
|
file: Path.isAbsolute(route.file) ? Path.relative(appDirectory, route.file) : route.file,
|
|
203
203
|
path: route.path,
|
|
204
204
|
index: route.index,
|
|
205
205
|
caseSensitive: route.caseSensitive
|
|
206
206
|
};
|
|
207
|
-
if (routeManifest.hasOwnProperty(
|
|
207
|
+
if (routeManifest.hasOwnProperty(id)) {
|
|
208
208
|
throw new Error(
|
|
209
|
-
`Unable to define routes with duplicate route id: "${
|
|
209
|
+
`Unable to define routes with duplicate route id: "${id}"`
|
|
210
210
|
);
|
|
211
211
|
}
|
|
212
|
-
routeManifest[
|
|
212
|
+
routeManifest[id] = manifestItem;
|
|
213
213
|
if (route.children) {
|
|
214
214
|
for (let child of route.children) {
|
|
215
|
-
walk(child,
|
|
215
|
+
walk(child, id);
|
|
216
216
|
}
|
|
217
217
|
}
|
|
218
218
|
}
|
|
@@ -812,7 +812,7 @@ function fromNodeRequest(nodeReq, nodeRes) {
|
|
|
812
812
|
nodeReq.originalUrl,
|
|
813
813
|
"Expected `nodeReq.originalUrl` to be defined"
|
|
814
814
|
);
|
|
815
|
-
let
|
|
815
|
+
let url2 = new URL(nodeReq.originalUrl, origin);
|
|
816
816
|
let controller = new AbortController();
|
|
817
817
|
let init = {
|
|
818
818
|
method: nodeReq.method,
|
|
@@ -825,7 +825,7 @@ function fromNodeRequest(nodeReq, nodeRes) {
|
|
|
825
825
|
init.body = (0, import_node.createReadableStreamFromReadable)(nodeReq);
|
|
826
826
|
init.duplex = "half";
|
|
827
827
|
}
|
|
828
|
-
return new Request(
|
|
828
|
+
return new Request(url2.href, init);
|
|
829
829
|
}
|
|
830
830
|
async function toNodeRequest(res, nodeRes) {
|
|
831
831
|
nodeRes.statusCode = res.status;
|
|
@@ -871,8 +871,8 @@ var cssModulesRegExp = new RegExp(`\\.module${cssFileRegExp.source}`);
|
|
|
871
871
|
var isCssFile = (file) => cssFileRegExp.test(file);
|
|
872
872
|
var isCssModulesFile = (file) => cssModulesRegExp.test(file);
|
|
873
873
|
var cssUrlParamsWithoutSideEffects = ["url", "inline", "raw", "inline-css"];
|
|
874
|
-
var isCssUrlWithoutSideEffects = (
|
|
875
|
-
let queryString =
|
|
874
|
+
var isCssUrlWithoutSideEffects = (url2) => {
|
|
875
|
+
let queryString = url2.split("?")[1];
|
|
876
876
|
if (!queryString) {
|
|
877
877
|
return false;
|
|
878
878
|
}
|
|
@@ -880,19 +880,22 @@ var isCssUrlWithoutSideEffects = (url3) => {
|
|
|
880
880
|
for (let paramWithoutSideEffects of cssUrlParamsWithoutSideEffects) {
|
|
881
881
|
if (
|
|
882
882
|
// Parameter is blank and not explicitly set, i.e. "?url", not "?url="
|
|
883
|
-
params.get(paramWithoutSideEffects) === "" && !
|
|
883
|
+
params.get(paramWithoutSideEffects) === "" && !url2.includes(`?${paramWithoutSideEffects}=`) && !url2.includes(`&${paramWithoutSideEffects}=`)
|
|
884
884
|
) {
|
|
885
885
|
return true;
|
|
886
886
|
}
|
|
887
887
|
}
|
|
888
888
|
return false;
|
|
889
889
|
};
|
|
890
|
+
var injectQuery = (url2, query) => url2.includes("?") ? url2.replace("?", `?${query}&`) : `${url2}?${query}`;
|
|
890
891
|
var getStylesForFiles = async ({
|
|
891
892
|
viteDevServer,
|
|
892
893
|
rootDirectory,
|
|
893
894
|
cssModulesManifest,
|
|
894
895
|
files
|
|
895
896
|
}) => {
|
|
897
|
+
let vite2 = importViteEsmSync();
|
|
898
|
+
let viteMajor = parseInt(vite2.version.split(".")[0], 10);
|
|
896
899
|
let styles = {};
|
|
897
900
|
let deps = /* @__PURE__ */ new Set();
|
|
898
901
|
try {
|
|
@@ -921,7 +924,15 @@ var getStylesForFiles = async ({
|
|
|
921
924
|
for (let dep of deps) {
|
|
922
925
|
if (dep.file && isCssFile(dep.file) && !isCssUrlWithoutSideEffects(dep.url)) {
|
|
923
926
|
try {
|
|
924
|
-
let css = isCssModulesFile(dep.file) ? cssModulesManifest[dep.file] : (await viteDevServer.ssrLoadModule(
|
|
927
|
+
let css = isCssModulesFile(dep.file) ? cssModulesManifest[dep.file] : (await viteDevServer.ssrLoadModule(
|
|
928
|
+
// We need the ?inline query in Vite v6 when loading CSS in SSR
|
|
929
|
+
// since it does not expose the default export for CSS in a
|
|
930
|
+
// server environment. This is to align with non-SSR
|
|
931
|
+
// environments. For backwards compatibility with v5 we keep
|
|
932
|
+
// using the URL without ?inline query because the HMR code was
|
|
933
|
+
// relying on the implicit SSR-client module graph relationship.
|
|
934
|
+
viteMajor >= 6 ? injectQuery(dep.url, "inline") : dep.url
|
|
935
|
+
)).default;
|
|
925
936
|
if (css === void 0) {
|
|
926
937
|
throw new Error();
|
|
927
938
|
}
|
|
@@ -945,8 +956,8 @@ var findDeps = async (vite2, node, deps) => {
|
|
|
945
956
|
await findDeps(vite2, node2, deps);
|
|
946
957
|
}
|
|
947
958
|
}
|
|
948
|
-
async function addFromUrl(
|
|
949
|
-
let node2 = await vite2.moduleGraph.getModuleByUrl(
|
|
959
|
+
async function addFromUrl(url2) {
|
|
960
|
+
let node2 = await vite2.moduleGraph.getModuleByUrl(url2);
|
|
950
961
|
if (node2) {
|
|
951
962
|
await addFromNode(node2);
|
|
952
963
|
}
|
|
@@ -954,7 +965,7 @@ var findDeps = async (vite2, node, deps) => {
|
|
|
954
965
|
if (node.ssrTransformResult) {
|
|
955
966
|
if (node.ssrTransformResult.deps) {
|
|
956
967
|
node.ssrTransformResult.deps.forEach(
|
|
957
|
-
(
|
|
968
|
+
(url2) => branches.push(addFromUrl(url2))
|
|
958
969
|
);
|
|
959
970
|
}
|
|
960
971
|
} else {
|
|
@@ -988,14 +999,14 @@ var getStylesForUrl = async ({
|
|
|
988
999
|
entryClientFilePath,
|
|
989
1000
|
cssModulesManifest,
|
|
990
1001
|
build,
|
|
991
|
-
url:
|
|
1002
|
+
url: url2
|
|
992
1003
|
}) => {
|
|
993
|
-
if (
|
|
1004
|
+
if (url2 === void 0 || url2.includes("?_data=")) {
|
|
994
1005
|
return void 0;
|
|
995
1006
|
}
|
|
996
1007
|
let routes = createRoutes(build.routes);
|
|
997
1008
|
let appPath = path3.relative(process.cwd(), reactRouterConfig.appDirectory);
|
|
998
|
-
let documentRouteFiles = (0, import_react_router.matchRoutes)(routes,
|
|
1009
|
+
let documentRouteFiles = (0, import_react_router.matchRoutes)(routes, url2, build.basename)?.map(
|
|
999
1010
|
(match) => path3.resolve(appPath, reactRouterConfig.routes[match.route.id].file)
|
|
1000
1011
|
) ?? [];
|
|
1001
1012
|
let styles = await getStylesForFiles({
|
|
@@ -1012,10 +1023,15 @@ var getStylesForUrl = async ({
|
|
|
1012
1023
|
return styles;
|
|
1013
1024
|
};
|
|
1014
1025
|
|
|
1015
|
-
// vite/
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1026
|
+
// vite/virtual-module.ts
|
|
1027
|
+
function create(name) {
|
|
1028
|
+
let id = `virtual:react-router/${name}`;
|
|
1029
|
+
return {
|
|
1030
|
+
id,
|
|
1031
|
+
resolvedId: `\0${id}`,
|
|
1032
|
+
url: `/@id/__x00__${id}`
|
|
1033
|
+
};
|
|
1034
|
+
}
|
|
1019
1035
|
|
|
1020
1036
|
// vite/combine-urls.ts
|
|
1021
1037
|
function combineURLs(baseURL, relativeURL) {
|
|
@@ -1064,14 +1080,14 @@ var removeExports = (ast, exportsToRemove) => {
|
|
|
1064
1080
|
}
|
|
1065
1081
|
}
|
|
1066
1082
|
if (path5.node.declaration?.type === "FunctionDeclaration") {
|
|
1067
|
-
let
|
|
1068
|
-
if (
|
|
1083
|
+
let id = path5.node.declaration.id;
|
|
1084
|
+
if (id && exportsToRemove.includes(id.name)) {
|
|
1069
1085
|
markedForRemoval.add(path5);
|
|
1070
1086
|
}
|
|
1071
1087
|
}
|
|
1072
1088
|
if (path5.node.declaration?.type === "ClassDeclaration") {
|
|
1073
|
-
let
|
|
1074
|
-
if (
|
|
1089
|
+
let id = path5.node.declaration.id;
|
|
1090
|
+
if (id && exportsToRemove.includes(id.name)) {
|
|
1075
1091
|
markedForRemoval.add(path5);
|
|
1076
1092
|
}
|
|
1077
1093
|
}
|
|
@@ -1088,9 +1104,9 @@ var removeExports = (ast, exportsToRemove) => {
|
|
|
1088
1104
|
(0, import_babel_dead_code_elimination.deadCodeElimination)(ast, previouslyReferencedIdentifiers);
|
|
1089
1105
|
}
|
|
1090
1106
|
};
|
|
1091
|
-
function validateDestructuredExports(
|
|
1092
|
-
if (
|
|
1093
|
-
for (let element of
|
|
1107
|
+
function validateDestructuredExports(id, exportsToRemove) {
|
|
1108
|
+
if (id.type === "ArrayPattern") {
|
|
1109
|
+
for (let element of id.elements) {
|
|
1094
1110
|
if (!element) {
|
|
1095
1111
|
continue;
|
|
1096
1112
|
}
|
|
@@ -1105,8 +1121,8 @@ function validateDestructuredExports(id2, exportsToRemove) {
|
|
|
1105
1121
|
}
|
|
1106
1122
|
}
|
|
1107
1123
|
}
|
|
1108
|
-
if (
|
|
1109
|
-
for (let property of
|
|
1124
|
+
if (id.type === "ObjectPattern") {
|
|
1125
|
+
for (let property of id.properties) {
|
|
1110
1126
|
if (!property) {
|
|
1111
1127
|
continue;
|
|
1112
1128
|
}
|
|
@@ -1130,16 +1146,16 @@ function invalidDestructureError(name) {
|
|
|
1130
1146
|
|
|
1131
1147
|
// vite/with-props.ts
|
|
1132
1148
|
var import_dedent2 = __toESM(require("dedent"));
|
|
1133
|
-
var
|
|
1149
|
+
var vmod = create("with-props");
|
|
1134
1150
|
var NAMED_COMPONENT_EXPORTS = ["HydrateFallback", "ErrorBoundary"];
|
|
1135
1151
|
var plugin = {
|
|
1136
1152
|
name: "react-router-with-props",
|
|
1137
1153
|
enforce: "pre",
|
|
1138
|
-
resolveId(
|
|
1139
|
-
if (
|
|
1154
|
+
resolveId(id) {
|
|
1155
|
+
if (id === vmod.id) return vmod.resolvedId;
|
|
1140
1156
|
},
|
|
1141
|
-
async load(
|
|
1142
|
-
if (
|
|
1157
|
+
async load(id) {
|
|
1158
|
+
if (id !== vmod.resolvedId) return;
|
|
1143
1159
|
return import_dedent2.default`
|
|
1144
1160
|
import { createElement as h } from "react";
|
|
1145
1161
|
import { useActionData, useLoaderData, useMatches, useParams, useRouteError } from "react-router";
|
|
@@ -1201,12 +1217,12 @@ var transform = (ast) => {
|
|
|
1201
1217
|
const decl = path5.get("declaration");
|
|
1202
1218
|
if (decl.isVariableDeclaration()) {
|
|
1203
1219
|
decl.get("declarations").forEach((varDeclarator) => {
|
|
1204
|
-
const
|
|
1220
|
+
const id = varDeclarator.get("id");
|
|
1205
1221
|
const init = varDeclarator.get("init");
|
|
1206
1222
|
const expr = init.node;
|
|
1207
1223
|
if (!expr) return;
|
|
1208
|
-
if (!
|
|
1209
|
-
const { name } =
|
|
1224
|
+
if (!id.isIdentifier()) return;
|
|
1225
|
+
const { name } = id.node;
|
|
1210
1226
|
if (!NAMED_COMPONENT_EXPORTS.includes(name)) return;
|
|
1211
1227
|
const uid = getHocUid(path5, `with${name}Props`);
|
|
1212
1228
|
init.replaceWith(t.callExpression(uid, [expr]));
|
|
@@ -1214,9 +1230,9 @@ var transform = (ast) => {
|
|
|
1214
1230
|
return;
|
|
1215
1231
|
}
|
|
1216
1232
|
if (decl.isFunctionDeclaration()) {
|
|
1217
|
-
const { id
|
|
1218
|
-
if (!
|
|
1219
|
-
const { name } =
|
|
1233
|
+
const { id } = decl.node;
|
|
1234
|
+
if (!id) return;
|
|
1235
|
+
const { name } = id;
|
|
1220
1236
|
if (!NAMED_COMPONENT_EXPORTS.includes(name)) return;
|
|
1221
1237
|
const uid = getHocUid(path5, `with${name}Props`);
|
|
1222
1238
|
decl.replaceWith(
|
|
@@ -1237,7 +1253,7 @@ var transform = (ast) => {
|
|
|
1237
1253
|
hocs.map(
|
|
1238
1254
|
([name, identifier]) => t.importSpecifier(identifier, t.identifier(name))
|
|
1239
1255
|
),
|
|
1240
|
-
t.stringLiteral(
|
|
1256
|
+
t.stringLiteral(vmod.id)
|
|
1241
1257
|
)
|
|
1242
1258
|
);
|
|
1243
1259
|
}
|
|
@@ -1266,27 +1282,23 @@ var CLIENT_ROUTE_EXPORTS = [
|
|
|
1266
1282
|
"meta",
|
|
1267
1283
|
"shouldRevalidate"
|
|
1268
1284
|
];
|
|
1269
|
-
var
|
|
1270
|
-
var
|
|
1271
|
-
|
|
1272
|
-
};
|
|
1273
|
-
var serverBuildId = id("server-build");
|
|
1274
|
-
var serverManifestId = id("server-manifest");
|
|
1275
|
-
var browserManifestId = id("browser-manifest");
|
|
1276
|
-
var hmrRuntimeId = id("hmr-runtime");
|
|
1277
|
-
var injectHmrRuntimeId = id("inject-hmr-runtime");
|
|
1285
|
+
var BUILD_CLIENT_ROUTE_QUERY_STRING = "?__react-router-build-client-route";
|
|
1286
|
+
var virtualHmrRuntime = create("hmr-runtime");
|
|
1287
|
+
var virtualInjectHmrRuntime = create("inject-hmr-runtime");
|
|
1278
1288
|
var resolveRelativeRouteFilePath = (route, reactRouterConfig) => {
|
|
1279
1289
|
let vite2 = importViteEsmSync();
|
|
1280
1290
|
let file = route.file;
|
|
1281
1291
|
let fullPath = path4.resolve(reactRouterConfig.appDirectory, file);
|
|
1282
1292
|
return vite2.normalizePath(fullPath);
|
|
1283
1293
|
};
|
|
1284
|
-
var
|
|
1294
|
+
var virtual = {
|
|
1295
|
+
serverBuild: create("server-build"),
|
|
1296
|
+
serverManifest: create("server-manifest"),
|
|
1297
|
+
browserManifest: create("browser-manifest")
|
|
1298
|
+
};
|
|
1285
1299
|
var invalidateVirtualModules = (viteDevServer) => {
|
|
1286
|
-
|
|
1287
|
-
let mod = viteDevServer.moduleGraph.getModuleById(
|
|
1288
|
-
resolve3(vmod)
|
|
1289
|
-
);
|
|
1300
|
+
Object.values(virtual).forEach((vmod2) => {
|
|
1301
|
+
let mod = viteDevServer.moduleGraph.getModuleById(vmod2.resolvedId);
|
|
1290
1302
|
if (mod) {
|
|
1291
1303
|
viteDevServer.moduleGraph.invalidateModule(mod);
|
|
1292
1304
|
}
|
|
@@ -1301,7 +1313,7 @@ var resolveChunk = (ctx, viteManifest, absoluteFilePath) => {
|
|
|
1301
1313
|
let rootRelativeFilePath = vite2.normalizePath(
|
|
1302
1314
|
path4.relative(ctx.rootDirectory, absoluteFilePath)
|
|
1303
1315
|
);
|
|
1304
|
-
let entryChunk = viteManifest[rootRelativeFilePath +
|
|
1316
|
+
let entryChunk = viteManifest[rootRelativeFilePath + BUILD_CLIENT_ROUTE_QUERY_STRING] ?? viteManifest[rootRelativeFilePath];
|
|
1305
1317
|
if (!entryChunk) {
|
|
1306
1318
|
let knownManifestKeys = Object.keys(viteManifest).map((key) => '"' + key + '"').join(", ");
|
|
1307
1319
|
throw new Error(
|
|
@@ -1374,19 +1386,19 @@ var getRouteModuleExports = async (viteChildCompiler, ctx, routeFile, readRouteF
|
|
|
1374
1386
|
let ssr = true;
|
|
1375
1387
|
let { pluginContainer, moduleGraph } = viteChildCompiler;
|
|
1376
1388
|
let routePath = path4.resolve(ctx.reactRouterConfig.appDirectory, routeFile);
|
|
1377
|
-
let
|
|
1389
|
+
let url2 = resolveFileUrl(ctx, routePath);
|
|
1378
1390
|
let resolveId = async () => {
|
|
1379
|
-
let result = await pluginContainer.resolveId(
|
|
1380
|
-
if (!result) throw new Error(`Could not resolve module ID for ${
|
|
1391
|
+
let result = await pluginContainer.resolveId(url2, void 0, { ssr });
|
|
1392
|
+
if (!result) throw new Error(`Could not resolve module ID for ${url2}`);
|
|
1381
1393
|
return result.id;
|
|
1382
1394
|
};
|
|
1383
|
-
let [
|
|
1395
|
+
let [id, code] = await Promise.all([
|
|
1384
1396
|
resolveId(),
|
|
1385
1397
|
readRouteFile?.() ?? fse.readFile(routePath, "utf-8"),
|
|
1386
1398
|
// pluginContainer.transform(...) fails if we don't do this first:
|
|
1387
|
-
moduleGraph.ensureEntryFromUrl(
|
|
1399
|
+
moduleGraph.ensureEntryFromUrl(url2, ssr)
|
|
1388
1400
|
]);
|
|
1389
|
-
let transformed = await pluginContainer.transform(code,
|
|
1401
|
+
let transformed = await pluginContainer.transform(code, id, { ssr });
|
|
1390
1402
|
let [, exports2] = (0, import_es_module_lexer.parse)(transformed.code);
|
|
1391
1403
|
let exportNames = exports2.map((e) => e.n);
|
|
1392
1404
|
return exportNames;
|
|
@@ -1491,10 +1503,12 @@ var reactRouterVitePlugin = () => {
|
|
|
1491
1503
|
resolveFileUrl(
|
|
1492
1504
|
ctx,
|
|
1493
1505
|
resolveRelativeRouteFilePath(route, ctx.reactRouterConfig)
|
|
1494
|
-
)
|
|
1506
|
+
)
|
|
1495
1507
|
)};`;
|
|
1496
1508
|
}).join("\n")}
|
|
1497
|
-
export { default as assets } from ${JSON.stringify(
|
|
1509
|
+
export { default as assets } from ${JSON.stringify(
|
|
1510
|
+
virtual.serverManifest.id
|
|
1511
|
+
)};
|
|
1498
1512
|
export const assetsBuildDirectory = ${JSON.stringify(
|
|
1499
1513
|
path4.relative(
|
|
1500
1514
|
ctx.rootDirectory,
|
|
@@ -1597,8 +1611,8 @@ var reactRouterVitePlugin = () => {
|
|
|
1597
1611
|
viteConfig.build.assetsDir,
|
|
1598
1612
|
`manifest-${version}.js`
|
|
1599
1613
|
);
|
|
1600
|
-
let
|
|
1601
|
-
let nonFingerprintedValues = { url:
|
|
1614
|
+
let url2 = `${ctx.publicPath}${manifestPath}`;
|
|
1615
|
+
let nonFingerprintedValues = { url: url2, version };
|
|
1602
1616
|
let reactRouterBrowserManifest = {
|
|
1603
1617
|
...fingerprintedValues,
|
|
1604
1618
|
...nonFingerprintedValues
|
|
@@ -1634,10 +1648,10 @@ var reactRouterVitePlugin = () => {
|
|
|
1634
1648
|
caseSensitive: route.caseSensitive,
|
|
1635
1649
|
module: combineURLs(
|
|
1636
1650
|
ctx.publicPath,
|
|
1637
|
-
|
|
1651
|
+
resolveFileUrl(
|
|
1638
1652
|
ctx,
|
|
1639
1653
|
resolveRelativeRouteFilePath(route, ctx.reactRouterConfig)
|
|
1640
|
-
)
|
|
1654
|
+
)
|
|
1641
1655
|
),
|
|
1642
1656
|
hasAction: sourceExports.includes("action"),
|
|
1643
1657
|
hasLoader: sourceExports.includes("loader"),
|
|
@@ -1649,12 +1663,9 @@ var reactRouterVitePlugin = () => {
|
|
|
1649
1663
|
}
|
|
1650
1664
|
return {
|
|
1651
1665
|
version: String(Math.random()),
|
|
1652
|
-
url: combineURLs(ctx.publicPath, url
|
|
1666
|
+
url: combineURLs(ctx.publicPath, virtual.browserManifest.url),
|
|
1653
1667
|
hmr: {
|
|
1654
|
-
runtime: combineURLs(
|
|
1655
|
-
ctx.publicPath,
|
|
1656
|
-
url(injectHmrRuntimeId)
|
|
1657
|
-
)
|
|
1668
|
+
runtime: combineURLs(ctx.publicPath, virtualInjectHmrRuntime.url)
|
|
1658
1669
|
},
|
|
1659
1670
|
entry: {
|
|
1660
1671
|
module: combineURLs(
|
|
@@ -1791,7 +1802,7 @@ var reactRouterVitePlugin = () => {
|
|
|
1791
1802
|
(route) => `${path4.resolve(
|
|
1792
1803
|
ctx.reactRouterConfig.appDirectory,
|
|
1793
1804
|
route.file
|
|
1794
|
-
)}${
|
|
1805
|
+
)}${BUILD_CLIENT_ROUTE_QUERY_STRING}`
|
|
1795
1806
|
)
|
|
1796
1807
|
]
|
|
1797
1808
|
}
|
|
@@ -1810,7 +1821,7 @@ var reactRouterVitePlugin = () => {
|
|
|
1810
1821
|
rollupOptions: {
|
|
1811
1822
|
...baseRollupOptions,
|
|
1812
1823
|
preserveEntrySignatures: "exports-only",
|
|
1813
|
-
input: viteUserConfig.build?.rollupOptions?.input ??
|
|
1824
|
+
input: viteUserConfig.build?.rollupOptions?.input ?? virtual.serverBuild.id,
|
|
1814
1825
|
output: {
|
|
1815
1826
|
entryFileNames: ctx.reactRouterConfig.serverBuildFile,
|
|
1816
1827
|
format: ctx.reactRouterConfig.serverModuleFormat
|
|
@@ -1873,15 +1884,15 @@ var reactRouterVitePlugin = () => {
|
|
|
1873
1884
|
envFile: false,
|
|
1874
1885
|
plugins: [
|
|
1875
1886
|
...(childCompilerConfigFile.config.plugins ?? []).flat().filter(
|
|
1876
|
-
(plugin2) => typeof plugin2 === "object" && plugin2 !== null && "name" in plugin2 && plugin2.name !== "react-router" && plugin2.name !== "react-router
|
|
1887
|
+
(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"
|
|
1877
1888
|
)
|
|
1878
1889
|
]
|
|
1879
1890
|
});
|
|
1880
1891
|
await viteChildCompiler.pluginContainer.buildStart({});
|
|
1881
1892
|
},
|
|
1882
|
-
async transform(code,
|
|
1883
|
-
if (isCssModulesFile(
|
|
1884
|
-
cssModulesManifest[
|
|
1893
|
+
async transform(code, id) {
|
|
1894
|
+
if (isCssModulesFile(id)) {
|
|
1895
|
+
cssModulesManifest[id] = code;
|
|
1885
1896
|
}
|
|
1886
1897
|
},
|
|
1887
1898
|
buildStart() {
|
|
@@ -1905,7 +1916,7 @@ var reactRouterVitePlugin = () => {
|
|
|
1905
1916
|
(0, import_react_router2.unstable_setDevServerHooks)({
|
|
1906
1917
|
// Give the request handler access to the critical CSS in dev to avoid a
|
|
1907
1918
|
// flash of unstyled content since Vite injects CSS file contents via JS
|
|
1908
|
-
getCriticalCss: async (build,
|
|
1919
|
+
getCriticalCss: async (build, url2) => {
|
|
1909
1920
|
return getStylesForUrl({
|
|
1910
1921
|
rootDirectory: ctx.rootDirectory,
|
|
1911
1922
|
entryClientFilePath: ctx.entryClientFilePath,
|
|
@@ -1913,7 +1924,7 @@ var reactRouterVitePlugin = () => {
|
|
|
1913
1924
|
viteDevServer,
|
|
1914
1925
|
cssModulesManifest,
|
|
1915
1926
|
build,
|
|
1916
|
-
url:
|
|
1927
|
+
url: url2
|
|
1917
1928
|
});
|
|
1918
1929
|
},
|
|
1919
1930
|
// If an error is caught within the request handler, let Vite fix the
|
|
@@ -1961,7 +1972,7 @@ var reactRouterVitePlugin = () => {
|
|
|
1961
1972
|
viteDevServer.middlewares.use(async (req, res, next) => {
|
|
1962
1973
|
try {
|
|
1963
1974
|
let build = await viteDevServer.ssrLoadModule(
|
|
1964
|
-
|
|
1975
|
+
virtual.serverBuild.id
|
|
1965
1976
|
);
|
|
1966
1977
|
let handler = (0, import_react_router2.createRequestHandler)(build, "development");
|
|
1967
1978
|
let nodeHandler = async (nodeReq, nodeRes) => {
|
|
@@ -2061,11 +2072,11 @@ var reactRouterVitePlugin = () => {
|
|
|
2061
2072
|
}
|
|
2062
2073
|
},
|
|
2063
2074
|
{
|
|
2064
|
-
name: "react-router-route
|
|
2075
|
+
name: "react-router:build-client-route",
|
|
2065
2076
|
enforce: "pre",
|
|
2066
|
-
async transform(_code,
|
|
2067
|
-
if (!
|
|
2068
|
-
let routeModuleId =
|
|
2077
|
+
async transform(_code, id, options) {
|
|
2078
|
+
if (!id.endsWith(BUILD_CLIENT_ROUTE_QUERY_STRING)) return;
|
|
2079
|
+
let routeModuleId = id.replace(BUILD_CLIENT_ROUTE_QUERY_STRING, "");
|
|
2069
2080
|
let routeFileName = path4.basename(routeModuleId);
|
|
2070
2081
|
let sourceExports = await getRouteModuleExports(
|
|
2071
2082
|
viteChildCompiler,
|
|
@@ -2079,23 +2090,24 @@ var reactRouterVitePlugin = () => {
|
|
|
2079
2090
|
}
|
|
2080
2091
|
},
|
|
2081
2092
|
{
|
|
2082
|
-
name: "react-router
|
|
2093
|
+
name: "react-router:virtual-modules",
|
|
2083
2094
|
enforce: "pre",
|
|
2084
|
-
resolveId(
|
|
2085
|
-
|
|
2095
|
+
resolveId(id) {
|
|
2096
|
+
const vmod2 = Object.values(virtual).find((vmod3) => vmod3.id === id);
|
|
2097
|
+
if (vmod2) return vmod2.resolvedId;
|
|
2086
2098
|
},
|
|
2087
|
-
async load(
|
|
2088
|
-
switch (
|
|
2089
|
-
case
|
|
2099
|
+
async load(id) {
|
|
2100
|
+
switch (id) {
|
|
2101
|
+
case virtual.serverBuild.resolvedId: {
|
|
2090
2102
|
return await getServerEntry();
|
|
2091
2103
|
}
|
|
2092
|
-
case
|
|
2104
|
+
case virtual.serverManifest.resolvedId: {
|
|
2093
2105
|
let reactRouterManifest = ctx.isSsrBuild ? await ctx.getReactRouterServerManifest() : await getReactRouterManifestForDev();
|
|
2094
2106
|
return `export default ${(0, import_jsesc.default)(reactRouterManifest, {
|
|
2095
2107
|
es6: true
|
|
2096
2108
|
})};`;
|
|
2097
2109
|
}
|
|
2098
|
-
case
|
|
2110
|
+
case virtual.browserManifest.resolvedId: {
|
|
2099
2111
|
if (viteCommand === "build") {
|
|
2100
2112
|
throw new Error("This module only exists in development");
|
|
2101
2113
|
}
|
|
@@ -2109,15 +2121,15 @@ var reactRouterVitePlugin = () => {
|
|
|
2109
2121
|
}
|
|
2110
2122
|
},
|
|
2111
2123
|
{
|
|
2112
|
-
name: "react-router
|
|
2124
|
+
name: "react-router:dot-server",
|
|
2113
2125
|
enforce: "pre",
|
|
2114
|
-
async resolveId(
|
|
2126
|
+
async resolveId(id, importer, options) {
|
|
2115
2127
|
let isOptimizeDeps = viteCommand === "serve" && options?.scan === true;
|
|
2116
2128
|
if (isOptimizeDeps || options?.ssr) return;
|
|
2117
|
-
let isResolving = options?.custom?.["react-router
|
|
2129
|
+
let isResolving = options?.custom?.["react-router:dot-server"] ?? false;
|
|
2118
2130
|
if (isResolving) return;
|
|
2119
|
-
options.custom = { ...options.custom, "react-router
|
|
2120
|
-
let resolved = await this.resolve(
|
|
2131
|
+
options.custom = { ...options.custom, "react-router:dot-server": true };
|
|
2132
|
+
let resolved = await this.resolve(id, importer, options);
|
|
2121
2133
|
if (!resolved) return;
|
|
2122
2134
|
let serverFileRE = /\.server(\.[cm]?[jt]sx?)?$/;
|
|
2123
2135
|
let serverDirRE = /\/\.server\//;
|
|
@@ -2140,12 +2152,12 @@ var reactRouterVitePlugin = () => {
|
|
|
2140
2152
|
[
|
|
2141
2153
|
import_picocolors3.default.red(`Server-only module referenced by client`),
|
|
2142
2154
|
"",
|
|
2143
|
-
` '${
|
|
2155
|
+
` '${id}' imported by route '${importerShort}'`,
|
|
2144
2156
|
"",
|
|
2145
2157
|
` React Router automatically removes server-code from these exports:`,
|
|
2146
2158
|
` ${serverOnlyExports}`,
|
|
2147
2159
|
"",
|
|
2148
|
-
` But other route exports in '${importerShort}' depend on '${
|
|
2160
|
+
` But other route exports in '${importerShort}' depend on '${id}'.`,
|
|
2149
2161
|
"",
|
|
2150
2162
|
" See https://remix.run/docs/en/main/guides/vite#splitting-up-client-and-server-code",
|
|
2151
2163
|
""
|
|
@@ -2156,7 +2168,7 @@ var reactRouterVitePlugin = () => {
|
|
|
2156
2168
|
[
|
|
2157
2169
|
import_picocolors3.default.red(`Server-only module referenced by client`),
|
|
2158
2170
|
"",
|
|
2159
|
-
` '${
|
|
2171
|
+
` '${id}' imported by '${importerShort}'`,
|
|
2160
2172
|
"",
|
|
2161
2173
|
" See https://remix.run/docs/en/main/guides/vite#splitting-up-client-and-server-code",
|
|
2162
2174
|
""
|
|
@@ -2165,12 +2177,12 @@ var reactRouterVitePlugin = () => {
|
|
|
2165
2177
|
}
|
|
2166
2178
|
},
|
|
2167
2179
|
{
|
|
2168
|
-
name: "react-router
|
|
2169
|
-
async transform(code,
|
|
2180
|
+
name: "react-router:dot-client",
|
|
2181
|
+
async transform(code, id, options) {
|
|
2170
2182
|
if (!options?.ssr) return;
|
|
2171
2183
|
let clientFileRE = /\.client(\.[cm]?[jt]sx?)?$/;
|
|
2172
2184
|
let clientDirRE = /\/\.client\//;
|
|
2173
|
-
if (clientFileRE.test(
|
|
2185
|
+
if (clientFileRE.test(id) || clientDirRE.test(id)) {
|
|
2174
2186
|
let exports2 = (0, import_es_module_lexer.parse)(code)[1];
|
|
2175
2187
|
return {
|
|
2176
2188
|
code: exports2.map(
|
|
@@ -2183,9 +2195,9 @@ var reactRouterVitePlugin = () => {
|
|
|
2183
2195
|
},
|
|
2184
2196
|
plugin,
|
|
2185
2197
|
{
|
|
2186
|
-
name: "react-router
|
|
2187
|
-
async transform(code,
|
|
2188
|
-
let route = getRoute(ctx.reactRouterConfig,
|
|
2198
|
+
name: "react-router:route-exports",
|
|
2199
|
+
async transform(code, id, options) {
|
|
2200
|
+
let route = getRoute(ctx.reactRouterConfig, id);
|
|
2189
2201
|
if (!route) return;
|
|
2190
2202
|
if (!options?.ssr && !ctx.reactRouterConfig.ssr) {
|
|
2191
2203
|
let serverOnlyExports = (0, import_es_module_lexer.parse)(code)[1].map((exp) => exp.n).filter((exp) => SERVER_ONLY_ROUTE_EXPORTS.includes(exp));
|
|
@@ -2202,7 +2214,7 @@ var reactRouterVitePlugin = () => {
|
|
|
2202
2214
|
}
|
|
2203
2215
|
}
|
|
2204
2216
|
}
|
|
2205
|
-
let [filepath] =
|
|
2217
|
+
let [filepath] = id.split("?");
|
|
2206
2218
|
let ast = (0, import_parser.parse)(code, { sourceType: "module" });
|
|
2207
2219
|
if (!options?.ssr) {
|
|
2208
2220
|
removeExports(ast, SERVER_ONLY_ROUTE_EXPORTS);
|
|
@@ -2210,22 +2222,23 @@ var reactRouterVitePlugin = () => {
|
|
|
2210
2222
|
transform(ast);
|
|
2211
2223
|
return generate2(ast, {
|
|
2212
2224
|
sourceMaps: true,
|
|
2213
|
-
filename:
|
|
2225
|
+
filename: id,
|
|
2214
2226
|
sourceFileName: filepath
|
|
2215
2227
|
});
|
|
2216
2228
|
}
|
|
2217
2229
|
},
|
|
2218
2230
|
{
|
|
2219
|
-
name: "react-router
|
|
2231
|
+
name: "react-router:inject-hmr-runtime",
|
|
2220
2232
|
enforce: "pre",
|
|
2221
|
-
resolveId(
|
|
2222
|
-
if (
|
|
2223
|
-
return
|
|
2233
|
+
resolveId(id) {
|
|
2234
|
+
if (id === virtualInjectHmrRuntime.id) {
|
|
2235
|
+
return virtualInjectHmrRuntime.resolvedId;
|
|
2236
|
+
}
|
|
2224
2237
|
},
|
|
2225
|
-
async load(
|
|
2226
|
-
if (
|
|
2238
|
+
async load(id) {
|
|
2239
|
+
if (id !== virtualInjectHmrRuntime.resolvedId) return;
|
|
2227
2240
|
return [
|
|
2228
|
-
`import RefreshRuntime from "${
|
|
2241
|
+
`import RefreshRuntime from "${virtualHmrRuntime.id}"`,
|
|
2229
2242
|
"RefreshRuntime.injectIntoGlobalHook(window)",
|
|
2230
2243
|
"window.$RefreshReg$ = () => {}",
|
|
2231
2244
|
"window.$RefreshSig$ = () => (type) => type",
|
|
@@ -2234,13 +2247,13 @@ var reactRouterVitePlugin = () => {
|
|
|
2234
2247
|
}
|
|
2235
2248
|
},
|
|
2236
2249
|
{
|
|
2237
|
-
name: "react-router
|
|
2250
|
+
name: "react-router:hmr-runtime",
|
|
2238
2251
|
enforce: "pre",
|
|
2239
|
-
resolveId(
|
|
2240
|
-
if (
|
|
2252
|
+
resolveId(id) {
|
|
2253
|
+
if (id === virtualHmrRuntime.id) return virtualHmrRuntime.resolvedId;
|
|
2241
2254
|
},
|
|
2242
|
-
async load(
|
|
2243
|
-
if (
|
|
2255
|
+
async load(id) {
|
|
2256
|
+
if (id !== virtualHmrRuntime.resolvedId) return;
|
|
2244
2257
|
let reactRefreshDir = path4.dirname(
|
|
2245
2258
|
require.resolve("react-refresh/package.json")
|
|
2246
2259
|
);
|
|
@@ -2260,11 +2273,11 @@ var reactRouterVitePlugin = () => {
|
|
|
2260
2273
|
}
|
|
2261
2274
|
},
|
|
2262
2275
|
{
|
|
2263
|
-
name: "react-router
|
|
2264
|
-
async transform(code,
|
|
2276
|
+
name: "react-router:react-refresh-babel",
|
|
2277
|
+
async transform(code, id, options) {
|
|
2265
2278
|
if (viteCommand !== "serve") return;
|
|
2266
|
-
if (
|
|
2267
|
-
let [filepath] =
|
|
2279
|
+
if (id.includes("/node_modules/")) return;
|
|
2280
|
+
let [filepath] = id.split("?");
|
|
2268
2281
|
let extensionsRE = /\.(jsx?|tsx?|mdx?)$/;
|
|
2269
2282
|
if (!extensionsRE.test(filepath)) return;
|
|
2270
2283
|
let devRuntime = "react/jsx-dev-runtime";
|
|
@@ -2272,13 +2285,10 @@ var reactRouterVitePlugin = () => {
|
|
|
2272
2285
|
let isJSX = filepath.endsWith("x");
|
|
2273
2286
|
let useFastRefresh = !ssr && (isJSX || code.includes(devRuntime));
|
|
2274
2287
|
if (!useFastRefresh) return;
|
|
2275
|
-
if (isRouteEntry(id2)) {
|
|
2276
|
-
return { code: addRefreshWrapper(ctx.reactRouterConfig, code, id2) };
|
|
2277
|
-
}
|
|
2278
2288
|
let result = await babel.transformAsync(code, {
|
|
2279
2289
|
babelrc: false,
|
|
2280
2290
|
configFile: false,
|
|
2281
|
-
filename:
|
|
2291
|
+
filename: id,
|
|
2282
2292
|
sourceFileName: filepath,
|
|
2283
2293
|
parserOpts: {
|
|
2284
2294
|
sourceType: "module",
|
|
@@ -2291,18 +2301,18 @@ var reactRouterVitePlugin = () => {
|
|
|
2291
2301
|
code = result.code;
|
|
2292
2302
|
let refreshContentRE = /\$Refresh(?:Reg|Sig)\$\(/;
|
|
2293
2303
|
if (refreshContentRE.test(code)) {
|
|
2294
|
-
code = addRefreshWrapper(ctx.reactRouterConfig, code,
|
|
2304
|
+
code = addRefreshWrapper(ctx.reactRouterConfig, code, id);
|
|
2295
2305
|
}
|
|
2296
2306
|
return { code, map: result.map };
|
|
2297
2307
|
}
|
|
2298
2308
|
},
|
|
2299
2309
|
{
|
|
2300
|
-
name: "react-router
|
|
2310
|
+
name: "react-router:hmr-updates",
|
|
2301
2311
|
async handleHotUpdate({ server, file, modules, read }) {
|
|
2302
2312
|
let route = getRoute(ctx.reactRouterConfig, file);
|
|
2303
2313
|
let hmrEventData = { route: null };
|
|
2304
2314
|
if (route) {
|
|
2305
|
-
let serverManifest = (await server.ssrLoadModule(
|
|
2315
|
+
let serverManifest = (await server.ssrLoadModule(virtual.serverManifest.id)).default;
|
|
2306
2316
|
let oldRouteMetadata = serverManifest.routes[route.id];
|
|
2307
2317
|
let newRouteMetadata = await getRouteMetadata(
|
|
2308
2318
|
ctx,
|
|
@@ -2328,12 +2338,58 @@ var reactRouterVitePlugin = () => {
|
|
|
2328
2338
|
});
|
|
2329
2339
|
return modules;
|
|
2330
2340
|
}
|
|
2341
|
+
},
|
|
2342
|
+
{
|
|
2343
|
+
name: "react-router-server-change-trigger-client-hmr",
|
|
2344
|
+
// This hook is only available in Vite v6+ so this is a no-op in v5.
|
|
2345
|
+
// Previously the server and client modules were shared in a single module
|
|
2346
|
+
// graph. This meant that changes to server code automatically resulted in
|
|
2347
|
+
// client HMR updates. In Vite v6+ these module graphs are separate from
|
|
2348
|
+
// each other so we need to manually trigger client HMR updates if server
|
|
2349
|
+
// code has changed.
|
|
2350
|
+
hotUpdate({ server, modules }) {
|
|
2351
|
+
if (this.environment.name !== "ssr" && modules.length <= 0) {
|
|
2352
|
+
return;
|
|
2353
|
+
}
|
|
2354
|
+
let clientModules = uniqueNodes(
|
|
2355
|
+
modules.flatMap(
|
|
2356
|
+
(mod) => getParentClientNodes(server.environments.client.moduleGraph, mod)
|
|
2357
|
+
)
|
|
2358
|
+
);
|
|
2359
|
+
for (let clientModule of clientModules) {
|
|
2360
|
+
server.environments.client.reloadModule(clientModule);
|
|
2361
|
+
}
|
|
2362
|
+
}
|
|
2331
2363
|
}
|
|
2332
2364
|
];
|
|
2333
2365
|
};
|
|
2334
|
-
function
|
|
2335
|
-
|
|
2336
|
-
|
|
2366
|
+
function getParentClientNodes(clientModuleGraph, module2) {
|
|
2367
|
+
if (!module2.id) {
|
|
2368
|
+
return [];
|
|
2369
|
+
}
|
|
2370
|
+
let clientModule = clientModuleGraph.getModuleById(module2.id);
|
|
2371
|
+
if (clientModule) {
|
|
2372
|
+
return [clientModule];
|
|
2373
|
+
}
|
|
2374
|
+
return [...module2.importers].flatMap(
|
|
2375
|
+
(importer) => getParentClientNodes(clientModuleGraph, importer)
|
|
2376
|
+
);
|
|
2377
|
+
}
|
|
2378
|
+
function uniqueNodes(nodes) {
|
|
2379
|
+
let nodeUrls = /* @__PURE__ */ new Set();
|
|
2380
|
+
let unique = [];
|
|
2381
|
+
for (let node of nodes) {
|
|
2382
|
+
if (nodeUrls.has(node.url)) {
|
|
2383
|
+
continue;
|
|
2384
|
+
}
|
|
2385
|
+
nodeUrls.add(node.url);
|
|
2386
|
+
unique.push(node);
|
|
2387
|
+
}
|
|
2388
|
+
return unique;
|
|
2389
|
+
}
|
|
2390
|
+
function addRefreshWrapper(reactRouterConfig, code, id) {
|
|
2391
|
+
let route = getRoute(reactRouterConfig, id);
|
|
2392
|
+
let acceptExports = route ? [
|
|
2337
2393
|
"clientAction",
|
|
2338
2394
|
"clientLoader",
|
|
2339
2395
|
"handle",
|
|
@@ -2343,10 +2399,10 @@ function addRefreshWrapper(reactRouterConfig, code, id2) {
|
|
|
2343
2399
|
] : [];
|
|
2344
2400
|
return "\n\n" + withCommentBoundaries(
|
|
2345
2401
|
"REACT REFRESH HEADER",
|
|
2346
|
-
REACT_REFRESH_HEADER.replaceAll("__SOURCE__", JSON.stringify(
|
|
2402
|
+
REACT_REFRESH_HEADER.replaceAll("__SOURCE__", JSON.stringify(id))
|
|
2347
2403
|
) + "\n\n" + withCommentBoundaries("REACT REFRESH BODY", code) + "\n\n" + withCommentBoundaries(
|
|
2348
2404
|
"REACT REFRESH FOOTER",
|
|
2349
|
-
REACT_REFRESH_FOOTER.replaceAll("__SOURCE__", JSON.stringify(
|
|
2405
|
+
REACT_REFRESH_FOOTER.replaceAll("__SOURCE__", JSON.stringify(id)).replaceAll("__ACCEPT_EXPORTS__", JSON.stringify(acceptExports)).replaceAll("__ROUTE_ID__", JSON.stringify(route?.id))
|
|
2350
2406
|
) + "\n";
|
|
2351
2407
|
}
|
|
2352
2408
|
function withCommentBoundaries(label, text) {
|
|
@@ -2359,7 +2415,7 @@ ${text}
|
|
|
2359
2415
|
${end}`;
|
|
2360
2416
|
}
|
|
2361
2417
|
var REACT_REFRESH_HEADER = `
|
|
2362
|
-
import RefreshRuntime from "${
|
|
2418
|
+
import RefreshRuntime from "${virtualHmrRuntime.id}";
|
|
2363
2419
|
|
|
2364
2420
|
const inWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
|
|
2365
2421
|
let prevRefreshReg;
|
|
@@ -2445,7 +2501,7 @@ async function getPrerenderBuildAndHandler(viteConfig, reactRouterConfig, server
|
|
|
2445
2501
|
serverBuildDirectory,
|
|
2446
2502
|
reactRouterConfig.serverBuildFile
|
|
2447
2503
|
);
|
|
2448
|
-
let build = await import(
|
|
2504
|
+
let build = await import(url.pathToFileURL(serverBuildPath).toString());
|
|
2449
2505
|
let { createRequestHandler: createHandler } = await import("react-router");
|
|
2450
2506
|
return {
|
|
2451
2507
|
build,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-router/dev",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.1.0-pre.0",
|
|
4
4
|
"description": "Dev tools and CLI for React Router",
|
|
5
5
|
"homepage": "https://reactrouter.com",
|
|
6
6
|
"bugs": {
|
|
@@ -80,8 +80,8 @@
|
|
|
80
80
|
"semver": "^7.3.7",
|
|
81
81
|
"set-cookie-parser": "^2.6.0",
|
|
82
82
|
"valibot": "^0.41.0",
|
|
83
|
-
"vite-node": "
|
|
84
|
-
"@react-router/node": "7.0.
|
|
83
|
+
"vite-node": "3.0.0-beta.2",
|
|
84
|
+
"@react-router/node": "7.1.0-pre.0"
|
|
85
85
|
},
|
|
86
86
|
"devDependencies": {
|
|
87
87
|
"@types/babel__core": "^7.20.5",
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
"@types/gunzip-maybe": "^1.4.0",
|
|
94
94
|
"@types/jsesc": "^3.0.1",
|
|
95
95
|
"@types/lodash": "^4.14.182",
|
|
96
|
-
"@types/node": "^
|
|
96
|
+
"@types/node": "^20.0.0",
|
|
97
97
|
"@types/npmcli__package-json": "^4.0.0",
|
|
98
98
|
"@types/picomatch": "^2.3.0",
|
|
99
99
|
"@types/prettier": "^2.7.3",
|
|
@@ -107,18 +107,18 @@
|
|
|
107
107
|
"tiny-invariant": "^1.2.0",
|
|
108
108
|
"tsup": "^8.3.0",
|
|
109
109
|
"typescript": "^5.1.6",
|
|
110
|
-
"vite": "^
|
|
110
|
+
"vite": "^6.0.0",
|
|
111
111
|
"wireit": "0.14.9",
|
|
112
112
|
"wrangler": "^3.28.2",
|
|
113
|
-
"react-router": "
|
|
114
|
-
"
|
|
113
|
+
"@react-router/serve": "7.1.0-pre.0",
|
|
114
|
+
"react-router": "^7.1.0-pre.0"
|
|
115
115
|
},
|
|
116
116
|
"peerDependencies": {
|
|
117
117
|
"typescript": "^5.1.0",
|
|
118
|
-
"vite": "^5.1.0",
|
|
118
|
+
"vite": "^5.1.0 || ^6.0.0",
|
|
119
119
|
"wrangler": "^3.28.2",
|
|
120
|
-
"@react-router/serve": "^7.0.
|
|
121
|
-
"react-router": "^7.0.
|
|
120
|
+
"@react-router/serve": "^7.1.0-pre.0",
|
|
121
|
+
"react-router": "^7.1.0-pre.0"
|
|
122
122
|
},
|
|
123
123
|
"peerDependenciesMeta": {
|
|
124
124
|
"@react-router/serve": {
|