react-router 7.2.0-pre.0 → 7.2.0-pre.2

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.
Files changed (36) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/development/{chunk-HLU4BUUT.mjs → chunk-ULARE4JK.mjs} +58 -40
  3. package/dist/development/dom-export.d.mts +2 -2
  4. package/dist/development/dom-export.d.ts +2 -2
  5. package/dist/development/dom-export.js +18 -19
  6. package/dist/development/dom-export.mjs +2 -2
  7. package/dist/{production/fog-of-war-Ax4Jg2xL.d.ts → development/fog-of-war-rn7nVSAv.d.ts} +1 -1
  8. package/dist/development/{fog-of-war-Cyo_TZuh.d.mts → fog-of-war-yKFj2vdd.d.mts} +1 -1
  9. package/dist/development/index.d.mts +37 -6
  10. package/dist/development/index.d.ts +37 -6
  11. package/dist/development/index.js +59 -40
  12. package/dist/development/index.mjs +4 -2
  13. package/dist/development/lib/types/route-module.d.mts +1 -1
  14. package/dist/development/lib/types/route-module.d.ts +1 -1
  15. package/dist/development/lib/types/route-module.js +1 -1
  16. package/dist/development/lib/types/route-module.mjs +1 -1
  17. package/dist/development/{route-data-DQbTMaUY.d.ts → route-data-CfLfC_Bh.d.mts} +1 -1
  18. package/dist/{production/route-data-DQbTMaUY.d.mts → development/route-data-CfLfC_Bh.d.ts} +1 -1
  19. package/dist/production/{chunk-IA3JXIZE.mjs → chunk-QRCLBIUO.mjs} +58 -40
  20. package/dist/production/dom-export.d.mts +2 -2
  21. package/dist/production/dom-export.d.ts +2 -2
  22. package/dist/production/dom-export.js +18 -19
  23. package/dist/production/dom-export.mjs +2 -2
  24. package/dist/{development/fog-of-war-Ax4Jg2xL.d.ts → production/fog-of-war-rn7nVSAv.d.ts} +1 -1
  25. package/dist/production/{fog-of-war-Cyo_TZuh.d.mts → fog-of-war-yKFj2vdd.d.mts} +1 -1
  26. package/dist/production/index.d.mts +37 -6
  27. package/dist/production/index.d.ts +37 -6
  28. package/dist/production/index.js +59 -40
  29. package/dist/production/index.mjs +4 -2
  30. package/dist/production/lib/types/route-module.d.mts +1 -1
  31. package/dist/production/lib/types/route-module.d.ts +1 -1
  32. package/dist/production/lib/types/route-module.js +1 -1
  33. package/dist/production/lib/types/route-module.mjs +1 -1
  34. package/dist/production/{route-data-DQbTMaUY.d.ts → route-data-CfLfC_Bh.d.mts} +1 -1
  35. package/dist/{development/route-data-DQbTMaUY.d.mts → production/route-data-CfLfC_Bh.d.ts} +1 -1
  36. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,62 @@
1
1
  # `react-router`
2
2
 
3
+ ## 7.2.0-pre.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Properly handle revalidations to across a prerender/SPA boundary ([#13021](https://github.com/remix-run/react-router/pull/13021))
8
+
9
+ - In "hybrid" applications where some routes are pre-rendered and some are served from a SPA fallback, we need to avoid making `.data` requests if the path wasn't pre-rendered because the request will 404
10
+ - We don't know all the pre-rendered paths client-side, however:
11
+ - All `loader` data in `ssr:false` mode is static because it's generated at build time
12
+ - A route must use a `clientLoader` to do anything dynamic
13
+ - Therefore, if a route only has a `loader` and not a `clientLoader`, we disable revalidation by default because there is no new data to retrieve
14
+ - We short circuit and skip single fetch `.data` request logic if there are no server loaders with `shouldLoad=true` in our single fetch `dataStrategy`
15
+ - This ensures that the route doesn't cause a `.data` request that would 404 after a submission
16
+
17
+ - Error at build time in `ssr:false` + `prerender` apps for the edge case scenario of: ([#13021](https://github.com/remix-run/react-router/pull/13021))
18
+
19
+ - A parent route has only a `loader` (does not have a `clientLoader`)
20
+ - The parent route is pre-rendered
21
+ - The parent route has children routes which are not prerendered
22
+ - This means that when the child paths are loaded via the SPA fallback, the parent won't have any `loaderData` because there is no server on which to run the `loader`
23
+ - This can be resolved by either adding a parent `clientLoader` or pre-rendering the child paths
24
+ - If you add a `clientLoader`, calling the `serverLoader()` on non-prerendered paths will throw a 404
25
+
26
+ ## 7.2.0-pre.1
27
+
28
+ ### Minor Changes
29
+
30
+ - New type-safe `href` utility that guarantees links point to actual paths in your app ([#13012](https://github.com/remix-run/react-router/pull/13012))
31
+
32
+ ```tsx
33
+ import { href } from "react-router";
34
+
35
+ export default function Component() {
36
+ const link = href("/blog/:slug", { slug: "my-first-post" });
37
+ return (
38
+ <main>
39
+ <Link to={href("/products/:id", { id: "asdf" })} />
40
+ <NavLink to={href("/:lang?/about", { lang: "en" })} />
41
+ </main>
42
+ );
43
+ }
44
+ ```
45
+
46
+ ### Patch Changes
47
+
48
+ - Fix typegen for repeated params ([#13012](https://github.com/remix-run/react-router/pull/13012))
49
+
50
+ In React Router, path parameters are keyed by their name.
51
+ So for a path pattern like `/a/:id/b/:id?/c/:id`, the last `:id` will set the value for `id` in `useParams` and the `params` prop.
52
+ For example, `/a/1/b/2/c/3` will result in the value `{ id: 3 }` at runtime.
53
+
54
+ Previously, generated types for params incorrectly modeled repeated params with an array.
55
+ So `/a/1/b/2/c/3` generated a type like `{ id: [1,2,3] }`.
56
+
57
+ To be consistent with runtime behavior, the generated types now correctly model the "last one wins" semantics of path parameters.
58
+ So `/a/1/b/2/c/3` now generates a type like `{ id: 3 }`.
59
+
3
60
  ## 7.2.0-pre.0
4
61
 
5
62
  ### Patch Changes
@@ -1,5 +1,5 @@
1
1
  /**
2
- * react-router v7.2.0-pre.0
2
+ * react-router v7.2.0-pre.2
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -154,13 +154,13 @@ function createHashHistory(options = {}) {
154
154
  }
155
155
  function createHashHref(window2, to) {
156
156
  let base = window2.document.querySelector("base");
157
- let href = "";
157
+ let href2 = "";
158
158
  if (base && base.getAttribute("href")) {
159
159
  let url = window2.location.href;
160
160
  let hashIndex = url.indexOf("#");
161
- href = hashIndex === -1 ? url : url.slice(0, hashIndex);
161
+ href2 = hashIndex === -1 ? url : url.slice(0, hashIndex);
162
162
  }
163
- return href + "#" + (typeof to === "string" ? to : createPath(to));
163
+ return href2 + "#" + (typeof to === "string" ? to : createPath(to));
164
164
  }
165
165
  function validateHashLocation(location, to) {
166
166
  warning(
@@ -302,13 +302,13 @@ function getUrlBasedHistory(getLocation, createHref2, validateLocation, options
302
302
  }
303
303
  function createURL(to) {
304
304
  let base = window2.location.origin !== "null" ? window2.location.origin : window2.location.href;
305
- let href = typeof to === "string" ? to : createPath(to);
306
- href = href.replace(/ $/, "%20");
305
+ let href2 = typeof to === "string" ? to : createPath(to);
306
+ href2 = href2.replace(/ $/, "%20");
307
307
  invariant(
308
308
  base,
309
- `No window.location.(origin|href) available to create URL for href: ${href}`
309
+ `No window.location.(origin|href) available to create URL for href: ${href2}`
310
310
  );
311
- return new URL(href, base);
311
+ return new URL(href2, base);
312
312
  }
313
313
  let history = {
314
314
  get action() {
@@ -1710,7 +1710,7 @@ function createRouter(init) {
1710
1710
  });
1711
1711
  return new Map(state.fetchers);
1712
1712
  }
1713
- async function fetch2(key, routeId, href, opts) {
1713
+ async function fetch2(key, routeId, href2, opts) {
1714
1714
  abortFetcher(key);
1715
1715
  let flushSync = (opts && opts.flushSync) === true;
1716
1716
  let routesToUse = inFlightDataRoutes || dataRoutes;
@@ -1718,7 +1718,7 @@ function createRouter(init) {
1718
1718
  state.location,
1719
1719
  state.matches,
1720
1720
  basename,
1721
- href,
1721
+ href2,
1722
1722
  routeId,
1723
1723
  opts?.relative
1724
1724
  );
@@ -5356,7 +5356,7 @@ function getKeyedLinksForMatches(matches, routeModules, manifest) {
5356
5356
  let module = routeModules[match.route.id];
5357
5357
  let route = manifest.routes[match.route.id];
5358
5358
  return [
5359
- route && route.css ? route.css.map((href) => ({ rel: "stylesheet", href })) : [],
5359
+ route && route.css ? route.css.map((href2) => ({ rel: "stylesheet", href: href2 })) : [],
5360
5360
  module?.links?.() || []
5361
5361
  ];
5362
5362
  }).flat(2);
@@ -5365,7 +5365,7 @@ function getKeyedLinksForMatches(matches, routeModules, manifest) {
5365
5365
  }
5366
5366
  function getRouteCssDescriptors(route) {
5367
5367
  if (!route.css) return [];
5368
- return route.css.map((href) => ({ rel: "stylesheet", href }));
5368
+ return route.css.map((href2) => ({ rel: "stylesheet", href: href2 }));
5369
5369
  }
5370
5370
  async function prefetchRouteCss(route) {
5371
5371
  if (!route.css) return;
@@ -5670,10 +5670,10 @@ function getSingleFetchDataStrategy(manifest, routeModules, ssr, getRouter) {
5670
5670
  return singleFetchActionStrategy(request, matches);
5671
5671
  }
5672
5672
  if (!ssr) {
5673
- let foundLoaderBelowRoot = matches.some(
5674
- (m) => m.route.id !== "root" && manifest.routes[m.route.id]?.hasLoader
5673
+ let foundRevalidatingServerLoader = matches.some(
5674
+ (m) => m.shouldLoad && manifest.routes[m.route.id]?.hasLoader && !manifest.routes[m.route.id]?.hasClientLoader
5675
5675
  );
5676
- if (!foundLoaderBelowRoot) {
5676
+ if (!foundRevalidatingServerLoader) {
5677
5677
  let matchesToLoad = matches.filter((m) => m.shouldLoad);
5678
5678
  let results = await Promise.all(matchesToLoad.map((m) => m.resolve()));
5679
5679
  return results.reduce(
@@ -6168,13 +6168,7 @@ function createClientRoutesWithHMRRevalidationOptOut(needsRevalidation, manifest
6168
6168
  needsRevalidation
6169
6169
  );
6170
6170
  }
6171
- function preventInvalidServerHandlerCall(type, route, isSpaMode) {
6172
- if (isSpaMode) {
6173
- let fn = type === "action" ? "serverAction()" : "serverLoader()";
6174
- let msg = `You cannot call ${fn} in SPA Mode (routeId: "${route.id}")`;
6175
- console.error(msg);
6176
- throw new ErrorResponseImpl(400, "Bad Request", new Error(msg), true);
6177
- }
6171
+ function preventInvalidServerHandlerCall(type, route) {
6178
6172
  if (type === "loader" && !route.hasLoader || type === "action" && !route.hasAction) {
6179
6173
  let fn = type === "action" ? "serverAction()" : "serverLoader()";
6180
6174
  let msg = `You are trying to call ${fn} on a route that does not have a server ${type} (routeId: "${route.id}")`;
@@ -6268,7 +6262,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSp
6268
6262
  request,
6269
6263
  params,
6270
6264
  async serverLoader() {
6271
- preventInvalidServerHandlerCall("loader", route, isSpaMode);
6265
+ preventInvalidServerHandlerCall("loader", route);
6272
6266
  if (isHydrationRequest) {
6273
6267
  if (hasInitialData) {
6274
6268
  return initialData;
@@ -6307,7 +6301,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSp
6307
6301
  request,
6308
6302
  params,
6309
6303
  async serverAction() {
6310
- preventInvalidServerHandlerCall("action", route, isSpaMode);
6304
+ preventInvalidServerHandlerCall("action", route);
6311
6305
  return fetchServerAction(singleFetch);
6312
6306
  }
6313
6307
  });
@@ -6329,7 +6323,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSp
6329
6323
  return clientLoader({
6330
6324
  ...args,
6331
6325
  async serverLoader() {
6332
- preventInvalidServerHandlerCall("loader", route, isSpaMode);
6326
+ preventInvalidServerHandlerCall("loader", route);
6333
6327
  return fetchServerLoader(singleFetch);
6334
6328
  }
6335
6329
  });
@@ -6354,7 +6348,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSp
6354
6348
  return clientAction({
6355
6349
  ...args,
6356
6350
  async serverAction() {
6357
- preventInvalidServerHandlerCall("action", route, isSpaMode);
6351
+ preventInvalidServerHandlerCall("action", route);
6358
6352
  return fetchServerAction(singleFetch);
6359
6353
  }
6360
6354
  });
@@ -6376,7 +6370,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSp
6376
6370
  lazyRoute.loader = (args, singleFetch) => clientLoader({
6377
6371
  ...args,
6378
6372
  async serverLoader() {
6379
- preventInvalidServerHandlerCall("loader", route, isSpaMode);
6373
+ preventInvalidServerHandlerCall("loader", route);
6380
6374
  return fetchServerLoader(singleFetch);
6381
6375
  }
6382
6376
  });
@@ -6386,7 +6380,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSp
6386
6380
  lazyRoute.action = (args, singleFetch) => clientAction({
6387
6381
  ...args,
6388
6382
  async serverAction() {
6389
- preventInvalidServerHandlerCall("action", route, isSpaMode);
6383
+ preventInvalidServerHandlerCall("action", route);
6390
6384
  return fetchServerAction(singleFetch);
6391
6385
  }
6392
6386
  });
@@ -6431,8 +6425,13 @@ function getShouldRevalidateFunction(route, manifestRoute, ssr, needsRevalidatio
6431
6425
  needsRevalidation
6432
6426
  );
6433
6427
  }
6434
- if (!ssr && manifestRoute.id === "root" && manifestRoute.hasLoader && !manifestRoute.hasClientLoader) {
6435
- return () => false;
6428
+ if (!ssr && manifestRoute.hasLoader && !manifestRoute.hasClientLoader) {
6429
+ if (route.shouldRevalidate) {
6430
+ let fn = route.shouldRevalidate;
6431
+ return (opts) => fn({ ...opts, defaultShouldRevalidate: false });
6432
+ } else {
6433
+ return () => false;
6434
+ }
6436
6435
  }
6437
6436
  if (ssr && route.shouldRevalidate) {
6438
6437
  let fn = route.shouldRevalidate;
@@ -6868,7 +6867,7 @@ function PrefetchPageLinksImpl({
6868
6867
  [newMatchesForAssets, manifest]
6869
6868
  );
6870
6869
  let keyedPrefetchLinks = useKeyedPrefetchLinks(newMatchesForAssets);
6871
- return /* @__PURE__ */ React9.createElement(React9.Fragment, null, dataHrefs.map((href) => /* @__PURE__ */ React9.createElement("link", { key: href, rel: "prefetch", as: "fetch", href, ...linkProps })), moduleHrefs.map((href) => /* @__PURE__ */ React9.createElement("link", { key: href, rel: "modulepreload", href, ...linkProps })), keyedPrefetchLinks.map(({ key, link }) => (
6870
+ return /* @__PURE__ */ React9.createElement(React9.Fragment, null, dataHrefs.map((href2) => /* @__PURE__ */ React9.createElement("link", { key: href2, rel: "prefetch", as: "fetch", href: href2, ...linkProps })), moduleHrefs.map((href2) => /* @__PURE__ */ React9.createElement("link", { key: href2, rel: "modulepreload", href: href2, ...linkProps })), keyedPrefetchLinks.map(({ key, link }) => (
6872
6871
  // these don't spread `linkProps` because they are full link descriptors
6873
6872
  // already with their own props
6874
6873
  /* @__PURE__ */ React9.createElement("link", { key, ...link })
@@ -7108,7 +7107,7 @@ function mergeRefs(...refs) {
7108
7107
  var isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined";
7109
7108
  try {
7110
7109
  if (isBrowser) {
7111
- window.__reactRouterVersion = "7.2.0-pre.0";
7110
+ window.__reactRouterVersion = "7.2.0-pre.2";
7112
7111
  }
7113
7112
  } catch (e) {
7114
7113
  }
@@ -7311,7 +7310,7 @@ var Link = React10.forwardRef(
7311
7310
  }
7312
7311
  }
7313
7312
  }
7314
- let href = useHref(to, { relative });
7313
+ let href2 = useHref(to, { relative });
7315
7314
  let [shouldPrefetch, prefetchRef, prefetchHandlers] = usePrefetchBehavior(
7316
7315
  prefetch,
7317
7316
  rest
@@ -7337,7 +7336,7 @@ var Link = React10.forwardRef(
7337
7336
  {
7338
7337
  ...rest,
7339
7338
  ...prefetchHandlers,
7340
- href: absoluteHref || href,
7339
+ href: absoluteHref || href2,
7341
7340
  onClick: isExternal || reloadDocument ? onClick : handleClick,
7342
7341
  ref: mergeRefs(forwardedRef, prefetchRef),
7343
7342
  target,
@@ -7345,7 +7344,7 @@ var Link = React10.forwardRef(
7345
7344
  }
7346
7345
  )
7347
7346
  );
7348
- return shouldPrefetch && !isAbsolute ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, link, /* @__PURE__ */ React10.createElement(PrefetchPageLinks, { page: href })) : link;
7347
+ return shouldPrefetch && !isAbsolute ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, link, /* @__PURE__ */ React10.createElement(PrefetchPageLinks, { page: href2 })) : link;
7349
7348
  }
7350
7349
  );
7351
7350
  Link.displayName = "Link";
@@ -7701,9 +7700,9 @@ function useFetcher({
7701
7700
  return () => router.deleteFetcher(fetcherKey);
7702
7701
  }, [router, fetcherKey]);
7703
7702
  let load = React10.useCallback(
7704
- async (href, opts) => {
7703
+ async (href2, opts) => {
7705
7704
  invariant(routeId, "No routeId available for fetcher.load()");
7706
- await router.fetch(fetcherKey, routeId, href, opts);
7705
+ await router.fetch(fetcherKey, routeId, href2, opts);
7707
7706
  },
7708
7707
  [fetcherKey, routeId, router]
7709
7708
  );
@@ -8160,9 +8159,9 @@ function createHref(to) {
8160
8159
  return typeof to === "string" ? to : createPath(to);
8161
8160
  }
8162
8161
  function encodeLocation(to) {
8163
- let href = typeof to === "string" ? to : createPath(to);
8164
- href = href.replace(/ $/, "%20");
8165
- let encoded = ABSOLUTE_URL_REGEX3.test(href) ? new URL(href) : new URL(href, "http://localhost");
8162
+ let href2 = typeof to === "string" ? to : createPath(to);
8163
+ href2 = href2.replace(/ $/, "%20");
8164
+ let encoded = ABSOLUTE_URL_REGEX3.test(href2) ? new URL(href2) : new URL(href2, "http://localhost");
8166
8165
  return {
8167
8166
  pathname: encoded.pathname,
8168
8167
  search: encoded.search,
@@ -9638,6 +9637,24 @@ function createMemorySessionStorage({ cookie } = {}) {
9638
9637
  });
9639
9638
  }
9640
9639
 
9640
+ // lib/href.ts
9641
+ function href(path, ...args) {
9642
+ let params = args[0];
9643
+ return path.split("/").map((segment) => {
9644
+ const match = segment.match(/^:([\w-]+)(\?)?/);
9645
+ if (!match) return segment;
9646
+ const param = match[1];
9647
+ const value = params ? params[param] : void 0;
9648
+ const isRequired = match[2] === void 0;
9649
+ if (isRequired && value === void 0) {
9650
+ throw Error(
9651
+ `Path '${path}' requires param '${param}' but it was not provided`
9652
+ );
9653
+ }
9654
+ return value;
9655
+ }).filter((segment) => segment !== void 0).join("/");
9656
+ }
9657
+
9641
9658
  // lib/dom/ssr/errors.ts
9642
9659
  function deserializeErrors2(errors) {
9643
9660
  if (!errors) return null;
@@ -9786,5 +9803,6 @@ export {
9786
9803
  createSessionStorage,
9787
9804
  createCookieSessionStorage,
9788
9805
  createMemorySessionStorage,
9806
+ href,
9789
9807
  deserializeErrors2 as deserializeErrors
9790
9808
  };
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
- import { R as RouterProviderProps$1 } from './fog-of-war-Cyo_TZuh.mjs';
3
- import './route-data-DQbTMaUY.mjs';
2
+ import { R as RouterProviderProps$1 } from './fog-of-war-yKFj2vdd.mjs';
3
+ import './route-data-CfLfC_Bh.mjs';
4
4
 
5
5
  type RouterProviderProps = Omit<RouterProviderProps$1, "flushSync">;
6
6
  declare function RouterProvider(props: Omit<RouterProviderProps, "flushSync">): React.JSX.Element;
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
- import { R as RouterProviderProps$1 } from './fog-of-war-Ax4Jg2xL.js';
3
- import './route-data-DQbTMaUY.js';
2
+ import { R as RouterProviderProps$1 } from './fog-of-war-rn7nVSAv.js';
3
+ import './route-data-CfLfC_Bh.js';
4
4
 
5
5
  type RouterProviderProps = Omit<RouterProviderProps$1, "flushSync">;
6
6
  declare function RouterProvider(props: Omit<RouterProviderProps, "flushSync">): React.JSX.Element;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * react-router v7.2.0-pre.0
2
+ * react-router v7.2.0-pre.2
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -4359,10 +4359,10 @@ function getSingleFetchDataStrategy(manifest, routeModules, ssr, getRouter) {
4359
4359
  return singleFetchActionStrategy(request, matches);
4360
4360
  }
4361
4361
  if (!ssr) {
4362
- let foundLoaderBelowRoot = matches.some(
4363
- (m) => m.route.id !== "root" && manifest.routes[m.route.id]?.hasLoader
4362
+ let foundRevalidatingServerLoader = matches.some(
4363
+ (m) => m.shouldLoad && manifest.routes[m.route.id]?.hasLoader && !manifest.routes[m.route.id]?.hasClientLoader
4364
4364
  );
4365
- if (!foundLoaderBelowRoot) {
4365
+ if (!foundRevalidatingServerLoader) {
4366
4366
  let matchesToLoad = matches.filter((m) => m.shouldLoad);
4367
4367
  let results = await Promise.all(matchesToLoad.map((m) => m.resolve()));
4368
4368
  return results.reduce(
@@ -4817,13 +4817,7 @@ function createClientRoutesWithHMRRevalidationOptOut(needsRevalidation, manifest
4817
4817
  needsRevalidation
4818
4818
  );
4819
4819
  }
4820
- function preventInvalidServerHandlerCall(type, route, isSpaMode) {
4821
- if (isSpaMode) {
4822
- let fn = type === "action" ? "serverAction()" : "serverLoader()";
4823
- let msg = `You cannot call ${fn} in SPA Mode (routeId: "${route.id}")`;
4824
- console.error(msg);
4825
- throw new ErrorResponseImpl(400, "Bad Request", new Error(msg), true);
4826
- }
4820
+ function preventInvalidServerHandlerCall(type, route) {
4827
4821
  if (type === "loader" && !route.hasLoader || type === "action" && !route.hasAction) {
4828
4822
  let fn = type === "action" ? "serverAction()" : "serverLoader()";
4829
4823
  let msg = `You are trying to call ${fn} on a route that does not have a server ${type} (routeId: "${route.id}")`;
@@ -4917,7 +4911,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSp
4917
4911
  request,
4918
4912
  params,
4919
4913
  async serverLoader() {
4920
- preventInvalidServerHandlerCall("loader", route, isSpaMode);
4914
+ preventInvalidServerHandlerCall("loader", route);
4921
4915
  if (isHydrationRequest) {
4922
4916
  if (hasInitialData) {
4923
4917
  return initialData;
@@ -4956,7 +4950,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSp
4956
4950
  request,
4957
4951
  params,
4958
4952
  async serverAction() {
4959
- preventInvalidServerHandlerCall("action", route, isSpaMode);
4953
+ preventInvalidServerHandlerCall("action", route);
4960
4954
  return fetchServerAction(singleFetch);
4961
4955
  }
4962
4956
  });
@@ -4978,7 +4972,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSp
4978
4972
  return clientLoader({
4979
4973
  ...args,
4980
4974
  async serverLoader() {
4981
- preventInvalidServerHandlerCall("loader", route, isSpaMode);
4975
+ preventInvalidServerHandlerCall("loader", route);
4982
4976
  return fetchServerLoader(singleFetch);
4983
4977
  }
4984
4978
  });
@@ -5003,7 +4997,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSp
5003
4997
  return clientAction({
5004
4998
  ...args,
5005
4999
  async serverAction() {
5006
- preventInvalidServerHandlerCall("action", route, isSpaMode);
5000
+ preventInvalidServerHandlerCall("action", route);
5007
5001
  return fetchServerAction(singleFetch);
5008
5002
  }
5009
5003
  });
@@ -5025,7 +5019,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSp
5025
5019
  lazyRoute.loader = (args, singleFetch) => clientLoader({
5026
5020
  ...args,
5027
5021
  async serverLoader() {
5028
- preventInvalidServerHandlerCall("loader", route, isSpaMode);
5022
+ preventInvalidServerHandlerCall("loader", route);
5029
5023
  return fetchServerLoader(singleFetch);
5030
5024
  }
5031
5025
  });
@@ -5035,7 +5029,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSp
5035
5029
  lazyRoute.action = (args, singleFetch) => clientAction({
5036
5030
  ...args,
5037
5031
  async serverAction() {
5038
- preventInvalidServerHandlerCall("action", route, isSpaMode);
5032
+ preventInvalidServerHandlerCall("action", route);
5039
5033
  return fetchServerAction(singleFetch);
5040
5034
  }
5041
5035
  });
@@ -5080,8 +5074,13 @@ function getShouldRevalidateFunction(route, manifestRoute, ssr, needsRevalidatio
5080
5074
  needsRevalidation
5081
5075
  );
5082
5076
  }
5083
- if (!ssr && manifestRoute.id === "root" && manifestRoute.hasLoader && !manifestRoute.hasClientLoader) {
5084
- return () => false;
5077
+ if (!ssr && manifestRoute.hasLoader && !manifestRoute.hasClientLoader) {
5078
+ if (route.shouldRevalidate) {
5079
+ let fn = route.shouldRevalidate;
5080
+ return (opts) => fn({ ...opts, defaultShouldRevalidate: false });
5081
+ } else {
5082
+ return () => false;
5083
+ }
5085
5084
  }
5086
5085
  if (ssr && route.shouldRevalidate) {
5087
5086
  let fn = route.shouldRevalidate;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * react-router v7.2.0-pre.0
2
+ * react-router v7.2.0-pre.2
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -25,7 +25,7 @@ import {
25
25
  matchRoutes,
26
26
  shouldHydrateRouteLoader,
27
27
  useFogOFWarDiscovery
28
- } from "./chunk-HLU4BUUT.mjs";
28
+ } from "./chunk-ULARE4JK.mjs";
29
29
 
30
30
  // lib/dom-export/dom-router-provider.tsx
31
31
  import * as React from "react";
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { j as RouteObject, F as FutureConfig$1, H as HydrationState, I as InitialEntry, D as DataStrategyFunction, al as PatchRoutesOnNavigationFunction, a as Router$1, T as To, c as RelativeRoutingType, u as NonIndexRouteObject, $ as LazyRouteFunction, q as IndexRouteObject, d as Location, e as Action, ak as Navigator, an as RouteMatch, o as StaticHandlerContext, b as RouteManifest, R as RouteModules, aj as DataRouteObject, aK as RouteModule, _ as HTMLFormMethod, Y as FormEncType, aw as PageLinkDescriptor, aL as History, w as GetScrollRestorationKeyFunction, N as NavigateOptions, x as Fetcher, m as SerializeFrom, B as BlockerFunction } from './route-data-DQbTMaUY.js';
2
+ import { j as RouteObject, F as FutureConfig$1, H as HydrationState, I as InitialEntry, D as DataStrategyFunction, am as PatchRoutesOnNavigationFunction, a as Router$1, T as To, c as RelativeRoutingType, u as NonIndexRouteObject, a0 as LazyRouteFunction, q as IndexRouteObject, d as Location, e as Action, al as Navigator, ao as RouteMatch, o as StaticHandlerContext, b as RouteManifest, R as RouteModules, ak as DataRouteObject, aL as RouteModule, $ as HTMLFormMethod, Z as FormEncType, ax as PageLinkDescriptor, aM as History, w as GetScrollRestorationKeyFunction, N as NavigateOptions, x as Fetcher, m as SerializeFrom, B as BlockerFunction } from './route-data-CfLfC_Bh.js';
3
3
 
4
4
  /**
5
5
  * @private
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { j as RouteObject, F as FutureConfig$1, H as HydrationState, I as InitialEntry, D as DataStrategyFunction, al as PatchRoutesOnNavigationFunction, a as Router$1, T as To, c as RelativeRoutingType, u as NonIndexRouteObject, $ as LazyRouteFunction, q as IndexRouteObject, d as Location, e as Action, ak as Navigator, an as RouteMatch, o as StaticHandlerContext, b as RouteManifest, R as RouteModules, aj as DataRouteObject, aK as RouteModule, _ as HTMLFormMethod, Y as FormEncType, aw as PageLinkDescriptor, aL as History, w as GetScrollRestorationKeyFunction, N as NavigateOptions, x as Fetcher, m as SerializeFrom, B as BlockerFunction } from './route-data-DQbTMaUY.mjs';
2
+ import { j as RouteObject, F as FutureConfig$1, H as HydrationState, I as InitialEntry, D as DataStrategyFunction, am as PatchRoutesOnNavigationFunction, a as Router$1, T as To, c as RelativeRoutingType, u as NonIndexRouteObject, a0 as LazyRouteFunction, q as IndexRouteObject, d as Location, e as Action, al as Navigator, ao as RouteMatch, o as StaticHandlerContext, b as RouteManifest, R as RouteModules, ak as DataRouteObject, aL as RouteModule, $ as HTMLFormMethod, Z as FormEncType, ax as PageLinkDescriptor, aM as History, w as GetScrollRestorationKeyFunction, N as NavigateOptions, x as Fetcher, m as SerializeFrom, B as BlockerFunction } from './route-data-CfLfC_Bh.mjs';
3
3
 
4
4
  /**
5
5
  * @private
@@ -1,7 +1,7 @@
1
- import { R as RouteModules, a as Router, D as DataStrategyFunction, b as RouteManifest, S as ServerRouteModule, L as LoaderFunctionArgs, A as ActionFunctionArgs, T as To, c as RelativeRoutingType, d as Location, e as Action, P as ParamParseKey, f as Path, g as PathPattern, h as PathMatch, N as NavigateOptions, i as Params, j as RouteObject, k as Navigation, l as RevalidationState, U as UIMatch, m as SerializeFrom, B as BlockerFunction, n as Blocker, o as StaticHandlerContext, p as StaticHandler, F as FutureConfig$1, C as CreateStaticHandlerOptions$1, I as InitialEntry, H as HydrationState, q as IndexRouteObject, r as LoaderFunction, s as ActionFunction, M as MetaFunction, t as LinksFunction, u as NonIndexRouteObject, v as RouterState } from './route-data-DQbTMaUY.mjs';
2
- export { ao as ClientActionFunction, ap as ClientActionFunctionArgs, aq as ClientLoaderFunction, ar as ClientLoaderFunctionArgs, ai as DataRouteMatch, aj as DataRouteObject, O as DataStrategyFunctionArgs, Q as DataStrategyMatch, V as DataStrategyResult, X as ErrorResponse, x as Fetcher, Y as FormEncType, Z as FormMethod, G as GetScrollPositionFunction, w as GetScrollRestorationKeyFunction, _ as HTMLFormMethod, as as HeadersArgs, at as HeadersFunction, ax as HtmlLinkDescriptor, a8 as IDLE_BLOCKER, a7 as IDLE_FETCHER, a6 as IDLE_NAVIGATION, $ as LazyRouteFunction, ay as LinkDescriptor, au as MetaArgs, av as MetaDescriptor, y as NavigationStates, ak as Navigator, aw as PageLinkDescriptor, al as PatchRoutesOnNavigationFunction, am as PatchRoutesOnNavigationFunctionArgs, a0 as PathParam, a1 as RedirectFunction, an as RouteMatch, K as RouterFetchOptions, z as RouterInit, J as RouterNavigateOptions, E as RouterSubscriber, a2 as ShouldRevalidateFunction, a3 as ShouldRevalidateFunctionArgs, aD as UNSAFE_DataRouterContext, aE as UNSAFE_DataRouterStateContext, W as UNSAFE_DataWithResponseInit, aC as UNSAFE_ErrorResponseImpl, aF as UNSAFE_FetchersContext, aG as UNSAFE_LocationContext, aH as UNSAFE_NavigationContext, aI as UNSAFE_RouteContext, aJ as UNSAFE_ViewTransitionContext, az as UNSAFE_createBrowserHistory, aB as UNSAFE_createRouter, aA as UNSAFE_invariant, a4 as createPath, a9 as data, aa as generatePath, ab as isRouteErrorResponse, ac as matchPath, ad as matchRoutes, a5 as parsePath, ae as redirect, af as redirectDocument, ag as replace, ah as resolvePath } from './route-data-DQbTMaUY.mjs';
3
- import { A as AssetsManifest, a as Route, F as FutureConfig, E as EntryContext } from './fog-of-war-Cyo_TZuh.mjs';
4
- export { f as Await, b as AwaitProps, J as BrowserRouter, B as BrowserRouterProps, v as FetcherFormProps, z as FetcherSubmitFunction, a4 as FetcherSubmitOptions, C as FetcherWithComponents, V as Form, w as FormProps, K as HashRouter, H as HashRouterProps, q as HistoryRouterProps, I as IndexRouteProps, L as LayoutRouteProps, Q as Link, s as LinkProps, ab as Links, g as MemoryRouter, M as MemoryRouterProps, aa as Meta, U as NavLink, t as NavLinkProps, u as NavLinkRenderProps, h as Navigate, N as NavigateProps, i as Outlet, O as OutletProps, a5 as ParamKeyValuePair, P as PathRouteProps, ad as PrefetchPageLinks, j as Route, c as RouteProps, k as Router, d as RouterProps, l as RouterProvider, R as RouterProviderProps, m as Routes, e as RoutesProps, ac as Scripts, ae as ScriptsProps, W as ScrollRestoration, S as ScrollRestorationProps, x as SetURLSearchParams, y as SubmitFunction, a6 as SubmitOptions, a8 as SubmitTarget, ag as UNSAFE_FrameworkContext, aj as UNSAFE_createClientRoutes, ak as UNSAFE_createClientRoutesWithHMRRevalidationOptOut, ah as UNSAFE_getPatchRoutesOnNavigationFunction, af as UNSAFE_mapRouteProperties, al as UNSAFE_shouldHydrateRouteLoader, ai as UNSAFE_useFogOFWarDiscovery, am as UNSAFE_useScrollRestoration, a7 as URLSearchParamsInit, D as createBrowserRouter, G as createHashRouter, n as createMemoryRouter, o as createRoutesFromChildren, p as createRoutesFromElements, a9 as createSearchParams, r as renderMatches, T as unstable_HistoryRouter, a2 as unstable_usePrompt, a1 as useBeforeUnload, $ as useFetcher, a0 as useFetchers, _ as useFormAction, X as useLinkClickHandler, Y as useSearchParams, Z as useSubmit, a3 as useViewTransitionState } from './fog-of-war-Cyo_TZuh.mjs';
1
+ import { R as RouteModules, a as Router, D as DataStrategyFunction, b as RouteManifest, S as ServerRouteModule, L as LoaderFunctionArgs, A as ActionFunctionArgs, T as To, c as RelativeRoutingType, d as Location, e as Action, P as ParamParseKey, f as Path, g as PathPattern, h as PathMatch, N as NavigateOptions, i as Params$1, j as RouteObject, k as Navigation, l as RevalidationState, U as UIMatch, m as SerializeFrom, B as BlockerFunction, n as Blocker, o as StaticHandlerContext, p as StaticHandler, F as FutureConfig$1, C as CreateStaticHandlerOptions$1, I as InitialEntry, H as HydrationState, q as IndexRouteObject, r as LoaderFunction, s as ActionFunction, M as MetaFunction, t as LinksFunction, u as NonIndexRouteObject, E as Equal, v as RouterState } from './route-data-CfLfC_Bh.mjs';
2
+ export { ap as ClientActionFunction, aq as ClientActionFunctionArgs, ar as ClientLoaderFunction, as as ClientLoaderFunctionArgs, aj as DataRouteMatch, ak as DataRouteObject, Q as DataStrategyFunctionArgs, V as DataStrategyMatch, W as DataStrategyResult, Y as ErrorResponse, x as Fetcher, Z as FormEncType, _ as FormMethod, G as GetScrollPositionFunction, w as GetScrollRestorationKeyFunction, $ as HTMLFormMethod, at as HeadersArgs, au as HeadersFunction, ay as HtmlLinkDescriptor, a9 as IDLE_BLOCKER, a8 as IDLE_FETCHER, a7 as IDLE_NAVIGATION, a0 as LazyRouteFunction, az as LinkDescriptor, av as MetaArgs, aw as MetaDescriptor, y as NavigationStates, al as Navigator, ax as PageLinkDescriptor, am as PatchRoutesOnNavigationFunction, an as PatchRoutesOnNavigationFunctionArgs, a1 as PathParam, a2 as RedirectFunction, ao as RouteMatch, O as RouterFetchOptions, z as RouterInit, K as RouterNavigateOptions, J as RouterSubscriber, a3 as ShouldRevalidateFunction, a4 as ShouldRevalidateFunctionArgs, aE as UNSAFE_DataRouterContext, aF as UNSAFE_DataRouterStateContext, X as UNSAFE_DataWithResponseInit, aD as UNSAFE_ErrorResponseImpl, aG as UNSAFE_FetchersContext, aH as UNSAFE_LocationContext, aI as UNSAFE_NavigationContext, aJ as UNSAFE_RouteContext, aK as UNSAFE_ViewTransitionContext, aA as UNSAFE_createBrowserHistory, aC as UNSAFE_createRouter, aB as UNSAFE_invariant, a5 as createPath, aa as data, ab as generatePath, ac as isRouteErrorResponse, ad as matchPath, ae as matchRoutes, a6 as parsePath, af as redirect, ag as redirectDocument, ah as replace, ai as resolvePath } from './route-data-CfLfC_Bh.mjs';
3
+ import { A as AssetsManifest, a as Route, F as FutureConfig, E as EntryContext } from './fog-of-war-yKFj2vdd.mjs';
4
+ export { f as Await, b as AwaitProps, J as BrowserRouter, B as BrowserRouterProps, v as FetcherFormProps, z as FetcherSubmitFunction, a4 as FetcherSubmitOptions, C as FetcherWithComponents, V as Form, w as FormProps, K as HashRouter, H as HashRouterProps, q as HistoryRouterProps, I as IndexRouteProps, L as LayoutRouteProps, Q as Link, s as LinkProps, ab as Links, g as MemoryRouter, M as MemoryRouterProps, aa as Meta, U as NavLink, t as NavLinkProps, u as NavLinkRenderProps, h as Navigate, N as NavigateProps, i as Outlet, O as OutletProps, a5 as ParamKeyValuePair, P as PathRouteProps, ad as PrefetchPageLinks, j as Route, c as RouteProps, k as Router, d as RouterProps, l as RouterProvider, R as RouterProviderProps, m as Routes, e as RoutesProps, ac as Scripts, ae as ScriptsProps, W as ScrollRestoration, S as ScrollRestorationProps, x as SetURLSearchParams, y as SubmitFunction, a6 as SubmitOptions, a8 as SubmitTarget, ag as UNSAFE_FrameworkContext, aj as UNSAFE_createClientRoutes, ak as UNSAFE_createClientRoutesWithHMRRevalidationOptOut, ah as UNSAFE_getPatchRoutesOnNavigationFunction, af as UNSAFE_mapRouteProperties, al as UNSAFE_shouldHydrateRouteLoader, ai as UNSAFE_useFogOFWarDiscovery, am as UNSAFE_useScrollRestoration, a7 as URLSearchParamsInit, D as createBrowserRouter, G as createHashRouter, n as createMemoryRouter, o as createRoutesFromChildren, p as createRoutesFromElements, a9 as createSearchParams, r as renderMatches, T as unstable_HistoryRouter, a2 as unstable_usePrompt, a1 as useBeforeUnload, $ as useFetcher, a0 as useFetchers, _ as useFormAction, X as useLinkClickHandler, Y as useSearchParams, Z as useSubmit, a3 as useViewTransitionState } from './fog-of-war-yKFj2vdd.mjs';
5
5
  import * as React from 'react';
6
6
  import { ReactElement } from 'react';
7
7
  import { ParseOptions, SerializeOptions } from 'cookie';
@@ -194,7 +194,7 @@ declare function useOutlet(context?: unknown): React.ReactElement | null;
194
194
  */
195
195
  declare function useParams<ParamsOrKey extends string | Record<string, string | undefined> = string>(): Readonly<[
196
196
  ParamsOrKey
197
- ] extends [string] ? Params<ParamsOrKey> : Partial<ParamsOrKey>>;
197
+ ] extends [string] ? Params$1<ParamsOrKey> : Partial<ParamsOrKey>>;
198
198
  /**
199
199
  Resolves the pathname of the given `to` value against the current location. Similar to {@link useHref}, but returns a {@link Path} instead of a string.
200
200
 
@@ -782,6 +782,37 @@ type DevServerHooks = {
782
782
  };
783
783
  declare function setDevServerHooks(devServerHooks: DevServerHooks): void;
784
784
 
785
+ /**
786
+ * Apps can use this interface to "register" app-wide types for React Router via interface declaration merging and module augmentation.
787
+ * React Router should handle this for you via type generation.
788
+ *
789
+ * For more on declaration merging and module augmentation, see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation .
790
+ */
791
+ interface Register {
792
+ }
793
+
794
+ type AnyParams = Record<string, Record<string, string | undefined>>;
795
+ type Params = Register extends {
796
+ params: infer RegisteredParams extends AnyParams;
797
+ } ? RegisteredParams : AnyParams;
798
+ type Args = {
799
+ [K in keyof Params]: ToArgs<Params[K]>;
800
+ };
801
+ type ToArgs<T> = Equal<T, {}> extends true ? [] : Partial<T> extends T ? [T] | [] : [
802
+ T
803
+ ];
804
+ /**
805
+ Returns a resolved URL path for the specified route.
806
+
807
+ ```tsx
808
+ const h = href("/:lang?/about", { lang: "en" })
809
+ // -> `/en/about`
810
+
811
+ <Link to={href("/products/:id", { id: "abc123" })} />
812
+ ```
813
+ */
814
+ declare function href<Path extends keyof Args>(path: Path, ...args: Args[Path]): string;
815
+
785
816
  declare function deserializeErrors(errors: RouterState["errors"]): RouterState["errors"];
786
817
 
787
818
  type RemixErrorBoundaryProps = React.PropsWithChildren<{
@@ -805,4 +836,4 @@ declare class RemixErrorBoundary extends React.Component<RemixErrorBoundaryProps
805
836
  render(): string | number | boolean | Iterable<React.ReactNode> | React.JSX.Element | null | undefined;
806
837
  }
807
838
 
808
- export { ActionFunction, ActionFunctionArgs, AppLoadContext$1 as AppLoadContext, Blocker, BlockerFunction, type Cookie, type CookieOptions, type CookieSignatureOptions, type CreateRequestHandlerFunction, Router as DataRouter, DataStrategyFunction, EntryContext, type FlashSessionData, type HandleDataRequestFunction, type HandleDocumentRequestFunction, type HandleErrorFunction, HydrationState, IndexRouteObject, InitialEntry, type IsCookieFunction, type IsSessionFunction, LinksFunction, LoaderFunction, LoaderFunctionArgs, Location, MetaFunction, type NavigateFunction, NavigateOptions, Navigation, Action as NavigationType, NonIndexRouteObject, ParamParseKey, Params, Path, PathMatch, PathPattern, RelativeRoutingType, type RequestHandler, RevalidationState, RouteObject, RouterState, type RoutesTestStubProps, type ServerBuild, type ServerEntryModule, ServerRouter, type ServerRouterProps, type Session, type SessionData, type SessionIdStorageStrategy, type SessionStorage, StaticHandler, StaticHandlerContext, StaticRouter, type StaticRouterProps, StaticRouterProvider, type StaticRouterProviderProps, To, UIMatch, AssetsManifest as UNSAFE_AssetsManifest, RemixErrorBoundary as UNSAFE_RemixErrorBoundary, RouteModules as UNSAFE_RouteModules, ServerMode as UNSAFE_ServerMode, SingleFetchRedirectSymbol as UNSAFE_SingleFetchRedirectSymbol, decodeViaTurboStream as UNSAFE_decodeViaTurboStream, deserializeErrors as UNSAFE_deserializeErrors, getSingleFetchDataStrategy as UNSAFE_getSingleFetchDataStrategy, createCookie, createCookieSessionStorage, createMemorySessionStorage, createRequestHandler, createRoutesStub, createSession, createSessionStorage, createStaticHandler, createStaticRouter, isCookie, isSession, setDevServerHooks as unstable_setDevServerHooks, useActionData, useAsyncError, useAsyncValue, useBlocker, useHref, useInRouterContext, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes };
839
+ export { ActionFunction, ActionFunctionArgs, AppLoadContext$1 as AppLoadContext, Blocker, BlockerFunction, type Cookie, type CookieOptions, type CookieSignatureOptions, type CreateRequestHandlerFunction, Router as DataRouter, DataStrategyFunction, EntryContext, type FlashSessionData, type HandleDataRequestFunction, type HandleDocumentRequestFunction, type HandleErrorFunction, HydrationState, IndexRouteObject, InitialEntry, type IsCookieFunction, type IsSessionFunction, LinksFunction, LoaderFunction, LoaderFunctionArgs, Location, MetaFunction, type NavigateFunction, NavigateOptions, Navigation, Action as NavigationType, NonIndexRouteObject, ParamParseKey, Params$1 as Params, Path, PathMatch, PathPattern, type Register, RelativeRoutingType, type RequestHandler, RevalidationState, RouteObject, RouterState, type RoutesTestStubProps, type ServerBuild, type ServerEntryModule, ServerRouter, type ServerRouterProps, type Session, type SessionData, type SessionIdStorageStrategy, type SessionStorage, StaticHandler, StaticHandlerContext, StaticRouter, type StaticRouterProps, StaticRouterProvider, type StaticRouterProviderProps, To, UIMatch, AssetsManifest as UNSAFE_AssetsManifest, RemixErrorBoundary as UNSAFE_RemixErrorBoundary, RouteModules as UNSAFE_RouteModules, ServerMode as UNSAFE_ServerMode, SingleFetchRedirectSymbol as UNSAFE_SingleFetchRedirectSymbol, decodeViaTurboStream as UNSAFE_decodeViaTurboStream, deserializeErrors as UNSAFE_deserializeErrors, getSingleFetchDataStrategy as UNSAFE_getSingleFetchDataStrategy, createCookie, createCookieSessionStorage, createMemorySessionStorage, createRequestHandler, createRoutesStub, createSession, createSessionStorage, createStaticHandler, createStaticRouter, href, isCookie, isSession, setDevServerHooks as unstable_setDevServerHooks, useActionData, useAsyncError, useAsyncValue, useBlocker, useHref, useInRouterContext, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes };