@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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/cli/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/cli/run.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * @react-router/dev v0.0.0-experimental-79e23be50
3
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
package/dist/colors.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
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-79e23be50
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 (isSpaMode && serverBundles) {
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 (isSpaMode && (future === null || future === void 0 ? void 0 : future.unstable_singleFetch) != true) {
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
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/invariant.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/vite/dev.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
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
- await handleSpaMode(serverBuildDirectory, ctx.reactRouterConfig.serverBuildFile, clientBuildDirectory, viteConfig, ctx.reactRouterConfig.basename);
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 handleSpaMode(serverBuildDirectoryPath, serverBuildFile, clientBuildDirectory, viteConfig, basename) {
1043
- // Create a handler and call it for the `/` path - rendering down to the
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
- let handler = createHandler(build, viteConfig.mode);
1052
- let response = await handler(new Request(`http://localhost${basename}`));
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
- // Cleanup - we no longer need the server build assets
1064
- fse__namespace.removeSync(serverBuildDirectoryPath);
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;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/vite/vmod.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-79e23be50
2
+ * @react-router/dev v0.0.0-experimental-4ed3f5da9
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-router/dev",
3
- "version": "0.0.0-experimental-79e23be50",
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-79e23be50",
46
- "react-router": "0.0.0-experimental-79e23be50",
47
- "@react-router/server-runtime": "0.0.0-experimental-79e23be50"
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-79e23be50"
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-79e23be50",
79
- "@react-router/serve": "^0.0.0-experimental-79e23be50"
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": {