let singleFetchResult; if (context.errors) { singleFetchResult = { error: Object.values(context.errors)[0] }; } else { singleFetchResult = { data: Object.values(context.actionData || {})[0] }; } return generateSingleFetchResponse(request, build, serverMode, { result: singleFetchResult, headers, status: context.statusCode }); }; var respond = respond2; let handlerRequest = new Request(handlerUrl, { method: request.method, body: request.body, headers: request.headers, signal: request.signal, ...request.body ? { duplex: "half" } : void 0 }); let result = await staticHandler.query(handlerRequest, { requestContext: loadContext, skipLoaderErrorBubbling: true, skipRevalidation: true, unstable_respond: respond2 }); if (!isResponse(result)) { result = respond2(result); } if (isRedirectResponse(result)) { return generateSingleFetchResponse(request, build, serverMode, { result: getSingleFetchRedirect( result.status, result.headers, build.basename ), headers: result.headers, status: SINGLE_FETCH_REDIRECT_STATUS }); } return result; } catch (error) { handleError(error); return generateSingleFetchResponse(request, build, serverMode, { result: { error }, headers: new Headers(), status: 500 }); } } async function singleFetchLoaders(build, serverMode, staticHandler, request, handlerUrl, loadContext, handleError) { try { let respond2 = function(context) { let headers = getDocumentHeaders(build, context); if (isRedirectStatusCode(context.statusCode) && headers.has("Location")) { return generateSingleFetchResponse(request, build, serverMode, { result: { [SingleFetchRedirectSymbol]: getSingleFetchRedirect( context.statusCode, headers, build.basename ) }, headers, status: SINGLE_FETCH_REDIRECT_STATUS }); } if (context.errors) { Object.values(context.errors).forEach((err) => { if (!isRouteErrorResponse(err) || err.error) { handleError(err); } }); context.errors = sanitizeErrors(context.errors, serverMode); } let results = {}; let loadedMatches = new Set( context.matches.filter( (m) => loadRouteIds ? loadRouteIds.has(m.route.id) : m.route.loader != null ).map((m) => m.route.id) ); if (context.errors) { for (let [id, error] of Object.entries(context.errors)) { results[id] = { error }; } } for (let [id, data2] of Object.entries(context.loaderData)) { if (!(id in results) && loadedMatches.has(id)) { results[id] = { data: data2 }; } } return generateSingleFetchResponse(request, build, serverMode, { result: results, headers, status: context.statusCode }); }; var respond = respond2; let handlerRequest = new Request(handlerUrl, { headers: request.headers, signal: request.signal }); let routesParam = new URL(request.url).searchParams.get("_routes"); let loadRouteIds = routesParam ? new Set(routesParam.split(",")) : null; let result = await staticHandler.query(handlerRequest, { requestContext: loadContext, filterMatchesToLoad: (m) => !loadRouteIds || loadRouteIds.has(m.route.id), skipLoaderErrorBubbling: true, unstable_respond: respond2 }); if (!isResponse(result)) { result = respond2(result); } if (isRedirectResponse(result)) { return generateSingleFetchResponse(request, build, serverMode, { result: { [SingleFetchRedirectSymbol]: getSingleFetchRedirect( result.status, result.headers, build.basename ) }, headers: result.headers, status: SINGLE_FETCH_REDIRECT_STATUS }); } return result; } catch (error) { handleError(error); return generateSingleFetchResponse(request, build, serverMode, { result: { root: { error } }, headers: new Headers(), status: 500 }); } } function generateSingleFetchResponse(request, build, serverMode, { result, headers, status }) { let resultHeaders = new Headers(headers); resultHeaders.set("X-Remix-Response", "yes"); if (NO_BODY_STATUS_CODES.has(status)) { return new Response(null, { status, headers: resultHeaders }); } resultHeaders.set("Content-Type", "text/x-script"); return new Response( encodeViaTurboStream( result, request.signal, build.entry.module.streamTimeout, serverMode ), { status: status || 200, headers: resultHeaders } ); } function getSingleFetchRedirect(status, headers, basename) { let redirect2 = headers.get("Location"); if (basename) { redirect2 = stripBasename(redirect2, basename) || redirect2; } return { redirect: redirect2, status, revalidate: ( // Technically X-Remix-Revalidate isn't needed here - that was an implementation // detail of ?_data requests as our way to tell the front end to revalidate when // we didn't have a response body to include that information in. // With single fetch, we tell the front end via this revalidate boolean field. // However, we're respecting it for now because it may be something folks have // used in their own responses // TODO(v3): Consider removing or making this official public API headers.has("X-Remix-Revalidate") || headers.has("Set-Cookie") ), reload: headers.has("X-Remix-Reload-Document"), replace: headers.has("X-Remix-Replace") }; } function encodeViaTurboStream(data2, requestSignal, streamTimeout, serverMode) { let controller = new AbortController(); let timeoutId = setTimeout( () => controller.abort(new Error("Server Timeout")), typeof streamTimeout === "number" ? streamTimeout : 4950 ); requestSignal.addEventListener("abort", () => clearTimeout(timeoutId)); return encode(data2, { signal: controller.signal, plugins: [ (value) => { if (value instanceof Error) { let { name, message, stack } = serverMode === "production" ? sanitizeError(value, serverMode) : value; return ["SanitizedError", name, message, stack]; } if (value instanceof ErrorResponseImpl) { let { data: data3, status, statusText } = value; return ["ErrorResponse", data3, status, statusText]; } if (value && typeof value === "object" && SingleFetchRedirectSymbol in value) { return ["SingleFetchRedirect", value[SingleFetchRedirectSymbol]]; } } ], postPlugins: [ (value) => { if (!value) return; if (typeof value !== "object") return; return [ "SingleFetchClassInstance", Object.fromEntries(Object.entries(value)) ]; }, () => ["SingleFetchFallback"] ] }); } function derive(build, mode) { let routes = createRoutes(build.routes); let dataRoutes = createStaticHandlerDataRoutes(build.routes, build.future); let serverMode = isServerMode(mode) ? mode : "production"; let staticHandler = createStaticHandler(dataRoutes, { basename: build.basename }); let errorHandler = build.entry.module.handleError || ((error, { request }) => { if (serverMode !== "test" && !request.signal.aborted) { console.error( // @ts-expect-error This is "private" from users but intended for internal use isRouteErrorResponse(error) && error.error ? error.error : error ); } }); return { routes, dataRoutes, serverMode, staticHandler, errorHandler }; } var createRequestHandler = (build, mode) => { let _build; let routes; let serverMode; let staticHandler; let errorHandler; return async function requestHandler(request, initialContext) { _build = typeof build === "function" ? await build() : build; let loadContext = _build.future.unstable_middleware ? new unstable_RouterContextProvider( initialContext ) : initialContext || {}; if (typeof build === "function") { let derived = derive(_build, mode); routes = derived.routes; serverMode = derived.serverMode; staticHandler = derived.staticHandler; errorHandler = derived.errorHandler; } else if (!routes || !serverMode || !staticHandler || !errorHandler) { let derived = derive(_build, mode); routes = derived.routes; serverMode = derived.serverMode; staticHandler = derived.staticHandler; errorHandler = derived.errorHandler; } let url = new URL(request.url); let normalizedBasename = _build.basename || "/"; let normalizedPath = url.pathname; if (stripBasename(normalizedPath, normalizedBasename) === "/_root.data") { normalizedPath = normalizedBasename; } else if (normalizedPath.endsWith(".data")) { normalizedPath = normalizedPath.replace(/\.data$/, ""); } if (stripBasename(normalizedPath, normalizedBasename) !== "/" && normalizedPath.endsWith("/")) { normalizedPath = normalizedPath.slice(0, -1); } let params = {}; let handleError = (error) => { if (mode === "development") { getDevServerHooks()?.processRequestError?.(error); } errorHandler(error, { context: loadContext, params, request }); }; if (!_build.ssr) { if (_build.prerender.length === 0) { request.headers.set("X-React-Router-SPA-Mode", "yes"); } else if (!_build.prerender.includes(normalizedPath) && !_build.prerender.includes(normalizedPath + "/")) { if (url.pathname.endsWith(".data")) { errorHandler( new ErrorResponseImpl( 404, "Not Found", `Refusing to SSR the path \`${normalizedPath}\` because \`ssr:false\` is set and the path is not included in the \`prerender\` config, so in production the path will be a 404.` ), { context: loadContext, params, request } ); return new Response("Not Found", { status: 404, statusText: "Not Found" }); } else { request.headers.set("X-React-Router-SPA-Mode", "yes"); } } } let manifestUrl = `${normalizedBasename}/__manifest`.replace(/\/+/g, "/"); if (url.pathname === manifestUrl) { try { let res = await handleManifestRequest(_build, routes, url); return res; } catch (e) { handleError(e); return new Response("Unknown Server Error", { status: 500 }); } } let matches = matchServerRoutes(routes, url.pathname, _build.basename); if (matches && matches.length > 0) { Object.assign(params, matches[0].params); } let response; if (url.pathname.endsWith(".data")) { let handlerUrl = new URL(request.url); handlerUrl.pathname = normalizedPath; let singleFetchMatches = matchServerRoutes( routes, handlerUrl.pathname, _build.basename ); response = await handleSingleFetchRequest( serverMode, _build, staticHandler, request, handlerUrl, loadContext, handleError ); if (_build.entry.module.handleDataRequest) { response = await _build.entry.module.handleDataRequest(response, { context: loadContext, params: singleFetchMatches ? singleFetchMatches[0].params : {}, request }); if (isRedirectResponse(response)) { let result = getSingleFetchRedirect( response.status, response.headers, _build.basename ); if (request.method === "GET") { result = { [SingleFetchRedirectSymbol]: result }; } let headers = new Headers(response.headers); headers.set("Content-Type", "text/x-script"); return new Response( encodeViaTurboStream( result, request.signal, _build.entry.module.streamTimeout, serverMode ), { status: SINGLE_FETCH_REDIRECT_STATUS, headers } ); } } } else if (!request.headers.has("X-React-Router-SPA-Mode") && matches && matches[matches.length - 1].route.module.default == null && matches[matches.length - 1].route.module.ErrorBoundary == null) { response = await handleResourceRequest( serverMode, _build, staticHandler, matches.slice(-1)[0].route.id, request, loadContext, handleError ); } else { let { pathname } = url; let criticalCss = void 0; if (_build.getCriticalCss) { criticalCss = await _build.getCriticalCss({ pathname }); } else if (mode === "development" && getDevServerHooks()?.getCriticalCss) { criticalCss = await getDevServerHooks()?.getCriticalCss?.(pathname); } response = await handleDocumentRequest( serverMode, _build, staticHandler, request, loadContext, handleError, criticalCss ); } if (request.method === "HEAD") { return new Response(null, { headers: response.headers, status: response.status, statusText: response.statusText }); } return response; }; }; async function handleManifestRequest(build, routes, url) { if (build.assets.version !== url.searchParams.get("version")) { return new Response(null, { status: 204, headers: { "X-Remix-Reload-Document": "true" } }); } let patches = {}; if (url.searchParams.has("p")) { for (let path of url.searchParams.getAll("p")) { let matches = matchServerRoutes(routes, path, build.basename); if (matches) { for (let match of matches) { let routeId = match.route.id; let route = build.assets.routes[routeId]; if (route) { patches[routeId] = route; } } } } return Response.json(patches, { headers: { "Cache-Control": "public, max-age=31536000, immutable" } }); } return new Response("Invalid Request", { status: 400 }); } async function handleSingleFetchRequest(serverMode, build, staticHandler, request, handlerUrl, loadContext, handleError) { let response = request.method !== "GET" ? await singleFetchAction( build, serverMode, staticHandler, request, handlerUrl, loadContext, handleError ) : await singleFetchLoaders( build, serverMode, staticHandler, request, handlerUrl, loadContext, handleError ); return response; } async function handleDocumentRequest(serverMode, build, staticHandler, request, loadContext, handleError, criticalCss) { let isSpaMode = request.headers.has("X-React-Router-SPA-Mode"); try { let response = await staticHandler.query(request, { requestContext: loadContext, unstable_respond: build.future.unstable_middleware ? (ctx) => renderHtml(ctx, isSpaMode) : void 0 }); return isResponse(response) ? response : renderHtml(response, isSpaMode); } catch (error) { handleError(error); return new Response(null, { status: 500 }); } async function renderHtml(context, isSpaMode2) { if (isResponse(context)) { return context; } let headers = getDocumentHeaders(build, context); if (NO_BODY_STATUS_CODES.has(context.statusCode)) { return new Response(null, { status: context.statusCode, headers }); } if (context.errors) { Object.values(context.errors).forEach((err) => { if (!isRouteErrorResponse(err) || err.error) { handleError(err); } }); context.errors = sanitizeErrors(context.errors, serverMode); } let state = { loaderData: context.loaderData, actionData: context.actionData, errors: serializeErrors2(context.errors, serverMode) }; let entryContext = { manifest: build.assets, routeModules: createEntryRouteModules(build.routes), staticHandlerContext: context, criticalCss, serverHandoffString: createServerHandoffString({ basename: build.basename, criticalCss, future: build.future, ssr: build.ssr, isSpaMode: isSpaMode2 }), serverHandoffStream: encodeViaTurboStream( state, request.signal, build.entry.module.streamTimeout, serverMode ), renderMeta: {}, future: build.future, ssr: build.ssr, isSpaMode: isSpaMode2, serializeError: (err) => serializeError(err, serverMode) }; let handleDocumentRequestFunction = build.entry.module.default; try { return await handleDocumentRequestFunction( request, context.statusCode, headers, entryContext, loadContext ); } catch (error) { handleError(error); let errorForSecondRender = error; if (isResponse(error)) { try { let data2 = await unwrapResponse(error); errorForSecondRender = new ErrorResponseImpl( error.status, error.statusText, data2 ); } catch (e) { } } context = getStaticContextFromError( staticHandler.dataRoutes, context, errorForSecondRender ); if (context.errors) { context.errors = sanitizeErrors(context.errors, serverMode); } let state2 = { loaderData: context.loaderData, actionData: context.actionData, errors: serializeErrors2(context.errors, serverMode) }; entryContext = { ...entryContext, staticHandlerContext: context, serverHandoffString: createServerHandoffString({ basename: build.basename, future: build.future, ssr: build.ssr, isSpaMode: isSpaMode2 }), serverHandoffStream: encodeViaTurboStream( state2, request.signal, build.entry.module.streamTimeout, serverMode ), renderMeta: {} }; try { return await handleDocumentRequestFunction( request, context.statusCode, headers, entryContext, loadContext ); } catch (error2) { handleError(error2); return returnLastResortErrorResponse(error2, serverMode); } } } } async function handleResourceRequest(serverMode, build, staticHandler, routeId, request, loadContext, handleError) { try { let response = await staticHandler.queryRoute(request, { routeId, requestContext: loadContext, unstable_respond: build.future.unstable_middleware ? (ctx) => ctx : void 0 }); if (isResponse(response)) { return response; } if (typeof response === "string") { return new Response(response); } return Response.json(response); } catch (error) { if (isResponse(error)) { error.headers.set("X-Remix-Catch", "yes"); return error; } if (isRouteErrorResponse(error)) { if (error) { handleError(error); } return errorResponseToJson(error, serverMode); } if (error instanceof Error && error.message === "Expected a response from queryRoute") { let newError = new Error( "Expected a Response to be returned from resource route handler" ); handleError(newError); return returnLastResortErrorResponse(newError, serverMode); } handleError(error); return returnLastResortErrorResponse(error, serverMode); } } function errorResponseToJson(errorResponse, serverMode) { return Response.json( serializeError( // @ts-expect-error This is "private" from users but intended for internal use errorResponse.error || new Error("Unexpected Server Error"), serverMode ), { status: errorResponse.status, statusText: errorResponse.statusText, headers: { "X-Remix-Error": "yes" } } ); } function returnLastResortErrorResponse(error, serverMode) { let message = "Unexpected Server Error"; if (serverMode !== "production") { message += ` ${String(error)}`; } return new Response(message, { status: 500, headers: { "Content-Type": "text/plain" } }); } function unwrapResponse(response) { let contentType = response.headers.get("Content-Type"); return contentType && /\bapplication\/json\b/.test(contentType) ? response.body == null ? null : response.json() : response.text(); } function flash(name) { return `__flash_${name}__`; } var createSession = (initialData = {}, id = "") => { let map = new Map(Object.entries(initialData)); return { get id() { return id; }, get data() { return Object.fromEntries(map); }, has(name) { return map.has(name) || map.has(flash(name)); }, get(name) { if (map.has(name)) return map.get(name); let flashName = flash(name); if (map.has(flashName)) { let value = map.get(flashName); map.delete(flashName); return value; } return void 0; }, set(name, value) { map.set(name, value); }, flash(name, value) { map.set(flash(name), value); }, unset(name) { map.delete(name); } }; }; var isSession = (object) => { 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"; }; function createSessionStorage({ cookie: cookieArg, createData, readData, updateData, deleteData }) { let cookie = isCookie(cookieArg) ? cookieArg : createCookie(cookieArg?.name || "__session", cookieArg); warnOnceAboutSigningSessionCookie(cookie); return { async getSession(cookieHeader, options) { let id = cookieHeader && await cookie.parse(cookieHeader, options); let data2 = id && await readData(id); return createSession(data2 || {}, id || ""); }, async commitSession(session, options) { let { id, data: data2 } = session; let expires = options?.maxAge != null ? new Date(Date.now() + options.maxAge * 1e3) : options?.expires != null ? options.expires : cookie.expires; if (id) { await updateData(id, data2, expires); } else { id = await createData(data2, expires); } return cookie.serialize(id, options); }, async destroySession(session, options) { await deleteData(session.id); return cookie.serialize("", { ...options, maxAge: void 0, expires: /* @__PURE__ */ new Date(0) }); } }; } function warnOnceAboutSigningSessionCookie(cookie) { warnOnce( cookie.isSigned, `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://remix.run/utils/cookies#signing-cookies for more information.` ); } function createCookieSessionStorage({ cookie: cookieArg } = {}) { let cookie = isCookie(cookieArg) ? cookieArg : createCookie(cookieArg?.name || "__session", cookieArg); warnOnceAboutSigningSessionCookie(cookie); return { async getSession(cookieHeader, options) { return createSession( cookieHeader && await cookie.parse(cookieHeader, options) || {} ); }, async commitSession(session, options) { let serializedCookie = await cookie.serialize(session.data, options); if (serializedCookie.length > 4096) { throw new Error( "Cookie length will exceed browser maximum. Length: " + serializedCookie.length ); } return serializedCookie; }, async destroySession(_session, options) { return cookie.serialize("", { ...options, maxAge: void 0, expires: /* @__PURE__ */ new Date(0) }); } }; } function createMemorySessionStorage({ cookie } = {}) { let map = /* @__PURE__ */ new Map(); return createSessionStorage({ cookie, async createData(data2, expires) { let id = Math.random().toString(36).substring(2, 10); map.set(id, { data: data2, expires }); return id; }, async readData(id) { if (map.has(id)) { let { data: data2, expires } = map.get(id); if (!expires || expires > /* @__PURE__ */ new Date()) { return data2; } if (expires) map.delete(id); } return null; }, async updateData(id, data2, expires) { map.set(id, { data: data2, expires }); }, async deleteData(id) { map.delete(id); } }); } function href(path, ...args) { let params = args[0]; return path.split("/").map((segment) => { const match = segment.match(/^:([\w-]+)(\?)?/); if (!match) return segment; const param = match[1]; const value = params ? params[param] : void 0; const isRequired = match[2] === void 0; if (isRequired && value === void 0) { throw Error( `Path '${path}' requires param '${param}' but it was not provided` ); } return value; }).filter((segment) => segment !== void 0).join("/"); } function deserializeErrors2(errors) { if (!errors) return null; let entries = Object.entries(errors); let serialized = {}; for (let [key, val] of entries) { if (val && val.__type === "RouteErrorResponse") { serialized[key] = new ErrorResponseImpl( val.status, val.statusText, val.data, val.internal === true ); } else if (val && val.__type === "Error") { if (val.__subType) { let ErrorConstructor = window[val.__subType]; if (typeof ErrorConstructor === "function") { try { let error = new ErrorConstructor(val.message); error.stack = val.stack; serialized[key] = error; } catch (e) { } } } if (serialized[key] == null) { let error = new Error(val.message); error.stack = val.stack; serialized[key] = error; } } else { serialized[key] = val; } } return serialized; } // node_modules/react-router/dist/development/dom-export.mjs var React14 = __toESM(require_react(), 1); var ReactDOM = __toESM(require_react_dom(), 1); var React22 = __toESM(require_react(), 1); function RouterProvider2(props) { return React14.createElement(RouterProvider, { flushSync: ReactDOM.flushSync, ...props }); } var ssrInfo = null; var router = null; function initSsrInfo() { if (!ssrInfo && window.__reactRouterContext && window.__reactRouterManifest && window.__reactRouterRouteModules) { ssrInfo = { context: window.__reactRouterContext, manifest: window.__reactRouterManifest, routeModules: window.__reactRouterRouteModules, stateDecodingPromise: void 0, router: void 0, routerInitialized: false }; } } function createHydratedRouter({ unstable_getContext }) { initSsrInfo(); if (!ssrInfo) { throw new Error( "You must be using the SSR features of React Router in order to skip passing a `router` prop to ``" ); } let localSsrInfo = ssrInfo; if (!ssrInfo.stateDecodingPromise) { let stream = ssrInfo.context.stream; invariant(stream, "No stream found for single fetch decoding"); ssrInfo.context.stream = void 0; ssrInfo.stateDecodingPromise = decodeViaTurboStream(stream, window).then((value) => { ssrInfo.context.state = value.value; localSsrInfo.stateDecodingPromise.value = true; }).catch((e) => { localSsrInfo.stateDecodingPromise.error = e; }); } if (ssrInfo.stateDecodingPromise.error) { throw ssrInfo.stateDecodingPromise.error; } if (!ssrInfo.stateDecodingPromise.value) { throw ssrInfo.stateDecodingPromise; } let routes = createClientRoutes( ssrInfo.manifest.routes, ssrInfo.routeModules, ssrInfo.context.state, ssrInfo.context.ssr, ssrInfo.context.isSpaMode ); let hydrationData = void 0; let loaderData = ssrInfo.context.state.loaderData; if (ssrInfo.context.isSpaMode) { hydrationData = { loaderData }; } else { hydrationData = { ...ssrInfo.context.state, loaderData: { ...loaderData } }; let initialMatches = matchRoutes( routes, window.location, window.__reactRouterContext?.basename ); if (initialMatches) { for (let match of initialMatches) { let routeId = match.route.id; let route = ssrInfo.routeModules[routeId]; let manifestRoute = ssrInfo.manifest.routes[routeId]; if (route && manifestRoute && shouldHydrateRouteLoader( manifestRoute, route, ssrInfo.context.isSpaMode ) && (route.HydrateFallback || !manifestRoute.hasLoader)) { delete hydrationData.loaderData[routeId]; } else if (manifestRoute && !manifestRoute.hasLoader) { hydrationData.loaderData[routeId] = null; } } } if (hydrationData && hydrationData.errors) { hydrationData.errors = deserializeErrors2(hydrationData.errors); } } let router2 = createRouter({ routes, history: createBrowserHistory(), basename: ssrInfo.context.basename, unstable_getContext, hydrationData, mapRouteProperties, future: { unstable_middleware: ssrInfo.context.future.unstable_middleware }, dataStrategy: getSingleFetchDataStrategy( ssrInfo.manifest, ssrInfo.routeModules, ssrInfo.context.ssr, ssrInfo.context.basename, () => router2 ), patchRoutesOnNavigation: getPatchRoutesOnNavigationFunction( ssrInfo.manifest, ssrInfo.routeModules, ssrInfo.context.ssr, ssrInfo.context.isSpaMode, ssrInfo.context.basename ) }); ssrInfo.router = router2; if (router2.state.initialized) { ssrInfo.routerInitialized = true; router2.initialize(); } router2.createRoutesForHMR = /* spacer so ts-ignore does not affect the right hand of the assignment */ createClientRoutesWithHMRRevalidationOptOut; window.__reactRouterDataRouter = router2; return router2; } function HydratedRouter(props) { if (!router) { router = createHydratedRouter({ unstable_getContext: props.unstable_getContext }); } let [criticalCss, setCriticalCss] = React22.useState( true ? ssrInfo?.context.criticalCss : void 0 ); if (true) { if (ssrInfo) { window.__reactRouterClearCriticalCss = () => setCriticalCss(void 0); } } let [location, setLocation] = React22.useState(router.state.location); React22.useLayoutEffect(() => { if (ssrInfo && ssrInfo.router && !ssrInfo.routerInitialized) { ssrInfo.routerInitialized = true; ssrInfo.router.initialize(); } }, []); React22.useLayoutEffect(() => { if (ssrInfo && ssrInfo.router) { return ssrInfo.router.subscribe((newState) => { if (newState.location !== location) { setLocation(newState.location); } }); } }, [location]); invariant(ssrInfo, "ssrInfo unavailable for HydratedRouter"); useFogOFWarDiscovery( router, ssrInfo.manifest, ssrInfo.routeModules, ssrInfo.context.ssr, ssrInfo.context.isSpaMode ); return ( // This fragment is important to ensure we match the JSX // structure so that useId values hydrate correctly React22.createElement(React22.Fragment, null, React22.createElement( FrameworkContext.Provider, { value: { manifest: ssrInfo.manifest, routeModules: ssrInfo.routeModules, future: ssrInfo.context.future, criticalCss, ssr: ssrInfo.context.ssr, isSpaMode: ssrInfo.context.isSpaMode } }, React22.createElement(RemixErrorBoundary, { location }, React22.createElement(RouterProvider2, { router })) ), React22.createElement(React22.Fragment, null)) ); } export { Await, BrowserRouter, Form, HashRouter, HydratedRouter, IDLE_BLOCKER, IDLE_FETCHER, IDLE_NAVIGATION, Link, Links, MemoryRouter, Meta, NavLink, Navigate, Action as NavigationType, Outlet, PrefetchPageLinks, Route, Router, RouterProvider2 as RouterProvider, Routes, Scripts, ScrollRestoration, ServerRouter, StaticRouter, StaticRouterProvider, DataRouterContext as UNSAFE_DataRouterContext, DataRouterStateContext as UNSAFE_DataRouterStateContext, ErrorResponseImpl as UNSAFE_ErrorResponseImpl, FetchersContext as UNSAFE_FetchersContext, FrameworkContext as UNSAFE_FrameworkContext, LocationContext as UNSAFE_LocationContext, NavigationContext as UNSAFE_NavigationContext, RemixErrorBoundary as UNSAFE_RemixErrorBoundary, RouteContext as UNSAFE_RouteContext, ServerMode as UNSAFE_ServerMode, SingleFetchRedirectSymbol as UNSAFE_SingleFetchRedirectSymbol, ViewTransitionContext as UNSAFE_ViewTransitionContext, createBrowserHistory as UNSAFE_createBrowserHistory, createClientRoutes as UNSAFE_createClientRoutes, createClientRoutesWithHMRRevalidationOptOut as UNSAFE_createClientRoutesWithHMRRevalidationOptOut, createRouter as UNSAFE_createRouter, decodeViaTurboStream as UNSAFE_decodeViaTurboStream, deserializeErrors2 as UNSAFE_deserializeErrors, getPatchRoutesOnNavigationFunction as UNSAFE_getPatchRoutesOnNavigationFunction, getSingleFetchDataStrategy as UNSAFE_getSingleFetchDataStrategy, invariant as UNSAFE_invariant, mapRouteProperties as UNSAFE_mapRouteProperties, shouldHydrateRouteLoader as UNSAFE_shouldHydrateRouteLoader, useFogOFWarDiscovery as UNSAFE_useFogOFWarDiscovery, useScrollRestoration as UNSAFE_useScrollRestoration, createBrowserRouter, createCookie, createCookieSessionStorage, createHashRouter, createMemoryRouter, createMemorySessionStorage, createPath, createRequestHandler, createRoutesFromChildren, createRoutesFromElements, createRoutesStub, createSearchParams, createSession, createSessionStorage, createStaticHandler2 as createStaticHandler, createStaticRouter, data, generatePath, href, isCookie, isRouteErrorResponse, isSession, matchPath, matchRoutes, parsePath, redirect, redirectDocument, renderMatches, replace, resolvePath, HistoryRouter as unstable_HistoryRouter, unstable_RouterContextProvider, unstable_createContext, setDevServerHooks as unstable_setDevServerHooks, usePrompt as unstable_usePrompt, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useBlocker, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit, useViewTransitionState }; /*! Bundled license information: react-router/dist/development/chunk-K6CSEXPM.mjs: (** * react-router v7.3.0 * * Copyright (c) Remix Software Inc. * * This source code is licensed under the MIT license found in the * LICENSE.md file in the root directory of this source tree. * * @license MIT *) react-router/dist/development/dom-export.mjs: (** * react-router v7.3.0 * * Copyright (c) Remix Software Inc. * * This source code is licensed under the MIT license found in the * LICENSE.md file in the root directory of this source tree. * * @license MIT *) react-router/dist/development/index.mjs: (** * react-router v7.3.0 * * Copyright (c) Remix Software Inc. * * This source code is licensed under the MIT license found in the * LICENSE.md file in the root directory of this source tree. * * @license MIT *) react-router-dom/dist/index.mjs: (** * react-router-dom v7.3.0 * * Copyright (c) Remix Software Inc. * * This source code is licensed under the MIT license found in the * LICENSE.md file in the root directory of this source tree. * * @license MIT *) */ //# sourceMappingURL=react-router-dom.js.map Ә