react-router 0.0.0-experimental-1ebb6d403 → 0.0.0-experimental-e41ede670

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 (44) hide show
  1. package/CHANGELOG.md +0 -10
  2. package/dist/development/{chunk-5XVYBMAF.mjs → chunk-H3OBLXFX.mjs} +767 -514
  3. package/dist/development/dom-export.d.mts +13 -3
  4. package/dist/development/dom-export.d.ts +13 -3
  5. package/dist/development/dom-export.js +272 -108
  6. package/dist/development/dom-export.mjs +9 -6
  7. package/dist/{production/fog-of-war-7V7BguJA.d.ts → development/fog-of-war-Bt7PejVF.d.ts} +91 -6
  8. package/dist/development/{fog-of-war-NQCW9yWR.d.mts → fog-of-war-Dz4n-TU-.d.mts} +91 -6
  9. package/dist/development/index.d.mts +10 -19
  10. package/dist/development/index.d.ts +10 -19
  11. package/dist/development/index.js +767 -514
  12. package/dist/development/index.mjs +2 -2
  13. package/dist/development/lib/types/route-module.d.mts +6 -2
  14. package/dist/development/lib/types/route-module.d.ts +6 -2
  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-JFOfNyPS.d.ts → route-data-C96IyGKo.d.mts} +37 -15
  18. package/dist/{production/route-data-JFOfNyPS.d.mts → development/route-data-C96IyGKo.d.ts} +37 -15
  19. package/dist/production/{chunk-CKFZHSMW.mjs → chunk-YBZNESR7.mjs} +767 -514
  20. package/dist/production/dom-export.d.mts +13 -3
  21. package/dist/production/dom-export.d.ts +13 -3
  22. package/dist/production/dom-export.js +272 -108
  23. package/dist/production/dom-export.mjs +9 -6
  24. package/dist/{development/fog-of-war-7V7BguJA.d.ts → production/fog-of-war-Bt7PejVF.d.ts} +91 -6
  25. package/dist/production/{fog-of-war-NQCW9yWR.d.mts → fog-of-war-Dz4n-TU-.d.mts} +91 -6
  26. package/dist/production/index.d.mts +10 -19
  27. package/dist/production/index.d.ts +10 -19
  28. package/dist/production/index.js +767 -514
  29. package/dist/production/index.mjs +2 -2
  30. package/dist/production/lib/types/route-module.d.mts +6 -2
  31. package/dist/production/lib/types/route-module.d.ts +6 -2
  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-JFOfNyPS.d.ts → route-data-C96IyGKo.d.mts} +37 -15
  35. package/dist/{development/route-data-JFOfNyPS.d.mts → production/route-data-C96IyGKo.d.ts} +37 -15
  36. package/package.json +2 -17
  37. package/dist/development/server.d.mts +0 -988
  38. package/dist/development/server.d.ts +0 -988
  39. package/dist/development/server.js +0 -1429
  40. package/dist/development/server.mjs +0 -1406
  41. package/dist/production/server.d.mts +0 -988
  42. package/dist/production/server.d.ts +0 -988
  43. package/dist/production/server.js +0 -1405
  44. package/dist/production/server.mjs +0 -1382
@@ -1,5 +1,5 @@
1
1
  /**
2
- * react-router v0.0.0-experimental-1ebb6d403
2
+ * react-router v0.0.0-experimental-e41ede670
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -812,7 +812,10 @@ var redirect = (url, init = 302) => {
812
812
  }
813
813
  let headers = new Headers(responseInit.headers);
814
814
  headers.set("Location", url);
815
- return new Response(null, { ...responseInit, headers });
815
+ return new Response(null, {
816
+ ...responseInit,
817
+ headers
818
+ });
816
819
  };
817
820
  var redirectDocument = (url, init) => {
818
821
  let response = redirect(url, init);
@@ -907,6 +910,7 @@ function createRouter(init) {
907
910
  );
908
911
  let inFlightDataRoutes;
909
912
  let basename = init.basename || "/";
913
+ let routerContext = typeof init.context !== "undefined" ? init.context : {};
910
914
  let dataStrategyImpl = init.dataStrategy || defaultDataStrategy;
911
915
  let patchRoutesOnNavigationImpl = init.patchRoutesOnNavigation;
912
916
  let future = {
@@ -1095,11 +1099,6 @@ function createRouter(init) {
1095
1099
  }
1096
1100
  }
1097
1101
  });
1098
- fetchersQueuedForDeletion.forEach((key) => {
1099
- if (!state.fetchers.has(key) && !fetchControllers.has(key)) {
1100
- unmountedFetchers.push(key);
1101
- }
1102
- });
1103
1102
  [...subscribers].forEach(
1104
1103
  (subscriber) => subscriber(state, {
1105
1104
  deletedFetchers: unmountedFetchers,
@@ -1482,6 +1481,14 @@ function createRouter(init) {
1482
1481
  null
1483
1482
  );
1484
1483
  result = results[actionMatch.route.id];
1484
+ if (!result) {
1485
+ for (let match of matches) {
1486
+ if (results[match.route.id]) {
1487
+ result = results[match.route.id];
1488
+ break;
1489
+ }
1490
+ }
1491
+ }
1485
1492
  if (request.signal.aborted) {
1486
1493
  return { shortCircuited: true };
1487
1494
  }
@@ -2143,13 +2150,13 @@ function createRouter(init) {
2143
2150
  results = await callDataStrategyImpl(
2144
2151
  dataStrategyImpl,
2145
2152
  type,
2146
- state2,
2147
2153
  request,
2148
2154
  matchesToLoad,
2149
2155
  matches,
2150
2156
  fetcherKey,
2151
2157
  manifest,
2152
- mapRouteProperties2
2158
+ mapRouteProperties2,
2159
+ routerContext
2153
2160
  );
2154
2161
  } catch (e) {
2155
2162
  matchesToLoad.forEach((m) => {
@@ -2575,16 +2582,18 @@ function createStaticHandler(routes, opts) {
2575
2582
  async function query(request, {
2576
2583
  requestContext,
2577
2584
  skipLoaderErrorBubbling,
2578
- dataStrategy
2585
+ dataStrategy,
2586
+ respond
2579
2587
  } = {}) {
2580
2588
  let url = new URL(request.url);
2581
2589
  let method = request.method;
2582
2590
  let location = createLocation("", createPath(url), null, "default");
2583
2591
  let matches = matchRoutes(dataRoutes, location, basename);
2592
+ let staticContext;
2584
2593
  if (!isValidMethod(method) && method !== "HEAD") {
2585
2594
  let error = getInternalRouterError(405, { method });
2586
2595
  let { matches: methodNotAllowedMatches, route } = getShortCircuitMatches(dataRoutes);
2587
- return {
2596
+ staticContext = {
2588
2597
  basename,
2589
2598
  location,
2590
2599
  matches: methodNotAllowedMatches,
@@ -2600,7 +2609,7 @@ function createStaticHandler(routes, opts) {
2600
2609
  } else if (!matches) {
2601
2610
  let error = getInternalRouterError(404, { pathname: location.pathname });
2602
2611
  let { matches: notFoundMatches, route } = getShortCircuitMatches(dataRoutes);
2603
- return {
2612
+ staticContext = {
2604
2613
  basename,
2605
2614
  location,
2606
2615
  matches: notFoundMatches,
@@ -2613,25 +2622,76 @@ function createStaticHandler(routes, opts) {
2613
2622
  loaderHeaders: {},
2614
2623
  actionHeaders: {}
2615
2624
  };
2625
+ } else if (respond) {
2626
+ try {
2627
+ let response = await runMiddlewarePipeline(
2628
+ {
2629
+ request,
2630
+ matches,
2631
+ params: matches[0].params,
2632
+ context: requestContext
2633
+ },
2634
+ matches.length - 1,
2635
+ true,
2636
+ async () => {
2637
+ let result = await callQueryHandlers(
2638
+ request,
2639
+ location,
2640
+ matches,
2641
+ requestContext,
2642
+ dataStrategy || defaultDataStrategyWithoutMiddleware,
2643
+ skipLoaderErrorBubbling === true,
2644
+ null
2645
+ );
2646
+ if (isResponse(result)) {
2647
+ return result;
2648
+ }
2649
+ let res = await respond({
2650
+ location,
2651
+ basename,
2652
+ ...result
2653
+ });
2654
+ return res;
2655
+ }
2656
+ );
2657
+ invariant(isResponse(response), "Expected a response in query()");
2658
+ return response;
2659
+ } catch (e) {
2660
+ if (isResponse(e)) {
2661
+ return e;
2662
+ }
2663
+ throw e;
2664
+ }
2665
+ } else {
2666
+ let result = await callQueryHandlers(
2667
+ request,
2668
+ location,
2669
+ matches,
2670
+ requestContext,
2671
+ dataStrategy || null,
2672
+ skipLoaderErrorBubbling === true,
2673
+ null
2674
+ );
2675
+ if (isResponse(result)) {
2676
+ return result;
2677
+ }
2678
+ staticContext = {
2679
+ location,
2680
+ basename,
2681
+ ...result
2682
+ };
2616
2683
  }
2617
- let result = await queryImpl(
2618
- request,
2619
- location,
2620
- matches,
2621
- requestContext,
2622
- dataStrategy || null,
2623
- skipLoaderErrorBubbling === true,
2624
- null
2625
- );
2626
- if (isResponse(result)) {
2627
- return result;
2684
+ if (respond) {
2685
+ let res = await respond(staticContext);
2686
+ return res;
2628
2687
  }
2629
- return { location, basename, ...result };
2688
+ return staticContext;
2630
2689
  }
2631
2690
  async function queryRoute(request, {
2632
2691
  routeId,
2633
2692
  requestContext,
2634
- dataStrategy
2693
+ dataStrategy,
2694
+ respond
2635
2695
  } = {}) {
2636
2696
  let url = new URL(request.url);
2637
2697
  let method = request.method;
@@ -2651,31 +2711,64 @@ function createStaticHandler(routes, opts) {
2651
2711
  } else if (!match) {
2652
2712
  throw getInternalRouterError(404, { pathname: location.pathname });
2653
2713
  }
2654
- let result = await queryImpl(
2655
- request,
2656
- location,
2657
- matches,
2658
- requestContext,
2659
- dataStrategy || null,
2660
- false,
2661
- match
2662
- );
2663
- if (isResponse(result)) {
2664
- return result;
2665
- }
2666
- let error = result.errors ? Object.values(result.errors)[0] : void 0;
2667
- if (error !== void 0) {
2668
- throw error;
2669
- }
2670
- if (result.actionData) {
2671
- return Object.values(result.actionData)[0];
2672
- }
2673
- if (result.loaderData) {
2674
- return Object.values(result.loaderData)[0];
2714
+ if (respond) {
2715
+ let response = await runMiddlewarePipeline(
2716
+ {
2717
+ request,
2718
+ matches,
2719
+ params: matches[0].params,
2720
+ context: requestContext
2721
+ },
2722
+ matches.length - 1,
2723
+ true,
2724
+ async () => {
2725
+ let result = await callQueryHandlers(
2726
+ request,
2727
+ location,
2728
+ matches,
2729
+ requestContext,
2730
+ dataStrategy || defaultDataStrategyWithoutMiddleware,
2731
+ false,
2732
+ match
2733
+ );
2734
+ if (isResponse(result)) {
2735
+ return result;
2736
+ }
2737
+ let error = result.errors ? Object.values(result.errors)[0] : void 0;
2738
+ if (error !== void 0) {
2739
+ throw error;
2740
+ }
2741
+ throw new Error("Expected a response from queryRoute");
2742
+ }
2743
+ );
2744
+ return response;
2745
+ } else {
2746
+ let result = await callQueryHandlers(
2747
+ request,
2748
+ location,
2749
+ matches,
2750
+ requestContext,
2751
+ dataStrategy || null,
2752
+ false,
2753
+ match
2754
+ );
2755
+ if (isResponse(result)) {
2756
+ return result;
2757
+ }
2758
+ let error = result.errors ? Object.values(result.errors)[0] : void 0;
2759
+ if (error !== void 0) {
2760
+ throw error;
2761
+ }
2762
+ if (result.actionData) {
2763
+ return Object.values(result.actionData)[0];
2764
+ }
2765
+ if (result.loaderData) {
2766
+ return Object.values(result.loaderData)[0];
2767
+ }
2768
+ return void 0;
2675
2769
  }
2676
- return void 0;
2677
2770
  }
2678
- async function queryImpl(request, location, matches, requestContext, dataStrategy, skipLoaderErrorBubbling, routeMatch) {
2771
+ async function callQueryHandlers(request, location, matches, requestContext, dataStrategy, skipLoaderErrorBubbling, routeMatch) {
2679
2772
  invariant(
2680
2773
  request.signal,
2681
2774
  "query()/queryRoute() requests must contain an AbortController signal"
@@ -2780,7 +2873,7 @@ function createStaticHandler(routes, opts) {
2780
2873
  });
2781
2874
  if (isErrorResult(result)) {
2782
2875
  let boundaryMatch = skipLoaderErrorBubbling ? actionMatch : findNearestBoundary(matches, actionMatch.route.id);
2783
- let context2 = await loadRouteData(
2876
+ let handlerContext2 = await loadRouteData(
2784
2877
  loaderRequest,
2785
2878
  matches,
2786
2879
  requestContext,
@@ -2790,7 +2883,7 @@ function createStaticHandler(routes, opts) {
2790
2883
  [boundaryMatch.route.id, result]
2791
2884
  );
2792
2885
  return {
2793
- ...context2,
2886
+ ...handlerContext2,
2794
2887
  statusCode: isRouteErrorResponse(result.error) ? result.error.status : result.statusCode != null ? result.statusCode : 500,
2795
2888
  actionData: null,
2796
2889
  actionHeaders: {
@@ -2798,7 +2891,7 @@ function createStaticHandler(routes, opts) {
2798
2891
  }
2799
2892
  };
2800
2893
  }
2801
- let context = await loadRouteData(
2894
+ let handlerContext = await loadRouteData(
2802
2895
  loaderRequest,
2803
2896
  matches,
2804
2897
  requestContext,
@@ -2807,7 +2900,7 @@ function createStaticHandler(routes, opts) {
2807
2900
  null
2808
2901
  );
2809
2902
  return {
2810
- ...context,
2903
+ ...handlerContext,
2811
2904
  actionData: {
2812
2905
  [actionMatch.route.id]: result.data
2813
2906
  },
@@ -2856,7 +2949,7 @@ function createStaticHandler(routes, opts) {
2856
2949
  if (request.signal.aborted) {
2857
2950
  throwStaticHandlerAbortedError(request, isRouteRequest);
2858
2951
  }
2859
- let context = processRouteLoaderData(
2952
+ let handlerContext = processRouteLoaderData(
2860
2953
  matches,
2861
2954
  results,
2862
2955
  pendingActionResult,
@@ -2868,26 +2961,25 @@ function createStaticHandler(routes, opts) {
2868
2961
  );
2869
2962
  matches.forEach((match) => {
2870
2963
  if (!executedLoaders.has(match.route.id)) {
2871
- context.loaderData[match.route.id] = null;
2964
+ handlerContext.loaderData[match.route.id] = null;
2872
2965
  }
2873
2966
  });
2874
2967
  return {
2875
- ...context,
2968
+ ...handlerContext,
2876
2969
  matches
2877
2970
  };
2878
2971
  }
2879
- async function callDataStrategy(type, request, matchesToLoad, matches, isRouteRequest, requestContext, dataStrategy) {
2972
+ async function callDataStrategy(type, request, matchesToLoad, matches, isRouteRequest, routerContext, dataStrategy) {
2880
2973
  let results = await callDataStrategyImpl(
2881
2974
  dataStrategy || defaultDataStrategy,
2882
2975
  type,
2883
- null,
2884
2976
  request,
2885
2977
  matchesToLoad,
2886
2978
  matches,
2887
2979
  null,
2888
2980
  manifest,
2889
2981
  mapRouteProperties2,
2890
- requestContext
2982
+ routerContext
2891
2983
  );
2892
2984
  let dataResults = {};
2893
2985
  await Promise.all(
@@ -2920,15 +3012,14 @@ function createStaticHandler(routes, opts) {
2920
3012
  queryRoute
2921
3013
  };
2922
3014
  }
2923
- function getStaticContextFromError(routes, context, error) {
2924
- let newContext = {
2925
- ...context,
3015
+ function getStaticContextFromError(routes, handlerContext, error) {
3016
+ return {
3017
+ ...handlerContext,
2926
3018
  statusCode: isRouteErrorResponse(error) ? error.status : 500,
2927
3019
  errors: {
2928
- [context._deepestRenderedBoundaryId || routes[0].id]: error
3020
+ [handlerContext._deepestRenderedBoundaryId || routes[0].id]: error
2929
3021
  }
2930
3022
  };
2931
- return newContext;
2932
3023
  }
2933
3024
  function throwStaticHandlerAbortedError(request, isRouteRequest) {
2934
3025
  if (request.signal.reason !== void 0) {
@@ -3321,20 +3412,133 @@ async function loadLazyRouteModule(route, mapRouteProperties2, manifest) {
3321
3412
  lazy: void 0
3322
3413
  });
3323
3414
  }
3324
- async function defaultDataStrategy({
3325
- matches
3326
- }) {
3327
- let matchesToLoad = matches.filter((m) => m.shouldLoad);
3415
+ async function defaultDataStrategyWithoutMiddleware(args) {
3416
+ let matchesToLoad = args.matches.filter((m) => m.shouldLoad);
3417
+ let keyedResults = {};
3328
3418
  let results = await Promise.all(matchesToLoad.map((m) => m.resolve()));
3329
- return results.reduce(
3330
- (acc, result, i) => Object.assign(acc, { [matchesToLoad[i].route.id]: result }),
3331
- {}
3419
+ results.forEach((result, i) => {
3420
+ keyedResults[matchesToLoad[i].route.id] = result;
3421
+ });
3422
+ return keyedResults;
3423
+ }
3424
+ async function defaultDataStrategy(args) {
3425
+ let matchesToLoad = args.matches.filter((m) => m.shouldLoad);
3426
+ let lastIndex = args.matches.length - 1;
3427
+ for (let i = lastIndex; i >= 0; i--) {
3428
+ if (args.matches[i].shouldLoad) {
3429
+ lastIndex = i;
3430
+ break;
3431
+ }
3432
+ }
3433
+ let results = await runMiddlewarePipeline(
3434
+ args,
3435
+ lastIndex,
3436
+ false,
3437
+ async (keyedResults) => {
3438
+ let results2 = await Promise.all(matchesToLoad.map((m) => m.resolve()));
3439
+ results2.forEach((result, i) => {
3440
+ keyedResults[matchesToLoad[i].route.id] = result;
3441
+ });
3442
+ }
3332
3443
  );
3444
+ return results;
3333
3445
  }
3334
- async function callDataStrategyImpl(dataStrategyImpl, type, state, request, matchesToLoad, matches, fetcherKey, manifest, mapRouteProperties2, requestContext) {
3446
+ async function runMiddlewarePipeline({
3447
+ request,
3448
+ params,
3449
+ context,
3450
+ matches
3451
+ }, lastIndex, propagateResult, handler) {
3452
+ let keyedResults = {};
3453
+ try {
3454
+ let result = await callRouteMiddleware(
3455
+ matches.slice(0, lastIndex + 1).flatMap(
3456
+ (m) => m.route.middleware ? m.route.middleware.map((fn) => [m.route.id, fn]) : []
3457
+ ),
3458
+ 0,
3459
+ { request, params, context },
3460
+ keyedResults,
3461
+ propagateResult,
3462
+ handler
3463
+ );
3464
+ return propagateResult ? result : keyedResults;
3465
+ } catch (e) {
3466
+ if (!(e instanceof MiddlewareError)) {
3467
+ throw e;
3468
+ }
3469
+ if (propagateResult && isResponse(e.error)) {
3470
+ throw e.error;
3471
+ }
3472
+ return {
3473
+ ...keyedResults,
3474
+ [e.routeId]: { type: "error", result: e.error }
3475
+ };
3476
+ }
3477
+ }
3478
+ var MiddlewareError = class {
3479
+ constructor(routeId, error) {
3480
+ this.routeId = routeId;
3481
+ this.error = error;
3482
+ }
3483
+ };
3484
+ async function callRouteMiddleware(middlewares, idx, args, keyedResults, propagateResult, handler) {
3485
+ let { request } = args;
3486
+ if (request.signal.aborted) {
3487
+ if (request.signal.reason) {
3488
+ throw request.signal.reason;
3489
+ }
3490
+ throw new Error(
3491
+ `Request aborted without an \`AbortSignal.reason\`: ${request.method} ${request.url}`
3492
+ );
3493
+ }
3494
+ let tuple = middlewares[idx];
3495
+ if (!tuple) {
3496
+ let result = await handler(keyedResults);
3497
+ return result;
3498
+ }
3499
+ let [routeId, middleware] = tuple;
3500
+ let nextCalled = false;
3501
+ let next = async () => {
3502
+ if (nextCalled) {
3503
+ throw new Error("You may only call `next()` once per middleware");
3504
+ }
3505
+ nextCalled = true;
3506
+ let result = await callRouteMiddleware(
3507
+ middlewares,
3508
+ idx + 1,
3509
+ args,
3510
+ keyedResults,
3511
+ propagateResult,
3512
+ handler
3513
+ );
3514
+ return propagateResult ? result : void 0;
3515
+ };
3516
+ try {
3517
+ let result = await middleware(args, next);
3518
+ if (!nextCalled) {
3519
+ result = await next();
3520
+ }
3521
+ return result;
3522
+ } catch (e) {
3523
+ if (e instanceof MiddlewareError) {
3524
+ throw e;
3525
+ }
3526
+ throw new MiddlewareError(routeId, e);
3527
+ }
3528
+ }
3529
+ async function callDataStrategyImpl(dataStrategyImpl, type, request, matchesToLoad, matches, fetcherKey, manifest, mapRouteProperties2, routerContext) {
3335
3530
  let loadRouteDefinitionsPromises = matches.map(
3336
3531
  (m) => m.route.lazy ? loadLazyRouteModule(m.route, mapRouteProperties2, manifest) : void 0
3337
3532
  );
3533
+ let lazyMiddlewarePromises = matches.map(
3534
+ (m, i) => m.route.lazy && !("middleware" in m.route) ? (
3535
+ // Swallow the error here, let it bubble up from resolve()
3536
+ loadRouteDefinitionsPromises[i].catch((e) => e)
3537
+ ) : null
3538
+ ).filter((p) => p != null);
3539
+ if (lazyMiddlewarePromises.length > 0) {
3540
+ await Promise.all(lazyMiddlewarePromises);
3541
+ }
3338
3542
  let dsMatches = matches.map((match, i) => {
3339
3543
  let loadRoutePromise = loadRouteDefinitionsPromises[i];
3340
3544
  let shouldLoad = matchesToLoad.some((m) => m.route.id === match.route.id);
@@ -3348,7 +3552,7 @@ async function callDataStrategyImpl(dataStrategyImpl, type, state, request, matc
3348
3552
  match,
3349
3553
  loadRoutePromise,
3350
3554
  handlerOverride,
3351
- requestContext
3555
+ routerContext
3352
3556
  ) : Promise.resolve({ type: "data" /* data */, result: void 0 });
3353
3557
  };
3354
3558
  return {
@@ -3362,7 +3566,7 @@ async function callDataStrategyImpl(dataStrategyImpl, type, state, request, matc
3362
3566
  request,
3363
3567
  params: matches[0].params,
3364
3568
  fetcherKey,
3365
- context: requestContext
3569
+ context: routerContext
3366
3570
  });
3367
3571
  try {
3368
3572
  await Promise.all(loadRouteDefinitionsPromises);
@@ -3370,7 +3574,7 @@ async function callDataStrategyImpl(dataStrategyImpl, type, state, request, matc
3370
3574
  }
3371
3575
  return results;
3372
3576
  }
3373
- async function callLoaderOrAction(type, request, match, loadRoutePromise, handlerOverride, staticContext) {
3577
+ async function callLoaderOrAction(type, request, match, loadRoutePromise, handlerOverride, routerContext) {
3374
3578
  let result;
3375
3579
  let onReject;
3376
3580
  let runHandler = (handler) => {
@@ -3390,7 +3594,7 @@ async function callLoaderOrAction(type, request, match, loadRoutePromise, handle
3390
3594
  {
3391
3595
  request,
3392
3596
  params: match.params,
3393
- context: staticContext
3597
+ context: routerContext
3394
3598
  },
3395
3599
  ...ctx !== void 0 ? [ctx] : []
3396
3600
  );
@@ -4024,7 +4228,7 @@ function createDeferred() {
4024
4228
  }
4025
4229
 
4026
4230
  // lib/components.tsx
4027
- import * as React4 from "react";
4231
+ import * as React3 from "react";
4028
4232
 
4029
4233
  // lib/context.ts
4030
4234
  import * as React from "react";
@@ -4642,23 +4846,8 @@ function warnOnce(condition, message) {
4642
4846
  }
4643
4847
  }
4644
4848
 
4645
- // lib/dom/shared.tsx
4646
- import * as React3 from "react";
4849
+ // lib/components.tsx
4647
4850
  var ENABLE_DEV_WARNINGS2 = true;
4648
- function createHref(to) {
4649
- return typeof to === "string" ? to : createPath(to);
4650
- }
4651
- function encodeLocation(to) {
4652
- let href = typeof to === "string" ? to : createPath(to);
4653
- href = href.replace(/ $/, "%20");
4654
- let encoded = ABSOLUTE_URL_REGEX2.test(href) ? new URL(href) : new URL(href, "http://localhost");
4655
- return {
4656
- pathname: encoded.pathname,
4657
- search: encoded.search,
4658
- hash: encoded.hash
4659
- };
4660
- }
4661
- var ABSOLUTE_URL_REGEX2 = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
4662
4851
  function mapRouteProperties(route) {
4663
4852
  let updates = {
4664
4853
  // Note: this check also occurs in createRoutesFromChildren so update
@@ -4709,11 +4898,10 @@ function mapRouteProperties(route) {
4709
4898
  }
4710
4899
  return updates;
4711
4900
  }
4712
-
4713
- // lib/components.tsx
4714
4901
  function createMemoryRouter(routes, opts) {
4715
4902
  return createRouter({
4716
4903
  basename: opts?.basename,
4904
+ context: opts?.context,
4717
4905
  future: opts?.future,
4718
4906
  history: createMemoryHistory({
4719
4907
  initialEntries: opts?.initialEntries,
@@ -4749,23 +4937,23 @@ function RouterProvider({
4749
4937
  router,
4750
4938
  flushSync: reactDomFlushSyncImpl
4751
4939
  }) {
4752
- let [state, setStateImpl] = React4.useState(router.state);
4753
- let [pendingState, setPendingState] = React4.useState();
4754
- let [vtContext, setVtContext] = React4.useState({
4940
+ let [state, setStateImpl] = React3.useState(router.state);
4941
+ let [pendingState, setPendingState] = React3.useState();
4942
+ let [vtContext, setVtContext] = React3.useState({
4755
4943
  isTransitioning: false
4756
4944
  });
4757
- let [renderDfd, setRenderDfd] = React4.useState();
4758
- let [transition, setTransition] = React4.useState();
4759
- let [interruption, setInterruption] = React4.useState();
4760
- let fetcherData = React4.useRef(/* @__PURE__ */ new Map());
4761
- let setState = React4.useCallback(
4945
+ let [renderDfd, setRenderDfd] = React3.useState();
4946
+ let [transition, setTransition] = React3.useState();
4947
+ let [interruption, setInterruption] = React3.useState();
4948
+ let fetcherData = React3.useRef(/* @__PURE__ */ new Map());
4949
+ let setState = React3.useCallback(
4762
4950
  (newState, { deletedFetchers, flushSync, viewTransitionOpts }) => {
4951
+ deletedFetchers.forEach((key) => fetcherData.current.delete(key));
4763
4952
  newState.fetchers.forEach((fetcher, key) => {
4764
4953
  if (fetcher.data !== void 0) {
4765
4954
  fetcherData.current.set(key, fetcher.data);
4766
4955
  }
4767
4956
  });
4768
- deletedFetchers.forEach((key) => fetcherData.current.delete(key));
4769
4957
  warnOnce(
4770
4958
  flushSync === false || reactDomFlushSyncImpl != null,
4771
4959
  'You provided the `flushSync` option to a router update, but you are not using the `<RouterProvider>` from `react-router/dom` so `ReactDOM.flushSync()` is unavailable. Please update your app to `import { RouterProvider } from "react-router/dom"` and ensure you have `react-dom` installed as a dependency to use the `flushSync` option.'
@@ -4779,7 +4967,7 @@ function RouterProvider({
4779
4967
  if (reactDomFlushSyncImpl && flushSync) {
4780
4968
  reactDomFlushSyncImpl(() => setStateImpl(newState));
4781
4969
  } else {
4782
- React4.startTransition(() => setStateImpl(newState));
4970
+ React3.startTransition(() => setStateImpl(newState));
4783
4971
  }
4784
4972
  return;
4785
4973
  }
@@ -4830,18 +5018,18 @@ function RouterProvider({
4830
5018
  },
4831
5019
  [router.window, reactDomFlushSyncImpl, transition, renderDfd]
4832
5020
  );
4833
- React4.useLayoutEffect(() => router.subscribe(setState), [router, setState]);
4834
- React4.useEffect(() => {
5021
+ React3.useLayoutEffect(() => router.subscribe(setState), [router, setState]);
5022
+ React3.useEffect(() => {
4835
5023
  if (vtContext.isTransitioning && !vtContext.flushSync) {
4836
5024
  setRenderDfd(new Deferred());
4837
5025
  }
4838
5026
  }, [vtContext]);
4839
- React4.useEffect(() => {
5027
+ React3.useEffect(() => {
4840
5028
  if (renderDfd && pendingState && router.window) {
4841
5029
  let newState = pendingState;
4842
5030
  let renderPromise = renderDfd.promise;
4843
5031
  let transition2 = router.window.document.startViewTransition(async () => {
4844
- React4.startTransition(() => setStateImpl(newState));
5032
+ React3.startTransition(() => setStateImpl(newState));
4845
5033
  await renderPromise;
4846
5034
  });
4847
5035
  transition2.finished.finally(() => {
@@ -4853,12 +5041,12 @@ function RouterProvider({
4853
5041
  setTransition(transition2);
4854
5042
  }
4855
5043
  }, [pendingState, renderDfd, router.window]);
4856
- React4.useEffect(() => {
5044
+ React3.useEffect(() => {
4857
5045
  if (renderDfd && pendingState && state.location.key === pendingState.location.key) {
4858
5046
  renderDfd.resolve();
4859
5047
  }
4860
5048
  }, [renderDfd, transition, state.location, pendingState]);
4861
- React4.useEffect(() => {
5049
+ React3.useEffect(() => {
4862
5050
  if (!vtContext.isTransitioning && interruption) {
4863
5051
  setPendingState(interruption.state);
4864
5052
  setVtContext({
@@ -4870,7 +5058,7 @@ function RouterProvider({
4870
5058
  setInterruption(void 0);
4871
5059
  }
4872
5060
  }, [vtContext.isTransitioning, interruption]);
4873
- let navigator2 = React4.useMemo(() => {
5061
+ let navigator2 = React3.useMemo(() => {
4874
5062
  return {
4875
5063
  createHref: router.createHref,
4876
5064
  encodeLocation: router.encodeLocation,
@@ -4887,7 +5075,7 @@ function RouterProvider({
4887
5075
  };
4888
5076
  }, [router]);
4889
5077
  let basename = router.basename || "/";
4890
- let dataRouterContext = React4.useMemo(
5078
+ let dataRouterContext = React3.useMemo(
4891
5079
  () => ({
4892
5080
  router,
4893
5081
  navigator: navigator2,
@@ -4896,7 +5084,7 @@ function RouterProvider({
4896
5084
  }),
4897
5085
  [router, navigator2, basename]
4898
5086
  );
4899
- return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(DataRouterContext.Provider, { value: dataRouterContext }, /* @__PURE__ */ React4.createElement(DataRouterStateContext.Provider, { value: state }, /* @__PURE__ */ React4.createElement(FetchersContext.Provider, { value: fetcherData.current }, /* @__PURE__ */ React4.createElement(ViewTransitionContext.Provider, { value: vtContext }, /* @__PURE__ */ React4.createElement(
5087
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(DataRouterContext.Provider, { value: dataRouterContext }, /* @__PURE__ */ React3.createElement(DataRouterStateContext.Provider, { value: state }, /* @__PURE__ */ React3.createElement(FetchersContext.Provider, { value: fetcherData.current }, /* @__PURE__ */ React3.createElement(ViewTransitionContext.Provider, { value: vtContext }, /* @__PURE__ */ React3.createElement(
4900
5088
  Router,
4901
5089
  {
4902
5090
  basename,
@@ -4904,7 +5092,7 @@ function RouterProvider({
4904
5092
  navigationType: state.historyAction,
4905
5093
  navigator: navigator2
4906
5094
  },
4907
- /* @__PURE__ */ React4.createElement(
5095
+ /* @__PURE__ */ React3.createElement(
4908
5096
  MemoizedDataRoutes,
4909
5097
  {
4910
5098
  routes: router.routes,
@@ -4914,7 +5102,7 @@ function RouterProvider({
4914
5102
  )
4915
5103
  ))))), null);
4916
5104
  }
4917
- var MemoizedDataRoutes = React4.memo(DataRoutes);
5105
+ var MemoizedDataRoutes = React3.memo(DataRoutes);
4918
5106
  function DataRoutes({
4919
5107
  routes,
4920
5108
  future,
@@ -4928,7 +5116,7 @@ function MemoryRouter({
4928
5116
  initialEntries,
4929
5117
  initialIndex
4930
5118
  }) {
4931
- let historyRef = React4.useRef();
5119
+ let historyRef = React3.useRef();
4932
5120
  if (historyRef.current == null) {
4933
5121
  historyRef.current = createMemoryHistory({
4934
5122
  initialEntries,
@@ -4937,18 +5125,18 @@ function MemoryRouter({
4937
5125
  });
4938
5126
  }
4939
5127
  let history = historyRef.current;
4940
- let [state, setStateImpl] = React4.useState({
5128
+ let [state, setStateImpl] = React3.useState({
4941
5129
  action: history.action,
4942
5130
  location: history.location
4943
5131
  });
4944
- let setState = React4.useCallback(
5132
+ let setState = React3.useCallback(
4945
5133
  (newState) => {
4946
- React4.startTransition(() => setStateImpl(newState));
5134
+ React3.startTransition(() => setStateImpl(newState));
4947
5135
  },
4948
5136
  [setStateImpl]
4949
5137
  );
4950
- React4.useLayoutEffect(() => history.listen(setState), [history, setState]);
4951
- return /* @__PURE__ */ React4.createElement(
5138
+ React3.useLayoutEffect(() => history.listen(setState), [history, setState]);
5139
+ return /* @__PURE__ */ React3.createElement(
4952
5140
  Router,
4953
5141
  {
4954
5142
  basename,
@@ -4971,12 +5159,12 @@ function Navigate({
4971
5159
  // the router loaded. We can help them understand how to avoid that.
4972
5160
  `<Navigate> may be used only in the context of a <Router> component.`
4973
5161
  );
4974
- let { static: isStatic } = React4.useContext(NavigationContext);
5162
+ let { static: isStatic } = React3.useContext(NavigationContext);
4975
5163
  warning(
4976
5164
  !isStatic,
4977
5165
  `<Navigate> must not be used on the initial render in a <StaticRouter>. This is a no-op, but you should modify your code so the <Navigate> is only ever rendered in response to some user interaction or state change.`
4978
5166
  );
4979
- let { matches } = React4.useContext(RouteContext);
5167
+ let { matches } = React3.useContext(RouteContext);
4980
5168
  let { pathname: locationPathname } = useLocation();
4981
5169
  let navigate = useNavigate();
4982
5170
  let path = resolveTo(
@@ -4986,7 +5174,7 @@ function Navigate({
4986
5174
  relative === "path"
4987
5175
  );
4988
5176
  let jsonPath = JSON.stringify(path);
4989
- React4.useEffect(() => {
5177
+ React3.useEffect(() => {
4990
5178
  navigate(JSON.parse(jsonPath), { replace: replace2, state, relative });
4991
5179
  }, [navigate, jsonPath, relative, replace2, state]);
4992
5180
  return null;
@@ -5013,7 +5201,7 @@ function Router({
5013
5201
  `You cannot render a <Router> inside another <Router>. You should never have more than one in your app.`
5014
5202
  );
5015
5203
  let basename = basenameProp.replace(/^\/*/, "/");
5016
- let navigationContext = React4.useMemo(
5204
+ let navigationContext = React3.useMemo(
5017
5205
  () => ({
5018
5206
  basename,
5019
5207
  navigator: navigator2,
@@ -5032,7 +5220,7 @@ function Router({
5032
5220
  state = null,
5033
5221
  key = "default"
5034
5222
  } = locationProp;
5035
- let locationContext = React4.useMemo(() => {
5223
+ let locationContext = React3.useMemo(() => {
5036
5224
  let trailingPathname = stripBasename(pathname, basename);
5037
5225
  if (trailingPathname == null) {
5038
5226
  return null;
@@ -5055,7 +5243,7 @@ function Router({
5055
5243
  if (locationContext == null) {
5056
5244
  return null;
5057
5245
  }
5058
- return /* @__PURE__ */ React4.createElement(NavigationContext.Provider, { value: navigationContext }, /* @__PURE__ */ React4.createElement(LocationContext.Provider, { children, value: locationContext }));
5246
+ return /* @__PURE__ */ React3.createElement(NavigationContext.Provider, { value: navigationContext }, /* @__PURE__ */ React3.createElement(LocationContext.Provider, { children, value: locationContext }));
5059
5247
  }
5060
5248
  function Routes({
5061
5249
  children,
@@ -5068,9 +5256,9 @@ function Await({
5068
5256
  errorElement,
5069
5257
  resolve
5070
5258
  }) {
5071
- return /* @__PURE__ */ React4.createElement(AwaitErrorBoundary, { resolve, errorElement }, /* @__PURE__ */ React4.createElement(ResolveAwait, null, children));
5259
+ return /* @__PURE__ */ React3.createElement(AwaitErrorBoundary, { resolve, errorElement }, /* @__PURE__ */ React3.createElement(ResolveAwait, null, children));
5072
5260
  }
5073
- var AwaitErrorBoundary = class extends React4.Component {
5261
+ var AwaitErrorBoundary = class extends React3.Component {
5074
5262
  constructor(props) {
5075
5263
  super(props);
5076
5264
  this.state = { error: null };
@@ -5116,10 +5304,10 @@ var AwaitErrorBoundary = class extends React4.Component {
5116
5304
  throw promise._error;
5117
5305
  }
5118
5306
  if (status === 2 /* error */) {
5119
- return /* @__PURE__ */ React4.createElement(AwaitContext.Provider, { value: promise, children: errorElement });
5307
+ return /* @__PURE__ */ React3.createElement(AwaitContext.Provider, { value: promise, children: errorElement });
5120
5308
  }
5121
5309
  if (status === 1 /* success */) {
5122
- return /* @__PURE__ */ React4.createElement(AwaitContext.Provider, { value: promise, children });
5310
+ return /* @__PURE__ */ React3.createElement(AwaitContext.Provider, { value: promise, children });
5123
5311
  }
5124
5312
  throw promise;
5125
5313
  }
@@ -5129,16 +5317,16 @@ function ResolveAwait({
5129
5317
  }) {
5130
5318
  let data2 = useAsyncValue();
5131
5319
  let toRender = typeof children === "function" ? children(data2) : children;
5132
- return /* @__PURE__ */ React4.createElement(React4.Fragment, null, toRender);
5320
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, toRender);
5133
5321
  }
5134
5322
  function createRoutesFromChildren(children, parentPath = []) {
5135
5323
  let routes = [];
5136
- React4.Children.forEach(children, (element, index) => {
5137
- if (!React4.isValidElement(element)) {
5324
+ React3.Children.forEach(children, (element, index) => {
5325
+ if (!React3.isValidElement(element)) {
5138
5326
  return;
5139
5327
  }
5140
5328
  let treePath = [...parentPath, index];
5141
- if (element.type === React4.Fragment) {
5329
+ if (element.type === React3.Fragment) {
5142
5330
  routes.push.apply(
5143
5331
  routes,
5144
5332
  createRoutesFromChildren(element.props.children, treePath)
@@ -5187,7 +5375,7 @@ function renderMatches(matches) {
5187
5375
  }
5188
5376
 
5189
5377
  // lib/dom/lib.tsx
5190
- import * as React11 from "react";
5378
+ import * as React10 from "react";
5191
5379
 
5192
5380
  // lib/dom/dom.ts
5193
5381
  var defaultMethod = "get";
@@ -5318,7 +5506,7 @@ function getFormSubmissionInfo(target, basename) {
5318
5506
  }
5319
5507
 
5320
5508
  // lib/dom/ssr/components.tsx
5321
- import * as React10 from "react";
5509
+ import * as React9 from "react";
5322
5510
 
5323
5511
  // lib/dom/ssr/invariant.ts
5324
5512
  function invariant2(value, message) {
@@ -5570,7 +5758,7 @@ function createHtml(html) {
5570
5758
  }
5571
5759
 
5572
5760
  // lib/dom/ssr/single-fetch.tsx
5573
- import * as React5 from "react";
5761
+ import * as React4 from "react";
5574
5762
  import { decode } from "turbo-stream";
5575
5763
 
5576
5764
  // lib/dom/ssr/data.ts
@@ -5628,7 +5816,7 @@ function StreamTransfer({
5628
5816
  throw promise;
5629
5817
  }
5630
5818
  let { done, value } = promise.result;
5631
- let scriptTag = value ? /* @__PURE__ */ React5.createElement(
5819
+ let scriptTag = value ? /* @__PURE__ */ React4.createElement(
5632
5820
  "script",
5633
5821
  {
5634
5822
  nonce,
@@ -5640,7 +5828,7 @@ function StreamTransfer({
5640
5828
  }
5641
5829
  ) : null;
5642
5830
  if (done) {
5643
- return /* @__PURE__ */ React5.createElement(React5.Fragment, null, scriptTag, /* @__PURE__ */ React5.createElement(
5831
+ return /* @__PURE__ */ React4.createElement(React4.Fragment, null, scriptTag, /* @__PURE__ */ React4.createElement(
5644
5832
  "script",
5645
5833
  {
5646
5834
  nonce,
@@ -5650,7 +5838,7 @@ function StreamTransfer({
5650
5838
  }
5651
5839
  ));
5652
5840
  } else {
5653
- return /* @__PURE__ */ React5.createElement(React5.Fragment, null, scriptTag, /* @__PURE__ */ React5.createElement(React5.Suspense, null, /* @__PURE__ */ React5.createElement(
5841
+ return /* @__PURE__ */ React4.createElement(React4.Fragment, null, scriptTag, /* @__PURE__ */ React4.createElement(React4.Suspense, null, /* @__PURE__ */ React4.createElement(
5654
5842
  StreamTransfer,
5655
5843
  {
5656
5844
  context,
@@ -5663,20 +5851,54 @@ function StreamTransfer({
5663
5851
  }
5664
5852
  }
5665
5853
  function getSingleFetchDataStrategy(manifest, routeModules, getRouter) {
5666
- return async ({ request, matches, fetcherKey }) => {
5854
+ return async (args) => {
5855
+ let { request, matches, fetcherKey } = args;
5667
5856
  if (request.method !== "GET") {
5668
- return singleFetchActionStrategy(request, matches);
5857
+ return runMiddlewarePipeline(
5858
+ args,
5859
+ matches.findIndex((m) => m.shouldLoad),
5860
+ false,
5861
+ async (keyedResults) => {
5862
+ let results = await singleFetchActionStrategy(request, matches);
5863
+ Object.assign(keyedResults, results);
5864
+ }
5865
+ );
5669
5866
  }
5670
5867
  if (fetcherKey) {
5671
- return singleFetchLoaderFetcherStrategy(request, matches);
5868
+ return runMiddlewarePipeline(
5869
+ args,
5870
+ matches.findIndex((m) => m.shouldLoad),
5871
+ false,
5872
+ async (keyedResults) => {
5873
+ let results = await singleFetchLoaderFetcherStrategy(
5874
+ request,
5875
+ matches
5876
+ );
5877
+ Object.assign(keyedResults, results);
5878
+ }
5879
+ );
5672
5880
  }
5673
- return singleFetchLoaderNavigationStrategy(
5881
+ let lowestLoadingIndex = getLowestLoadingIndex(
5674
5882
  manifest,
5675
5883
  routeModules,
5676
5884
  getRouter(),
5677
- request,
5678
5885
  matches
5679
5886
  );
5887
+ return runMiddlewarePipeline(
5888
+ args,
5889
+ lowestLoadingIndex,
5890
+ false,
5891
+ async (keyedResults) => {
5892
+ let results = await singleFetchLoaderNavigationStrategy(
5893
+ manifest,
5894
+ routeModules,
5895
+ getRouter(),
5896
+ request,
5897
+ matches
5898
+ );
5899
+ Object.assign(keyedResults, results);
5900
+ }
5901
+ );
5680
5902
  };
5681
5903
  }
5682
5904
  async function singleFetchActionStrategy(request, matches) {
@@ -5706,6 +5928,20 @@ async function singleFetchActionStrategy(request, matches) {
5706
5928
  }
5707
5929
  };
5708
5930
  }
5931
+ function isOptedOut(manifestRoute, routeModule, match, router) {
5932
+ return match.route.id in router.state.loaderData && manifestRoute && manifestRoute.hasLoader && routeModule && routeModule.shouldRevalidate;
5933
+ }
5934
+ function getLowestLoadingIndex(manifest, routeModules, router, matches) {
5935
+ let tailIdx = [...matches].reverse().findIndex(
5936
+ (m) => m.shouldLoad || !isOptedOut(
5937
+ manifest.routes[m.route.id],
5938
+ routeModules[m.route.id],
5939
+ m,
5940
+ router
5941
+ )
5942
+ );
5943
+ return tailIdx < 0 ? 0 : matches.length - 1 - tailIdx;
5944
+ }
5709
5945
  async function singleFetchLoaderNavigationStrategy(manifest, routeModules, router, request, matches) {
5710
5946
  let routesParams = /* @__PURE__ */ new Set();
5711
5947
  let foundOptOutRoute = false;
@@ -5724,7 +5960,7 @@ async function singleFetchLoaderNavigationStrategy(manifest, routeModules, route
5724
5960
  if (!router.state.initialized) {
5725
5961
  return;
5726
5962
  }
5727
- if (m.route.id in router.state.loaderData && manifestRoute && manifestRoute.hasLoader && routeModules[m.route.id]?.shouldRevalidate) {
5963
+ if (isOptedOut(manifestRoute, routeModules[m.route.id], m, router)) {
5728
5964
  foundOptOutRoute = true;
5729
5965
  return;
5730
5966
  }
@@ -5900,7 +6136,7 @@ function unwrapSingleFetchResult(result, routeId) {
5900
6136
  if (result.replace) {
5901
6137
  headers["X-Remix-Replace"] = "yes";
5902
6138
  }
5903
- throw redirect(result.redirect, { status: result.status, headers });
6139
+ return redirect(result.redirect, { status: result.status, headers });
5904
6140
  } else if ("data" in result) {
5905
6141
  return result.data;
5906
6142
  } else {
@@ -5936,14 +6172,14 @@ function createDeferred2() {
5936
6172
  }
5937
6173
 
5938
6174
  // lib/dom/ssr/fog-of-war.ts
5939
- import * as React9 from "react";
6175
+ import * as React8 from "react";
5940
6176
 
5941
6177
  // lib/dom/ssr/routes.tsx
5942
- import * as React8 from "react";
6178
+ import * as React7 from "react";
5943
6179
 
5944
6180
  // lib/dom/ssr/errorBoundaries.tsx
5945
- import * as React6 from "react";
5946
- var RemixErrorBoundary = class extends React6.Component {
6181
+ import * as React5 from "react";
6182
+ var RemixErrorBoundary = class extends React5.Component {
5947
6183
  constructor(props) {
5948
6184
  super(props);
5949
6185
  this.state = { error: props.error || null, location: props.location };
@@ -5959,7 +6195,7 @@ var RemixErrorBoundary = class extends React6.Component {
5959
6195
  }
5960
6196
  render() {
5961
6197
  if (this.state.error) {
5962
- return /* @__PURE__ */ React6.createElement(
6198
+ return /* @__PURE__ */ React5.createElement(
5963
6199
  RemixRootDefaultErrorBoundary,
5964
6200
  {
5965
6201
  error: this.state.error,
@@ -5976,7 +6212,7 @@ function RemixRootDefaultErrorBoundary({
5976
6212
  isOutsideRemixApp
5977
6213
  }) {
5978
6214
  console.error(error);
5979
- let heyDeveloper = /* @__PURE__ */ React6.createElement(
6215
+ let heyDeveloper = /* @__PURE__ */ React5.createElement(
5980
6216
  "script",
5981
6217
  {
5982
6218
  dangerouslySetInnerHTML: {
@@ -5989,7 +6225,7 @@ function RemixRootDefaultErrorBoundary({
5989
6225
  }
5990
6226
  );
5991
6227
  if (isRouteErrorResponse(error)) {
5992
- return /* @__PURE__ */ React6.createElement(BoundaryShell, { title: "Unhandled Thrown Response!" }, /* @__PURE__ */ React6.createElement("h1", { style: { fontSize: "24px" } }, error.status, " ", error.statusText), heyDeveloper);
6228
+ return /* @__PURE__ */ React5.createElement(BoundaryShell, { title: "Unhandled Thrown Response!" }, /* @__PURE__ */ React5.createElement("h1", { style: { fontSize: "24px" } }, error.status, " ", error.statusText), heyDeveloper);
5993
6229
  }
5994
6230
  let errorInstance;
5995
6231
  if (error instanceof Error) {
@@ -5998,14 +6234,14 @@ function RemixRootDefaultErrorBoundary({
5998
6234
  let errorString = error == null ? "Unknown Error" : typeof error === "object" && "toString" in error ? error.toString() : JSON.stringify(error);
5999
6235
  errorInstance = new Error(errorString);
6000
6236
  }
6001
- return /* @__PURE__ */ React6.createElement(
6237
+ return /* @__PURE__ */ React5.createElement(
6002
6238
  BoundaryShell,
6003
6239
  {
6004
6240
  title: "Application Error!",
6005
6241
  isOutsideRemixApp
6006
6242
  },
6007
- /* @__PURE__ */ React6.createElement("h1", { style: { fontSize: "24px" } }, "Application Error"),
6008
- /* @__PURE__ */ React6.createElement(
6243
+ /* @__PURE__ */ React5.createElement("h1", { style: { fontSize: "24px" } }, "Application Error"),
6244
+ /* @__PURE__ */ React5.createElement(
6009
6245
  "pre",
6010
6246
  {
6011
6247
  style: {
@@ -6030,19 +6266,19 @@ function BoundaryShell({
6030
6266
  if (routeModules.root?.Layout && !isOutsideRemixApp) {
6031
6267
  return children;
6032
6268
  }
6033
- return /* @__PURE__ */ React6.createElement("html", { lang: "en" }, /* @__PURE__ */ React6.createElement("head", null, /* @__PURE__ */ React6.createElement("meta", { charSet: "utf-8" }), /* @__PURE__ */ React6.createElement(
6269
+ return /* @__PURE__ */ React5.createElement("html", { lang: "en" }, /* @__PURE__ */ React5.createElement("head", null, /* @__PURE__ */ React5.createElement("meta", { charSet: "utf-8" }), /* @__PURE__ */ React5.createElement(
6034
6270
  "meta",
6035
6271
  {
6036
6272
  name: "viewport",
6037
6273
  content: "width=device-width,initial-scale=1,viewport-fit=cover"
6038
6274
  }
6039
- ), /* @__PURE__ */ React6.createElement("title", null, title)), /* @__PURE__ */ React6.createElement("body", null, /* @__PURE__ */ React6.createElement("main", { style: { fontFamily: "system-ui, sans-serif", padding: "2rem" } }, children, renderScripts ? /* @__PURE__ */ React6.createElement(Scripts, null) : null)));
6275
+ ), /* @__PURE__ */ React5.createElement("title", null, title)), /* @__PURE__ */ React5.createElement("body", null, /* @__PURE__ */ React5.createElement("main", { style: { fontFamily: "system-ui, sans-serif", padding: "2rem" } }, children, renderScripts ? /* @__PURE__ */ React5.createElement(Scripts, null) : null)));
6040
6276
  }
6041
6277
 
6042
6278
  // lib/dom/ssr/fallback.tsx
6043
- import * as React7 from "react";
6279
+ import * as React6 from "react";
6044
6280
  function RemixRootDefaultHydrateFallback() {
6045
- return /* @__PURE__ */ React7.createElement(BoundaryShell, { title: "Loading...", renderScripts: true }, /* @__PURE__ */ React7.createElement(
6281
+ return /* @__PURE__ */ React6.createElement(BoundaryShell, { title: "Loading...", renderScripts: true }, /* @__PURE__ */ React6.createElement(
6046
6282
  "script",
6047
6283
  {
6048
6284
  dangerouslySetInnerHTML: {
@@ -6076,17 +6312,17 @@ function groupRoutesByParentId(manifest) {
6076
6312
  function getRouteComponents(route, routeModule, isSpaMode) {
6077
6313
  let Component4 = getRouteModuleComponent(routeModule);
6078
6314
  let HydrateFallback = routeModule.HydrateFallback && (!isSpaMode || route.id === "root") ? routeModule.HydrateFallback : route.id === "root" ? RemixRootDefaultHydrateFallback : void 0;
6079
- let ErrorBoundary = routeModule.ErrorBoundary ? routeModule.ErrorBoundary : route.id === "root" ? () => /* @__PURE__ */ React8.createElement(RemixRootDefaultErrorBoundary, { error: useRouteError() }) : void 0;
6315
+ let ErrorBoundary = routeModule.ErrorBoundary ? routeModule.ErrorBoundary : route.id === "root" ? () => /* @__PURE__ */ React7.createElement(RemixRootDefaultErrorBoundary, { error: useRouteError() }) : void 0;
6080
6316
  if (route.id === "root" && routeModule.Layout) {
6081
6317
  return {
6082
6318
  ...Component4 ? {
6083
- element: /* @__PURE__ */ React8.createElement(routeModule.Layout, null, /* @__PURE__ */ React8.createElement(Component4, null))
6319
+ element: /* @__PURE__ */ React7.createElement(routeModule.Layout, null, /* @__PURE__ */ React7.createElement(Component4, null))
6084
6320
  } : { Component: Component4 },
6085
6321
  ...ErrorBoundary ? {
6086
- errorElement: /* @__PURE__ */ React8.createElement(routeModule.Layout, null, /* @__PURE__ */ React8.createElement(ErrorBoundary, null))
6322
+ errorElement: /* @__PURE__ */ React7.createElement(routeModule.Layout, null, /* @__PURE__ */ React7.createElement(ErrorBoundary, null))
6087
6323
  } : { ErrorBoundary },
6088
6324
  ...HydrateFallback ? {
6089
- hydrateFallbackElement: /* @__PURE__ */ React8.createElement(routeModule.Layout, null, /* @__PURE__ */ React8.createElement(HydrateFallback, null))
6325
+ hydrateFallbackElement: /* @__PURE__ */ React7.createElement(routeModule.Layout, null, /* @__PURE__ */ React7.createElement(HydrateFallback, null))
6090
6326
  } : { HydrateFallback }
6091
6327
  };
6092
6328
  }
@@ -6116,8 +6352,8 @@ function createServerRoutes(manifest, routeModules, future, isSpaMode, parentId
6116
6352
  // render, so just give it a no-op function so we can render down to the
6117
6353
  // proper fallback
6118
6354
  loader: route.hasLoader || route.hasClientLoader ? () => null : void 0
6119
- // We don't need action/shouldRevalidate on these routes since they're
6120
- // for a static render
6355
+ // We don't need middleware/action/shouldRevalidate on these routes since
6356
+ // they're for a static render
6121
6357
  };
6122
6358
  let children = createServerRoutes(
6123
6359
  manifest,
@@ -6201,6 +6437,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, isSpaMode
6201
6437
  Object.assign(dataRoute, {
6202
6438
  ...dataRoute,
6203
6439
  ...getRouteComponents(route, routeModule, isSpaMode),
6440
+ middleware: routeModule.clientMiddleware,
6204
6441
  handle: routeModule.handle,
6205
6442
  shouldRevalidate: getShouldRevalidateFunction(
6206
6443
  routeModule,
@@ -6213,7 +6450,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, isSpaMode
6213
6450
  let hasInitialError = initialState && initialState.errors && route.id in initialState.errors;
6214
6451
  let initialError = hasInitialError ? initialState?.errors?.[route.id] : void 0;
6215
6452
  let isHydrationRequest = needsRevalidation == null && (routeModule.clientLoader?.hydrate === true || !route.hasLoader);
6216
- dataRoute.loader = async ({ request, params }, singleFetch) => {
6453
+ dataRoute.loader = async ({ request, params, context }, singleFetch) => {
6217
6454
  try {
6218
6455
  let result = await prefetchStylesAndCallHandler(async () => {
6219
6456
  invariant2(
@@ -6227,6 +6464,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, isSpaMode
6227
6464
  return routeModule.clientLoader({
6228
6465
  request,
6229
6466
  params,
6467
+ context,
6230
6468
  async serverLoader() {
6231
6469
  preventInvalidServerHandlerCall("loader", route, isSpaMode);
6232
6470
  if (isHydrationRequest) {
@@ -6251,7 +6489,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, isSpaMode
6251
6489
  routeModule,
6252
6490
  isSpaMode
6253
6491
  );
6254
- dataRoute.action = ({ request, params }, singleFetch) => {
6492
+ dataRoute.action = ({ request, params, context }, singleFetch) => {
6255
6493
  return prefetchStylesAndCallHandler(async () => {
6256
6494
  invariant2(
6257
6495
  routeModule,
@@ -6266,6 +6504,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, isSpaMode
6266
6504
  return routeModule.clientAction({
6267
6505
  request,
6268
6506
  params,
6507
+ context,
6269
6508
  async serverAction() {
6270
6509
  preventInvalidServerHandlerCall("action", route, isSpaMode);
6271
6510
  return fetchServerAction(singleFetch);
@@ -6275,13 +6514,13 @@ function createClientRoutes(manifest, routeModulesCache, initialState, isSpaMode
6275
6514
  };
6276
6515
  } else {
6277
6516
  if (!route.hasClientLoader) {
6278
- dataRoute.loader = ({ request }, singleFetch) => prefetchStylesAndCallHandler(() => {
6517
+ dataRoute.loader = (_, singleFetch) => prefetchStylesAndCallHandler(() => {
6279
6518
  if (isSpaMode) return Promise.resolve(null);
6280
6519
  return fetchServerLoader(singleFetch);
6281
6520
  });
6282
6521
  }
6283
6522
  if (!route.hasClientAction) {
6284
- dataRoute.action = ({ request }, singleFetch) => prefetchStylesAndCallHandler(() => {
6523
+ dataRoute.action = (_, singleFetch) => prefetchStylesAndCallHandler(() => {
6285
6524
  if (isSpaMode) {
6286
6525
  throw noActionDefinedError("clientAction", route.id);
6287
6526
  }
@@ -6317,6 +6556,7 @@ function createClientRoutes(manifest, routeModulesCache, initialState, isSpaMode
6317
6556
  return {
6318
6557
  ...lazyRoute.loader ? { loader: lazyRoute.loader } : {},
6319
6558
  ...lazyRoute.action ? { action: lazyRoute.action } : {},
6559
+ middleware: mod.clientMiddleware,
6320
6560
  hasErrorBoundary: lazyRoute.hasErrorBoundary,
6321
6561
  shouldRevalidate: getShouldRevalidateFunction(
6322
6562
  lazyRoute,
@@ -6374,6 +6614,7 @@ async function loadRouteModuleWithBlockingLinks(route, routeModules) {
6374
6614
  return {
6375
6615
  Component: getRouteModuleComponent(routeModule),
6376
6616
  ErrorBoundary: routeModule.ErrorBoundary,
6617
+ clientMiddleware: routeModule.clientMiddleware,
6377
6618
  clientAction: routeModule.clientAction,
6378
6619
  clientLoader: routeModule.clientLoader,
6379
6620
  handle: routeModule.handle,
@@ -6444,7 +6685,7 @@ function getPatchRoutesOnNavigationFunction(manifest, routeModules, isSpaMode, b
6444
6685
  };
6445
6686
  }
6446
6687
  function useFogOFWarDiscovery(router, manifest, routeModules, isSpaMode) {
6447
- React9.useEffect(() => {
6688
+ React8.useEffect(() => {
6448
6689
  if (!isFogOfWarEnabled(isSpaMode) || navigator.connection?.saveData === true) {
6449
6690
  return;
6450
6691
  }
@@ -6573,7 +6814,7 @@ function debounce(callback, wait) {
6573
6814
 
6574
6815
  // lib/dom/ssr/components.tsx
6575
6816
  function useDataRouterContext2() {
6576
- let context = React10.useContext(DataRouterContext);
6817
+ let context = React9.useContext(DataRouterContext);
6577
6818
  invariant2(
6578
6819
  context,
6579
6820
  "You must render this element inside a <DataRouterContext.Provider> element"
@@ -6581,17 +6822,17 @@ function useDataRouterContext2() {
6581
6822
  return context;
6582
6823
  }
6583
6824
  function useDataRouterStateContext() {
6584
- let context = React10.useContext(DataRouterStateContext);
6825
+ let context = React9.useContext(DataRouterStateContext);
6585
6826
  invariant2(
6586
6827
  context,
6587
6828
  "You must render this element inside a <DataRouterStateContext.Provider> element"
6588
6829
  );
6589
6830
  return context;
6590
6831
  }
6591
- var FrameworkContext = React10.createContext(void 0);
6832
+ var FrameworkContext = React9.createContext(void 0);
6592
6833
  FrameworkContext.displayName = "FrameworkContext";
6593
6834
  function useFrameworkContext() {
6594
- let context = React10.useContext(FrameworkContext);
6835
+ let context = React9.useContext(FrameworkContext);
6595
6836
  invariant2(
6596
6837
  context,
6597
6838
  "You must render this element inside a <HydratedRouter> element"
@@ -6599,12 +6840,12 @@ function useFrameworkContext() {
6599
6840
  return context;
6600
6841
  }
6601
6842
  function usePrefetchBehavior(prefetch, theirElementProps) {
6602
- let frameworkContext = React10.useContext(FrameworkContext);
6603
- let [maybePrefetch, setMaybePrefetch] = React10.useState(false);
6604
- let [shouldPrefetch, setShouldPrefetch] = React10.useState(false);
6843
+ let frameworkContext = React9.useContext(FrameworkContext);
6844
+ let [maybePrefetch, setMaybePrefetch] = React9.useState(false);
6845
+ let [shouldPrefetch, setShouldPrefetch] = React9.useState(false);
6605
6846
  let { onFocus, onBlur, onMouseEnter, onMouseLeave, onTouchStart } = theirElementProps;
6606
- let ref = React10.useRef(null);
6607
- React10.useEffect(() => {
6847
+ let ref = React9.useRef(null);
6848
+ React9.useEffect(() => {
6608
6849
  if (prefetch === "render") {
6609
6850
  setShouldPrefetch(true);
6610
6851
  }
@@ -6621,7 +6862,7 @@ function usePrefetchBehavior(prefetch, theirElementProps) {
6621
6862
  };
6622
6863
  }
6623
6864
  }, [prefetch]);
6624
- React10.useEffect(() => {
6865
+ React9.useEffect(() => {
6625
6866
  if (maybePrefetch) {
6626
6867
  let id = setTimeout(() => {
6627
6868
  setShouldPrefetch(true);
@@ -6678,12 +6919,12 @@ function Links() {
6678
6919
  let { isSpaMode, manifest, routeModules, criticalCss } = useFrameworkContext();
6679
6920
  let { errors, matches: routerMatches } = useDataRouterStateContext();
6680
6921
  let matches = getActiveMatches(routerMatches, errors, isSpaMode);
6681
- let keyedLinks = React10.useMemo(
6922
+ let keyedLinks = React9.useMemo(
6682
6923
  () => getKeyedLinksForMatches(matches, routeModules, manifest),
6683
6924
  [matches, routeModules, manifest]
6684
6925
  );
6685
- return /* @__PURE__ */ React10.createElement(React10.Fragment, null, criticalCss ? /* @__PURE__ */ React10.createElement("style", { dangerouslySetInnerHTML: { __html: criticalCss } }) : null, keyedLinks.map(
6686
- ({ key, link }) => isPageLinkDescriptor(link) ? /* @__PURE__ */ React10.createElement(PrefetchPageLinks, { key, ...link }) : /* @__PURE__ */ React10.createElement("link", { key, ...link })
6926
+ return /* @__PURE__ */ React9.createElement(React9.Fragment, null, criticalCss ? /* @__PURE__ */ React9.createElement("style", { dangerouslySetInnerHTML: { __html: criticalCss } }) : null, keyedLinks.map(
6927
+ ({ key, link }) => isPageLinkDescriptor(link) ? /* @__PURE__ */ React9.createElement(PrefetchPageLinks, { key, ...link }) : /* @__PURE__ */ React9.createElement("link", { key, ...link })
6687
6928
  ));
6688
6929
  }
6689
6930
  function PrefetchPageLinks({
@@ -6691,19 +6932,19 @@ function PrefetchPageLinks({
6691
6932
  ...dataLinkProps
6692
6933
  }) {
6693
6934
  let { router } = useDataRouterContext2();
6694
- let matches = React10.useMemo(
6935
+ let matches = React9.useMemo(
6695
6936
  () => matchRoutes(router.routes, page, router.basename),
6696
6937
  [router.routes, page, router.basename]
6697
6938
  );
6698
6939
  if (!matches) {
6699
6940
  return null;
6700
6941
  }
6701
- return /* @__PURE__ */ React10.createElement(PrefetchPageLinksImpl, { page, matches, ...dataLinkProps });
6942
+ return /* @__PURE__ */ React9.createElement(PrefetchPageLinksImpl, { page, matches, ...dataLinkProps });
6702
6943
  }
6703
6944
  function useKeyedPrefetchLinks(matches) {
6704
6945
  let { manifest, routeModules } = useFrameworkContext();
6705
- let [keyedPrefetchLinks, setKeyedPrefetchLinks] = React10.useState([]);
6706
- React10.useEffect(() => {
6946
+ let [keyedPrefetchLinks, setKeyedPrefetchLinks] = React9.useState([]);
6947
+ React9.useEffect(() => {
6707
6948
  let interrupted = false;
6708
6949
  void getKeyedPrefetchLinks(matches, manifest, routeModules).then(
6709
6950
  (links) => {
@@ -6726,7 +6967,7 @@ function PrefetchPageLinksImpl({
6726
6967
  let location = useLocation();
6727
6968
  let { manifest, routeModules } = useFrameworkContext();
6728
6969
  let { loaderData, matches } = useDataRouterStateContext();
6729
- let newMatchesForData = React10.useMemo(
6970
+ let newMatchesForData = React9.useMemo(
6730
6971
  () => getNewMatchesForLinks(
6731
6972
  page,
6732
6973
  nextMatches,
@@ -6737,7 +6978,7 @@ function PrefetchPageLinksImpl({
6737
6978
  ),
6738
6979
  [page, nextMatches, matches, manifest, location]
6739
6980
  );
6740
- let newMatchesForAssets = React10.useMemo(
6981
+ let newMatchesForAssets = React9.useMemo(
6741
6982
  () => getNewMatchesForLinks(
6742
6983
  page,
6743
6984
  nextMatches,
@@ -6748,7 +6989,7 @@ function PrefetchPageLinksImpl({
6748
6989
  ),
6749
6990
  [page, nextMatches, matches, manifest, location]
6750
6991
  );
6751
- let dataHrefs = React10.useMemo(() => {
6992
+ let dataHrefs = React9.useMemo(() => {
6752
6993
  if (page === location.pathname + location.search + location.hash) {
6753
6994
  return [];
6754
6995
  }
@@ -6787,15 +7028,15 @@ function PrefetchPageLinksImpl({
6787
7028
  page,
6788
7029
  routeModules
6789
7030
  ]);
6790
- let moduleHrefs = React10.useMemo(
7031
+ let moduleHrefs = React9.useMemo(
6791
7032
  () => getModuleLinkHrefs(newMatchesForAssets, manifest),
6792
7033
  [newMatchesForAssets, manifest]
6793
7034
  );
6794
7035
  let keyedPrefetchLinks = useKeyedPrefetchLinks(newMatchesForAssets);
6795
- return /* @__PURE__ */ React10.createElement(React10.Fragment, null, dataHrefs.map((href) => /* @__PURE__ */ React10.createElement("link", { key: href, rel: "prefetch", as: "fetch", href, ...linkProps })), moduleHrefs.map((href) => /* @__PURE__ */ React10.createElement("link", { key: href, rel: "modulepreload", href, ...linkProps })), keyedPrefetchLinks.map(({ key, link }) => (
7036
+ 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 }) => (
6796
7037
  // these don't spread `linkProps` because they are full link descriptors
6797
7038
  // already with their own props
6798
- /* @__PURE__ */ React10.createElement("link", { key, ...link })
7039
+ /* @__PURE__ */ React9.createElement("link", { key, ...link })
6799
7040
  )));
6800
7041
  }
6801
7042
  function Meta() {
@@ -6853,7 +7094,7 @@ function Meta() {
6853
7094
  meta = [...routeMeta];
6854
7095
  leafMeta = meta;
6855
7096
  }
6856
- return /* @__PURE__ */ React10.createElement(React10.Fragment, null, meta.flat().map((metaProps) => {
7097
+ return /* @__PURE__ */ React9.createElement(React9.Fragment, null, meta.flat().map((metaProps) => {
6857
7098
  if (!metaProps) {
6858
7099
  return null;
6859
7100
  }
@@ -6866,22 +7107,22 @@ function Meta() {
6866
7107
  return null;
6867
7108
  }
6868
7109
  let Comp = tagName;
6869
- return /* @__PURE__ */ React10.createElement(Comp, { key: JSON.stringify(rest), ...rest });
7110
+ return /* @__PURE__ */ React9.createElement(Comp, { key: JSON.stringify(rest), ...rest });
6870
7111
  }
6871
7112
  if ("title" in metaProps) {
6872
- return /* @__PURE__ */ React10.createElement("title", { key: "title" }, String(metaProps.title));
7113
+ return /* @__PURE__ */ React9.createElement("title", { key: "title" }, String(metaProps.title));
6873
7114
  }
6874
7115
  if ("charset" in metaProps) {
6875
7116
  metaProps.charSet ?? (metaProps.charSet = metaProps.charset);
6876
7117
  delete metaProps.charset;
6877
7118
  }
6878
7119
  if ("charSet" in metaProps && metaProps.charSet != null) {
6879
- return typeof metaProps.charSet === "string" ? /* @__PURE__ */ React10.createElement("meta", { key: "charSet", charSet: metaProps.charSet }) : null;
7120
+ return typeof metaProps.charSet === "string" ? /* @__PURE__ */ React9.createElement("meta", { key: "charSet", charSet: metaProps.charSet }) : null;
6880
7121
  }
6881
7122
  if ("script:ld+json" in metaProps) {
6882
7123
  try {
6883
7124
  let json = JSON.stringify(metaProps["script:ld+json"]);
6884
- return /* @__PURE__ */ React10.createElement(
7125
+ return /* @__PURE__ */ React9.createElement(
6885
7126
  "script",
6886
7127
  {
6887
7128
  key: `script:ld+json:${json}`,
@@ -6893,7 +7134,7 @@ function Meta() {
6893
7134
  return null;
6894
7135
  }
6895
7136
  }
6896
- return /* @__PURE__ */ React10.createElement("meta", { key: JSON.stringify(metaProps), ...metaProps });
7137
+ return /* @__PURE__ */ React9.createElement("meta", { key: JSON.stringify(metaProps), ...metaProps });
6897
7138
  }));
6898
7139
  }
6899
7140
  function isValidMetaTag(tagName) {
@@ -6909,10 +7150,10 @@ function Scripts(props) {
6909
7150
  renderMeta.didRenderScripts = true;
6910
7151
  }
6911
7152
  let matches = getActiveMatches(routerMatches, null, isSpaMode);
6912
- React10.useEffect(() => {
7153
+ React9.useEffect(() => {
6913
7154
  isHydrated = true;
6914
7155
  }, []);
6915
- let initialScripts = React10.useMemo(() => {
7156
+ let initialScripts = React9.useMemo(() => {
6916
7157
  let streamScript = "window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());";
6917
7158
  let contextScript = staticContext ? `window.__reactRouterContext = ${serverHandoffString};${streamScript}` : " ";
6918
7159
  let routeModulesScript = !isStatic ? " " : `${manifest.hmr?.runtime ? `import ${JSON.stringify(manifest.hmr.runtime)};` : ""}${!enableFogOfWar ? `import ${JSON.stringify(manifest.url)}` : ""};
@@ -6932,7 +7173,7 @@ ${matches.map(
6932
7173
  window.__reactRouterRouteModules = {${matches.map((match, index) => `${JSON.stringify(match.route.id)}:route${index}`).join(",")}};
6933
7174
 
6934
7175
  import(${JSON.stringify(manifest.entry.module)});`;
6935
- return /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(
7176
+ return /* @__PURE__ */ React9.createElement(React9.Fragment, null, /* @__PURE__ */ React9.createElement(
6936
7177
  "script",
6937
7178
  {
6938
7179
  ...props,
@@ -6940,7 +7181,7 @@ import(${JSON.stringify(manifest.entry.module)});`;
6940
7181
  dangerouslySetInnerHTML: createHtml(contextScript),
6941
7182
  type: void 0
6942
7183
  }
6943
- ), /* @__PURE__ */ React10.createElement(
7184
+ ), /* @__PURE__ */ React9.createElement(
6944
7185
  "script",
6945
7186
  {
6946
7187
  ...props,
@@ -6956,21 +7197,21 @@ import(${JSON.stringify(manifest.entry.module)});`;
6956
7197
  return route ? (route.imports || []).concat([route.module]) : [];
6957
7198
  }).flat(1);
6958
7199
  let preloads = isHydrated ? [] : manifest.entry.imports.concat(routePreloads);
6959
- return isHydrated ? null : /* @__PURE__ */ React10.createElement(React10.Fragment, null, !enableFogOfWar ? /* @__PURE__ */ React10.createElement(
7200
+ return isHydrated ? null : /* @__PURE__ */ React9.createElement(React9.Fragment, null, !enableFogOfWar ? /* @__PURE__ */ React9.createElement(
6960
7201
  "link",
6961
7202
  {
6962
7203
  rel: "modulepreload",
6963
7204
  href: manifest.url,
6964
7205
  crossOrigin: props.crossOrigin
6965
7206
  }
6966
- ) : null, /* @__PURE__ */ React10.createElement(
7207
+ ) : null, /* @__PURE__ */ React9.createElement(
6967
7208
  "link",
6968
7209
  {
6969
7210
  rel: "modulepreload",
6970
7211
  href: manifest.entry.module,
6971
7212
  crossOrigin: props.crossOrigin
6972
7213
  }
6973
- ), dedupe(preloads).map((path) => /* @__PURE__ */ React10.createElement(
7214
+ ), dedupe(preloads).map((path) => /* @__PURE__ */ React9.createElement(
6974
7215
  "link",
6975
7216
  {
6976
7217
  key: path,
@@ -6999,13 +7240,14 @@ function mergeRefs(...refs) {
6999
7240
  var isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined";
7000
7241
  try {
7001
7242
  if (isBrowser) {
7002
- window.__reactRouterVersion = "0.0.0-experimental-1ebb6d403";
7243
+ window.__reactRouterVersion = "0.0.0-experimental-e41ede670";
7003
7244
  }
7004
7245
  } catch (e) {
7005
7246
  }
7006
7247
  function createBrowserRouter(routes, opts) {
7007
7248
  return createRouter({
7008
7249
  basename: opts?.basename,
7250
+ context: opts?.context,
7009
7251
  future: opts?.future,
7010
7252
  history: createBrowserHistory({ window: opts?.window }),
7011
7253
  hydrationData: opts?.hydrationData || parseHydrationData(),
@@ -7019,6 +7261,7 @@ function createBrowserRouter(routes, opts) {
7019
7261
  function createHashRouter(routes, opts) {
7020
7262
  return createRouter({
7021
7263
  basename: opts?.basename,
7264
+ context: opts?.context,
7022
7265
  future: opts?.future,
7023
7266
  history: createHashHistory({ window: opts?.window }),
7024
7267
  hydrationData: opts?.hydrationData || parseHydrationData(),
@@ -7079,23 +7322,23 @@ function BrowserRouter({
7079
7322
  children,
7080
7323
  window: window2
7081
7324
  }) {
7082
- let historyRef = React11.useRef();
7325
+ let historyRef = React10.useRef();
7083
7326
  if (historyRef.current == null) {
7084
7327
  historyRef.current = createBrowserHistory({ window: window2, v5Compat: true });
7085
7328
  }
7086
7329
  let history = historyRef.current;
7087
- let [state, setStateImpl] = React11.useState({
7330
+ let [state, setStateImpl] = React10.useState({
7088
7331
  action: history.action,
7089
7332
  location: history.location
7090
7333
  });
7091
- let setState = React11.useCallback(
7334
+ let setState = React10.useCallback(
7092
7335
  (newState) => {
7093
- React11.startTransition(() => setStateImpl(newState));
7336
+ React10.startTransition(() => setStateImpl(newState));
7094
7337
  },
7095
7338
  [setStateImpl]
7096
7339
  );
7097
- React11.useLayoutEffect(() => history.listen(setState), [history, setState]);
7098
- return /* @__PURE__ */ React11.createElement(
7340
+ React10.useLayoutEffect(() => history.listen(setState), [history, setState]);
7341
+ return /* @__PURE__ */ React10.createElement(
7099
7342
  Router,
7100
7343
  {
7101
7344
  basename,
@@ -7107,23 +7350,23 @@ function BrowserRouter({
7107
7350
  );
7108
7351
  }
7109
7352
  function HashRouter({ basename, children, window: window2 }) {
7110
- let historyRef = React11.useRef();
7353
+ let historyRef = React10.useRef();
7111
7354
  if (historyRef.current == null) {
7112
7355
  historyRef.current = createHashHistory({ window: window2, v5Compat: true });
7113
7356
  }
7114
7357
  let history = historyRef.current;
7115
- let [state, setStateImpl] = React11.useState({
7358
+ let [state, setStateImpl] = React10.useState({
7116
7359
  action: history.action,
7117
7360
  location: history.location
7118
7361
  });
7119
- let setState = React11.useCallback(
7362
+ let setState = React10.useCallback(
7120
7363
  (newState) => {
7121
- React11.startTransition(() => setStateImpl(newState));
7364
+ React10.startTransition(() => setStateImpl(newState));
7122
7365
  },
7123
7366
  [setStateImpl]
7124
7367
  );
7125
- React11.useLayoutEffect(() => history.listen(setState), [history, setState]);
7126
- return /* @__PURE__ */ React11.createElement(
7368
+ React10.useLayoutEffect(() => history.listen(setState), [history, setState]);
7369
+ return /* @__PURE__ */ React10.createElement(
7127
7370
  Router,
7128
7371
  {
7129
7372
  basename,
@@ -7139,18 +7382,18 @@ function HistoryRouter({
7139
7382
  children,
7140
7383
  history
7141
7384
  }) {
7142
- let [state, setStateImpl] = React11.useState({
7385
+ let [state, setStateImpl] = React10.useState({
7143
7386
  action: history.action,
7144
7387
  location: history.location
7145
7388
  });
7146
- let setState = React11.useCallback(
7389
+ let setState = React10.useCallback(
7147
7390
  (newState) => {
7148
- React11.startTransition(() => setStateImpl(newState));
7391
+ React10.startTransition(() => setStateImpl(newState));
7149
7392
  },
7150
7393
  [setStateImpl]
7151
7394
  );
7152
- React11.useLayoutEffect(() => history.listen(setState), [history, setState]);
7153
- return /* @__PURE__ */ React11.createElement(
7395
+ React10.useLayoutEffect(() => history.listen(setState), [history, setState]);
7396
+ return /* @__PURE__ */ React10.createElement(
7154
7397
  Router,
7155
7398
  {
7156
7399
  basename,
@@ -7162,8 +7405,8 @@ function HistoryRouter({
7162
7405
  );
7163
7406
  }
7164
7407
  HistoryRouter.displayName = "unstable_HistoryRouter";
7165
- var ABSOLUTE_URL_REGEX3 = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
7166
- var Link = React11.forwardRef(
7408
+ var ABSOLUTE_URL_REGEX2 = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
7409
+ var Link = React10.forwardRef(
7167
7410
  function LinkWithRef({
7168
7411
  onClick,
7169
7412
  discover = "render",
@@ -7178,8 +7421,8 @@ var Link = React11.forwardRef(
7178
7421
  viewTransition,
7179
7422
  ...rest
7180
7423
  }, forwardedRef) {
7181
- let { basename } = React11.useContext(NavigationContext);
7182
- let isAbsolute = typeof to === "string" && ABSOLUTE_URL_REGEX3.test(to);
7424
+ let { basename } = React10.useContext(NavigationContext);
7425
+ let isAbsolute = typeof to === "string" && ABSOLUTE_URL_REGEX2.test(to);
7183
7426
  let absoluteHref;
7184
7427
  let isExternal = false;
7185
7428
  if (typeof to === "string" && isAbsolute) {
@@ -7223,7 +7466,7 @@ var Link = React11.forwardRef(
7223
7466
  }
7224
7467
  let link = (
7225
7468
  // eslint-disable-next-line jsx-a11y/anchor-has-content
7226
- /* @__PURE__ */ React11.createElement(
7469
+ /* @__PURE__ */ React10.createElement(
7227
7470
  "a",
7228
7471
  {
7229
7472
  ...rest,
@@ -7236,11 +7479,11 @@ var Link = React11.forwardRef(
7236
7479
  }
7237
7480
  )
7238
7481
  );
7239
- return shouldPrefetch && !isAbsolute ? /* @__PURE__ */ React11.createElement(React11.Fragment, null, link, /* @__PURE__ */ React11.createElement(PrefetchPageLinks, { page: href })) : link;
7482
+ return shouldPrefetch && !isAbsolute ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, link, /* @__PURE__ */ React10.createElement(PrefetchPageLinks, { page: href })) : link;
7240
7483
  }
7241
7484
  );
7242
7485
  Link.displayName = "Link";
7243
- var NavLink = React11.forwardRef(
7486
+ var NavLink = React10.forwardRef(
7244
7487
  function NavLinkWithRef({
7245
7488
  "aria-current": ariaCurrentProp = "page",
7246
7489
  caseSensitive = false,
@@ -7254,8 +7497,8 @@ var NavLink = React11.forwardRef(
7254
7497
  }, ref) {
7255
7498
  let path = useResolvedPath(to, { relative: rest.relative });
7256
7499
  let location = useLocation();
7257
- let routerState = React11.useContext(DataRouterStateContext);
7258
- let { navigator: navigator2, basename } = React11.useContext(NavigationContext);
7500
+ let routerState = React10.useContext(DataRouterStateContext);
7501
+ let { navigator: navigator2, basename } = React10.useContext(NavigationContext);
7259
7502
  let isTransitioning = routerState != null && // Conditional usage is OK here because the usage of a data router is static
7260
7503
  // eslint-disable-next-line react-hooks/rules-of-hooks
7261
7504
  useViewTransitionState(path) && viewTransition === true;
@@ -7291,7 +7534,7 @@ var NavLink = React11.forwardRef(
7291
7534
  ].filter(Boolean).join(" ");
7292
7535
  }
7293
7536
  let style = typeof styleProp === "function" ? styleProp(renderProps) : styleProp;
7294
- return /* @__PURE__ */ React11.createElement(
7537
+ return /* @__PURE__ */ React10.createElement(
7295
7538
  Link,
7296
7539
  {
7297
7540
  ...rest,
@@ -7307,7 +7550,7 @@ var NavLink = React11.forwardRef(
7307
7550
  }
7308
7551
  );
7309
7552
  NavLink.displayName = "NavLink";
7310
- var Form = React11.forwardRef(
7553
+ var Form = React10.forwardRef(
7311
7554
  ({
7312
7555
  discover = "render",
7313
7556
  fetcherKey,
@@ -7326,7 +7569,7 @@ var Form = React11.forwardRef(
7326
7569
  let submit = useSubmit();
7327
7570
  let formAction = useFormAction(action, { relative });
7328
7571
  let formMethod = method.toLowerCase() === "get" ? "get" : "post";
7329
- let isAbsolute = typeof action === "string" && ABSOLUTE_URL_REGEX3.test(action);
7572
+ let isAbsolute = typeof action === "string" && ABSOLUTE_URL_REGEX2.test(action);
7330
7573
  let submitHandler = (event) => {
7331
7574
  onSubmit && onSubmit(event);
7332
7575
  if (event.defaultPrevented) return;
@@ -7344,7 +7587,7 @@ var Form = React11.forwardRef(
7344
7587
  viewTransition
7345
7588
  });
7346
7589
  };
7347
- return /* @__PURE__ */ React11.createElement(
7590
+ return /* @__PURE__ */ React10.createElement(
7348
7591
  "form",
7349
7592
  {
7350
7593
  ref: forwardedRef,
@@ -7363,12 +7606,12 @@ function ScrollRestoration({
7363
7606
  storageKey,
7364
7607
  ...props
7365
7608
  }) {
7366
- let remixContext = React11.useContext(FrameworkContext);
7367
- let { basename } = React11.useContext(NavigationContext);
7609
+ let remixContext = React10.useContext(FrameworkContext);
7610
+ let { basename } = React10.useContext(NavigationContext);
7368
7611
  let location = useLocation();
7369
7612
  let matches = useMatches();
7370
7613
  useScrollRestoration({ getKey, storageKey });
7371
- let ssrKey = React11.useMemo(
7614
+ let ssrKey = React10.useMemo(
7372
7615
  () => {
7373
7616
  if (!remixContext || !getKey) return null;
7374
7617
  let userKey = getScrollRestorationKey(
@@ -7402,7 +7645,7 @@ function ScrollRestoration({
7402
7645
  sessionStorage.removeItem(storageKey2);
7403
7646
  }
7404
7647
  }).toString();
7405
- return /* @__PURE__ */ React11.createElement(
7648
+ return /* @__PURE__ */ React10.createElement(
7406
7649
  "script",
7407
7650
  {
7408
7651
  ...props,
@@ -7420,12 +7663,12 @@ function getDataRouterConsoleError2(hookName) {
7420
7663
  return `${hookName} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`;
7421
7664
  }
7422
7665
  function useDataRouterContext3(hookName) {
7423
- let ctx = React11.useContext(DataRouterContext);
7666
+ let ctx = React10.useContext(DataRouterContext);
7424
7667
  invariant(ctx, getDataRouterConsoleError2(hookName));
7425
7668
  return ctx;
7426
7669
  }
7427
7670
  function useDataRouterState2(hookName) {
7428
- let state = React11.useContext(DataRouterStateContext);
7671
+ let state = React10.useContext(DataRouterStateContext);
7429
7672
  invariant(state, getDataRouterConsoleError2(hookName));
7430
7673
  return state;
7431
7674
  }
@@ -7440,7 +7683,7 @@ function useLinkClickHandler(to, {
7440
7683
  let navigate = useNavigate();
7441
7684
  let location = useLocation();
7442
7685
  let path = useResolvedPath(to, { relative });
7443
- return React11.useCallback(
7686
+ return React10.useCallback(
7444
7687
  (event) => {
7445
7688
  if (shouldProcessLinkClick(event, target)) {
7446
7689
  event.preventDefault();
@@ -7473,10 +7716,10 @@ function useSearchParams(defaultInit) {
7473
7716
  typeof URLSearchParams !== "undefined",
7474
7717
  `You cannot use the \`useSearchParams\` hook in a browser that does not support the URLSearchParams API. If you need to support Internet Explorer 11, we recommend you load a polyfill such as https://github.com/ungap/url-search-params.`
7475
7718
  );
7476
- let defaultSearchParamsRef = React11.useRef(createSearchParams(defaultInit));
7477
- let hasSetSearchParamsRef = React11.useRef(false);
7719
+ let defaultSearchParamsRef = React10.useRef(createSearchParams(defaultInit));
7720
+ let hasSetSearchParamsRef = React10.useRef(false);
7478
7721
  let location = useLocation();
7479
- let searchParams = React11.useMemo(
7722
+ let searchParams = React10.useMemo(
7480
7723
  () => (
7481
7724
  // Only merge in the defaults if we haven't yet called setSearchParams.
7482
7725
  // Once we call that we want those to take precedence, otherwise you can't
@@ -7489,7 +7732,7 @@ function useSearchParams(defaultInit) {
7489
7732
  [location.search]
7490
7733
  );
7491
7734
  let navigate = useNavigate();
7492
- let setSearchParams = React11.useCallback(
7735
+ let setSearchParams = React10.useCallback(
7493
7736
  (nextInit, navigateOptions) => {
7494
7737
  const newSearchParams = createSearchParams(
7495
7738
  typeof nextInit === "function" ? nextInit(searchParams) : nextInit
@@ -7505,9 +7748,9 @@ var fetcherId = 0;
7505
7748
  var getUniqueFetcherId = () => `__${String(++fetcherId)}__`;
7506
7749
  function useSubmit() {
7507
7750
  let { router } = useDataRouterContext3("useSubmit" /* UseSubmit */);
7508
- let { basename } = React11.useContext(NavigationContext);
7751
+ let { basename } = React10.useContext(NavigationContext);
7509
7752
  let currentRouteId = useRouteId();
7510
- return React11.useCallback(
7753
+ return React10.useCallback(
7511
7754
  async (target, options = {}) => {
7512
7755
  let { action, method, encType, formData, body } = getFormSubmissionInfo(
7513
7756
  target,
@@ -7542,8 +7785,8 @@ function useSubmit() {
7542
7785
  );
7543
7786
  }
7544
7787
  function useFormAction(action, { relative } = {}) {
7545
- let { basename } = React11.useContext(NavigationContext);
7546
- let routeContext = React11.useContext(RouteContext);
7788
+ let { basename } = React10.useContext(NavigationContext);
7789
+ let routeContext = React10.useContext(RouteContext);
7547
7790
  invariant(routeContext, "useFormAction must be used inside a RouteContext");
7548
7791
  let [match] = routeContext.matches.slice(-1);
7549
7792
  let path = { ...useResolvedPath(action ? action : ".", { relative }) };
@@ -7573,8 +7816,8 @@ function useFetcher({
7573
7816
  } = {}) {
7574
7817
  let { router } = useDataRouterContext3("useFetcher" /* UseFetcher */);
7575
7818
  let state = useDataRouterState2("useFetcher" /* UseFetcher */);
7576
- let fetcherData = React11.useContext(FetchersContext);
7577
- let route = React11.useContext(RouteContext);
7819
+ let fetcherData = React10.useContext(FetchersContext);
7820
+ let route = React10.useContext(RouteContext);
7578
7821
  let routeId = route.matches[route.matches.length - 1]?.route.id;
7579
7822
  invariant(fetcherData, `useFetcher must be used inside a FetchersContext`);
7580
7823
  invariant(route, `useFetcher must be used inside a RouteContext`);
@@ -7582,16 +7825,16 @@ function useFetcher({
7582
7825
  routeId != null,
7583
7826
  `useFetcher can only be used on routes that contain a unique "id"`
7584
7827
  );
7585
- let defaultKey = React11.useId();
7586
- let [fetcherKey, setFetcherKey] = React11.useState(key || defaultKey);
7828
+ let defaultKey = React10.useId();
7829
+ let [fetcherKey, setFetcherKey] = React10.useState(key || defaultKey);
7587
7830
  if (key && key !== fetcherKey) {
7588
7831
  setFetcherKey(key);
7589
7832
  }
7590
- React11.useEffect(() => {
7833
+ React10.useEffect(() => {
7591
7834
  router.getFetcher(fetcherKey);
7592
7835
  return () => router.deleteFetcher(fetcherKey);
7593
7836
  }, [router, fetcherKey]);
7594
- let load = React11.useCallback(
7837
+ let load = React10.useCallback(
7595
7838
  async (href, opts) => {
7596
7839
  invariant(routeId, "No routeId available for fetcher.load()");
7597
7840
  await router.fetch(fetcherKey, routeId, href, opts);
@@ -7599,7 +7842,7 @@ function useFetcher({
7599
7842
  [fetcherKey, routeId, router]
7600
7843
  );
7601
7844
  let submitImpl = useSubmit();
7602
- let submit = React11.useCallback(
7845
+ let submit = React10.useCallback(
7603
7846
  async (target, opts) => {
7604
7847
  await submitImpl(target, {
7605
7848
  ...opts,
@@ -7609,10 +7852,10 @@ function useFetcher({
7609
7852
  },
7610
7853
  [fetcherKey, submitImpl]
7611
7854
  );
7612
- let FetcherForm = React11.useMemo(() => {
7613
- let FetcherForm2 = React11.forwardRef(
7855
+ let FetcherForm = React10.useMemo(() => {
7856
+ let FetcherForm2 = React10.forwardRef(
7614
7857
  (props, ref) => {
7615
- return /* @__PURE__ */ React11.createElement(Form, { ...props, navigate: false, fetcherKey, ref });
7858
+ return /* @__PURE__ */ React10.createElement(Form, { ...props, navigate: false, fetcherKey, ref });
7616
7859
  }
7617
7860
  );
7618
7861
  FetcherForm2.displayName = "fetcher.Form";
@@ -7620,7 +7863,7 @@ function useFetcher({
7620
7863
  }, [fetcherKey]);
7621
7864
  let fetcher = state.fetchers.get(fetcherKey) || IDLE_FETCHER;
7622
7865
  let data2 = fetcherData.get(fetcherKey);
7623
- let fetcherWithComponents = React11.useMemo(
7866
+ let fetcherWithComponents = React10.useMemo(
7624
7867
  () => ({
7625
7868
  Form: FetcherForm,
7626
7869
  submit,
@@ -7669,18 +7912,18 @@ function useScrollRestoration({
7669
7912
  let { restoreScrollPosition, preventScrollReset } = useDataRouterState2(
7670
7913
  "useScrollRestoration" /* UseScrollRestoration */
7671
7914
  );
7672
- let { basename } = React11.useContext(NavigationContext);
7915
+ let { basename } = React10.useContext(NavigationContext);
7673
7916
  let location = useLocation();
7674
7917
  let matches = useMatches();
7675
7918
  let navigation = useNavigation();
7676
- React11.useEffect(() => {
7919
+ React10.useEffect(() => {
7677
7920
  window.history.scrollRestoration = "manual";
7678
7921
  return () => {
7679
7922
  window.history.scrollRestoration = "auto";
7680
7923
  };
7681
7924
  }, []);
7682
7925
  usePageHide(
7683
- React11.useCallback(() => {
7926
+ React10.useCallback(() => {
7684
7927
  if (navigation.state === "idle") {
7685
7928
  let key = getScrollRestorationKey(location, matches, basename, getKey);
7686
7929
  savedScrollPositions[key] = window.scrollY;
@@ -7700,7 +7943,7 @@ function useScrollRestoration({
7700
7943
  }, [navigation.state, getKey, basename, location, matches, storageKey])
7701
7944
  );
7702
7945
  if (typeof document !== "undefined") {
7703
- React11.useLayoutEffect(() => {
7946
+ React10.useLayoutEffect(() => {
7704
7947
  try {
7705
7948
  let sessionPositions = sessionStorage.getItem(
7706
7949
  storageKey || SCROLL_RESTORATION_STORAGE_KEY
@@ -7711,7 +7954,7 @@ function useScrollRestoration({
7711
7954
  } catch (e) {
7712
7955
  }
7713
7956
  }, [storageKey]);
7714
- React11.useLayoutEffect(() => {
7957
+ React10.useLayoutEffect(() => {
7715
7958
  let disableScrollRestoration = router?.enableScrollRestoration(
7716
7959
  savedScrollPositions,
7717
7960
  () => window.scrollY,
@@ -7719,7 +7962,7 @@ function useScrollRestoration({
7719
7962
  );
7720
7963
  return () => disableScrollRestoration && disableScrollRestoration();
7721
7964
  }, [router, basename, getKey]);
7722
- React11.useLayoutEffect(() => {
7965
+ React10.useLayoutEffect(() => {
7723
7966
  if (restoreScrollPosition === false) {
7724
7967
  return;
7725
7968
  }
@@ -7745,7 +7988,7 @@ function useScrollRestoration({
7745
7988
  }
7746
7989
  function useBeforeUnload(callback, options) {
7747
7990
  let { capture } = options || {};
7748
- React11.useEffect(() => {
7991
+ React10.useEffect(() => {
7749
7992
  let opts = capture != null ? { capture } : void 0;
7750
7993
  window.addEventListener("beforeunload", callback, opts);
7751
7994
  return () => {
@@ -7755,7 +7998,7 @@ function useBeforeUnload(callback, options) {
7755
7998
  }
7756
7999
  function usePageHide(callback, options) {
7757
8000
  let { capture } = options || {};
7758
- React11.useEffect(() => {
8001
+ React10.useEffect(() => {
7759
8002
  let opts = capture != null ? { capture } : void 0;
7760
8003
  window.addEventListener("pagehide", callback, opts);
7761
8004
  return () => {
@@ -7768,7 +8011,7 @@ function usePrompt({
7768
8011
  message
7769
8012
  }) {
7770
8013
  let blocker = useBlocker(when);
7771
- React11.useEffect(() => {
8014
+ React10.useEffect(() => {
7772
8015
  if (blocker.state === "blocked") {
7773
8016
  let proceed = window.confirm(message);
7774
8017
  if (proceed) {
@@ -7778,14 +8021,14 @@ function usePrompt({
7778
8021
  }
7779
8022
  }
7780
8023
  }, [blocker, message]);
7781
- React11.useEffect(() => {
8024
+ React10.useEffect(() => {
7782
8025
  if (blocker.state === "blocked" && !when) {
7783
8026
  blocker.reset();
7784
8027
  }
7785
8028
  }, [blocker, when]);
7786
8029
  }
7787
8030
  function useViewTransitionState(to, opts = {}) {
7788
- let vtContext = React11.useContext(ViewTransitionContext);
8031
+ let vtContext = React10.useContext(ViewTransitionContext);
7789
8032
  invariant(
7790
8033
  vtContext != null,
7791
8034
  "`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?"
@@ -7802,8 +8045,8 @@ function useViewTransitionState(to, opts = {}) {
7802
8045
  return matchPath(path.pathname, nextPath) != null || matchPath(path.pathname, currentPath) != null;
7803
8046
  }
7804
8047
 
7805
- // lib/dom/components.tsx
7806
- import * as React12 from "react";
8048
+ // lib/dom/server.tsx
8049
+ import * as React11 from "react";
7807
8050
  function StaticRouter({
7808
8051
  basename,
7809
8052
  children,
@@ -7821,7 +8064,7 @@ function StaticRouter({
7821
8064
  key: locationProp.key || "default"
7822
8065
  };
7823
8066
  let staticNavigator = getStatelessNavigator();
7824
- return /* @__PURE__ */ React12.createElement(
8067
+ return /* @__PURE__ */ React11.createElement(
7825
8068
  Router,
7826
8069
  {
7827
8070
  basename,
@@ -7862,7 +8105,7 @@ function StaticRouterProvider({
7862
8105
  hydrateScript = `window.__staticRouterHydrationData = JSON.parse(${json});`;
7863
8106
  }
7864
8107
  let { state } = dataRouterContext.router;
7865
- return /* @__PURE__ */ React12.createElement(React12.Fragment, null, /* @__PURE__ */ React12.createElement(DataRouterContext.Provider, { value: dataRouterContext }, /* @__PURE__ */ React12.createElement(DataRouterStateContext.Provider, { value: state }, /* @__PURE__ */ React12.createElement(FetchersContext.Provider, { value: fetchersContext }, /* @__PURE__ */ React12.createElement(ViewTransitionContext.Provider, { value: { isTransitioning: false } }, /* @__PURE__ */ React12.createElement(
8108
+ return /* @__PURE__ */ React11.createElement(React11.Fragment, null, /* @__PURE__ */ React11.createElement(DataRouterContext.Provider, { value: dataRouterContext }, /* @__PURE__ */ React11.createElement(DataRouterStateContext.Provider, { value: state }, /* @__PURE__ */ React11.createElement(FetchersContext.Provider, { value: fetchersContext }, /* @__PURE__ */ React11.createElement(ViewTransitionContext.Provider, { value: { isTransitioning: false } }, /* @__PURE__ */ React11.createElement(
7866
8109
  Router,
7867
8110
  {
7868
8111
  basename: dataRouterContext.basename,
@@ -7871,7 +8114,7 @@ function StaticRouterProvider({
7871
8114
  navigator: dataRouterContext.navigator,
7872
8115
  static: dataRouterContext.static
7873
8116
  },
7874
- /* @__PURE__ */ React12.createElement(
8117
+ /* @__PURE__ */ React11.createElement(
7875
8118
  DataRoutes2,
7876
8119
  {
7877
8120
  routes: router.routes,
@@ -7879,7 +8122,7 @@ function StaticRouterProvider({
7879
8122
  state
7880
8123
  }
7881
8124
  )
7882
- ))))), hydrateScript ? /* @__PURE__ */ React12.createElement(
8125
+ ))))), hydrateScript ? /* @__PURE__ */ React11.createElement(
7883
8126
  "script",
7884
8127
  {
7885
8128
  suppressHydrationWarning: true,
@@ -7949,19 +8192,6 @@ function getStatelessNavigator() {
7949
8192
  }
7950
8193
  };
7951
8194
  }
7952
- var ESCAPE_LOOKUP2 = {
7953
- "&": "\\u0026",
7954
- ">": "\\u003e",
7955
- "<": "\\u003c",
7956
- "\u2028": "\\u2028",
7957
- "\u2029": "\\u2029"
7958
- };
7959
- var ESCAPE_REGEX2 = /[&><\u2028\u2029]/g;
7960
- function htmlEscape(str) {
7961
- return str.replace(ESCAPE_REGEX2, (match) => ESCAPE_LOOKUP2[match]);
7962
- }
7963
-
7964
- // lib/dom/server.tsx
7965
8195
  function createStaticHandler2(routes, opts) {
7966
8196
  return createStaticHandler(routes, {
7967
8197
  ...opts,
@@ -8060,9 +8290,34 @@ function createStaticRouter(routes, context, opts = {}) {
8060
8290
  }
8061
8291
  };
8062
8292
  }
8293
+ function createHref(to) {
8294
+ return typeof to === "string" ? to : createPath(to);
8295
+ }
8296
+ function encodeLocation(to) {
8297
+ let href = typeof to === "string" ? to : createPath(to);
8298
+ href = href.replace(/ $/, "%20");
8299
+ let encoded = ABSOLUTE_URL_REGEX3.test(href) ? new URL(href) : new URL(href, "http://localhost");
8300
+ return {
8301
+ pathname: encoded.pathname,
8302
+ search: encoded.search,
8303
+ hash: encoded.hash
8304
+ };
8305
+ }
8306
+ var ABSOLUTE_URL_REGEX3 = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
8307
+ var ESCAPE_LOOKUP2 = {
8308
+ "&": "\\u0026",
8309
+ ">": "\\u003e",
8310
+ "<": "\\u003c",
8311
+ "\u2028": "\\u2028",
8312
+ "\u2029": "\\u2029"
8313
+ };
8314
+ var ESCAPE_REGEX2 = /[&><\u2028\u2029]/g;
8315
+ function htmlEscape(str) {
8316
+ return str.replace(ESCAPE_REGEX2, (match) => ESCAPE_LOOKUP2[match]);
8317
+ }
8063
8318
 
8064
8319
  // lib/dom/ssr/server.tsx
8065
- import * as React13 from "react";
8320
+ import * as React12 from "react";
8066
8321
  function ServerRouter({
8067
8322
  context,
8068
8323
  url,
@@ -8090,7 +8345,7 @@ function ServerRouter({
8090
8345
  }
8091
8346
  }
8092
8347
  let router = createStaticRouter(routes, context.staticHandlerContext);
8093
- return /* @__PURE__ */ React13.createElement(React13.Fragment, null, /* @__PURE__ */ React13.createElement(
8348
+ return /* @__PURE__ */ React12.createElement(React12.Fragment, null, /* @__PURE__ */ React12.createElement(
8094
8349
  FrameworkContext.Provider,
8095
8350
  {
8096
8351
  value: {
@@ -8104,7 +8359,7 @@ function ServerRouter({
8104
8359
  renderMeta: context.renderMeta
8105
8360
  }
8106
8361
  },
8107
- /* @__PURE__ */ React13.createElement(RemixErrorBoundary, { location: router.state.location }, /* @__PURE__ */ React13.createElement(
8362
+ /* @__PURE__ */ React12.createElement(RemixErrorBoundary, { location: router.state.location }, /* @__PURE__ */ React12.createElement(
8108
8363
  StaticRouterProvider,
8109
8364
  {
8110
8365
  router,
@@ -8112,7 +8367,7 @@ function ServerRouter({
8112
8367
  hydrate: false
8113
8368
  }
8114
8369
  ))
8115
- ), context.serverHandoffStream ? /* @__PURE__ */ React13.createElement(React13.Suspense, null, /* @__PURE__ */ React13.createElement(
8370
+ ), context.serverHandoffStream ? /* @__PURE__ */ React12.createElement(React12.Suspense, null, /* @__PURE__ */ React12.createElement(
8116
8371
  StreamTransfer,
8117
8372
  {
8118
8373
  context,
@@ -8125,7 +8380,7 @@ function ServerRouter({
8125
8380
  }
8126
8381
 
8127
8382
  // lib/dom/ssr/routes-test-stub.tsx
8128
- import * as React14 from "react";
8383
+ import * as React13 from "react";
8129
8384
  function createRoutesStub(routes, context = {}) {
8130
8385
  return function RoutesTestStub({
8131
8386
  initialEntries,
@@ -8133,8 +8388,8 @@ function createRoutesStub(routes, context = {}) {
8133
8388
  hydrationData,
8134
8389
  future
8135
8390
  }) {
8136
- let routerRef = React14.useRef();
8137
- let remixContextRef = React14.useRef();
8391
+ let routerRef = React13.useRef();
8392
+ let remixContextRef = React13.useRef();
8138
8393
  if (routerRef.current == null) {
8139
8394
  remixContextRef.current = {
8140
8395
  future: {},
@@ -8148,29 +8403,29 @@ function createRoutesStub(routes, context = {}) {
8148
8403
  isSpaMode: false
8149
8404
  };
8150
8405
  let patched = processRoutes(
8151
- // @ts-expect-error loader/action context types don't match :/
8406
+ // @ts-expect-error `StubRouteObject` is stricter about `loader`/`action`
8407
+ // types compared to `AgnosticRouteObject`
8152
8408
  convertRoutesToDataRoutes(routes, (r) => r),
8153
- context,
8154
8409
  remixContextRef.current.manifest,
8155
8410
  remixContextRef.current.routeModules
8156
8411
  );
8157
8412
  routerRef.current = createMemoryRouter(patched, {
8413
+ context,
8158
8414
  initialEntries,
8159
8415
  initialIndex,
8160
8416
  hydrationData
8161
8417
  });
8162
8418
  }
8163
- return /* @__PURE__ */ React14.createElement(FrameworkContext.Provider, { value: remixContextRef.current }, /* @__PURE__ */ React14.createElement(RouterProvider, { router: routerRef.current }));
8419
+ return /* @__PURE__ */ React13.createElement(FrameworkContext.Provider, { value: remixContextRef.current }, /* @__PURE__ */ React13.createElement(RouterProvider, { router: routerRef.current }));
8164
8420
  };
8165
8421
  }
8166
- function processRoutes(routes, context, manifest, routeModules, parentId) {
8422
+ function processRoutes(routes, manifest, routeModules, parentId) {
8167
8423
  return routes.map((route) => {
8168
8424
  if (!route.id) {
8169
8425
  throw new Error(
8170
8426
  "Expected a route.id in @remix-run/testing processRoutes() function"
8171
8427
  );
8172
8428
  }
8173
- let { loader, action } = route;
8174
8429
  let newRoute = {
8175
8430
  id: route.id,
8176
8431
  path: route.path,
@@ -8178,8 +8433,8 @@ function processRoutes(routes, context, manifest, routeModules, parentId) {
8178
8433
  Component: route.Component,
8179
8434
  HydrateFallback: route.HydrateFallback,
8180
8435
  ErrorBoundary: route.ErrorBoundary,
8181
- action: action ? (args) => action({ ...args, context }) : void 0,
8182
- loader: loader ? (args) => loader({ ...args, context }) : void 0,
8436
+ action: route.action,
8437
+ loader: route.loader,
8183
8438
  handle: route.handle,
8184
8439
  shouldRevalidate: route.shouldRevalidate
8185
8440
  };
@@ -8211,7 +8466,6 @@ function processRoutes(routes, context, manifest, routeModules, parentId) {
8211
8466
  if (route.children) {
8212
8467
  newRoute.children = processRoutes(
8213
8468
  route.children,
8214
- context,
8215
8469
  manifest,
8216
8470
  routeModules,
8217
8471
  newRoute.id
@@ -8572,6 +8826,7 @@ function createStaticHandlerDataRoutes(manifest, future, parentId = "", routesBy
8572
8826
  hasErrorBoundary: route.id === "root" || route.module.ErrorBoundary != null,
8573
8827
  id: route.id,
8574
8828
  path: route.path,
8829
+ middleware: route.module.middleware,
8575
8830
  // Need to use RR's version in the param typed here to permit the optional
8576
8831
  // context even though we know it'll always be provided in remix
8577
8832
  loader: route.module.loader ? async (args) => {
@@ -8715,24 +8970,6 @@ function prependCookies(parentHeaders, childHeaders) {
8715
8970
 
8716
8971
  // lib/server-runtime/single-fetch.ts
8717
8972
  var SINGLE_FETCH_REDIRECT_STATUS = 202;
8718
- function getSingleFetchDataStrategy2({
8719
- isActionDataRequest,
8720
- loadRouteIds
8721
- } = {}) {
8722
- return async ({ request, matches }) => {
8723
- if (isActionDataRequest && request.method === "GET") {
8724
- return {};
8725
- }
8726
- let matchesToLoad = loadRouteIds ? matches.filter((m) => loadRouteIds.includes(m.route.id)) : matches;
8727
- let results = await Promise.all(
8728
- matchesToLoad.map((match) => match.resolve())
8729
- );
8730
- return results.reduce(
8731
- (acc, result, i) => Object.assign(acc, { [matchesToLoad[i].route.id]: result }),
8732
- {}
8733
- );
8734
- };
8735
- }
8736
8973
  async function singleFetchAction(build, serverMode, staticHandler, request, handlerUrl, loadContext, handleError) {
8737
8974
  try {
8738
8975
  let handlerRequest = new Request(handlerUrl, {
@@ -8745,12 +8982,45 @@ async function singleFetchAction(build, serverMode, staticHandler, request, hand
8745
8982
  let result = await staticHandler.query(handlerRequest, {
8746
8983
  requestContext: loadContext,
8747
8984
  skipLoaderErrorBubbling: true,
8748
- dataStrategy: getSingleFetchDataStrategy2({
8749
- isActionDataRequest: true
8750
- })
8985
+ async respond(context) {
8986
+ let headers = getDocumentHeaders(build, context);
8987
+ if (isRedirectStatusCode(context.statusCode) && headers.has("Location")) {
8988
+ return generateSingleFetchResponse(request, build, serverMode, {
8989
+ result: getSingleFetchRedirect(
8990
+ context.statusCode,
8991
+ headers,
8992
+ build.basename
8993
+ ),
8994
+ headers,
8995
+ status: SINGLE_FETCH_REDIRECT_STATUS
8996
+ });
8997
+ }
8998
+ if (context.errors) {
8999
+ Object.values(context.errors).forEach((err) => {
9000
+ if (!isRouteErrorResponse(err) || err.error) {
9001
+ handleError(err);
9002
+ }
9003
+ });
9004
+ context.errors = sanitizeErrors(context.errors, serverMode);
9005
+ }
9006
+ let singleFetchResult;
9007
+ if (context.errors) {
9008
+ singleFetchResult = { error: Object.values(context.errors)[0] };
9009
+ } else {
9010
+ singleFetchResult = {
9011
+ data: Object.values(context.actionData || {})[0]
9012
+ };
9013
+ }
9014
+ return generateSingleFetchResponse(request, build, serverMode, {
9015
+ result: singleFetchResult,
9016
+ headers,
9017
+ status: context.statusCode
9018
+ });
9019
+ }
8751
9020
  });
8752
- if (isResponse(result)) {
8753
- return {
9021
+ invariant3(isResponse(result), " Expected a Response from query()");
9022
+ if (isRedirectResponse(result)) {
9023
+ return generateSingleFetchResponse(request, build, serverMode, {
8754
9024
  result: getSingleFetchRedirect(
8755
9025
  result.status,
8756
9026
  result.headers,
@@ -8758,47 +9028,16 @@ async function singleFetchAction(build, serverMode, staticHandler, request, hand
8758
9028
  ),
8759
9029
  headers: result.headers,
8760
9030
  status: SINGLE_FETCH_REDIRECT_STATUS
8761
- };
8762
- }
8763
- let context = result;
8764
- let headers = getDocumentHeaders(build, context);
8765
- if (isRedirectStatusCode(context.statusCode) && headers.has("Location")) {
8766
- return {
8767
- result: getSingleFetchRedirect(
8768
- context.statusCode,
8769
- headers,
8770
- build.basename
8771
- ),
8772
- headers,
8773
- status: SINGLE_FETCH_REDIRECT_STATUS
8774
- };
8775
- }
8776
- if (context.errors) {
8777
- Object.values(context.errors).forEach((err) => {
8778
- if (!isRouteErrorResponse(err) || err.error) {
8779
- handleError(err);
8780
- }
8781
9031
  });
8782
- context.errors = sanitizeErrors(context.errors, serverMode);
8783
9032
  }
8784
- let singleFetchResult;
8785
- if (context.errors) {
8786
- singleFetchResult = { error: Object.values(context.errors)[0] };
8787
- } else {
8788
- singleFetchResult = { data: Object.values(context.actionData || {})[0] };
8789
- }
8790
- return {
8791
- result: singleFetchResult,
8792
- headers,
8793
- status: context.statusCode
8794
- };
9033
+ return result;
8795
9034
  } catch (error) {
8796
9035
  handleError(error);
8797
- return {
9036
+ return generateSingleFetchResponse(request, build, serverMode, {
8798
9037
  result: { error },
8799
9038
  headers: new Headers(),
8800
9039
  status: 500
8801
- };
9040
+ });
8802
9041
  }
8803
9042
  }
8804
9043
  async function singleFetchLoaders(build, serverMode, staticHandler, request, handlerUrl, loadContext, handleError) {
@@ -8811,12 +9050,51 @@ async function singleFetchLoaders(build, serverMode, staticHandler, request, han
8811
9050
  let result = await staticHandler.query(handlerRequest, {
8812
9051
  requestContext: loadContext,
8813
9052
  skipLoaderErrorBubbling: true,
8814
- dataStrategy: getSingleFetchDataStrategy2({
8815
- loadRouteIds
8816
- })
9053
+ async respond(context) {
9054
+ let headers = getDocumentHeaders(build, context);
9055
+ if (isRedirectStatusCode(context.statusCode) && headers.has("Location")) {
9056
+ return generateSingleFetchResponse(request, build, serverMode, {
9057
+ result: {
9058
+ [SingleFetchRedirectSymbol]: getSingleFetchRedirect(
9059
+ context.statusCode,
9060
+ headers,
9061
+ build.basename
9062
+ )
9063
+ },
9064
+ headers,
9065
+ status: SINGLE_FETCH_REDIRECT_STATUS
9066
+ });
9067
+ }
9068
+ if (context.errors) {
9069
+ Object.values(context.errors).forEach((err) => {
9070
+ if (!isRouteErrorResponse(err) || err.error) {
9071
+ handleError(err);
9072
+ }
9073
+ });
9074
+ context.errors = sanitizeErrors(context.errors, serverMode);
9075
+ }
9076
+ let results = {};
9077
+ let loadedMatches = loadRouteIds ? context.matches.filter(
9078
+ (m) => m.route.loader && loadRouteIds.includes(m.route.id)
9079
+ ) : context.matches;
9080
+ loadedMatches.forEach((m) => {
9081
+ let { id } = m.route;
9082
+ if (context.errors && context.errors.hasOwnProperty(id)) {
9083
+ results[id] = { error: context.errors[id] };
9084
+ } else if (context.loaderData.hasOwnProperty(id)) {
9085
+ results[id] = { data: context.loaderData[id] };
9086
+ }
9087
+ });
9088
+ return generateSingleFetchResponse(request, build, serverMode, {
9089
+ result: results,
9090
+ headers,
9091
+ status: context.statusCode
9092
+ });
9093
+ }
8817
9094
  });
8818
- if (isResponse(result)) {
8819
- return {
9095
+ invariant3(isResponse(result), " Expected a Response from query()");
9096
+ if (isRedirectResponse(result)) {
9097
+ return generateSingleFetchResponse(request, build, serverMode, {
8820
9098
  result: {
8821
9099
  [SingleFetchRedirectSymbol]: getSingleFetchRedirect(
8822
9100
  result.status,
@@ -8826,56 +9104,41 @@ async function singleFetchLoaders(build, serverMode, staticHandler, request, han
8826
9104
  },
8827
9105
  headers: result.headers,
8828
9106
  status: SINGLE_FETCH_REDIRECT_STATUS
8829
- };
8830
- }
8831
- let context = result;
8832
- let headers = getDocumentHeaders(build, context);
8833
- if (isRedirectStatusCode(context.statusCode) && headers.has("Location")) {
8834
- return {
8835
- result: {
8836
- [SingleFetchRedirectSymbol]: getSingleFetchRedirect(
8837
- context.statusCode,
8838
- headers,
8839
- build.basename
8840
- )
8841
- },
8842
- headers,
8843
- status: SINGLE_FETCH_REDIRECT_STATUS
8844
- };
8845
- }
8846
- if (context.errors) {
8847
- Object.values(context.errors).forEach((err) => {
8848
- if (!isRouteErrorResponse(err) || err.error) {
8849
- handleError(err);
8850
- }
8851
9107
  });
8852
- context.errors = sanitizeErrors(context.errors, serverMode);
8853
9108
  }
8854
- let results = {};
8855
- let loadedMatches = loadRouteIds ? context.matches.filter(
8856
- (m) => m.route.loader && loadRouteIds.includes(m.route.id)
8857
- ) : context.matches;
8858
- loadedMatches.forEach((m) => {
8859
- let { id } = m.route;
8860
- if (context.errors && context.errors.hasOwnProperty(id)) {
8861
- results[id] = { error: context.errors[id] };
8862
- } else if (context.loaderData.hasOwnProperty(id)) {
8863
- results[id] = { data: context.loaderData[id] };
8864
- }
8865
- });
8866
- return {
8867
- result: results,
8868
- headers,
8869
- status: context.statusCode
8870
- };
9109
+ return result;
8871
9110
  } catch (error) {
8872
9111
  handleError(error);
8873
- return {
9112
+ return generateSingleFetchResponse(request, build, serverMode, {
8874
9113
  result: { root: { error } },
8875
9114
  headers: new Headers(),
8876
9115
  status: 500
8877
- };
9116
+ });
9117
+ }
9118
+ }
9119
+ function generateSingleFetchResponse(request, build, serverMode, {
9120
+ result,
9121
+ headers,
9122
+ status
9123
+ }) {
9124
+ let resultHeaders = new Headers(headers);
9125
+ resultHeaders.set("X-Remix-Response", "yes");
9126
+ if (status === 304) {
9127
+ return new Response(null, { status: 304, headers: resultHeaders });
8878
9128
  }
9129
+ resultHeaders.set("Content-Type", "text/x-script");
9130
+ return new Response(
9131
+ encodeViaTurboStream(
9132
+ result,
9133
+ request.signal,
9134
+ build.entry.module.streamTimeout,
9135
+ serverMode
9136
+ ),
9137
+ {
9138
+ status: status || 200,
9139
+ headers: resultHeaders
9140
+ }
9141
+ );
8879
9142
  }
8880
9143
  function getSingleFetchRedirect(status, headers, basename) {
8881
9144
  let redirect2 = headers.get("Location");
@@ -9117,7 +9380,7 @@ async function handleManifestRequest(build, routes, url) {
9117
9380
  return new Response("Invalid Request", { status: 400 });
9118
9381
  }
9119
9382
  async function handleSingleFetchRequest(serverMode, build, staticHandler, request, handlerUrl, loadContext, handleError) {
9120
- let { result, headers, status } = request.method !== "GET" ? await singleFetchAction(
9383
+ let response = request.method !== "GET" ? await singleFetchAction(
9121
9384
  build,
9122
9385
  serverMode,
9123
9386
  staticHandler,
@@ -9134,129 +9397,67 @@ async function handleSingleFetchRequest(serverMode, build, staticHandler, reques
9134
9397
  loadContext,
9135
9398
  handleError
9136
9399
  );
9137
- let resultHeaders = new Headers(headers);
9138
- resultHeaders.set("X-Remix-Response", "yes");
9139
- if (status === 304) {
9140
- return new Response(null, { status: 304, headers: resultHeaders });
9141
- }
9142
- resultHeaders.set("Content-Type", "text/x-script");
9143
- return new Response(
9144
- encodeViaTurboStream(
9145
- result,
9146
- request.signal,
9147
- build.entry.module.streamTimeout,
9148
- serverMode
9149
- ),
9150
- {
9151
- status: status || 200,
9152
- headers: resultHeaders
9153
- }
9154
- );
9400
+ return response;
9155
9401
  }
9156
9402
  async function handleDocumentRequest(serverMode, build, staticHandler, request, loadContext, handleError, criticalCss) {
9157
- let context;
9158
9403
  try {
9159
- context = await staticHandler.query(request, {
9160
- requestContext: loadContext
9404
+ let response = await staticHandler.query(request, {
9405
+ requestContext: loadContext,
9406
+ respond: renderHtml
9161
9407
  });
9408
+ invariant3(
9409
+ isResponse(response),
9410
+ "Expected a Response to be returned from query"
9411
+ );
9412
+ return response;
9162
9413
  } catch (error) {
9163
9414
  handleError(error);
9164
9415
  return new Response(null, { status: 500 });
9165
9416
  }
9166
- if (isResponse(context)) {
9167
- return context;
9168
- }
9169
- let headers = getDocumentHeaders(build, context);
9170
- if (context.statusCode === 304) {
9171
- return new Response(null, { status: 304, headers });
9172
- }
9173
- if (context.errors) {
9174
- Object.values(context.errors).forEach((err) => {
9175
- if (!isRouteErrorResponse(err) || err.error) {
9176
- handleError(err);
9177
- }
9178
- });
9179
- context.errors = sanitizeErrors(context.errors, serverMode);
9180
- }
9181
- let state = {
9182
- loaderData: context.loaderData,
9183
- actionData: context.actionData,
9184
- errors: serializeErrors2(context.errors, serverMode)
9185
- };
9186
- let entryContext = {
9187
- manifest: build.assets,
9188
- routeModules: createEntryRouteModules(build.routes),
9189
- staticHandlerContext: context,
9190
- criticalCss,
9191
- serverHandoffString: createServerHandoffString({
9192
- basename: build.basename,
9193
- criticalCss,
9194
- future: build.future,
9195
- isSpaMode: build.isSpaMode
9196
- }),
9197
- serverHandoffStream: encodeViaTurboStream(
9198
- state,
9199
- request.signal,
9200
- build.entry.module.streamTimeout,
9201
- serverMode
9202
- ),
9203
- renderMeta: {},
9204
- future: build.future,
9205
- isSpaMode: build.isSpaMode,
9206
- serializeError: (err) => serializeError(err, serverMode)
9207
- };
9208
- let handleDocumentRequestFunction = build.entry.module.default;
9209
- try {
9210
- return await handleDocumentRequestFunction(
9211
- request,
9212
- context.statusCode,
9213
- headers,
9214
- entryContext,
9215
- loadContext
9216
- );
9217
- } catch (error) {
9218
- handleError(error);
9219
- let errorForSecondRender = error;
9220
- if (isResponse(error)) {
9221
- try {
9222
- let data2 = await unwrapResponse(error);
9223
- errorForSecondRender = new ErrorResponseImpl(
9224
- error.status,
9225
- error.statusText,
9226
- data2
9227
- );
9228
- } catch (e) {
9229
- }
9417
+ async function renderHtml(context) {
9418
+ if (isResponse(context)) {
9419
+ return context;
9420
+ }
9421
+ let headers = getDocumentHeaders(build, context);
9422
+ if (context.statusCode === 304) {
9423
+ return new Response(null, { status: 304, headers });
9230
9424
  }
9231
- context = getStaticContextFromError(
9232
- staticHandler.dataRoutes,
9233
- context,
9234
- errorForSecondRender
9235
- );
9236
9425
  if (context.errors) {
9426
+ Object.values(context.errors).forEach((err) => {
9427
+ if (!isRouteErrorResponse(err) || err.error) {
9428
+ handleError(err);
9429
+ }
9430
+ });
9237
9431
  context.errors = sanitizeErrors(context.errors, serverMode);
9238
9432
  }
9239
- let state2 = {
9433
+ let state = {
9240
9434
  loaderData: context.loaderData,
9241
9435
  actionData: context.actionData,
9242
9436
  errors: serializeErrors2(context.errors, serverMode)
9243
9437
  };
9244
- entryContext = {
9245
- ...entryContext,
9438
+ let entryContext = {
9439
+ manifest: build.assets,
9440
+ routeModules: createEntryRouteModules(build.routes),
9246
9441
  staticHandlerContext: context,
9442
+ criticalCss,
9247
9443
  serverHandoffString: createServerHandoffString({
9248
9444
  basename: build.basename,
9445
+ criticalCss,
9249
9446
  future: build.future,
9250
9447
  isSpaMode: build.isSpaMode
9251
9448
  }),
9252
9449
  serverHandoffStream: encodeViaTurboStream(
9253
- state2,
9450
+ state,
9254
9451
  request.signal,
9255
9452
  build.entry.module.streamTimeout,
9256
9453
  serverMode
9257
9454
  ),
9258
- renderMeta: {}
9455
+ renderMeta: {},
9456
+ future: build.future,
9457
+ isSpaMode: build.isSpaMode,
9458
+ serializeError: (err) => serializeError(err, serverMode)
9259
9459
  };
9460
+ let handleDocumentRequestFunction = build.entry.module.default;
9260
9461
  try {
9261
9462
  return await handleDocumentRequestFunction(
9262
9463
  request,
@@ -9265,9 +9466,61 @@ async function handleDocumentRequest(serverMode, build, staticHandler, request,
9265
9466
  entryContext,
9266
9467
  loadContext
9267
9468
  );
9268
- } catch (error2) {
9269
- handleError(error2);
9270
- return returnLastResortErrorResponse(error2, serverMode);
9469
+ } catch (error) {
9470
+ handleError(error);
9471
+ let errorForSecondRender = error;
9472
+ if (isResponse(error)) {
9473
+ try {
9474
+ let data2 = await unwrapResponse(error);
9475
+ errorForSecondRender = new ErrorResponseImpl(
9476
+ error.status,
9477
+ error.statusText,
9478
+ data2
9479
+ );
9480
+ } catch (e) {
9481
+ }
9482
+ }
9483
+ context = getStaticContextFromError(
9484
+ staticHandler.dataRoutes,
9485
+ context,
9486
+ errorForSecondRender
9487
+ );
9488
+ if (context.errors) {
9489
+ context.errors = sanitizeErrors(context.errors, serverMode);
9490
+ }
9491
+ let state2 = {
9492
+ loaderData: context.loaderData,
9493
+ actionData: context.actionData,
9494
+ errors: serializeErrors2(context.errors, serverMode)
9495
+ };
9496
+ entryContext = {
9497
+ ...entryContext,
9498
+ staticHandlerContext: context,
9499
+ serverHandoffString: createServerHandoffString({
9500
+ basename: build.basename,
9501
+ future: build.future,
9502
+ isSpaMode: build.isSpaMode
9503
+ }),
9504
+ serverHandoffStream: encodeViaTurboStream(
9505
+ state2,
9506
+ request.signal,
9507
+ build.entry.module.streamTimeout,
9508
+ serverMode
9509
+ ),
9510
+ renderMeta: {}
9511
+ };
9512
+ try {
9513
+ return await handleDocumentRequestFunction(
9514
+ request,
9515
+ context.statusCode,
9516
+ headers,
9517
+ entryContext,
9518
+ loadContext
9519
+ );
9520
+ } catch (error2) {
9521
+ handleError(error2);
9522
+ return returnLastResortErrorResponse(error2, serverMode);
9523
+ }
9271
9524
  }
9272
9525
  }
9273
9526
  }