UNPKG

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