fect(() => router2.subscribe(setState), [router2, setState]); React3.useEffect(() => { if (vtContext.isTransitioning && !vtContext.flushSync) { setRenderDfd(new Deferred2()); } }, [vtContext]); React3.useEffect(() => { if (renderDfd && pendingState && router2.window) { let newState = pendingState; let renderPromise = renderDfd.promise; let transition2 = router2.window.document.startViewTransition(async () => { React3.startTransition(() => setStateImpl(newState)); await renderPromise; }); transition2.finished.finally(() => { setRenderDfd(void 0); setTransition(void 0); setPendingState(void 0); setVtContext({ isTransitioning: false }); }); setTransition(transition2); } }, [pendingState, renderDfd, router2.window]); React3.useEffect(() => { if (renderDfd && pendingState && state.location.key === pendingState.location.key) { renderDfd.resolve(); } }, [renderDfd, transition, state.location, pendingState]); React3.useEffect(() => { if (!vtContext.isTransitioning && interruption) { setPendingState(interruption.state); setVtContext({ isTransitioning: true, flushSync: false, currentLocation: interruption.currentLocation, nextLocation: interruption.nextLocation }); setInterruption(void 0); } }, [vtContext.isTransitioning, interruption]); let navigator2 = React3.useMemo(() => { return { createHref: router2.createHref, encodeLocation: router2.encodeLocation, go: (n) => router2.navigate(n), push: (to, state2, opts) => router2.navigate(to, { state: state2, preventScrollReset: opts?.preventScrollReset }), replace: (to, state2, opts) => router2.navigate(to, { replace: true, state: state2, preventScrollReset: opts?.preventScrollReset }) }; }, [router2]); let basename = router2.basename || "/"; let dataRouterContext = React3.useMemo( () => ({ router: router2, navigator: navigator2, static: false, basename }), [router2, navigator2, basename] ); return React3.createElement(React3.Fragment, null, React3.createElement(DataRouterContext.Provider, { value: dataRouterContext }, React3.createElement(DataRouterStateContext.Provider, { value: state }, React3.createElement(FetchersContext.Provider, { value: fetcherData.current }, React3.createElement(ViewTransitionContext.Provider, { value: vtContext }, React3.createElement( Router, { basename, location: state.location, navigationType: state.historyAction, navigator: navigator2 }, React3.createElement( MemoizedDataRoutes, { routes: router2.routes, future: router2.future, state } ) ))))), null); } var MemoizedDataRoutes = React3.memo(DataRoutes); function DataRoutes({ routes, future, state }) { return useRoutesImpl(routes, void 0, state, future); } function MemoryRouter({ basename, children, initialEntries, initialIndex }) { let historyRef = React3.useRef(); if (historyRef.current == null) { historyRef.current = createMemoryHistory({ initialEntries, initialIndex, v5Compat: true }); } let history = historyRef.current; let [state, setStateImpl] = React3.useState({ action: history.action, location: history.location }); let setState = React3.useCallback( (newState) => { React3.startTransition(() => setStateImpl(newState)); }, [setStateImpl] ); React3.useLayoutEffect(() => history.listen(setState), [history, setState]); return React3.createElement( Router, { basename, children, location: state.location, navigationType: state.action, navigator: history } ); } function Navigate({ to, replace: replace2, state, relative }) { invariant( useInRouterContext(), // TODO: This error is probably because they somehow have 2 versions of // the router loaded. We can help them understand how to avoid that. ` may be used only in the context of a component.` ); let { static: isStatic } = React3.useContext(NavigationContext); warning( !isStatic, ` must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.` ); let { matches } = React3.useContext(RouteContext); let { pathname: locationPathname } = useLocation(); let navigate = useNavigate(); let path = resolveTo( to, getResolveToMatches(matches), locationPathname, relative === "path" ); let jsonPath = JSON.stringify(path); React3.useEffect(() => { navigate(JSON.parse(jsonPath), { replace: replace2, state, relative }); }, [navigate, jsonPath, relative, replace2, state]); return null; } function Outlet(props) { return useOutlet(props.context); } function Route(_props) { invariant( false, `A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .` ); } function Router({ basename: basenameProp = "/", children = null, location: locationProp, navigationType = "POP", navigator: navigator2, static: staticProp = false }) { invariant( !useInRouterContext(), `You cannot render a inside another . You should never have more than one in your app.` ); let basename = basenameProp.replace(/^\/*/, "/"); let navigationContext = React3.useMemo( () => ({ basename, navigator: navigator2, static: staticProp, future: {} }), [basename, navigator2, staticProp] ); if (typeof locationProp === "string") { locationProp = parsePath(locationProp); } let { pathname = "/", search = "", hash = "", state = null, key = "default" } = locationProp; let locationContext = React3.useMemo(() => { let trailingPathname = stripBasename(pathname, basename); if (trailingPathname == null) { return null; } return { location: { pathname: trailingPathname, search, hash, state, key }, navigationType }; }, [basename, pathname, search, hash, state, key, navigationType]); warning( locationContext != null, ` is not able to match the URL "${pathname}${search}${hash}" because it does not start with the basename, so the won't render anything.` ); if (locationContext == null) { return null; } return React3.createElement(NavigationContext.Provider, { value: navigationContext }, React3.createElement(LocationContext.Provider, { children, value: locationContext })); } function Routes({ children, location }) { return useRoutes(createRoutesFromChildren(children), location); } function Await({ children, errorElement, resolve }) { return React3.createElement(AwaitErrorBoundary, { resolve, errorElement }, React3.createElement(ResolveAwait, null, children)); } var AwaitErrorBoundary = class extends React3.Component { constructor(props) { super(props); this.state = { error: null }; } static getDerivedStateFromError(error) { return { error }; } componentDidCatch(error, errorInfo) { console.error( " caught the following error during render", error, errorInfo ); } render() { let { children, errorElement, resolve } = this.props; let promise = null; let status = 0; if (!(resolve instanceof Promise)) { status = 1; promise = Promise.resolve(); Object.defineProperty(promise, "_tracked", { get: () => true }); Object.defineProperty(promise, "_data", { get: () => resolve }); } else if (this.state.error) { status = 2; let renderError = this.state.error; promise = Promise.reject().catch(() => { }); Object.defineProperty(promise, "_tracked", { get: () => true }); Object.defineProperty(promise, "_error", { get: () => renderError }); } else if (resolve._tracked) { promise = resolve; status = "_error" in promise ? 2 : "_data" in promise ? 1 : 0; } else { status = 0; Object.defineProperty(resolve, "_tracked", { get: () => true }); promise = resolve.then( (data2) => Object.defineProperty(resolve, "_data", { get: () => data2 }), (error) => Object.defineProperty(resolve, "_error", { get: () => error }) ); } if (status === 2 && !errorElement) { throw promise._error; } if (status === 2) { return React3.createElement(AwaitContext.Provider, { value: promise, children: errorElement }); } if (status === 1) { return React3.createElement(AwaitContext.Provider, { value: promise, children }); } throw promise; } }; function ResolveAwait({ children }) { let data2 = useAsyncValue(); let toRender = typeof children === "function" ? children(data2) : children; return React3.createElement(React3.Fragment, null, toRender); } function createRoutesFromChildren(children, parentPath = []) { let routes = []; React3.Children.forEach(children, (element, index) => { if (!React3.isValidElement(element)) { return; } let treePath = [...parentPath, index]; if (element.type === React3.Fragment) { routes.push.apply( routes, createRoutesFromChildren(element.props.children, treePath) ); return; } invariant( element.type === Route, `[${typeof element.type === "string" ? element.type : element.type.name}] is not a component. All component children of must be a or ` ); invariant( !element.props.index || !element.props.children, "An index route cannot have child routes." ); let route = { id: element.props.id || treePath.join("-"), caseSensitive: element.props.caseSensitive, element: element.props.element, Component: element.props.Component, index: element.props.index, path: element.props.path, loader: element.props.loader, action: element.props.action, hydrateFallbackElement: element.props.hydrateFallbackElement, HydrateFallback: element.props.HydrateFallback, errorElement: element.props.errorElement, ErrorBoundary: element.props.ErrorBoundary, hasErrorBoundary: element.props.hasErrorBoundary === true || element.props.ErrorBoundary != null || element.props.errorElement != null, shouldRevalidate: element.props.shouldRevalidate, handle: element.props.handle, lazy: element.props.lazy }; if (element.props.children) { route.children = createRoutesFromChildren( element.props.children, treePath ); } routes.push(route); }); return routes; } var createRoutesFromElements = createRoutesFromChildren; function renderMatches(matches) { return _renderMatches(matches); } var defaultMethod = "get"; var defaultEncType = "application/x-www-form-urlencoded"; function isHtmlElement(object) { return object != null && typeof object.tagName === "string"; } function isButtonElement(object) { return isHtmlElement(object) && object.tagName.toLowerCase() === "button"; } function isFormElement(object) { return isHtmlElement(object) && object.tagName.toLowerCase() === "form"; } function isInputElement(object) { return isHtmlElement(object) && object.tagName.toLowerCase() === "input"; } function isModifiedEvent(event) { return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey); } function shouldProcessLinkClick(event, target) { return event.button === 0 && // Ignore everything but left clicks (!target || target === "_self") && // Let browser handle "target=_blank" etc. !isModifiedEvent(event); } function createSearchParams(init = "") { return new URLSearchParams( typeof init === "string" || Array.isArray(init) || init instanceof URLSearchParams ? init : Object.keys(init).reduce((memo2, key) => { let value = init[key]; return memo2.concat( Array.isArray(value) ? value.map((v) => [key, v]) : [[key, value]] ); }, []) ); } function getSearchParamsForLocation(locationSearch, defaultSearchParams) { let searchParams = createSearchParams(locationSearch); if (defaultSearchParams) { defaultSearchParams.forEach((_, key) => { if (!searchParams.has(key)) { defaultSearchParams.getAll(key).forEach((value) => { searchParams.append(key, value); }); } }); } return searchParams; } var _formDataSupportsSubmitter = null; function isFormDataSubmitterSupported() { if (_formDataSupportsSubmitter === null) { try { new FormData( document.createElement("form"), // @ts-expect-error if FormData supports the submitter parameter, this will throw 0 ); _formDataSupportsSubmitter = false; } catch (e) { _formDataSupportsSubmitter = true; } } return _formDataSupportsSubmitter; } var supportedFormEncTypes = /* @__PURE__ */ new Set([ "application/x-www-form-urlencoded", "multipart/form-data", "text/plain" ]); function getFormEncType(encType) { if (encType != null && !supportedFormEncTypes.has(encType)) { warning( false, `"${encType}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${defaultEncType}"` ); return null; } return encType; } function getFormSubmissionInfo(target, basename) { let method; let action; let encType; let formData; let body; if (isFormElement(target)) { let attr = target.getAttribute("action"); action = attr ? stripBasename(attr, basename) : null; method = target.getAttribute("method") || defaultMethod; encType = getFormEncType(target.getAttribute("enctype")) || defaultEncType; formData = new FormData(target); } else if (isButtonElement(target) || isInputElement(target) && (target.type === "submit" || target.type === "image")) { let form = target.form; if (form == null) { throw new Error( `Cannot submit a