react-router 0.0.0-experimental-e5dac68cb → 0.0.0-experimental-59413d9ab

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 (75) hide show
  1. package/dist/development/browser-DYcG-QSM.d.mts +141 -0
  2. package/dist/development/chunk-5D3KTOSM.js +21 -0
  3. package/dist/development/chunk-6IGRGMSR.js +9993 -0
  4. package/dist/development/{chunk-USQXBNSR.mjs → chunk-NM2NJ6LO.mjs} +758 -3325
  5. package/dist/development/chunk-Q4E2T2VL.mjs +2991 -0
  6. package/dist/development/chunk-SIFL75JK.js +3027 -0
  7. package/dist/development/chunk-VBH7ULUE.mjs +2652 -0
  8. package/dist/development/components-CwtESh53.d.mts +816 -0
  9. package/dist/development/dom-export.d.mts +3 -2
  10. package/dist/development/dom-export.js +52 -72
  11. package/dist/development/dom-export.mjs +6 -4
  12. package/dist/development/index-react-server-client-CzKQ01cq.d.mts +1360 -0
  13. package/dist/development/{browser-Bh26Omrk.d.mts → index-react-server-client-unV28389.d.ts} +35 -91
  14. package/dist/development/index-react-server-client.d.mts +4 -0
  15. package/dist/development/index-react-server-client.d.ts +3 -0
  16. package/dist/development/index-react-server-client.js +54 -0
  17. package/dist/development/index-react-server-client.mjs +53 -0
  18. package/dist/development/index-react-server.d.mts +1853 -0
  19. package/dist/development/index-react-server.d.ts +1853 -0
  20. package/dist/development/index-react-server.js +143 -0
  21. package/dist/development/index-react-server.mjs +2 -0
  22. package/dist/development/index.d.mts +14 -45
  23. package/dist/development/index.d.ts +72 -2189
  24. package/dist/development/index.js +469 -10355
  25. package/dist/development/index.mjs +26 -24
  26. package/dist/development/lib/types/internal.d.mts +2 -2
  27. package/dist/development/lib/types/internal.d.ts +2 -1
  28. package/dist/development/lib/types/internal.js +2 -20
  29. package/dist/development/lib/types/internal.mjs +1 -1
  30. package/dist/{production/register-DeIo2iHO.d.mts → development/register-DiOIlEq5.d.mts} +1 -1
  31. package/dist/development/{register-DeIo2iHO.d.mts → register-DiOIlEq5.d.ts} +1 -1
  32. package/dist/development/{route-data-C8_wxpLo.d.mts → route-data-Csr8hE3v.d.mts} +1 -1
  33. package/dist/{production/route-data-C8_wxpLo.d.mts → development/route-data-x_b_BLCv.d.ts} +11 -11
  34. package/dist/development/rsc-export.d.mts +4 -1851
  35. package/dist/development/rsc-export.d.ts +4 -1851
  36. package/dist/development/rsc-export.js +60 -3028
  37. package/dist/development/rsc-export.mjs +1 -2998
  38. package/dist/production/browser-DYcG-QSM.d.mts +141 -0
  39. package/dist/production/chunk-5D3KTOSM.js +21 -0
  40. package/dist/production/chunk-BUCOUPH7.mjs +2652 -0
  41. package/dist/production/{chunk-SB3D2OAU.mjs → chunk-JTLYHRZM.mjs} +758 -3325
  42. package/dist/production/chunk-Q4E2T2VL.mjs +2991 -0
  43. package/dist/production/chunk-SIFL75JK.js +3027 -0
  44. package/dist/production/chunk-TAPQIP6U.js +9993 -0
  45. package/dist/production/components-CwtESh53.d.mts +816 -0
  46. package/dist/production/dom-export.d.mts +3 -2
  47. package/dist/production/dom-export.js +52 -72
  48. package/dist/production/dom-export.mjs +6 -4
  49. package/dist/production/index-react-server-client-CzKQ01cq.d.mts +1360 -0
  50. package/dist/production/{browser-Bh26Omrk.d.mts → index-react-server-client-unV28389.d.ts} +35 -91
  51. package/dist/production/index-react-server-client.d.mts +4 -0
  52. package/dist/production/index-react-server-client.d.ts +3 -0
  53. package/dist/production/index-react-server-client.js +54 -0
  54. package/dist/production/index-react-server-client.mjs +53 -0
  55. package/dist/production/index-react-server.d.mts +1853 -0
  56. package/dist/production/index-react-server.d.ts +1853 -0
  57. package/dist/production/index-react-server.js +143 -0
  58. package/dist/production/index-react-server.mjs +2 -0
  59. package/dist/production/index.d.mts +14 -45
  60. package/dist/production/index.d.ts +72 -2189
  61. package/dist/production/index.js +469 -10355
  62. package/dist/production/index.mjs +26 -24
  63. package/dist/production/lib/types/internal.d.mts +2 -2
  64. package/dist/production/lib/types/internal.d.ts +2 -1
  65. package/dist/production/lib/types/internal.js +2 -20
  66. package/dist/production/lib/types/internal.mjs +1 -1
  67. package/dist/production/register-DiOIlEq5.d.mts +24 -0
  68. package/dist/production/register-DiOIlEq5.d.ts +24 -0
  69. package/dist/production/{register-BEmY26MO.d.ts → route-data-Csr8hE3v.d.mts} +1 -24
  70. package/dist/{development/register-BEmY26MO.d.ts → production/route-data-x_b_BLCv.d.ts} +11 -34
  71. package/dist/production/rsc-export.d.mts +4 -1851
  72. package/dist/production/rsc-export.d.ts +4 -1851
  73. package/dist/production/rsc-export.js +60 -3028
  74. package/dist/production/rsc-export.mjs +1 -2998
  75. package/package.json +20 -24
@@ -0,0 +1,2652 @@
1
+ /**
2
+ * react-router v0.0.0-experimental-59413d9ab
3
+ *
4
+ * Copyright (c) Remix Software Inc.
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE.md file in the root directory of this source tree.
8
+ *
9
+ * @license MIT
10
+ */
11
+ import {
12
+ ENABLE_DEV_WARNINGS,
13
+ ErrorResponseImpl,
14
+ FrameworkContext,
15
+ NO_BODY_STATUS_CODES,
16
+ Outlet,
17
+ RemixErrorBoundary,
18
+ RouterProvider,
19
+ SINGLE_FETCH_REDIRECT_STATUS,
20
+ SingleFetchRedirectSymbol,
21
+ StaticRouterProvider,
22
+ StreamTransfer,
23
+ convertRoutesToDataRoutes,
24
+ createBrowserHistory,
25
+ createMemoryRouter,
26
+ createRequestInit,
27
+ createRouter,
28
+ createServerRoutes,
29
+ createStaticHandler,
30
+ createStaticRouter,
31
+ decodeViaTurboStream,
32
+ encode,
33
+ getManifestPath,
34
+ getSingleFetchDataStrategyImpl,
35
+ getStaticContextFromError,
36
+ invariant,
37
+ isDataWithResponseInit,
38
+ isMutationMethod,
39
+ isRedirectResponse,
40
+ isRedirectStatusCode,
41
+ isResponse,
42
+ isRouteErrorResponse,
43
+ matchRoutes,
44
+ noActionDefinedError,
45
+ redirect,
46
+ redirectDocument,
47
+ replace,
48
+ shouldHydrateRouteLoader,
49
+ singleFetchUrl,
50
+ stripBasename,
51
+ stripIndexParam,
52
+ unstable_RouterContextProvider,
53
+ unstable_createContext,
54
+ useRouteError,
55
+ warnOnce,
56
+ withComponentProps,
57
+ withErrorBoundaryProps,
58
+ withHydrateFallbackProps
59
+ } from "./chunk-NM2NJ6LO.mjs";
60
+
61
+ // lib/dom/ssr/server.tsx
62
+ import * as React from "react";
63
+ function ServerRouter({
64
+ context,
65
+ url,
66
+ nonce
67
+ }) {
68
+ if (typeof url === "string") {
69
+ url = new URL(url);
70
+ }
71
+ let { manifest, routeModules, criticalCss, serverHandoffString } = context;
72
+ let routes = createServerRoutes(
73
+ manifest.routes,
74
+ routeModules,
75
+ context.future,
76
+ context.isSpaMode
77
+ );
78
+ context.staticHandlerContext.loaderData = {
79
+ ...context.staticHandlerContext.loaderData
80
+ };
81
+ for (let match of context.staticHandlerContext.matches) {
82
+ let routeId = match.route.id;
83
+ let route = routeModules[routeId];
84
+ let manifestRoute = context.manifest.routes[routeId];
85
+ if (route && manifestRoute && shouldHydrateRouteLoader(
86
+ routeId,
87
+ route.clientLoader,
88
+ manifestRoute.hasLoader,
89
+ context.isSpaMode
90
+ ) && (route.HydrateFallback || !manifestRoute.hasLoader)) {
91
+ delete context.staticHandlerContext.loaderData[routeId];
92
+ }
93
+ }
94
+ let router = createStaticRouter(routes, context.staticHandlerContext);
95
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
96
+ FrameworkContext.Provider,
97
+ {
98
+ value: {
99
+ manifest,
100
+ routeModules,
101
+ criticalCss,
102
+ serverHandoffString,
103
+ future: context.future,
104
+ ssr: context.ssr,
105
+ isSpaMode: context.isSpaMode,
106
+ routeDiscovery: context.routeDiscovery,
107
+ serializeError: context.serializeError,
108
+ renderMeta: context.renderMeta
109
+ }
110
+ },
111
+ /* @__PURE__ */ React.createElement(RemixErrorBoundary, { location: router.state.location }, /* @__PURE__ */ React.createElement(
112
+ StaticRouterProvider,
113
+ {
114
+ router,
115
+ context: context.staticHandlerContext,
116
+ hydrate: false
117
+ }
118
+ ))
119
+ ), context.serverHandoffStream ? /* @__PURE__ */ React.createElement(React.Suspense, null, /* @__PURE__ */ React.createElement(
120
+ StreamTransfer,
121
+ {
122
+ context,
123
+ identifier: 0,
124
+ reader: context.serverHandoffStream.getReader(),
125
+ textDecoder: new TextDecoder(),
126
+ nonce
127
+ }
128
+ )) : null);
129
+ }
130
+
131
+ // lib/dom/ssr/routes-test-stub.tsx
132
+ import * as React2 from "react";
133
+ function createRoutesStub(routes, unstable_getContext) {
134
+ return function RoutesTestStub({
135
+ initialEntries,
136
+ initialIndex,
137
+ hydrationData,
138
+ future
139
+ }) {
140
+ let routerRef = React2.useRef();
141
+ let remixContextRef = React2.useRef();
142
+ if (routerRef.current == null) {
143
+ remixContextRef.current = {
144
+ future: {
145
+ unstable_subResourceIntegrity: future?.unstable_subResourceIntegrity === true,
146
+ unstable_middleware: future?.unstable_middleware === true
147
+ },
148
+ manifest: {
149
+ routes: {},
150
+ entry: { imports: [], module: "" },
151
+ url: "",
152
+ version: ""
153
+ },
154
+ routeModules: {},
155
+ ssr: false,
156
+ isSpaMode: false,
157
+ routeDiscovery: { mode: "lazy", manifestPath: "/__manifest" }
158
+ };
159
+ let patched = processRoutes(
160
+ // @ts-expect-error `StubRouteObject` is stricter about `loader`/`action`
161
+ // types compared to `AgnosticRouteObject`
162
+ convertRoutesToDataRoutes(routes, (r) => r),
163
+ remixContextRef.current.manifest,
164
+ remixContextRef.current.routeModules
165
+ );
166
+ routerRef.current = createMemoryRouter(patched, {
167
+ unstable_getContext,
168
+ initialEntries,
169
+ initialIndex,
170
+ hydrationData
171
+ });
172
+ }
173
+ return /* @__PURE__ */ React2.createElement(FrameworkContext.Provider, { value: remixContextRef.current }, /* @__PURE__ */ React2.createElement(RouterProvider, { router: routerRef.current }));
174
+ };
175
+ }
176
+ function processRoutes(routes, manifest, routeModules, parentId) {
177
+ return routes.map((route) => {
178
+ if (!route.id) {
179
+ throw new Error(
180
+ "Expected a route.id in @remix-run/testing processRoutes() function"
181
+ );
182
+ }
183
+ let newRoute = {
184
+ id: route.id,
185
+ path: route.path,
186
+ index: route.index,
187
+ Component: route.Component ? withComponentProps(route.Component) : void 0,
188
+ HydrateFallback: route.HydrateFallback ? withHydrateFallbackProps(route.HydrateFallback) : void 0,
189
+ ErrorBoundary: route.ErrorBoundary ? withErrorBoundaryProps(route.ErrorBoundary) : void 0,
190
+ action: route.action,
191
+ loader: route.loader,
192
+ handle: route.handle,
193
+ shouldRevalidate: route.shouldRevalidate
194
+ };
195
+ let entryRoute = {
196
+ id: route.id,
197
+ path: route.path,
198
+ index: route.index,
199
+ parentId,
200
+ hasAction: route.action != null,
201
+ hasLoader: route.loader != null,
202
+ // When testing routes, you should be stubbing loader/action/middleware,
203
+ // not trying to re-implement the full loader/clientLoader/SSR/hydration
204
+ // flow. That is better tested via E2E tests.
205
+ hasClientAction: false,
206
+ hasClientLoader: false,
207
+ hasClientMiddleware: false,
208
+ hasErrorBoundary: route.ErrorBoundary != null,
209
+ // any need for these?
210
+ module: "build/stub-path-to-module.js",
211
+ clientActionModule: void 0,
212
+ clientLoaderModule: void 0,
213
+ clientMiddlewareModule: void 0,
214
+ hydrateFallbackModule: void 0
215
+ };
216
+ manifest.routes[newRoute.id] = entryRoute;
217
+ routeModules[route.id] = {
218
+ default: newRoute.Component || Outlet,
219
+ ErrorBoundary: newRoute.ErrorBoundary || void 0,
220
+ handle: route.handle,
221
+ links: route.links,
222
+ meta: route.meta,
223
+ shouldRevalidate: route.shouldRevalidate
224
+ };
225
+ if (route.children) {
226
+ newRoute.children = processRoutes(
227
+ route.children,
228
+ manifest,
229
+ routeModules,
230
+ newRoute.id
231
+ );
232
+ }
233
+ return newRoute;
234
+ });
235
+ }
236
+
237
+ // lib/server-runtime/cookies.ts
238
+ import { parse, serialize } from "cookie";
239
+
240
+ // lib/server-runtime/crypto.ts
241
+ var encoder = /* @__PURE__ */ new TextEncoder();
242
+ var sign = async (value, secret) => {
243
+ let data2 = encoder.encode(value);
244
+ let key = await createKey(secret, ["sign"]);
245
+ let signature = await crypto.subtle.sign("HMAC", key, data2);
246
+ let hash = btoa(String.fromCharCode(...new Uint8Array(signature))).replace(
247
+ /=+$/,
248
+ ""
249
+ );
250
+ return value + "." + hash;
251
+ };
252
+ var unsign = async (cookie, secret) => {
253
+ let index = cookie.lastIndexOf(".");
254
+ let value = cookie.slice(0, index);
255
+ let hash = cookie.slice(index + 1);
256
+ let data2 = encoder.encode(value);
257
+ let key = await createKey(secret, ["verify"]);
258
+ let signature = byteStringToUint8Array(atob(hash));
259
+ let valid = await crypto.subtle.verify("HMAC", key, signature, data2);
260
+ return valid ? value : false;
261
+ };
262
+ var createKey = async (secret, usages) => crypto.subtle.importKey(
263
+ "raw",
264
+ encoder.encode(secret),
265
+ { name: "HMAC", hash: "SHA-256" },
266
+ false,
267
+ usages
268
+ );
269
+ function byteStringToUint8Array(byteString) {
270
+ let array = new Uint8Array(byteString.length);
271
+ for (let i = 0; i < byteString.length; i++) {
272
+ array[i] = byteString.charCodeAt(i);
273
+ }
274
+ return array;
275
+ }
276
+
277
+ // lib/server-runtime/cookies.ts
278
+ var createCookie = (name, cookieOptions = {}) => {
279
+ let { secrets = [], ...options } = {
280
+ path: "/",
281
+ sameSite: "lax",
282
+ ...cookieOptions
283
+ };
284
+ warnOnceAboutExpiresCookie(name, options.expires);
285
+ return {
286
+ get name() {
287
+ return name;
288
+ },
289
+ get isSigned() {
290
+ return secrets.length > 0;
291
+ },
292
+ get expires() {
293
+ return typeof options.maxAge !== "undefined" ? new Date(Date.now() + options.maxAge * 1e3) : options.expires;
294
+ },
295
+ async parse(cookieHeader, parseOptions) {
296
+ if (!cookieHeader) return null;
297
+ let cookies = parse(cookieHeader, { ...options, ...parseOptions });
298
+ if (name in cookies) {
299
+ let value = cookies[name];
300
+ if (typeof value === "string" && value !== "") {
301
+ let decoded = await decodeCookieValue(value, secrets);
302
+ return decoded;
303
+ } else {
304
+ return "";
305
+ }
306
+ } else {
307
+ return null;
308
+ }
309
+ },
310
+ async serialize(value, serializeOptions) {
311
+ return serialize(
312
+ name,
313
+ value === "" ? "" : await encodeCookieValue(value, secrets),
314
+ {
315
+ ...options,
316
+ ...serializeOptions
317
+ }
318
+ );
319
+ }
320
+ };
321
+ };
322
+ var isCookie = (object) => {
323
+ return object != null && typeof object.name === "string" && typeof object.isSigned === "boolean" && typeof object.parse === "function" && typeof object.serialize === "function";
324
+ };
325
+ async function encodeCookieValue(value, secrets) {
326
+ let encoded = encodeData(value);
327
+ if (secrets.length > 0) {
328
+ encoded = await sign(encoded, secrets[0]);
329
+ }
330
+ return encoded;
331
+ }
332
+ async function decodeCookieValue(value, secrets) {
333
+ if (secrets.length > 0) {
334
+ for (let secret of secrets) {
335
+ let unsignedValue = await unsign(value, secret);
336
+ if (unsignedValue !== false) {
337
+ return decodeData(unsignedValue);
338
+ }
339
+ }
340
+ return null;
341
+ }
342
+ return decodeData(value);
343
+ }
344
+ function encodeData(value) {
345
+ return btoa(myUnescape(encodeURIComponent(JSON.stringify(value))));
346
+ }
347
+ function decodeData(value) {
348
+ try {
349
+ return JSON.parse(decodeURIComponent(myEscape(atob(value))));
350
+ } catch (error) {
351
+ return {};
352
+ }
353
+ }
354
+ function myEscape(value) {
355
+ let str = value.toString();
356
+ let result = "";
357
+ let index = 0;
358
+ let chr, code;
359
+ while (index < str.length) {
360
+ chr = str.charAt(index++);
361
+ if (/[\w*+\-./@]/.exec(chr)) {
362
+ result += chr;
363
+ } else {
364
+ code = chr.charCodeAt(0);
365
+ if (code < 256) {
366
+ result += "%" + hex(code, 2);
367
+ } else {
368
+ result += "%u" + hex(code, 4).toUpperCase();
369
+ }
370
+ }
371
+ }
372
+ return result;
373
+ }
374
+ function hex(code, length) {
375
+ let result = code.toString(16);
376
+ while (result.length < length) result = "0" + result;
377
+ return result;
378
+ }
379
+ function myUnescape(value) {
380
+ let str = value.toString();
381
+ let result = "";
382
+ let index = 0;
383
+ let chr, part;
384
+ while (index < str.length) {
385
+ chr = str.charAt(index++);
386
+ if (chr === "%") {
387
+ if (str.charAt(index) === "u") {
388
+ part = str.slice(index + 1, index + 5);
389
+ if (/^[\da-f]{4}$/i.exec(part)) {
390
+ result += String.fromCharCode(parseInt(part, 16));
391
+ index += 5;
392
+ continue;
393
+ }
394
+ } else {
395
+ part = str.slice(index, index + 2);
396
+ if (/^[\da-f]{2}$/i.exec(part)) {
397
+ result += String.fromCharCode(parseInt(part, 16));
398
+ index += 2;
399
+ continue;
400
+ }
401
+ }
402
+ }
403
+ result += chr;
404
+ }
405
+ return result;
406
+ }
407
+ function warnOnceAboutExpiresCookie(name, expires) {
408
+ warnOnce(
409
+ !expires,
410
+ `The "${name}" cookie has an "expires" property set. This will cause the expires value to not be updated when the session is committed. Instead, you should set the expires value when serializing the cookie. You can use \`commitSession(session, { expires })\` if using a session storage object, or \`cookie.serialize("value", { expires })\` if you're using the cookie directly.`
411
+ );
412
+ }
413
+
414
+ // lib/server-runtime/entry.ts
415
+ function createEntryRouteModules(manifest) {
416
+ return Object.keys(manifest).reduce((memo, routeId) => {
417
+ let route = manifest[routeId];
418
+ if (route) {
419
+ memo[routeId] = route.module;
420
+ }
421
+ return memo;
422
+ }, {});
423
+ }
424
+
425
+ // lib/server-runtime/mode.ts
426
+ var ServerMode = /* @__PURE__ */ ((ServerMode2) => {
427
+ ServerMode2["Development"] = "development";
428
+ ServerMode2["Production"] = "production";
429
+ ServerMode2["Test"] = "test";
430
+ return ServerMode2;
431
+ })(ServerMode || {});
432
+ function isServerMode(value) {
433
+ return value === "development" /* Development */ || value === "production" /* Production */ || value === "test" /* Test */;
434
+ }
435
+
436
+ // lib/server-runtime/errors.ts
437
+ function sanitizeError(error, serverMode) {
438
+ if (error instanceof Error && serverMode !== "development" /* Development */) {
439
+ let sanitized = new Error("Unexpected Server Error");
440
+ sanitized.stack = void 0;
441
+ return sanitized;
442
+ }
443
+ return error;
444
+ }
445
+ function sanitizeErrors(errors, serverMode) {
446
+ return Object.entries(errors).reduce((acc, [routeId, error]) => {
447
+ return Object.assign(acc, { [routeId]: sanitizeError(error, serverMode) });
448
+ }, {});
449
+ }
450
+ function serializeError(error, serverMode) {
451
+ let sanitized = sanitizeError(error, serverMode);
452
+ return {
453
+ message: sanitized.message,
454
+ stack: sanitized.stack
455
+ };
456
+ }
457
+ function serializeErrors(errors, serverMode) {
458
+ if (!errors) return null;
459
+ let entries = Object.entries(errors);
460
+ let serialized = {};
461
+ for (let [key, val] of entries) {
462
+ if (isRouteErrorResponse(val)) {
463
+ serialized[key] = { ...val, __type: "RouteErrorResponse" };
464
+ } else if (val instanceof Error) {
465
+ let sanitized = sanitizeError(val, serverMode);
466
+ serialized[key] = {
467
+ message: sanitized.message,
468
+ stack: sanitized.stack,
469
+ __type: "Error",
470
+ // If this is a subclass (i.e., ReferenceError), send up the type so we
471
+ // can re-create the same type during hydration. This will only apply
472
+ // in dev mode since all production errors are sanitized to normal
473
+ // Error instances
474
+ ...sanitized.name !== "Error" ? {
475
+ __subType: sanitized.name
476
+ } : {}
477
+ };
478
+ } else {
479
+ serialized[key] = val;
480
+ }
481
+ }
482
+ return serialized;
483
+ }
484
+
485
+ // lib/server-runtime/routeMatching.ts
486
+ function matchServerRoutes(routes, pathname, basename) {
487
+ let matches = matchRoutes(
488
+ routes,
489
+ pathname,
490
+ basename
491
+ );
492
+ if (!matches) return null;
493
+ return matches.map((match) => ({
494
+ params: match.params,
495
+ pathname: match.pathname,
496
+ route: match.route
497
+ }));
498
+ }
499
+
500
+ // lib/server-runtime/data.ts
501
+ async function callRouteHandler(handler, args) {
502
+ let result = await handler({
503
+ request: stripRoutesParam(stripIndexParam2(args.request)),
504
+ params: args.params,
505
+ context: args.context
506
+ });
507
+ if (isDataWithResponseInit(result) && result.init && result.init.status && isRedirectStatusCode(result.init.status)) {
508
+ throw new Response(null, result.init);
509
+ }
510
+ return result;
511
+ }
512
+ function stripIndexParam2(request) {
513
+ let url = new URL(request.url);
514
+ let indexValues = url.searchParams.getAll("index");
515
+ url.searchParams.delete("index");
516
+ let indexValuesToKeep = [];
517
+ for (let indexValue of indexValues) {
518
+ if (indexValue) {
519
+ indexValuesToKeep.push(indexValue);
520
+ }
521
+ }
522
+ for (let toKeep of indexValuesToKeep) {
523
+ url.searchParams.append("index", toKeep);
524
+ }
525
+ let init = {
526
+ method: request.method,
527
+ body: request.body,
528
+ headers: request.headers,
529
+ signal: request.signal
530
+ };
531
+ if (init.body) {
532
+ init.duplex = "half";
533
+ }
534
+ return new Request(url.href, init);
535
+ }
536
+ function stripRoutesParam(request) {
537
+ let url = new URL(request.url);
538
+ url.searchParams.delete("_routes");
539
+ let init = {
540
+ method: request.method,
541
+ body: request.body,
542
+ headers: request.headers,
543
+ signal: request.signal
544
+ };
545
+ if (init.body) {
546
+ init.duplex = "half";
547
+ }
548
+ return new Request(url.href, init);
549
+ }
550
+
551
+ // lib/server-runtime/invariant.ts
552
+ function invariant2(value, message) {
553
+ if (value === false || value === null || typeof value === "undefined") {
554
+ console.error(
555
+ "The following error is a bug in React Router; please open an issue! https://github.com/remix-run/react-router/issues/new/choose"
556
+ );
557
+ throw new Error(message);
558
+ }
559
+ }
560
+
561
+ // lib/server-runtime/dev.ts
562
+ var globalDevServerHooksKey = "__reactRouterDevServerHooks";
563
+ function setDevServerHooks(devServerHooks) {
564
+ globalThis[globalDevServerHooksKey] = devServerHooks;
565
+ }
566
+ function getDevServerHooks() {
567
+ return globalThis[globalDevServerHooksKey];
568
+ }
569
+ function getBuildTimeHeader(request, headerName) {
570
+ if (typeof process !== "undefined") {
571
+ try {
572
+ if (process.env?.IS_RR_BUILD_REQUEST === "yes") {
573
+ return request.headers.get(headerName);
574
+ }
575
+ } catch (e) {
576
+ }
577
+ }
578
+ return null;
579
+ }
580
+
581
+ // lib/server-runtime/routes.ts
582
+ function groupRoutesByParentId(manifest) {
583
+ let routes = {};
584
+ Object.values(manifest).forEach((route) => {
585
+ if (route) {
586
+ let parentId = route.parentId || "";
587
+ if (!routes[parentId]) {
588
+ routes[parentId] = [];
589
+ }
590
+ routes[parentId].push(route);
591
+ }
592
+ });
593
+ return routes;
594
+ }
595
+ function createRoutes(manifest, parentId = "", routesByParentId = groupRoutesByParentId(manifest)) {
596
+ return (routesByParentId[parentId] || []).map((route) => ({
597
+ ...route,
598
+ children: createRoutes(manifest, route.id, routesByParentId)
599
+ }));
600
+ }
601
+ function createStaticHandlerDataRoutes(manifest, future, parentId = "", routesByParentId = groupRoutesByParentId(manifest)) {
602
+ return (routesByParentId[parentId] || []).map((route) => {
603
+ let commonRoute = {
604
+ // Always include root due to default boundaries
605
+ hasErrorBoundary: route.id === "root" || route.module.ErrorBoundary != null,
606
+ id: route.id,
607
+ path: route.path,
608
+ unstable_middleware: route.module.unstable_middleware,
609
+ // Need to use RR's version in the param typed here to permit the optional
610
+ // context even though we know it'll always be provided in remix
611
+ loader: route.module.loader ? async (args) => {
612
+ let preRenderedData = getBuildTimeHeader(
613
+ args.request,
614
+ "X-React-Router-Prerender-Data"
615
+ );
616
+ if (preRenderedData != null) {
617
+ let encoded = preRenderedData ? decodeURI(preRenderedData) : preRenderedData;
618
+ invariant2(encoded, "Missing prerendered data for route");
619
+ let uint8array = new TextEncoder().encode(encoded);
620
+ let stream = new ReadableStream({
621
+ start(controller) {
622
+ controller.enqueue(uint8array);
623
+ controller.close();
624
+ }
625
+ });
626
+ let decoded = await decodeViaTurboStream(stream, global);
627
+ let data2 = decoded.value;
628
+ if (data2 && SingleFetchRedirectSymbol in data2) {
629
+ let result = data2[SingleFetchRedirectSymbol];
630
+ let init = { status: result.status };
631
+ if (result.reload) {
632
+ throw redirectDocument(result.redirect, init);
633
+ } else if (result.replace) {
634
+ throw replace(result.redirect, init);
635
+ } else {
636
+ throw redirect(result.redirect, init);
637
+ }
638
+ } else {
639
+ invariant2(
640
+ data2 && route.id in data2,
641
+ "Unable to decode prerendered data"
642
+ );
643
+ let result = data2[route.id];
644
+ invariant2(
645
+ "data" in result,
646
+ "Unable to process prerendered data"
647
+ );
648
+ return result.data;
649
+ }
650
+ }
651
+ let val = await callRouteHandler(route.module.loader, args);
652
+ return val;
653
+ } : void 0,
654
+ action: route.module.action ? (args) => callRouteHandler(route.module.action, args) : void 0,
655
+ handle: route.module.handle
656
+ };
657
+ return route.index ? {
658
+ index: true,
659
+ ...commonRoute
660
+ } : {
661
+ caseSensitive: route.caseSensitive,
662
+ children: createStaticHandlerDataRoutes(
663
+ manifest,
664
+ future,
665
+ route.id,
666
+ routesByParentId
667
+ ),
668
+ ...commonRoute
669
+ };
670
+ });
671
+ }
672
+
673
+ // lib/server-runtime/markup.ts
674
+ var ESCAPE_LOOKUP = {
675
+ "&": "\\u0026",
676
+ ">": "\\u003e",
677
+ "<": "\\u003c",
678
+ "\u2028": "\\u2028",
679
+ "\u2029": "\\u2029"
680
+ };
681
+ var ESCAPE_REGEX = /[&><\u2028\u2029]/g;
682
+ function escapeHtml(html) {
683
+ return html.replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]);
684
+ }
685
+
686
+ // lib/server-runtime/serverHandoff.ts
687
+ function createServerHandoffString(serverHandoff) {
688
+ return escapeHtml(JSON.stringify(serverHandoff));
689
+ }
690
+
691
+ // lib/server-runtime/headers.ts
692
+ import { splitCookiesString } from "set-cookie-parser";
693
+ function getDocumentHeaders(context, build) {
694
+ return getDocumentHeadersImpl(context, (m) => {
695
+ let route = build.routes[m.route.id];
696
+ invariant2(route, `Route with id "${m.route.id}" not found in build`);
697
+ return route.module.headers;
698
+ });
699
+ }
700
+ function getDocumentHeadersImpl(context, getRouteHeadersFn) {
701
+ let boundaryIdx = context.errors ? context.matches.findIndex((m) => context.errors[m.route.id]) : -1;
702
+ let matches = boundaryIdx >= 0 ? context.matches.slice(0, boundaryIdx + 1) : context.matches;
703
+ let errorHeaders;
704
+ if (boundaryIdx >= 0) {
705
+ let { actionHeaders, actionData, loaderHeaders, loaderData } = context;
706
+ context.matches.slice(boundaryIdx).some((match) => {
707
+ let id = match.route.id;
708
+ if (actionHeaders[id] && (!actionData || !actionData.hasOwnProperty(id))) {
709
+ errorHeaders = actionHeaders[id];
710
+ } else if (loaderHeaders[id] && !loaderData.hasOwnProperty(id)) {
711
+ errorHeaders = loaderHeaders[id];
712
+ }
713
+ return errorHeaders != null;
714
+ });
715
+ }
716
+ return matches.reduce((parentHeaders, match, idx) => {
717
+ let { id } = match.route;
718
+ let loaderHeaders = context.loaderHeaders[id] || new Headers();
719
+ let actionHeaders = context.actionHeaders[id] || new Headers();
720
+ let includeErrorHeaders = errorHeaders != null && idx === matches.length - 1;
721
+ let includeErrorCookies = includeErrorHeaders && errorHeaders !== loaderHeaders && errorHeaders !== actionHeaders;
722
+ let headersFn = getRouteHeadersFn(match);
723
+ if (headersFn == null) {
724
+ let headers2 = new Headers(parentHeaders);
725
+ if (includeErrorCookies) {
726
+ prependCookies(errorHeaders, headers2);
727
+ }
728
+ prependCookies(actionHeaders, headers2);
729
+ prependCookies(loaderHeaders, headers2);
730
+ return headers2;
731
+ }
732
+ let headers = new Headers(
733
+ typeof headersFn === "function" ? headersFn({
734
+ loaderHeaders,
735
+ parentHeaders,
736
+ actionHeaders,
737
+ errorHeaders: includeErrorHeaders ? errorHeaders : void 0
738
+ }) : headersFn
739
+ );
740
+ if (includeErrorCookies) {
741
+ prependCookies(errorHeaders, headers);
742
+ }
743
+ prependCookies(actionHeaders, headers);
744
+ prependCookies(loaderHeaders, headers);
745
+ prependCookies(parentHeaders, headers);
746
+ return headers;
747
+ }, new Headers());
748
+ }
749
+ function prependCookies(parentHeaders, childHeaders) {
750
+ let parentSetCookieString = parentHeaders.get("Set-Cookie");
751
+ if (parentSetCookieString) {
752
+ let cookies = splitCookiesString(parentSetCookieString);
753
+ let childCookies = new Set(childHeaders.getSetCookie());
754
+ cookies.forEach((cookie) => {
755
+ if (!childCookies.has(cookie)) {
756
+ childHeaders.append("Set-Cookie", cookie);
757
+ }
758
+ });
759
+ }
760
+ }
761
+
762
+ // lib/server-runtime/single-fetch.ts
763
+ var SERVER_NO_BODY_STATUS_CODES = /* @__PURE__ */ new Set([
764
+ ...NO_BODY_STATUS_CODES,
765
+ 304
766
+ ]);
767
+ async function singleFetchAction(build, serverMode, staticHandler, request, handlerUrl, loadContext, handleError) {
768
+ try {
769
+ let respond2 = function(context) {
770
+ let headers = getDocumentHeaders(context, build);
771
+ if (isRedirectStatusCode(context.statusCode) && headers.has("Location")) {
772
+ return generateSingleFetchResponse(request, build, serverMode, {
773
+ result: getSingleFetchRedirect(
774
+ context.statusCode,
775
+ headers,
776
+ build.basename
777
+ ),
778
+ headers,
779
+ status: SINGLE_FETCH_REDIRECT_STATUS
780
+ });
781
+ }
782
+ if (context.errors) {
783
+ Object.values(context.errors).forEach((err) => {
784
+ if (!isRouteErrorResponse(err) || err.error) {
785
+ handleError(err);
786
+ }
787
+ });
788
+ context.errors = sanitizeErrors(context.errors, serverMode);
789
+ }
790
+ let singleFetchResult;
791
+ if (context.errors) {
792
+ singleFetchResult = { error: Object.values(context.errors)[0] };
793
+ } else {
794
+ singleFetchResult = {
795
+ data: Object.values(context.actionData || {})[0]
796
+ };
797
+ }
798
+ return generateSingleFetchResponse(request, build, serverMode, {
799
+ result: singleFetchResult,
800
+ headers,
801
+ status: context.statusCode
802
+ });
803
+ };
804
+ var respond = respond2;
805
+ let handlerRequest = new Request(handlerUrl, {
806
+ method: request.method,
807
+ body: request.body,
808
+ headers: request.headers,
809
+ signal: request.signal,
810
+ ...request.body ? { duplex: "half" } : void 0
811
+ });
812
+ let result = await staticHandler.query(handlerRequest, {
813
+ requestContext: loadContext,
814
+ skipLoaderErrorBubbling: true,
815
+ skipRevalidation: true,
816
+ unstable_respond: respond2
817
+ });
818
+ if (!isResponse(result)) {
819
+ result = respond2(result);
820
+ }
821
+ if (isRedirectResponse(result)) {
822
+ return generateSingleFetchResponse(request, build, serverMode, {
823
+ result: getSingleFetchRedirect(
824
+ result.status,
825
+ result.headers,
826
+ build.basename
827
+ ),
828
+ headers: result.headers,
829
+ status: SINGLE_FETCH_REDIRECT_STATUS
830
+ });
831
+ }
832
+ return result;
833
+ } catch (error) {
834
+ handleError(error);
835
+ return generateSingleFetchResponse(request, build, serverMode, {
836
+ result: { error },
837
+ headers: new Headers(),
838
+ status: 500
839
+ });
840
+ }
841
+ }
842
+ async function singleFetchLoaders(build, serverMode, staticHandler, request, handlerUrl, loadContext, handleError) {
843
+ try {
844
+ let respond2 = function(context) {
845
+ let headers = getDocumentHeaders(context, build);
846
+ if (isRedirectStatusCode(context.statusCode) && headers.has("Location")) {
847
+ return generateSingleFetchResponse(request, build, serverMode, {
848
+ result: {
849
+ [SingleFetchRedirectSymbol]: getSingleFetchRedirect(
850
+ context.statusCode,
851
+ headers,
852
+ build.basename
853
+ )
854
+ },
855
+ headers,
856
+ status: SINGLE_FETCH_REDIRECT_STATUS
857
+ });
858
+ }
859
+ if (context.errors) {
860
+ Object.values(context.errors).forEach((err) => {
861
+ if (!isRouteErrorResponse(err) || err.error) {
862
+ handleError(err);
863
+ }
864
+ });
865
+ context.errors = sanitizeErrors(context.errors, serverMode);
866
+ }
867
+ let results = {};
868
+ let loadedMatches = new Set(
869
+ context.matches.filter(
870
+ (m) => loadRouteIds ? loadRouteIds.has(m.route.id) : m.route.loader != null
871
+ ).map((m) => m.route.id)
872
+ );
873
+ if (context.errors) {
874
+ for (let [id, error] of Object.entries(context.errors)) {
875
+ results[id] = { error };
876
+ }
877
+ }
878
+ for (let [id, data2] of Object.entries(context.loaderData)) {
879
+ if (!(id in results) && loadedMatches.has(id)) {
880
+ results[id] = { data: data2 };
881
+ }
882
+ }
883
+ return generateSingleFetchResponse(request, build, serverMode, {
884
+ result: results,
885
+ headers,
886
+ status: context.statusCode
887
+ });
888
+ };
889
+ var respond = respond2;
890
+ let handlerRequest = new Request(handlerUrl, {
891
+ headers: request.headers,
892
+ signal: request.signal
893
+ });
894
+ let routesParam = new URL(request.url).searchParams.get("_routes");
895
+ let loadRouteIds = routesParam ? new Set(routesParam.split(",")) : null;
896
+ let result = await staticHandler.query(handlerRequest, {
897
+ requestContext: loadContext,
898
+ filterMatchesToLoad: (m) => !loadRouteIds || loadRouteIds.has(m.route.id),
899
+ skipLoaderErrorBubbling: true,
900
+ unstable_respond: respond2
901
+ });
902
+ if (!isResponse(result)) {
903
+ result = respond2(result);
904
+ }
905
+ if (isRedirectResponse(result)) {
906
+ return generateSingleFetchResponse(request, build, serverMode, {
907
+ result: {
908
+ [SingleFetchRedirectSymbol]: getSingleFetchRedirect(
909
+ result.status,
910
+ result.headers,
911
+ build.basename
912
+ )
913
+ },
914
+ headers: result.headers,
915
+ status: SINGLE_FETCH_REDIRECT_STATUS
916
+ });
917
+ }
918
+ return result;
919
+ } catch (error) {
920
+ handleError(error);
921
+ return generateSingleFetchResponse(request, build, serverMode, {
922
+ result: { root: { error } },
923
+ headers: new Headers(),
924
+ status: 500
925
+ });
926
+ }
927
+ }
928
+ function generateSingleFetchResponse(request, build, serverMode, {
929
+ result,
930
+ headers,
931
+ status
932
+ }) {
933
+ let resultHeaders = new Headers(headers);
934
+ resultHeaders.set("X-Remix-Response", "yes");
935
+ if (SERVER_NO_BODY_STATUS_CODES.has(status)) {
936
+ return new Response(null, { status, headers: resultHeaders });
937
+ }
938
+ resultHeaders.set("Content-Type", "text/x-script");
939
+ return new Response(
940
+ encodeViaTurboStream(
941
+ result,
942
+ request.signal,
943
+ build.entry.module.streamTimeout,
944
+ serverMode
945
+ ),
946
+ {
947
+ status: status || 200,
948
+ headers: resultHeaders
949
+ }
950
+ );
951
+ }
952
+ function getSingleFetchRedirect(status, headers, basename) {
953
+ let redirect2 = headers.get("Location");
954
+ if (basename) {
955
+ redirect2 = stripBasename(redirect2, basename) || redirect2;
956
+ }
957
+ return {
958
+ redirect: redirect2,
959
+ status,
960
+ revalidate: (
961
+ // Technically X-Remix-Revalidate isn't needed here - that was an implementation
962
+ // detail of ?_data requests as our way to tell the front end to revalidate when
963
+ // we didn't have a response body to include that information in.
964
+ // With single fetch, we tell the front end via this revalidate boolean field.
965
+ // However, we're respecting it for now because it may be something folks have
966
+ // used in their own responses
967
+ // TODO(v3): Consider removing or making this official public API
968
+ headers.has("X-Remix-Revalidate") || headers.has("Set-Cookie")
969
+ ),
970
+ reload: headers.has("X-Remix-Reload-Document"),
971
+ replace: headers.has("X-Remix-Replace")
972
+ };
973
+ }
974
+ function encodeViaTurboStream(data2, requestSignal, streamTimeout, serverMode) {
975
+ let controller = new AbortController();
976
+ let timeoutId = setTimeout(
977
+ () => controller.abort(new Error("Server Timeout")),
978
+ typeof streamTimeout === "number" ? streamTimeout : 4950
979
+ );
980
+ requestSignal.addEventListener("abort", () => clearTimeout(timeoutId));
981
+ return encode(data2, {
982
+ signal: controller.signal,
983
+ plugins: [
984
+ (value) => {
985
+ if (value instanceof Error) {
986
+ let { name, message, stack } = serverMode === "production" /* Production */ ? sanitizeError(value, serverMode) : value;
987
+ return ["SanitizedError", name, message, stack];
988
+ }
989
+ if (value instanceof ErrorResponseImpl) {
990
+ let { data: data3, status, statusText } = value;
991
+ return ["ErrorResponse", data3, status, statusText];
992
+ }
993
+ if (value && typeof value === "object" && SingleFetchRedirectSymbol in value) {
994
+ return ["SingleFetchRedirect", value[SingleFetchRedirectSymbol]];
995
+ }
996
+ }
997
+ ],
998
+ postPlugins: [
999
+ (value) => {
1000
+ if (!value) return;
1001
+ if (typeof value !== "object") return;
1002
+ return [
1003
+ "SingleFetchClassInstance",
1004
+ Object.fromEntries(Object.entries(value))
1005
+ ];
1006
+ },
1007
+ () => ["SingleFetchFallback"]
1008
+ ]
1009
+ });
1010
+ }
1011
+
1012
+ // lib/server-runtime/server.ts
1013
+ function derive(build, mode) {
1014
+ let routes = createRoutes(build.routes);
1015
+ let dataRoutes = createStaticHandlerDataRoutes(build.routes, build.future);
1016
+ let serverMode = isServerMode(mode) ? mode : "production" /* Production */;
1017
+ let staticHandler = createStaticHandler(dataRoutes, {
1018
+ basename: build.basename
1019
+ });
1020
+ let errorHandler = build.entry.module.handleError || ((error, { request }) => {
1021
+ if (serverMode !== "test" /* Test */ && !request.signal.aborted) {
1022
+ console.error(
1023
+ // @ts-expect-error This is "private" from users but intended for internal use
1024
+ isRouteErrorResponse(error) && error.error ? error.error : error
1025
+ );
1026
+ }
1027
+ });
1028
+ return {
1029
+ routes,
1030
+ dataRoutes,
1031
+ serverMode,
1032
+ staticHandler,
1033
+ errorHandler
1034
+ };
1035
+ }
1036
+ var createRequestHandler = (build, mode) => {
1037
+ let _build;
1038
+ let routes;
1039
+ let serverMode;
1040
+ let staticHandler;
1041
+ let errorHandler;
1042
+ return async function requestHandler(request, initialContext) {
1043
+ _build = typeof build === "function" ? await build() : build;
1044
+ if (typeof build === "function") {
1045
+ let derived = derive(_build, mode);
1046
+ routes = derived.routes;
1047
+ serverMode = derived.serverMode;
1048
+ staticHandler = derived.staticHandler;
1049
+ errorHandler = derived.errorHandler;
1050
+ } else if (!routes || !serverMode || !staticHandler || !errorHandler) {
1051
+ let derived = derive(_build, mode);
1052
+ routes = derived.routes;
1053
+ serverMode = derived.serverMode;
1054
+ staticHandler = derived.staticHandler;
1055
+ errorHandler = derived.errorHandler;
1056
+ }
1057
+ let params = {};
1058
+ let loadContext;
1059
+ let handleError = (error) => {
1060
+ if (mode === "development" /* Development */) {
1061
+ getDevServerHooks()?.processRequestError?.(error);
1062
+ }
1063
+ errorHandler(error, {
1064
+ context: loadContext,
1065
+ params,
1066
+ request
1067
+ });
1068
+ };
1069
+ if (_build.future.unstable_middleware) {
1070
+ if (initialContext == null) {
1071
+ loadContext = new unstable_RouterContextProvider();
1072
+ } else {
1073
+ try {
1074
+ loadContext = new unstable_RouterContextProvider(
1075
+ initialContext
1076
+ );
1077
+ } catch (e) {
1078
+ let error = new Error(
1079
+ `Unable to create initial \`unstable_RouterContextProvider\` instance. Please confirm you are returning an instance of \`Map<unstable_routerContext, unknown>\` from your \`getLoadContext\` function.
1080
+
1081
+ Error: ${e instanceof Error ? e.toString() : e}`
1082
+ );
1083
+ handleError(error);
1084
+ return returnLastResortErrorResponse(error, serverMode);
1085
+ }
1086
+ }
1087
+ } else {
1088
+ loadContext = initialContext || {};
1089
+ }
1090
+ let url = new URL(request.url);
1091
+ let normalizedBasename = _build.basename || "/";
1092
+ let normalizedPath = url.pathname;
1093
+ if (stripBasename(normalizedPath, normalizedBasename) === "/_root.data") {
1094
+ normalizedPath = normalizedBasename;
1095
+ } else if (normalizedPath.endsWith(".data")) {
1096
+ normalizedPath = normalizedPath.replace(/\.data$/, "");
1097
+ }
1098
+ if (stripBasename(normalizedPath, normalizedBasename) !== "/" && normalizedPath.endsWith("/")) {
1099
+ normalizedPath = normalizedPath.slice(0, -1);
1100
+ }
1101
+ let isSpaMode = getBuildTimeHeader(request, "X-React-Router-SPA-Mode") === "yes";
1102
+ if (!_build.ssr) {
1103
+ if (_build.prerender.length === 0) {
1104
+ isSpaMode = true;
1105
+ } else if (!_build.prerender.includes(normalizedPath) && !_build.prerender.includes(normalizedPath + "/")) {
1106
+ if (url.pathname.endsWith(".data")) {
1107
+ errorHandler(
1108
+ new ErrorResponseImpl(
1109
+ 404,
1110
+ "Not Found",
1111
+ `Refusing to SSR the path \`${normalizedPath}\` because \`ssr:false\` is set and the path is not included in the \`prerender\` config, so in production the path will be a 404.`
1112
+ ),
1113
+ {
1114
+ context: loadContext,
1115
+ params,
1116
+ request
1117
+ }
1118
+ );
1119
+ return new Response("Not Found", {
1120
+ status: 404,
1121
+ statusText: "Not Found"
1122
+ });
1123
+ } else {
1124
+ isSpaMode = true;
1125
+ }
1126
+ }
1127
+ }
1128
+ let manifestUrl = getManifestPath(
1129
+ _build.routeDiscovery.manifestPath,
1130
+ normalizedBasename
1131
+ );
1132
+ if (url.pathname === manifestUrl) {
1133
+ try {
1134
+ let res = await handleManifestRequest(_build, routes, url);
1135
+ return res;
1136
+ } catch (e) {
1137
+ handleError(e);
1138
+ return new Response("Unknown Server Error", { status: 500 });
1139
+ }
1140
+ }
1141
+ let matches = matchServerRoutes(routes, normalizedPath, _build.basename);
1142
+ if (matches && matches.length > 0) {
1143
+ Object.assign(params, matches[0].params);
1144
+ }
1145
+ let response;
1146
+ if (url.pathname.endsWith(".data")) {
1147
+ let handlerUrl = new URL(request.url);
1148
+ handlerUrl.pathname = normalizedPath;
1149
+ let singleFetchMatches = matchServerRoutes(
1150
+ routes,
1151
+ handlerUrl.pathname,
1152
+ _build.basename
1153
+ );
1154
+ response = await handleSingleFetchRequest(
1155
+ serverMode,
1156
+ _build,
1157
+ staticHandler,
1158
+ request,
1159
+ handlerUrl,
1160
+ loadContext,
1161
+ handleError
1162
+ );
1163
+ if (_build.entry.module.handleDataRequest) {
1164
+ response = await _build.entry.module.handleDataRequest(response, {
1165
+ context: loadContext,
1166
+ params: singleFetchMatches ? singleFetchMatches[0].params : {},
1167
+ request
1168
+ });
1169
+ if (isRedirectResponse(response)) {
1170
+ let result = getSingleFetchRedirect(
1171
+ response.status,
1172
+ response.headers,
1173
+ _build.basename
1174
+ );
1175
+ if (request.method === "GET") {
1176
+ result = {
1177
+ [SingleFetchRedirectSymbol]: result
1178
+ };
1179
+ }
1180
+ let headers = new Headers(response.headers);
1181
+ headers.set("Content-Type", "text/x-script");
1182
+ return new Response(
1183
+ encodeViaTurboStream(
1184
+ result,
1185
+ request.signal,
1186
+ _build.entry.module.streamTimeout,
1187
+ serverMode
1188
+ ),
1189
+ {
1190
+ status: SINGLE_FETCH_REDIRECT_STATUS,
1191
+ headers
1192
+ }
1193
+ );
1194
+ }
1195
+ }
1196
+ } else if (!isSpaMode && matches && matches[matches.length - 1].route.module.default == null && matches[matches.length - 1].route.module.ErrorBoundary == null) {
1197
+ response = await handleResourceRequest(
1198
+ serverMode,
1199
+ _build,
1200
+ staticHandler,
1201
+ matches.slice(-1)[0].route.id,
1202
+ request,
1203
+ loadContext,
1204
+ handleError
1205
+ );
1206
+ } else {
1207
+ let { pathname } = url;
1208
+ let criticalCss = void 0;
1209
+ if (_build.unstable_getCriticalCss) {
1210
+ criticalCss = await _build.unstable_getCriticalCss({ pathname });
1211
+ } else if (mode === "development" /* Development */ && getDevServerHooks()?.getCriticalCss) {
1212
+ criticalCss = await getDevServerHooks()?.getCriticalCss?.(pathname);
1213
+ }
1214
+ response = await handleDocumentRequest(
1215
+ serverMode,
1216
+ _build,
1217
+ staticHandler,
1218
+ request,
1219
+ loadContext,
1220
+ handleError,
1221
+ isSpaMode,
1222
+ criticalCss
1223
+ );
1224
+ }
1225
+ if (request.method === "HEAD") {
1226
+ return new Response(null, {
1227
+ headers: response.headers,
1228
+ status: response.status,
1229
+ statusText: response.statusText
1230
+ });
1231
+ }
1232
+ return response;
1233
+ };
1234
+ };
1235
+ async function handleManifestRequest(build, routes, url) {
1236
+ if (build.assets.version !== url.searchParams.get("version")) {
1237
+ return new Response(null, {
1238
+ status: 204,
1239
+ headers: {
1240
+ "X-Remix-Reload-Document": "true"
1241
+ }
1242
+ });
1243
+ }
1244
+ let patches = {};
1245
+ if (url.searchParams.has("p")) {
1246
+ let paths = /* @__PURE__ */ new Set();
1247
+ url.searchParams.getAll("p").forEach((path) => {
1248
+ if (!path.startsWith("/")) {
1249
+ path = `/${path}`;
1250
+ }
1251
+ let segments = path.split("/").slice(1);
1252
+ segments.forEach((_, i) => {
1253
+ let partialPath = segments.slice(0, i + 1).join("/");
1254
+ paths.add(`/${partialPath}`);
1255
+ });
1256
+ });
1257
+ for (let path of paths) {
1258
+ let matches = matchServerRoutes(routes, path, build.basename);
1259
+ if (matches) {
1260
+ for (let match of matches) {
1261
+ let routeId = match.route.id;
1262
+ let route = build.assets.routes[routeId];
1263
+ if (route) {
1264
+ patches[routeId] = route;
1265
+ }
1266
+ }
1267
+ }
1268
+ }
1269
+ return Response.json(patches, {
1270
+ headers: {
1271
+ "Cache-Control": "public, max-age=31536000, immutable"
1272
+ }
1273
+ });
1274
+ }
1275
+ return new Response("Invalid Request", { status: 400 });
1276
+ }
1277
+ async function handleSingleFetchRequest(serverMode, build, staticHandler, request, handlerUrl, loadContext, handleError) {
1278
+ let response = request.method !== "GET" ? await singleFetchAction(
1279
+ build,
1280
+ serverMode,
1281
+ staticHandler,
1282
+ request,
1283
+ handlerUrl,
1284
+ loadContext,
1285
+ handleError
1286
+ ) : await singleFetchLoaders(
1287
+ build,
1288
+ serverMode,
1289
+ staticHandler,
1290
+ request,
1291
+ handlerUrl,
1292
+ loadContext,
1293
+ handleError
1294
+ );
1295
+ return response;
1296
+ }
1297
+ async function handleDocumentRequest(serverMode, build, staticHandler, request, loadContext, handleError, isSpaMode, criticalCss) {
1298
+ try {
1299
+ let response = await staticHandler.query(request, {
1300
+ requestContext: loadContext,
1301
+ unstable_respond: build.future.unstable_middleware ? (ctx) => renderHtml(ctx, isSpaMode) : void 0
1302
+ });
1303
+ return isResponse(response) ? response : renderHtml(response, isSpaMode);
1304
+ } catch (error) {
1305
+ handleError(error);
1306
+ return new Response(null, { status: 500 });
1307
+ }
1308
+ async function renderHtml(context, isSpaMode2) {
1309
+ if (isResponse(context)) {
1310
+ return context;
1311
+ }
1312
+ let headers = getDocumentHeaders(context, build);
1313
+ if (SERVER_NO_BODY_STATUS_CODES.has(context.statusCode)) {
1314
+ return new Response(null, { status: context.statusCode, headers });
1315
+ }
1316
+ if (context.errors) {
1317
+ Object.values(context.errors).forEach((err) => {
1318
+ if (!isRouteErrorResponse(err) || err.error) {
1319
+ handleError(err);
1320
+ }
1321
+ });
1322
+ context.errors = sanitizeErrors(context.errors, serverMode);
1323
+ }
1324
+ let state = {
1325
+ loaderData: context.loaderData,
1326
+ actionData: context.actionData,
1327
+ errors: serializeErrors(context.errors, serverMode)
1328
+ };
1329
+ let baseServerHandoff = {
1330
+ basename: build.basename,
1331
+ future: build.future,
1332
+ routeDiscovery: build.routeDiscovery,
1333
+ ssr: build.ssr,
1334
+ isSpaMode: isSpaMode2
1335
+ };
1336
+ let entryContext = {
1337
+ manifest: build.assets,
1338
+ routeModules: createEntryRouteModules(build.routes),
1339
+ staticHandlerContext: context,
1340
+ criticalCss,
1341
+ serverHandoffString: createServerHandoffString({
1342
+ ...baseServerHandoff,
1343
+ criticalCss
1344
+ }),
1345
+ serverHandoffStream: encodeViaTurboStream(
1346
+ state,
1347
+ request.signal,
1348
+ build.entry.module.streamTimeout,
1349
+ serverMode
1350
+ ),
1351
+ renderMeta: {},
1352
+ future: build.future,
1353
+ ssr: build.ssr,
1354
+ routeDiscovery: build.routeDiscovery,
1355
+ isSpaMode: isSpaMode2,
1356
+ serializeError: (err) => serializeError(err, serverMode)
1357
+ };
1358
+ let handleDocumentRequestFunction = build.entry.module.default;
1359
+ try {
1360
+ return await handleDocumentRequestFunction(
1361
+ request,
1362
+ context.statusCode,
1363
+ headers,
1364
+ entryContext,
1365
+ loadContext
1366
+ );
1367
+ } catch (error) {
1368
+ handleError(error);
1369
+ let errorForSecondRender = error;
1370
+ if (isResponse(error)) {
1371
+ try {
1372
+ let data2 = await unwrapResponse(error);
1373
+ errorForSecondRender = new ErrorResponseImpl(
1374
+ error.status,
1375
+ error.statusText,
1376
+ data2
1377
+ );
1378
+ } catch (e) {
1379
+ }
1380
+ }
1381
+ context = getStaticContextFromError(
1382
+ staticHandler.dataRoutes,
1383
+ context,
1384
+ errorForSecondRender
1385
+ );
1386
+ if (context.errors) {
1387
+ context.errors = sanitizeErrors(context.errors, serverMode);
1388
+ }
1389
+ let state2 = {
1390
+ loaderData: context.loaderData,
1391
+ actionData: context.actionData,
1392
+ errors: serializeErrors(context.errors, serverMode)
1393
+ };
1394
+ entryContext = {
1395
+ ...entryContext,
1396
+ staticHandlerContext: context,
1397
+ serverHandoffString: createServerHandoffString(baseServerHandoff),
1398
+ serverHandoffStream: encodeViaTurboStream(
1399
+ state2,
1400
+ request.signal,
1401
+ build.entry.module.streamTimeout,
1402
+ serverMode
1403
+ ),
1404
+ renderMeta: {}
1405
+ };
1406
+ try {
1407
+ return await handleDocumentRequestFunction(
1408
+ request,
1409
+ context.statusCode,
1410
+ headers,
1411
+ entryContext,
1412
+ loadContext
1413
+ );
1414
+ } catch (error2) {
1415
+ handleError(error2);
1416
+ return returnLastResortErrorResponse(error2, serverMode);
1417
+ }
1418
+ }
1419
+ }
1420
+ }
1421
+ async function handleResourceRequest(serverMode, build, staticHandler, routeId, request, loadContext, handleError) {
1422
+ try {
1423
+ let response = await staticHandler.queryRoute(request, {
1424
+ routeId,
1425
+ requestContext: loadContext,
1426
+ unstable_respond: build.future.unstable_middleware ? (ctx) => ctx : void 0
1427
+ });
1428
+ if (isResponse(response)) {
1429
+ return response;
1430
+ }
1431
+ if (typeof response === "string") {
1432
+ return new Response(response);
1433
+ }
1434
+ return Response.json(response);
1435
+ } catch (error) {
1436
+ if (isResponse(error)) {
1437
+ error.headers.set("X-Remix-Catch", "yes");
1438
+ return error;
1439
+ }
1440
+ if (isRouteErrorResponse(error)) {
1441
+ if (error) {
1442
+ handleError(error);
1443
+ }
1444
+ return errorResponseToJson(error, serverMode);
1445
+ }
1446
+ if (error instanceof Error && error.message === "Expected a response from queryRoute") {
1447
+ let newError = new Error(
1448
+ "Expected a Response to be returned from resource route handler"
1449
+ );
1450
+ handleError(newError);
1451
+ return returnLastResortErrorResponse(newError, serverMode);
1452
+ }
1453
+ handleError(error);
1454
+ return returnLastResortErrorResponse(error, serverMode);
1455
+ }
1456
+ }
1457
+ function errorResponseToJson(errorResponse, serverMode) {
1458
+ return Response.json(
1459
+ serializeError(
1460
+ // @ts-expect-error This is "private" from users but intended for internal use
1461
+ errorResponse.error || new Error("Unexpected Server Error"),
1462
+ serverMode
1463
+ ),
1464
+ {
1465
+ status: errorResponse.status,
1466
+ statusText: errorResponse.statusText,
1467
+ headers: {
1468
+ "X-Remix-Error": "yes"
1469
+ }
1470
+ }
1471
+ );
1472
+ }
1473
+ function returnLastResortErrorResponse(error, serverMode) {
1474
+ let message = "Unexpected Server Error";
1475
+ if (serverMode !== "production" /* Production */) {
1476
+ message += `
1477
+
1478
+ ${String(error)}`;
1479
+ }
1480
+ return new Response(message, {
1481
+ status: 500,
1482
+ headers: {
1483
+ "Content-Type": "text/plain"
1484
+ }
1485
+ });
1486
+ }
1487
+ function unwrapResponse(response) {
1488
+ let contentType = response.headers.get("Content-Type");
1489
+ return contentType && /\bapplication\/json\b/.test(contentType) ? response.body == null ? null : response.json() : response.text();
1490
+ }
1491
+
1492
+ // lib/server-runtime/sessions.ts
1493
+ function flash(name) {
1494
+ return `__flash_${name}__`;
1495
+ }
1496
+ var createSession = (initialData = {}, id = "") => {
1497
+ let map = new Map(Object.entries(initialData));
1498
+ return {
1499
+ get id() {
1500
+ return id;
1501
+ },
1502
+ get data() {
1503
+ return Object.fromEntries(map);
1504
+ },
1505
+ has(name) {
1506
+ return map.has(name) || map.has(flash(name));
1507
+ },
1508
+ get(name) {
1509
+ if (map.has(name)) return map.get(name);
1510
+ let flashName = flash(name);
1511
+ if (map.has(flashName)) {
1512
+ let value = map.get(flashName);
1513
+ map.delete(flashName);
1514
+ return value;
1515
+ }
1516
+ return void 0;
1517
+ },
1518
+ set(name, value) {
1519
+ map.set(name, value);
1520
+ },
1521
+ flash(name, value) {
1522
+ map.set(flash(name), value);
1523
+ },
1524
+ unset(name) {
1525
+ map.delete(name);
1526
+ }
1527
+ };
1528
+ };
1529
+ var isSession = (object) => {
1530
+ return object != null && typeof object.id === "string" && typeof object.data !== "undefined" && typeof object.has === "function" && typeof object.get === "function" && typeof object.set === "function" && typeof object.flash === "function" && typeof object.unset === "function";
1531
+ };
1532
+ function createSessionStorage({
1533
+ cookie: cookieArg,
1534
+ createData,
1535
+ readData,
1536
+ updateData,
1537
+ deleteData
1538
+ }) {
1539
+ let cookie = isCookie(cookieArg) ? cookieArg : createCookie(cookieArg?.name || "__session", cookieArg);
1540
+ warnOnceAboutSigningSessionCookie(cookie);
1541
+ return {
1542
+ async getSession(cookieHeader, options) {
1543
+ let id = cookieHeader && await cookie.parse(cookieHeader, options);
1544
+ let data2 = id && await readData(id);
1545
+ return createSession(data2 || {}, id || "");
1546
+ },
1547
+ async commitSession(session, options) {
1548
+ let { id, data: data2 } = session;
1549
+ let expires = options?.maxAge != null ? new Date(Date.now() + options.maxAge * 1e3) : options?.expires != null ? options.expires : cookie.expires;
1550
+ if (id) {
1551
+ await updateData(id, data2, expires);
1552
+ } else {
1553
+ id = await createData(data2, expires);
1554
+ }
1555
+ return cookie.serialize(id, options);
1556
+ },
1557
+ async destroySession(session, options) {
1558
+ await deleteData(session.id);
1559
+ return cookie.serialize("", {
1560
+ ...options,
1561
+ maxAge: void 0,
1562
+ expires: /* @__PURE__ */ new Date(0)
1563
+ });
1564
+ }
1565
+ };
1566
+ }
1567
+ function warnOnceAboutSigningSessionCookie(cookie) {
1568
+ warnOnce(
1569
+ cookie.isSigned,
1570
+ `The "${cookie.name}" cookie is not signed, but session cookies should be signed to prevent tampering on the client before they are sent back to the server. See https://reactrouter.com/explanation/sessions-and-cookies#signing-cookies for more information.`
1571
+ );
1572
+ }
1573
+
1574
+ // lib/server-runtime/sessions/cookieStorage.ts
1575
+ function createCookieSessionStorage({ cookie: cookieArg } = {}) {
1576
+ let cookie = isCookie(cookieArg) ? cookieArg : createCookie(cookieArg?.name || "__session", cookieArg);
1577
+ warnOnceAboutSigningSessionCookie(cookie);
1578
+ return {
1579
+ async getSession(cookieHeader, options) {
1580
+ return createSession(
1581
+ cookieHeader && await cookie.parse(cookieHeader, options) || {}
1582
+ );
1583
+ },
1584
+ async commitSession(session, options) {
1585
+ let serializedCookie = await cookie.serialize(session.data, options);
1586
+ if (serializedCookie.length > 4096) {
1587
+ throw new Error(
1588
+ "Cookie length will exceed browser maximum. Length: " + serializedCookie.length
1589
+ );
1590
+ }
1591
+ return serializedCookie;
1592
+ },
1593
+ async destroySession(_session, options) {
1594
+ return cookie.serialize("", {
1595
+ ...options,
1596
+ maxAge: void 0,
1597
+ expires: /* @__PURE__ */ new Date(0)
1598
+ });
1599
+ }
1600
+ };
1601
+ }
1602
+
1603
+ // lib/server-runtime/sessions/memoryStorage.ts
1604
+ function createMemorySessionStorage({ cookie } = {}) {
1605
+ let map = /* @__PURE__ */ new Map();
1606
+ return createSessionStorage({
1607
+ cookie,
1608
+ async createData(data2, expires) {
1609
+ let id = Math.random().toString(36).substring(2, 10);
1610
+ map.set(id, { data: data2, expires });
1611
+ return id;
1612
+ },
1613
+ async readData(id) {
1614
+ if (map.has(id)) {
1615
+ let { data: data2, expires } = map.get(id);
1616
+ if (!expires || expires > /* @__PURE__ */ new Date()) {
1617
+ return data2;
1618
+ }
1619
+ if (expires) map.delete(id);
1620
+ }
1621
+ return null;
1622
+ },
1623
+ async updateData(id, data2, expires) {
1624
+ map.set(id, { data: data2, expires });
1625
+ },
1626
+ async deleteData(id) {
1627
+ map.delete(id);
1628
+ }
1629
+ });
1630
+ }
1631
+
1632
+ // lib/href.ts
1633
+ function href(path, ...args) {
1634
+ let params = args[0];
1635
+ return path.split("/").map((segment) => {
1636
+ if (segment === "*") {
1637
+ return params ? params["*"] : void 0;
1638
+ }
1639
+ const match = segment.match(/^:([\w-]+)(\?)?/);
1640
+ if (!match) return segment;
1641
+ const param = match[1];
1642
+ const value = params ? params[param] : void 0;
1643
+ const isRequired = match[2] === void 0;
1644
+ if (isRequired && value === void 0) {
1645
+ throw Error(
1646
+ `Path '${path}' requires param '${param}' but it was not provided`
1647
+ );
1648
+ }
1649
+ return value;
1650
+ }).filter((segment) => segment !== void 0).join("/");
1651
+ }
1652
+
1653
+ // lib/rsc/browser.tsx
1654
+ import * as React4 from "react";
1655
+ import * as ReactDOM from "react-dom";
1656
+
1657
+ // lib/dom/ssr/hydration.tsx
1658
+ function getHydrationData(state, routes, getRouteInfo, location2, basename, isSpaMode) {
1659
+ let hydrationData = {
1660
+ ...state,
1661
+ loaderData: { ...state.loaderData }
1662
+ };
1663
+ let initialMatches = matchRoutes(routes, location2, basename);
1664
+ if (initialMatches) {
1665
+ for (let match of initialMatches) {
1666
+ let routeId = match.route.id;
1667
+ let routeInfo = getRouteInfo(routeId);
1668
+ if (shouldHydrateRouteLoader(
1669
+ routeId,
1670
+ routeInfo.clientLoader,
1671
+ routeInfo.hasLoader,
1672
+ isSpaMode
1673
+ ) && (routeInfo.hasHydrateFallback || !routeInfo.hasLoader)) {
1674
+ delete hydrationData.loaderData[routeId];
1675
+ } else if (!routeInfo.hasLoader) {
1676
+ hydrationData.loaderData[routeId] = null;
1677
+ }
1678
+ }
1679
+ }
1680
+ return hydrationData;
1681
+ }
1682
+
1683
+ // lib/rsc/errorBoundaries.tsx
1684
+ import React3 from "react";
1685
+ var RSCRouterGlobalErrorBoundary = class extends React3.Component {
1686
+ constructor(props) {
1687
+ super(props);
1688
+ this.state = { error: null, location: props.location };
1689
+ }
1690
+ static getDerivedStateFromError(error) {
1691
+ return { error };
1692
+ }
1693
+ static getDerivedStateFromProps(props, state) {
1694
+ if (state.location !== props.location) {
1695
+ return { error: null, location: props.location };
1696
+ }
1697
+ return { error: state.error, location: state.location };
1698
+ }
1699
+ render() {
1700
+ if (this.state.error) {
1701
+ return /* @__PURE__ */ React3.createElement(
1702
+ RSCDefaultRootErrorBoundaryImpl,
1703
+ {
1704
+ error: this.state.error,
1705
+ renderAppShell: true
1706
+ }
1707
+ );
1708
+ } else {
1709
+ return this.props.children;
1710
+ }
1711
+ }
1712
+ };
1713
+ function ErrorWrapper({
1714
+ renderAppShell,
1715
+ title,
1716
+ children
1717
+ }) {
1718
+ if (!renderAppShell) {
1719
+ return children;
1720
+ }
1721
+ return /* @__PURE__ */ React3.createElement("html", { lang: "en" }, /* @__PURE__ */ React3.createElement("head", null, /* @__PURE__ */ React3.createElement("meta", { charSet: "utf-8" }), /* @__PURE__ */ React3.createElement(
1722
+ "meta",
1723
+ {
1724
+ name: "viewport",
1725
+ content: "width=device-width,initial-scale=1,viewport-fit=cover"
1726
+ }
1727
+ ), /* @__PURE__ */ React3.createElement("title", null, title)), /* @__PURE__ */ React3.createElement("body", null, /* @__PURE__ */ React3.createElement("main", { style: { fontFamily: "system-ui, sans-serif", padding: "2rem" } }, children)));
1728
+ }
1729
+ function RSCDefaultRootErrorBoundaryImpl({
1730
+ error,
1731
+ renderAppShell
1732
+ }) {
1733
+ console.error(error);
1734
+ let heyDeveloper = /* @__PURE__ */ React3.createElement(
1735
+ "script",
1736
+ {
1737
+ dangerouslySetInnerHTML: {
1738
+ __html: `
1739
+ console.log(
1740
+ "\u{1F4BF} Hey developer \u{1F44B}. You can provide a way better UX than this when your app throws errors. Check out https://reactrouter.com/how-to/error-boundary for more information."
1741
+ );
1742
+ `
1743
+ }
1744
+ }
1745
+ );
1746
+ if (isRouteErrorResponse(error)) {
1747
+ return /* @__PURE__ */ React3.createElement(
1748
+ ErrorWrapper,
1749
+ {
1750
+ renderAppShell,
1751
+ title: "Unhandled Thrown Response!"
1752
+ },
1753
+ /* @__PURE__ */ React3.createElement("h1", { style: { fontSize: "24px" } }, error.status, " ", error.statusText),
1754
+ ENABLE_DEV_WARNINGS ? heyDeveloper : null
1755
+ );
1756
+ }
1757
+ let errorInstance;
1758
+ if (error instanceof Error) {
1759
+ errorInstance = error;
1760
+ } else {
1761
+ let errorString = error == null ? "Unknown Error" : typeof error === "object" && "toString" in error ? error.toString() : JSON.stringify(error);
1762
+ errorInstance = new Error(errorString);
1763
+ }
1764
+ return /* @__PURE__ */ React3.createElement(ErrorWrapper, { renderAppShell, title: "Application Error!" }, /* @__PURE__ */ React3.createElement("h1", { style: { fontSize: "24px" } }, "Application Error"), /* @__PURE__ */ React3.createElement(
1765
+ "pre",
1766
+ {
1767
+ style: {
1768
+ padding: "2rem",
1769
+ background: "hsla(10, 50%, 50%, 0.1)",
1770
+ color: "red",
1771
+ overflow: "auto"
1772
+ }
1773
+ },
1774
+ errorInstance.stack
1775
+ ), heyDeveloper);
1776
+ }
1777
+ function RSCDefaultRootErrorBoundary({
1778
+ hasRootLayout
1779
+ }) {
1780
+ let error = useRouteError();
1781
+ if (hasRootLayout === void 0) {
1782
+ throw new Error("Missing 'hasRootLayout' prop");
1783
+ }
1784
+ return /* @__PURE__ */ React3.createElement(
1785
+ RSCDefaultRootErrorBoundaryImpl,
1786
+ {
1787
+ renderAppShell: !hasRootLayout,
1788
+ error
1789
+ }
1790
+ );
1791
+ }
1792
+
1793
+ // lib/rsc/browser.tsx
1794
+ function createCallServer({
1795
+ decode,
1796
+ encodeAction,
1797
+ fetch: fetchImplementation = fetch
1798
+ }) {
1799
+ let landedActionId = 0;
1800
+ return async (id, args) => {
1801
+ let actionId = window.__routerActionID = (window.__routerActionID ?? (window.__routerActionID = 0)) + 1;
1802
+ const response = await fetchImplementation(
1803
+ new Request(location.href, {
1804
+ body: await encodeAction(args),
1805
+ method: "POST",
1806
+ headers: {
1807
+ Accept: "text/x-component",
1808
+ "rsc-action-id": id
1809
+ }
1810
+ })
1811
+ );
1812
+ if (!response.body) {
1813
+ throw new Error("No response body");
1814
+ }
1815
+ const payload = await decode(response.body);
1816
+ if (payload.type === "redirect") {
1817
+ if (payload.reload) {
1818
+ window.location.href = payload.location;
1819
+ return;
1820
+ }
1821
+ window.__router.navigate(payload.location, {
1822
+ replace: payload.replace
1823
+ });
1824
+ return payload.actionResult;
1825
+ }
1826
+ if (payload.type !== "action") {
1827
+ throw new Error("Unexpected payload type");
1828
+ }
1829
+ if (payload.rerender) {
1830
+ (async () => {
1831
+ const rerender = await payload.rerender;
1832
+ if (!rerender) return;
1833
+ if (landedActionId < actionId && window.__routerActionID <= actionId) {
1834
+ landedActionId = actionId;
1835
+ if (rerender.type === "redirect") {
1836
+ if (rerender.reload) {
1837
+ window.location.href = rerender.location;
1838
+ return;
1839
+ }
1840
+ window.__router.navigate(rerender.location, {
1841
+ replace: rerender.replace
1842
+ });
1843
+ return;
1844
+ }
1845
+ let lastMatch;
1846
+ for (const match of rerender.matches) {
1847
+ window.__router.patchRoutes(
1848
+ lastMatch?.id ?? null,
1849
+ [createRouteFromServerManifest(match)],
1850
+ true
1851
+ );
1852
+ lastMatch = match;
1853
+ }
1854
+ window.__router._internalSetStateDoNotUseOrYouWillBreakYourApp({});
1855
+ React4.startTransition(() => {
1856
+ window.__router._internalSetStateDoNotUseOrYouWillBreakYourApp({
1857
+ loaderData: Object.assign(
1858
+ {},
1859
+ window.__router.state.loaderData,
1860
+ rerender.loaderData
1861
+ ),
1862
+ errors: rerender.errors ? Object.assign(
1863
+ {},
1864
+ window.__router.state.errors,
1865
+ rerender.errors
1866
+ ) : null
1867
+ });
1868
+ });
1869
+ }
1870
+ })();
1871
+ }
1872
+ return payload.actionResult;
1873
+ };
1874
+ }
1875
+ function createRouterFromPayload({
1876
+ fetchImplementation,
1877
+ decode,
1878
+ payload
1879
+ }) {
1880
+ if (window.__router) return window.__router;
1881
+ if (payload.type !== "render") throw new Error("Invalid payload type");
1882
+ let patches = /* @__PURE__ */ new Map();
1883
+ payload.patches?.forEach((patch) => {
1884
+ invariant(patch.parentId, "Invalid patch parentId");
1885
+ if (!patches.has(patch.parentId)) {
1886
+ patches.set(patch.parentId, []);
1887
+ }
1888
+ patches.get(patch.parentId)?.push(patch);
1889
+ });
1890
+ let routes = payload.matches.reduceRight((previous, match) => {
1891
+ const route = createRouteFromServerManifest(
1892
+ match,
1893
+ payload
1894
+ );
1895
+ if (previous.length > 0) {
1896
+ route.children = previous;
1897
+ let childrenToPatch = patches.get(match.id);
1898
+ if (childrenToPatch) {
1899
+ route.children.push(
1900
+ ...childrenToPatch.map((r) => createRouteFromServerManifest(r))
1901
+ );
1902
+ }
1903
+ }
1904
+ return [route];
1905
+ }, []);
1906
+ window.__router = createRouter({
1907
+ routes,
1908
+ basename: payload.basename,
1909
+ history: createBrowserHistory(),
1910
+ hydrationData: getHydrationData(
1911
+ {
1912
+ loaderData: payload.loaderData,
1913
+ actionData: payload.actionData,
1914
+ errors: payload.errors
1915
+ },
1916
+ routes,
1917
+ (routeId) => {
1918
+ let match = payload.matches.find((m) => m.id === routeId);
1919
+ invariant(match, "Route not found in payload");
1920
+ return {
1921
+ clientLoader: match.clientLoader,
1922
+ hasLoader: match.hasLoader,
1923
+ hasHydrateFallback: match.hydrateFallbackElement != null
1924
+ };
1925
+ },
1926
+ payload.location,
1927
+ void 0,
1928
+ false
1929
+ ),
1930
+ async patchRoutesOnNavigation({ path, signal }) {
1931
+ if (discoveredPaths.has(path)) {
1932
+ return;
1933
+ }
1934
+ await fetchAndApplyManifestPatches(
1935
+ [path],
1936
+ decode,
1937
+ fetchImplementation,
1938
+ signal
1939
+ );
1940
+ },
1941
+ // FIXME: Pass `build.ssr` and `build.basename` into this function
1942
+ dataStrategy: getRSCSingleFetchDataStrategy(
1943
+ () => window.__router,
1944
+ true,
1945
+ void 0,
1946
+ decode,
1947
+ fetchImplementation
1948
+ )
1949
+ });
1950
+ if (window.__router.state.initialized) {
1951
+ window.__routerInitialized = true;
1952
+ window.__router.initialize();
1953
+ } else {
1954
+ window.__routerInitialized = false;
1955
+ }
1956
+ let lastLoaderData = void 0;
1957
+ window.__router.subscribe(({ loaderData, actionData }) => {
1958
+ if (lastLoaderData !== loaderData) {
1959
+ window.__routerActionID = (window.__routerActionID ?? (window.__routerActionID = 0)) + 1;
1960
+ }
1961
+ });
1962
+ return window.__router;
1963
+ }
1964
+ var renderedRoutesContext = unstable_createContext();
1965
+ function getRSCSingleFetchDataStrategy(getRouter, ssr, basename, decode, fetchImplementation) {
1966
+ let dataStrategy = getSingleFetchDataStrategyImpl(
1967
+ getRouter,
1968
+ (match) => {
1969
+ let M = match;
1970
+ return {
1971
+ hasLoader: M.route.hasLoader,
1972
+ hasClientLoader: M.route.hasClientLoader,
1973
+ hasComponent: M.route.hasComponent,
1974
+ hasAction: M.route.hasAction,
1975
+ hasClientAction: M.route.hasClientAction,
1976
+ hasShouldRevalidate: M.route.hasShouldRevalidate
1977
+ };
1978
+ },
1979
+ // pass map into fetchAndDecode so it can add payloads
1980
+ getFetchAndDecodeViaRSC(decode, fetchImplementation),
1981
+ ssr,
1982
+ basename,
1983
+ // If the route has a component but we don't have an element, we need to hit
1984
+ // the server loader flow regardless of whether the client loader calls
1985
+ // `serverLoader` or not, otherwise we'll have nothing to render.
1986
+ (match) => {
1987
+ let M = match;
1988
+ return M.route.hasComponent && !M.route.element;
1989
+ }
1990
+ );
1991
+ return async (args) => args.unstable_runClientMiddleware(async () => {
1992
+ let context = args.context;
1993
+ context.set(renderedRoutesContext, []);
1994
+ let results = await dataStrategy(args);
1995
+ const renderedRoutesById = /* @__PURE__ */ new Map();
1996
+ for (const route of context.get(renderedRoutesContext)) {
1997
+ if (!renderedRoutesById.has(route.id)) {
1998
+ renderedRoutesById.set(route.id, []);
1999
+ }
2000
+ renderedRoutesById.get(route.id).push(route);
2001
+ }
2002
+ for (const match of args.matches) {
2003
+ const renderedRoutes = renderedRoutesById.get(match.route.id);
2004
+ if (renderedRoutes) {
2005
+ for (const rendered of renderedRoutes) {
2006
+ window.__router.patchRoutes(
2007
+ rendered.parentId ?? null,
2008
+ [createRouteFromServerManifest(rendered)],
2009
+ true
2010
+ );
2011
+ }
2012
+ }
2013
+ }
2014
+ return results;
2015
+ });
2016
+ }
2017
+ function getFetchAndDecodeViaRSC(decode, fetchImplementation) {
2018
+ return async (args, basename, targetRoutes) => {
2019
+ let { request, context } = args;
2020
+ let url = singleFetchUrl(request.url, basename, "rsc");
2021
+ if (request.method === "GET") {
2022
+ url = stripIndexParam(url);
2023
+ if (targetRoutes) {
2024
+ url.searchParams.set("_routes", targetRoutes.join(","));
2025
+ }
2026
+ }
2027
+ let res = await fetchImplementation(
2028
+ new Request(url, await createRequestInit(request))
2029
+ );
2030
+ if (res.status === 404 && !res.headers.has("X-Remix-Response")) {
2031
+ throw new ErrorResponseImpl(404, "Not Found", true);
2032
+ }
2033
+ invariant(res.body, "No response body to decode");
2034
+ try {
2035
+ const payload = await decode(res.body);
2036
+ if (payload.type === "redirect") {
2037
+ return {
2038
+ status: res.status,
2039
+ data: {
2040
+ redirect: {
2041
+ redirect: payload.location,
2042
+ reload: payload.reload,
2043
+ replace: payload.replace,
2044
+ revalidate: false,
2045
+ status: payload.status
2046
+ }
2047
+ }
2048
+ };
2049
+ }
2050
+ if (payload.type !== "render") {
2051
+ throw new Error("Unexpected payload type");
2052
+ }
2053
+ context.get(renderedRoutesContext).push(...payload.matches);
2054
+ let results = { routes: {} };
2055
+ const dataKey = isMutationMethod(request.method) ? "actionData" : "loaderData";
2056
+ for (let [routeId, data2] of Object.entries(payload[dataKey] || {})) {
2057
+ results.routes[routeId] = { data: data2 };
2058
+ }
2059
+ if (payload.errors) {
2060
+ for (let [routeId, error] of Object.entries(payload.errors)) {
2061
+ results.routes[routeId] = { error };
2062
+ }
2063
+ }
2064
+ return { status: res.status, data: results };
2065
+ } catch (e) {
2066
+ throw new Error("Unable to decode RSC response");
2067
+ }
2068
+ };
2069
+ }
2070
+ function RSCHydratedRouter({
2071
+ decode,
2072
+ fetch: fetchImplementation = fetch,
2073
+ payload,
2074
+ routeDiscovery = "eager"
2075
+ }) {
2076
+ if (payload.type !== "render") throw new Error("Invalid payload type");
2077
+ let router = React4.useMemo(
2078
+ () => createRouterFromPayload({
2079
+ decode,
2080
+ payload,
2081
+ fetchImplementation
2082
+ }),
2083
+ [decode, payload, fetchImplementation]
2084
+ );
2085
+ React4.useLayoutEffect(() => {
2086
+ if (!window.__routerInitialized) {
2087
+ window.__routerInitialized = true;
2088
+ window.__router.initialize();
2089
+ }
2090
+ }, []);
2091
+ let [location2, setLocation] = React4.useState(router.state.location);
2092
+ React4.useLayoutEffect(
2093
+ () => router.subscribe((newState) => {
2094
+ if (newState.location !== location2) {
2095
+ setLocation(newState.location);
2096
+ }
2097
+ }),
2098
+ [router, location2]
2099
+ );
2100
+ React4.useEffect(() => {
2101
+ if (routeDiscovery === "lazy" || // @ts-expect-error - TS doesn't know about this yet
2102
+ window.navigator?.connection?.saveData === true) {
2103
+ return;
2104
+ }
2105
+ function registerElement(el) {
2106
+ let path = el.tagName === "FORM" ? el.getAttribute("action") : el.getAttribute("href");
2107
+ if (!path) {
2108
+ return;
2109
+ }
2110
+ let pathname = el.tagName === "A" ? el.pathname : new URL(path, window.location.origin).pathname;
2111
+ if (!discoveredPaths.has(pathname)) {
2112
+ nextPaths.add(pathname);
2113
+ }
2114
+ }
2115
+ async function fetchPatches() {
2116
+ document.querySelectorAll("a[data-discover], form[data-discover]").forEach(registerElement);
2117
+ let paths = Array.from(nextPaths.keys()).filter((path) => {
2118
+ if (discoveredPaths.has(path)) {
2119
+ nextPaths.delete(path);
2120
+ return false;
2121
+ }
2122
+ return true;
2123
+ });
2124
+ if (paths.length === 0) {
2125
+ return;
2126
+ }
2127
+ try {
2128
+ await fetchAndApplyManifestPatches(paths, decode, fetchImplementation);
2129
+ } catch (e) {
2130
+ console.error("Failed to fetch manifest patches", e);
2131
+ }
2132
+ }
2133
+ let debouncedFetchPatches = debounce(fetchPatches, 100);
2134
+ fetchPatches();
2135
+ let observer = new MutationObserver(() => debouncedFetchPatches());
2136
+ observer.observe(document.documentElement, {
2137
+ subtree: true,
2138
+ childList: true,
2139
+ attributes: true,
2140
+ attributeFilter: ["data-discover", "href", "action"]
2141
+ });
2142
+ }, [routeDiscovery, decode, fetchImplementation]);
2143
+ const frameworkContext = {
2144
+ future: {
2145
+ // These flags have no runtime impact so can always be false. If we add
2146
+ // flags that drive runtime behavior they'll need to be proxied through.
2147
+ unstable_middleware: false,
2148
+ unstable_subResourceIntegrity: false
2149
+ },
2150
+ isSpaMode: true,
2151
+ ssr: true,
2152
+ criticalCss: "",
2153
+ manifest: {
2154
+ routes: {},
2155
+ version: "1",
2156
+ url: "",
2157
+ entry: {
2158
+ module: "",
2159
+ imports: []
2160
+ }
2161
+ },
2162
+ routeDiscovery: { mode: "lazy", manifestPath: "/__manifest" },
2163
+ routeModules: {}
2164
+ };
2165
+ return /* @__PURE__ */ React4.createElement(RSCRouterGlobalErrorBoundary, { location: location2 }, /* @__PURE__ */ React4.createElement(FrameworkContext.Provider, { value: frameworkContext }, /* @__PURE__ */ React4.createElement(RouterProvider, { router, flushSync: ReactDOM.flushSync })));
2166
+ }
2167
+ function createRouteFromServerManifest(match, payload) {
2168
+ let hasInitialData = payload && match.id in payload.loaderData;
2169
+ let initialData = payload?.loaderData[match.id];
2170
+ let hasInitialError = payload?.errors && match.id in payload.errors;
2171
+ let initialError = payload?.errors?.[match.id];
2172
+ let isHydrationRequest = match.clientLoader?.hydrate === true || !match.hasLoader || // If the route has a component but we don't have an element, we need to hit
2173
+ // the server loader flow regardless of whether the client loader calls
2174
+ // `serverLoader` or not, otherwise we'll have nothing to render.
2175
+ match.hasComponent && !match.element;
2176
+ let dataRoute = {
2177
+ id: match.id,
2178
+ element: match.element,
2179
+ errorElement: match.errorElement,
2180
+ handle: match.handle,
2181
+ hasErrorBoundary: match.hasErrorBoundary,
2182
+ hydrateFallbackElement: match.hydrateFallbackElement,
2183
+ index: match.index,
2184
+ loader: match.clientLoader ? async (args, singleFetch) => {
2185
+ try {
2186
+ let result = await match.clientLoader({
2187
+ ...args,
2188
+ serverLoader: () => {
2189
+ preventInvalidServerHandlerCall(
2190
+ "loader",
2191
+ match.id,
2192
+ match.hasLoader
2193
+ );
2194
+ if (isHydrationRequest) {
2195
+ if (hasInitialData) {
2196
+ return initialData;
2197
+ }
2198
+ if (hasInitialError) {
2199
+ throw initialError;
2200
+ }
2201
+ }
2202
+ return callSingleFetch(singleFetch);
2203
+ }
2204
+ });
2205
+ return result;
2206
+ } finally {
2207
+ isHydrationRequest = false;
2208
+ }
2209
+ } : (
2210
+ // We always make the call in this RSC world since even if we don't
2211
+ // have a `loader` we may need to get the `element` implementation
2212
+ (_, singleFetch) => callSingleFetch(singleFetch)
2213
+ ),
2214
+ action: match.clientAction ? (args, singleFetch) => match.clientAction({
2215
+ ...args,
2216
+ serverAction: async () => {
2217
+ preventInvalidServerHandlerCall(
2218
+ "loader",
2219
+ match.id,
2220
+ match.hasLoader
2221
+ );
2222
+ return await callSingleFetch(singleFetch);
2223
+ }
2224
+ }) : match.hasAction ? (_, singleFetch) => callSingleFetch(singleFetch) : () => {
2225
+ throw noActionDefinedError("action", match.id);
2226
+ },
2227
+ path: match.path,
2228
+ shouldRevalidate: match.shouldRevalidate,
2229
+ // We always have a "loader" in this RSC world since even if we don't
2230
+ // have a `loader` we may need to get the `element` implementation
2231
+ hasLoader: true,
2232
+ hasClientLoader: match.clientLoader != null,
2233
+ hasAction: match.hasAction,
2234
+ hasClientAction: match.clientAction != null,
2235
+ hasShouldRevalidate: match.shouldRevalidate != null
2236
+ };
2237
+ if (typeof dataRoute.loader === "function") {
2238
+ dataRoute.loader.hydrate = shouldHydrateRouteLoader(
2239
+ match.id,
2240
+ match.clientLoader,
2241
+ match.hasLoader,
2242
+ false
2243
+ );
2244
+ }
2245
+ return dataRoute;
2246
+ }
2247
+ function callSingleFetch(singleFetch) {
2248
+ invariant(typeof singleFetch === "function", "Invalid singleFetch parameter");
2249
+ return singleFetch();
2250
+ }
2251
+ function preventInvalidServerHandlerCall(type, routeId, hasHandler) {
2252
+ if (!hasHandler) {
2253
+ let fn = type === "action" ? "serverAction()" : "serverLoader()";
2254
+ let msg = `You are trying to call ${fn} on a route that does not have a server ${type} (routeId: "${routeId}")`;
2255
+ console.error(msg);
2256
+ throw new ErrorResponseImpl(400, "Bad Request", new Error(msg), true);
2257
+ }
2258
+ }
2259
+ var nextPaths = /* @__PURE__ */ new Set();
2260
+ var discoveredPathsMaxSize = 1e3;
2261
+ var discoveredPaths = /* @__PURE__ */ new Set();
2262
+ var URL_LIMIT = 7680;
2263
+ function getManifestUrl(paths) {
2264
+ if (paths.length === 0) {
2265
+ return null;
2266
+ }
2267
+ if (paths.length === 1) {
2268
+ return new URL(`${paths[0]}.manifest`, window.location.origin);
2269
+ }
2270
+ let basename = (window.__router.basename ?? "").replace(/^\/|\/$/g, "");
2271
+ let url = new URL(`${basename}/.manifest`, window.location.origin);
2272
+ paths.sort().forEach((path) => url.searchParams.append("p", path));
2273
+ return url;
2274
+ }
2275
+ async function fetchAndApplyManifestPatches(paths, decode, fetchImplementation, signal) {
2276
+ let url = getManifestUrl(paths);
2277
+ if (url == null) {
2278
+ return;
2279
+ }
2280
+ if (url.toString().length > URL_LIMIT) {
2281
+ nextPaths.clear();
2282
+ return;
2283
+ }
2284
+ let response = await fetchImplementation(new Request(url, { signal }));
2285
+ if (!response.body || response.status < 200 || response.status >= 300) {
2286
+ throw new Error("Unable to fetch new route matches from the server");
2287
+ }
2288
+ let payload = await decode(response.body);
2289
+ if (payload.type !== "manifest") {
2290
+ throw new Error("Failed to patch routes");
2291
+ }
2292
+ paths.forEach((p) => addToFifoQueue(p, discoveredPaths));
2293
+ payload.patches.forEach((p) => {
2294
+ window.__router.patchRoutes(p.parentId ?? null, [
2295
+ createRouteFromServerManifest(p)
2296
+ ]);
2297
+ });
2298
+ }
2299
+ function addToFifoQueue(path, queue) {
2300
+ if (queue.size >= discoveredPathsMaxSize) {
2301
+ let first = queue.values().next().value;
2302
+ queue.delete(first);
2303
+ }
2304
+ queue.add(path);
2305
+ }
2306
+ function debounce(callback, wait) {
2307
+ let timeoutId;
2308
+ return (...args) => {
2309
+ window.clearTimeout(timeoutId);
2310
+ timeoutId = window.setTimeout(() => callback(...args), wait);
2311
+ };
2312
+ }
2313
+
2314
+ // lib/rsc/server.ssr.tsx
2315
+ import * as React5 from "react";
2316
+
2317
+ // lib/rsc/html-stream/server.ts
2318
+ var encoder2 = new TextEncoder();
2319
+ var trailer = "</body></html>";
2320
+ function injectRSCPayload(rscStream) {
2321
+ let decoder = new TextDecoder();
2322
+ let resolveFlightDataPromise;
2323
+ let flightDataPromise = new Promise(
2324
+ (resolve) => resolveFlightDataPromise = resolve
2325
+ );
2326
+ let startedRSC = false;
2327
+ let buffered = [];
2328
+ let timeout = null;
2329
+ function flushBufferedChunks(controller) {
2330
+ for (let chunk of buffered) {
2331
+ let buf = decoder.decode(chunk, { stream: true });
2332
+ if (buf.endsWith(trailer)) {
2333
+ buf = buf.slice(0, -trailer.length);
2334
+ }
2335
+ controller.enqueue(encoder2.encode(buf));
2336
+ }
2337
+ buffered.length = 0;
2338
+ timeout = null;
2339
+ }
2340
+ return new TransformStream({
2341
+ transform(chunk, controller) {
2342
+ buffered.push(chunk);
2343
+ if (timeout) {
2344
+ return;
2345
+ }
2346
+ timeout = setTimeout(async () => {
2347
+ flushBufferedChunks(controller);
2348
+ if (!startedRSC) {
2349
+ startedRSC = true;
2350
+ writeRSCStream(rscStream, controller).catch((err) => controller.error(err)).then(resolveFlightDataPromise);
2351
+ }
2352
+ }, 0);
2353
+ },
2354
+ async flush(controller) {
2355
+ await flightDataPromise;
2356
+ if (timeout) {
2357
+ clearTimeout(timeout);
2358
+ flushBufferedChunks(controller);
2359
+ }
2360
+ controller.enqueue(encoder2.encode("</body></html>"));
2361
+ }
2362
+ });
2363
+ }
2364
+ async function writeRSCStream(rscStream, controller) {
2365
+ let decoder = new TextDecoder("utf-8", { fatal: true });
2366
+ const reader = rscStream.getReader();
2367
+ try {
2368
+ let read;
2369
+ while ((read = await reader.read()) && !read.done) {
2370
+ const chunk = read.value;
2371
+ try {
2372
+ writeChunk(
2373
+ JSON.stringify(decoder.decode(chunk, { stream: true })),
2374
+ controller
2375
+ );
2376
+ } catch (err) {
2377
+ let base64 = JSON.stringify(btoa(String.fromCodePoint(...chunk)));
2378
+ writeChunk(
2379
+ `Uint8Array.from(atob(${base64}), m => m.codePointAt(0))`,
2380
+ controller
2381
+ );
2382
+ }
2383
+ }
2384
+ } finally {
2385
+ reader.releaseLock();
2386
+ }
2387
+ let remaining = decoder.decode();
2388
+ if (remaining.length) {
2389
+ writeChunk(JSON.stringify(remaining), controller);
2390
+ }
2391
+ }
2392
+ function writeChunk(chunk, controller) {
2393
+ controller.enqueue(
2394
+ encoder2.encode(
2395
+ `<script>${escapeScript(
2396
+ `(self.__FLIGHT_DATA||=[]).push(${chunk})`
2397
+ )}</script>`
2398
+ )
2399
+ );
2400
+ }
2401
+ function escapeScript(script) {
2402
+ return script.replace(/<!--/g, "<\\!--").replace(/<\/(script)/gi, "</\\$1");
2403
+ }
2404
+
2405
+ // lib/rsc/server.ssr.tsx
2406
+ async function routeRSCServerRequest({
2407
+ request,
2408
+ callServer,
2409
+ decode,
2410
+ renderHTML,
2411
+ hydrate = true
2412
+ }) {
2413
+ const url = new URL(request.url);
2414
+ const isDataRequest = isReactServerRequest(url);
2415
+ const respondWithRSCPayload = isDataRequest || isManifestRequest(url) || request.headers.has("rsc-action-id");
2416
+ const serverResponse = await callServer(request);
2417
+ if (respondWithRSCPayload || serverResponse.headers.get("React-Router-Resource") === "true") {
2418
+ return serverResponse;
2419
+ }
2420
+ if (!serverResponse.body) {
2421
+ throw new Error("Missing body in server response");
2422
+ }
2423
+ let serverResponseB = null;
2424
+ if (hydrate) {
2425
+ serverResponseB = serverResponse.clone();
2426
+ }
2427
+ const body = serverResponse.body;
2428
+ let payloadPromise;
2429
+ const getPayload = async () => {
2430
+ if (payloadPromise) return payloadPromise;
2431
+ payloadPromise = decode(body);
2432
+ return payloadPromise;
2433
+ };
2434
+ try {
2435
+ const html = await renderHTML(getPayload);
2436
+ const headers = new Headers(serverResponse.headers);
2437
+ headers.set("Content-Type", "text/html");
2438
+ if (!hydrate) {
2439
+ return new Response(html, {
2440
+ status: serverResponse.status,
2441
+ headers
2442
+ });
2443
+ }
2444
+ if (!serverResponseB?.body) {
2445
+ throw new Error("Failed to clone server response");
2446
+ }
2447
+ const body2 = html.pipeThrough(injectRSCPayload(serverResponseB.body));
2448
+ return new Response(body2, {
2449
+ status: serverResponse.status,
2450
+ headers
2451
+ });
2452
+ } catch (reason) {
2453
+ if (reason instanceof Response) {
2454
+ return reason;
2455
+ }
2456
+ throw reason;
2457
+ }
2458
+ }
2459
+ function RSCStaticRouter({
2460
+ getPayload
2461
+ }) {
2462
+ const payload = React5.use(getPayload());
2463
+ if (payload.type === "redirect") {
2464
+ throw new Response(null, {
2465
+ status: payload.status,
2466
+ headers: {
2467
+ Location: payload.location
2468
+ }
2469
+ });
2470
+ }
2471
+ if (payload.type !== "render") return null;
2472
+ const context = {
2473
+ actionData: payload.actionData,
2474
+ actionHeaders: {},
2475
+ basename: payload.basename,
2476
+ errors: payload.errors,
2477
+ loaderData: payload.loaderData,
2478
+ loaderHeaders: {},
2479
+ location: payload.location,
2480
+ statusCode: 200,
2481
+ matches: payload.matches.map((match) => ({
2482
+ params: match.params,
2483
+ pathname: match.pathname,
2484
+ pathnameBase: match.pathnameBase,
2485
+ route: {
2486
+ id: match.id,
2487
+ action: match.hasAction || !!match.clientAction,
2488
+ handle: match.handle,
2489
+ hasErrorBoundary: match.hasErrorBoundary,
2490
+ loader: match.hasLoader || !!match.clientLoader,
2491
+ index: match.index,
2492
+ path: match.path,
2493
+ shouldRevalidate: match.shouldRevalidate
2494
+ }
2495
+ }))
2496
+ };
2497
+ const router = createStaticRouter(
2498
+ payload.matches.reduceRight((previous, match) => {
2499
+ const route = {
2500
+ id: match.id,
2501
+ action: match.hasAction || !!match.clientAction,
2502
+ element: match.element,
2503
+ errorElement: match.errorElement,
2504
+ handle: match.handle,
2505
+ hasErrorBoundary: !!match.errorElement,
2506
+ hydrateFallbackElement: match.hydrateFallbackElement,
2507
+ index: match.index,
2508
+ loader: match.hasLoader || !!match.clientLoader,
2509
+ path: match.path,
2510
+ shouldRevalidate: match.shouldRevalidate
2511
+ };
2512
+ if (previous.length > 0) {
2513
+ route.children = previous;
2514
+ }
2515
+ return [route];
2516
+ }, []),
2517
+ context
2518
+ );
2519
+ const frameworkContext = {
2520
+ future: {
2521
+ // These flags have no runtime impact so can always be false. If we add
2522
+ // flags that drive runtime behavior they'll need to be proxied through.
2523
+ unstable_middleware: false,
2524
+ unstable_subResourceIntegrity: false
2525
+ },
2526
+ isSpaMode: false,
2527
+ ssr: true,
2528
+ criticalCss: "",
2529
+ manifest: {
2530
+ routes: {},
2531
+ version: "1",
2532
+ url: "",
2533
+ entry: {
2534
+ module: "",
2535
+ imports: []
2536
+ }
2537
+ },
2538
+ routeDiscovery: { mode: "lazy", manifestPath: "/__manifest" },
2539
+ routeModules: {}
2540
+ };
2541
+ return /* @__PURE__ */ React5.createElement(RSCRouterGlobalErrorBoundary, { location: payload.location }, /* @__PURE__ */ React5.createElement(FrameworkContext.Provider, { value: frameworkContext }, /* @__PURE__ */ React5.createElement(
2542
+ StaticRouterProvider,
2543
+ {
2544
+ context,
2545
+ router,
2546
+ hydrate: false,
2547
+ nonce: payload.nonce
2548
+ }
2549
+ )));
2550
+ }
2551
+ function isReactServerRequest(url) {
2552
+ return url.pathname.endsWith(".rsc");
2553
+ }
2554
+ function isManifestRequest(url) {
2555
+ return url.pathname.endsWith(".manifest");
2556
+ }
2557
+
2558
+ // lib/rsc/html-stream/browser.ts
2559
+ function getServerStream() {
2560
+ let encoder3 = new TextEncoder();
2561
+ let streamController = null;
2562
+ let rscStream = new ReadableStream({
2563
+ start(controller) {
2564
+ if (typeof window === "undefined") {
2565
+ return;
2566
+ }
2567
+ let handleChunk = (chunk) => {
2568
+ if (typeof chunk === "string") {
2569
+ controller.enqueue(encoder3.encode(chunk));
2570
+ } else {
2571
+ controller.enqueue(chunk);
2572
+ }
2573
+ };
2574
+ window.__FLIGHT_DATA || (window.__FLIGHT_DATA = []);
2575
+ window.__FLIGHT_DATA.forEach(handleChunk);
2576
+ window.__FLIGHT_DATA.push = (chunk) => {
2577
+ handleChunk(chunk);
2578
+ return 0;
2579
+ };
2580
+ streamController = controller;
2581
+ }
2582
+ });
2583
+ if (typeof document !== "undefined" && document.readyState === "loading") {
2584
+ document.addEventListener("DOMContentLoaded", () => {
2585
+ streamController?.close();
2586
+ });
2587
+ } else {
2588
+ streamController?.close();
2589
+ }
2590
+ return rscStream;
2591
+ }
2592
+
2593
+ // lib/dom/ssr/errors.ts
2594
+ function deserializeErrors(errors) {
2595
+ if (!errors) return null;
2596
+ let entries = Object.entries(errors);
2597
+ let serialized = {};
2598
+ for (let [key, val] of entries) {
2599
+ if (val && val.__type === "RouteErrorResponse") {
2600
+ serialized[key] = new ErrorResponseImpl(
2601
+ val.status,
2602
+ val.statusText,
2603
+ val.data,
2604
+ val.internal === true
2605
+ );
2606
+ } else if (val && val.__type === "Error") {
2607
+ if (val.__subType) {
2608
+ let ErrorConstructor = window[val.__subType];
2609
+ if (typeof ErrorConstructor === "function") {
2610
+ try {
2611
+ let error = new ErrorConstructor(val.message);
2612
+ error.stack = val.stack;
2613
+ serialized[key] = error;
2614
+ } catch (e) {
2615
+ }
2616
+ }
2617
+ }
2618
+ if (serialized[key] == null) {
2619
+ let error = new Error(val.message);
2620
+ error.stack = val.stack;
2621
+ serialized[key] = error;
2622
+ }
2623
+ } else {
2624
+ serialized[key] = val;
2625
+ }
2626
+ }
2627
+ return serialized;
2628
+ }
2629
+
2630
+ export {
2631
+ ServerRouter,
2632
+ createRoutesStub,
2633
+ createCookie,
2634
+ isCookie,
2635
+ ServerMode,
2636
+ setDevServerHooks,
2637
+ createRequestHandler,
2638
+ createSession,
2639
+ isSession,
2640
+ createSessionStorage,
2641
+ createCookieSessionStorage,
2642
+ createMemorySessionStorage,
2643
+ href,
2644
+ getHydrationData,
2645
+ RSCDefaultRootErrorBoundary,
2646
+ createCallServer,
2647
+ RSCHydratedRouter,
2648
+ routeRSCServerRequest,
2649
+ RSCStaticRouter,
2650
+ getServerStream,
2651
+ deserializeErrors
2652
+ };