@react-router/dev 0.0.0-experimental-79e23be50 → 0.0.0-experimental-4ed3f5da9
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/dist/cli/commands.js +1 -1
- package/dist/cli/detectPackageManager.js +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/run.js +1 -1
- package/dist/cli/useJavascript.js +1 -1
- package/dist/cli.js +1 -1
- package/dist/colors.js +1 -1
- package/dist/config/findConfig.js +1 -1
- package/dist/config/flatRoutes.js +1 -1
- package/dist/config/format.js +1 -1
- package/dist/config/routes.js +1 -1
- package/dist/config.d.ts +13 -0
- package/dist/config.js +15 -5
- package/dist/index.js +1 -1
- package/dist/invariant.js +1 -1
- package/dist/vite/babel.js +1 -1
- package/dist/vite/build.js +1 -1
- package/dist/vite/cloudflare-proxy-plugin.js +1 -1
- package/dist/vite/dev.js +1 -1
- package/dist/vite/import-vite-esm-sync.js +1 -1
- package/dist/vite/index.js +1 -1
- package/dist/vite/node-adapter.js +1 -1
- package/dist/vite/plugin.js +118 -12
- package/dist/vite/profiler.js +1 -1
- package/dist/vite/remove-exports.js +1 -1
- package/dist/vite/resolve-file-url.js +1 -1
- package/dist/vite/styles.js +1 -1
- package/dist/vite/vmod.js +1 -1
- package/package.json +7 -7
package/dist/cli/commands.js
CHANGED
package/dist/cli/index.js
CHANGED
package/dist/cli/run.js
CHANGED
package/dist/cli.js
CHANGED
package/dist/colors.js
CHANGED
package/dist/config/format.js
CHANGED
package/dist/config/routes.js
CHANGED
package/dist/config.d.ts
CHANGED
|
@@ -93,6 +93,11 @@ export type VitePluginConfig = {
|
|
|
93
93
|
* Defaults to `false`.
|
|
94
94
|
*/
|
|
95
95
|
manifest?: boolean;
|
|
96
|
+
/**
|
|
97
|
+
* An array of URLs to prerender to HTML files at build time. Can also be a
|
|
98
|
+
* function returning an array to dynamically generate URLs.
|
|
99
|
+
*/
|
|
100
|
+
prerender?: Array<string> | (() => Array<string> | Promise<Array<string>>);
|
|
96
101
|
/**
|
|
97
102
|
* An array of React Router plugin config presets to ease integration with
|
|
98
103
|
* other platforms and tools.
|
|
@@ -144,6 +149,10 @@ export type ResolvedVitePluginConfig = Readonly<{
|
|
|
144
149
|
* Defaults to `false`.
|
|
145
150
|
*/
|
|
146
151
|
manifest: boolean;
|
|
152
|
+
/**
|
|
153
|
+
* An array of URLs to prerender to HTML files at build time.
|
|
154
|
+
*/
|
|
155
|
+
prerender: Array<string> | null;
|
|
147
156
|
/**
|
|
148
157
|
* Derived from Vite's `base` config
|
|
149
158
|
* */
|
|
@@ -207,6 +216,10 @@ export declare function resolveReactRouterConfig({ rootDirectory, reactRouterUse
|
|
|
207
216
|
* Defaults to `false`.
|
|
208
217
|
*/
|
|
209
218
|
manifest: boolean;
|
|
219
|
+
/**
|
|
220
|
+
* An array of URLs to prerender to HTML files at build time.
|
|
221
|
+
*/
|
|
222
|
+
prerender: string[] | null;
|
|
210
223
|
/**
|
|
211
224
|
* Derived from Vite's `base` config
|
|
212
225
|
* */
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v0.0.0-experimental-
|
|
2
|
+
* @react-router/dev v0.0.0-experimental-4ed3f5da9
|
|
3
3
|
*
|
|
4
4
|
* Copyright (c) Remix Software Inc.
|
|
5
5
|
*
|
|
@@ -124,6 +124,7 @@ async function resolveReactRouterConfig({
|
|
|
124
124
|
ignoredRouteFiles,
|
|
125
125
|
manifest,
|
|
126
126
|
routes: userRoutesFunction,
|
|
127
|
+
prerender: prerenderConfig,
|
|
127
128
|
serverBuildFile,
|
|
128
129
|
serverBundles,
|
|
129
130
|
serverModuleFormat,
|
|
@@ -133,12 +134,21 @@ async function resolveReactRouterConfig({
|
|
|
133
134
|
// Default values should be completely overridden by user/preset config, not merged
|
|
134
135
|
...mergeReactRouterConfig(...presets, reactRouterUserConfig)
|
|
135
136
|
};
|
|
136
|
-
let isSpaMode = !ssr;
|
|
137
137
|
// Log warning for incompatible vite config flags
|
|
138
|
-
if (
|
|
138
|
+
if (!ssr && serverBundles) {
|
|
139
139
|
console.warn(colors__default["default"].yellow(colors__default["default"].bold("⚠️ SPA Mode: ") + "the `serverBundles` config is invalid with " + "`ssr:false` and will be ignored`"));
|
|
140
140
|
serverBundles = undefined;
|
|
141
141
|
}
|
|
142
|
+
let prerender = null;
|
|
143
|
+
if (prerenderConfig) {
|
|
144
|
+
if (Array.isArray(prerenderConfig)) {
|
|
145
|
+
prerender = prerenderConfig;
|
|
146
|
+
} else if (typeof prerenderConfig === "function") {
|
|
147
|
+
prerender = await prerenderConfig();
|
|
148
|
+
} else {
|
|
149
|
+
throw new Error("The `prerender` config must be an array of string paths, or a function " + "returning an array of string paths");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
142
152
|
let appDirectory = path__default["default"].resolve(rootDirectory, userAppDirectory || "app");
|
|
143
153
|
let buildDirectory = path__default["default"].resolve(rootDirectory, userBuildDirectory);
|
|
144
154
|
let publicPath = viteUserConfig.base ?? "/";
|
|
@@ -187,6 +197,7 @@ async function resolveReactRouterConfig({
|
|
|
187
197
|
buildEnd,
|
|
188
198
|
future,
|
|
189
199
|
manifest,
|
|
200
|
+
prerender,
|
|
190
201
|
publicPath,
|
|
191
202
|
routes: routes$1,
|
|
192
203
|
serverBuildFile,
|
|
@@ -210,7 +221,6 @@ async function resolveEntryFiles({
|
|
|
210
221
|
appDirectory,
|
|
211
222
|
future
|
|
212
223
|
} = reactRouterConfig;
|
|
213
|
-
let isSpaMode = !reactRouterConfig.ssr;
|
|
214
224
|
let defaultsDirectory = path__default["default"].resolve(__dirname, "config", "defaults");
|
|
215
225
|
let userEntryClientFile = findEntry(appDirectory, "entry.client");
|
|
216
226
|
let userEntryServerFile = findEntry(appDirectory, "entry.server");
|
|
@@ -218,7 +228,7 @@ async function resolveEntryFiles({
|
|
|
218
228
|
let entryClientFile = userEntryClientFile || "entry.client.tsx";
|
|
219
229
|
let pkgJson = await PackageJson__default["default"].load(rootDirectory);
|
|
220
230
|
let deps = pkgJson.content.dependencies ?? {};
|
|
221
|
-
if (
|
|
231
|
+
if (!reactRouterConfig.ssr && (future === null || future === void 0 ? void 0 : future.unstable_singleFetch) !== true) {
|
|
222
232
|
// This is a super-simple default since we don't need streaming in SPA Mode.
|
|
223
233
|
// We can include this in a remix-spa template, but right now `npx remix reveal`
|
|
224
234
|
// will still expose the streaming template since that command doesn't have
|
package/dist/index.js
CHANGED
package/dist/invariant.js
CHANGED
package/dist/vite/babel.js
CHANGED
package/dist/vite/build.js
CHANGED
package/dist/vite/dev.js
CHANGED
package/dist/vite/index.js
CHANGED
package/dist/vite/plugin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v0.0.0-experimental-
|
|
2
|
+
* @react-router/dev v0.0.0-experimental-4ed3f5da9
|
|
3
3
|
*
|
|
4
4
|
* Copyright (c) Remix Software Inc.
|
|
5
5
|
*
|
|
@@ -18,6 +18,7 @@ var url = require('node:url');
|
|
|
18
18
|
var fse = require('fs-extra');
|
|
19
19
|
var babel = require('@babel/core');
|
|
20
20
|
var serverRuntime = require('@react-router/server-runtime');
|
|
21
|
+
var reactRouter = require('react-router');
|
|
21
22
|
var esModuleLexer = require('es-module-lexer');
|
|
22
23
|
var jsesc = require('jsesc');
|
|
23
24
|
var colors = require('picocolors');
|
|
@@ -324,7 +325,7 @@ const reactRouterVitePlugin = _config => {
|
|
|
324
325
|
export const assetsBuildDirectory = ${JSON.stringify(path__namespace.relative(ctx.rootDirectory, getClientBuildDirectory(ctx.reactRouterConfig)))};
|
|
325
326
|
export const basename = ${JSON.stringify(ctx.reactRouterConfig.basename)};
|
|
326
327
|
export const future = ${JSON.stringify(ctx.reactRouterConfig.future)};
|
|
327
|
-
export const isSpaMode = ${!ctx.reactRouterConfig.ssr};
|
|
328
|
+
export const isSpaMode = ${!ctx.reactRouterConfig.ssr && ctx.reactRouterConfig.prerender == null};
|
|
328
329
|
export const publicPath = ${JSON.stringify(ctx.reactRouterConfig.publicPath)};
|
|
329
330
|
export const entry = { module: entryServer };
|
|
330
331
|
export const routes = {
|
|
@@ -748,8 +749,19 @@ const reactRouterVitePlugin = _config => {
|
|
|
748
749
|
if (movedAssetPaths.length) {
|
|
749
750
|
viteConfig.logger.info(["", `${colors__default["default"].green("✓")} ${movedAssetPaths.length} asset${movedAssetPaths.length > 1 ? "s" : ""} moved from React Router server build to client assets.`, ...movedAssetPaths.map(movedAssetPath => colors__default["default"].dim(path__namespace.relative(ctx.rootDirectory, movedAssetPath))), ""].join("\n"));
|
|
750
751
|
}
|
|
752
|
+
if (ctx.reactRouterConfig.prerender != null) {
|
|
753
|
+
// If we have prerender routes, that takes precedence over SPA mode
|
|
754
|
+
// which is ssr:false and only the rot route being rendered
|
|
755
|
+
await handlePrerender(viteConfig, ctx.reactRouterConfig, serverBuildDirectory, clientBuildDirectory);
|
|
756
|
+
} else if (!ctx.reactRouterConfig.ssr) {
|
|
757
|
+
await handleSpaMode(viteConfig, ctx.reactRouterConfig, serverBuildDirectory, clientBuildDirectory);
|
|
758
|
+
}
|
|
759
|
+
// For both SPA mode and prerendering, we can remove the server builds
|
|
760
|
+
// if ssr:false is set
|
|
751
761
|
if (!ctx.reactRouterConfig.ssr) {
|
|
752
|
-
|
|
762
|
+
// Cleanup - we no longer need the server build assets
|
|
763
|
+
viteConfig.logger.info(["Removing the server build in", colors__default["default"].green(serverBuildDirectory), "due to ssr:false"].join(" "));
|
|
764
|
+
fse__namespace.removeSync(serverBuildDirectory);
|
|
753
765
|
}
|
|
754
766
|
}
|
|
755
767
|
},
|
|
@@ -1039,17 +1051,23 @@ async function getRouteMetadata(ctx, viteChildCompiler, route, readRouteFile) {
|
|
|
1039
1051
|
};
|
|
1040
1052
|
return info;
|
|
1041
1053
|
}
|
|
1042
|
-
async function
|
|
1043
|
-
|
|
1044
|
-
// proper HydrateFallback ... or not! Maybe they have a static landing page
|
|
1045
|
-
// generated from routes/_index.tsx.
|
|
1046
|
-
let serverBuildPath = path__namespace.join(serverBuildDirectoryPath, serverBuildFile);
|
|
1054
|
+
async function getPrerenderBuildAndHandler(viteConfig, reactRouterConfig, serverBuildDirectory) {
|
|
1055
|
+
let serverBuildPath = path__namespace.join(serverBuildDirectory, reactRouterConfig.serverBuildFile);
|
|
1047
1056
|
let build = await import(url__namespace.pathToFileURL(serverBuildPath).toString());
|
|
1048
1057
|
let {
|
|
1049
1058
|
createRequestHandler: createHandler
|
|
1050
1059
|
} = await import('@react-router/node');
|
|
1051
|
-
|
|
1052
|
-
|
|
1060
|
+
return {
|
|
1061
|
+
build,
|
|
1062
|
+
handler: createHandler(build, viteConfig.mode)
|
|
1063
|
+
};
|
|
1064
|
+
}
|
|
1065
|
+
async function handleSpaMode(viteConfig, reactRouterConfig, serverBuildDirectory, clientBuildDirectory) {
|
|
1066
|
+
let {
|
|
1067
|
+
handler
|
|
1068
|
+
} = await getPrerenderBuildAndHandler(viteConfig, reactRouterConfig, serverBuildDirectory);
|
|
1069
|
+
let request = new Request(`http://localhost${reactRouterConfig.basename}`);
|
|
1070
|
+
let response = await handler(request);
|
|
1053
1071
|
let html = await response.text();
|
|
1054
1072
|
if (response.status !== 200) {
|
|
1055
1073
|
throw new Error(`SPA Mode: Received a ${response.status} status code from ` + `\`entry.server.tsx\` while generating the \`index.html\` file.\n${html}`);
|
|
@@ -1060,8 +1078,96 @@ async function handleSpaMode(serverBuildDirectoryPath, serverBuildFile, clientBu
|
|
|
1060
1078
|
// Write out the index.html file for the SPA
|
|
1061
1079
|
await fse__namespace.writeFile(path__namespace.join(clientBuildDirectory, "index.html"), html);
|
|
1062
1080
|
viteConfig.logger.info("SPA Mode: index.html has been written to your " + colors__default["default"].bold(path__namespace.relative(process.cwd(), clientBuildDirectory)) + " directory");
|
|
1063
|
-
|
|
1064
|
-
|
|
1081
|
+
}
|
|
1082
|
+
async function handlePrerender(viteConfig, reactRouterConfig, serverBuildDirectory, clientBuildDirectory) {
|
|
1083
|
+
let {
|
|
1084
|
+
build,
|
|
1085
|
+
handler
|
|
1086
|
+
} = await getPrerenderBuildAndHandler(viteConfig, reactRouterConfig, serverBuildDirectory);
|
|
1087
|
+
let routes = createPrerenderRoutes(build.routes);
|
|
1088
|
+
let routesToPrerender = reactRouterConfig.prerender || ["/"];
|
|
1089
|
+
let requestInit = {
|
|
1090
|
+
headers: {
|
|
1091
|
+
// Header that can be used in the loader to know if you're running at
|
|
1092
|
+
// build time or runtime
|
|
1093
|
+
"X-React-Router-Prerender": "yes"
|
|
1094
|
+
}
|
|
1095
|
+
};
|
|
1096
|
+
for (let path of routesToPrerender) {
|
|
1097
|
+
var _matchRoutes;
|
|
1098
|
+
let hasLoaders = (_matchRoutes = reactRouter.matchRoutes(routes, path)) === null || _matchRoutes === void 0 ? void 0 : _matchRoutes.some(m => m.route.loader);
|
|
1099
|
+
if (hasLoaders) {
|
|
1100
|
+
await prerenderData(handler, reactRouterConfig.basename, path, clientBuildDirectory, viteConfig, requestInit);
|
|
1101
|
+
}
|
|
1102
|
+
await prerenderRoute(handler, reactRouterConfig.basename, path, clientBuildDirectory, viteConfig, requestInit);
|
|
1103
|
+
}
|
|
1104
|
+
async function prerenderData(handler, basename, prerenderPath, clientBuildDirectory, viteConfig, requestInit) {
|
|
1105
|
+
let normalizedPath = `${basename}${prerenderPath === "/" ? "/_root.data" : `${prerenderPath.replace(/\/$/, "")}.data`}`.replace(/\/\/+/g, "/");
|
|
1106
|
+
let request = new Request(`http://localhost${normalizedPath}`, requestInit);
|
|
1107
|
+
let response = await handler(request);
|
|
1108
|
+
let data = await response.text();
|
|
1109
|
+
if (response.status !== 200) {
|
|
1110
|
+
throw new Error(`Prerender: Received a ${response.status} status code from ` + `\`entry.server.tsx\` while prerendering the \`${normalizedPath}\` ` + `path.\n${data}`);
|
|
1111
|
+
}
|
|
1112
|
+
// Write out the .data file
|
|
1113
|
+
let outdir = path__namespace.relative(process.cwd(), clientBuildDirectory);
|
|
1114
|
+
let outfile = path__namespace.join(outdir, normalizedPath.split("/").join(path__namespace.sep));
|
|
1115
|
+
await fse__namespace.ensureDir(path__namespace.dirname(outfile));
|
|
1116
|
+
await fse__namespace.outputFile(outfile, data);
|
|
1117
|
+
viteConfig.logger.info(`Prerender: Generated ${colors__default["default"].bold(outfile)}`);
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
async function prerenderRoute(handler, basename, prerenderPath, clientBuildDirectory, viteConfig, requestInit) {
|
|
1121
|
+
let normalizedPath = `${basename}${prerenderPath}/`.replace(/\/\/+/g, "/");
|
|
1122
|
+
let request = new Request(`http://localhost${normalizedPath}`, requestInit);
|
|
1123
|
+
let response = await handler(request);
|
|
1124
|
+
let html = await response.text();
|
|
1125
|
+
if (response.status !== 200) {
|
|
1126
|
+
throw new Error(`Prerender: Received a ${response.status} status code from ` + `\`entry.server.tsx\` while prerendering the \`${normalizedPath}\` ` + `path.\n${html}`);
|
|
1127
|
+
}
|
|
1128
|
+
if (!html.includes("window.__remixContext =") || !html.includes("window.__remixRouteModules =")) {
|
|
1129
|
+
throw new Error("Prerender: Did you forget to include <Scripts/> in your `root.tsx` " + "`HydrateFallback` component? Your prerendered HTML files cannot " + "hydrate into a SPA without `<Scripts />`.");
|
|
1130
|
+
}
|
|
1131
|
+
// Write out the HTML file
|
|
1132
|
+
let outdir = path__namespace.relative(process.cwd(), clientBuildDirectory);
|
|
1133
|
+
let outfile = path__namespace.join(outdir, ...normalizedPath.split("/"), "index.html");
|
|
1134
|
+
await fse__namespace.ensureDir(path__namespace.dirname(outfile));
|
|
1135
|
+
await fse__namespace.outputFile(outfile, html);
|
|
1136
|
+
viteConfig.logger.info(`Prerender: Generated ${colors__default["default"].bold(outfile)}`);
|
|
1137
|
+
}
|
|
1138
|
+
// Note: Duplicated from remix-server-runtime
|
|
1139
|
+
function groupRoutesByParentId(manifest) {
|
|
1140
|
+
let routes = {};
|
|
1141
|
+
Object.values(manifest).forEach(route => {
|
|
1142
|
+
let parentId = route.parentId || "";
|
|
1143
|
+
if (!routes[parentId]) {
|
|
1144
|
+
routes[parentId] = [];
|
|
1145
|
+
}
|
|
1146
|
+
routes[parentId].push(route);
|
|
1147
|
+
});
|
|
1148
|
+
return routes;
|
|
1149
|
+
}
|
|
1150
|
+
// Note: Duplicated from remix-server-runtime
|
|
1151
|
+
function createPrerenderRoutes(manifest, parentId = "", routesByParentId = groupRoutesByParentId(manifest)) {
|
|
1152
|
+
return (routesByParentId[parentId] || []).map(route => {
|
|
1153
|
+
let commonRoute = {
|
|
1154
|
+
// Always include root due to default boundaries
|
|
1155
|
+
hasErrorBoundary: route.id === "root" || route.module.ErrorBoundary != null,
|
|
1156
|
+
id: route.id,
|
|
1157
|
+
path: route.path,
|
|
1158
|
+
loader: route.module.loader ? () => null : undefined,
|
|
1159
|
+
action: undefined,
|
|
1160
|
+
handle: route.module.handle
|
|
1161
|
+
};
|
|
1162
|
+
return route.index ? {
|
|
1163
|
+
index: true,
|
|
1164
|
+
...commonRoute
|
|
1165
|
+
} : {
|
|
1166
|
+
caseSensitive: route.caseSensitive,
|
|
1167
|
+
children: createPrerenderRoutes(manifest, route.id, routesByParentId),
|
|
1168
|
+
...commonRoute
|
|
1169
|
+
};
|
|
1170
|
+
});
|
|
1065
1171
|
}
|
|
1066
1172
|
|
|
1067
1173
|
exports.extractPluginContext = extractPluginContext;
|
package/dist/vite/profiler.js
CHANGED
package/dist/vite/styles.js
CHANGED
package/dist/vite/vmod.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-router/dev",
|
|
3
|
-
"version": "0.0.0-experimental-
|
|
3
|
+
"version": "0.0.0-experimental-4ed3f5da9",
|
|
4
4
|
"description": "Dev tools and CLI for React Router",
|
|
5
5
|
"homepage": "https://reactrouter.com",
|
|
6
6
|
"bugs": {
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"react-refresh": "^0.14.0",
|
|
43
43
|
"semver": "^7.3.7",
|
|
44
44
|
"set-cookie-parser": "^2.6.0",
|
|
45
|
-
"@react-router/node": "0.0.0-experimental-
|
|
46
|
-
"react-router": "0.0.0-experimental-
|
|
47
|
-
"
|
|
45
|
+
"@react-router/node": "0.0.0-experimental-4ed3f5da9",
|
|
46
|
+
"@react-router/server-runtime": "0.0.0-experimental-4ed3f5da9",
|
|
47
|
+
"react-router": "0.0.0-experimental-4ed3f5da9"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@types/babel__core": "^7.20.5",
|
|
@@ -69,14 +69,14 @@
|
|
|
69
69
|
"tiny-invariant": "^1.2.0",
|
|
70
70
|
"vite": "^5.1.0",
|
|
71
71
|
"wrangler": "^3.28.2",
|
|
72
|
-
"@react-router/serve": "0.0.0-experimental-
|
|
72
|
+
"@react-router/serve": "0.0.0-experimental-4ed3f5da9"
|
|
73
73
|
},
|
|
74
74
|
"peerDependencies": {
|
|
75
75
|
"typescript": "^5.1.0",
|
|
76
76
|
"vite": "^5.1.0",
|
|
77
77
|
"wrangler": "^3.28.2",
|
|
78
|
-
"react-router": "^0.0.0-experimental-
|
|
79
|
-
"
|
|
78
|
+
"@react-router/serve": "^0.0.0-experimental-4ed3f5da9",
|
|
79
|
+
"react-router": "^0.0.0-experimental-4ed3f5da9"
|
|
80
80
|
},
|
|
81
81
|
"peerDependenciesMeta": {
|
|
82
82
|
"@react-router/serve": {
|