UNPKG

@tanstack/solid-router

Version:

Modern and scalable routing for Solid applications

337 lines (336 loc) 13.8 kB
const require_runtime = require("./_virtual/_rolldown/runtime.cjs"); const require_CatchBoundary = require("./CatchBoundary.cjs"); const require_useRouter = require("./useRouter.cjs"); const require_useRouterState = require("./useRouterState.cjs"); const require_matchContext = require("./matchContext.cjs"); const require_SafeFragment = require("./SafeFragment.cjs"); const require_not_found = require("./not-found.cjs"); const require_renderRouteNotFound = require("./renderRouteNotFound.cjs"); const require_scroll_restoration = require("./scroll-restoration.cjs"); let _tanstack_router_core = require("@tanstack/router-core"); let solid_js_web = require("solid-js/web"); let solid_js = require("solid-js"); solid_js = require_runtime.__toESM(solid_js); let tiny_warning = require("tiny-warning"); tiny_warning = require_runtime.__toESM(tiny_warning); let _tanstack_router_core_isServer = require("@tanstack/router-core/isServer"); let tiny_invariant = require("tiny-invariant"); tiny_invariant = require_runtime.__toESM(tiny_invariant); //#region src/Match.tsx var Match = (props) => { const router = require_useRouter.useRouter(); const matchState = require_useRouterState.useRouterState({ select: (s) => { const match = s.matches.find((d) => d.id === props.matchId); if (!match) return null; return { routeId: match.routeId, ssr: match.ssr, _displayPending: match._displayPending }; } }); if (!matchState()) return null; const route = () => router.routesById[matchState().routeId]; const resolvePendingComponent = () => route().options.pendingComponent ?? router.options.defaultPendingComponent; const routeErrorComponent = () => route().options.errorComponent ?? router.options.defaultErrorComponent; const routeOnCatch = () => route().options.onCatch ?? router.options.defaultOnCatch; const routeNotFoundComponent = () => route().isRoot ? route().options.notFoundComponent ?? router.options.notFoundRoute?.options.component : route().options.notFoundComponent; const resolvedNoSsr = matchState().ssr === false || matchState().ssr === "data-only"; const ResolvedSuspenseBoundary = () => solid_js.Suspense; const ResolvedCatchBoundary = () => routeErrorComponent() ? require_CatchBoundary.CatchBoundary : require_SafeFragment.SafeFragment; const ResolvedNotFoundBoundary = () => routeNotFoundComponent() ? require_not_found.CatchNotFound : require_SafeFragment.SafeFragment; const resetKey = require_useRouterState.useRouterState({ select: (s) => s.loadedAt }); const parentRouteId = require_useRouterState.useRouterState({ select: (s) => { const index = s.matches.findIndex((d) => d.id === props.matchId); return s.matches[index - 1]?.routeId; } }); return (0, solid_js_web.createComponent)(route().isRoot ? route().options.shellComponent ?? require_SafeFragment.SafeFragment : require_SafeFragment.SafeFragment, { get children() { return [(0, solid_js_web.createComponent)(require_matchContext.matchContext.Provider, { value: () => props.matchId, get children() { return (0, solid_js_web.createComponent)(solid_js_web.Dynamic, { get component() { return ResolvedSuspenseBoundary(); }, get fallback() { return (0, solid_js_web.memo)(() => !!((_tanstack_router_core_isServer.isServer ?? router.isServer) || resolvedNoSsr))() ? void 0 : (0, solid_js_web.createComponent)(solid_js_web.Dynamic, { get component() { return resolvePendingComponent(); } }); }, get children() { return (0, solid_js_web.createComponent)(solid_js_web.Dynamic, { get component() { return ResolvedCatchBoundary(); }, getResetKey: () => resetKey(), get errorComponent() { return routeErrorComponent() || require_CatchBoundary.ErrorComponent; }, onCatch: (error) => { if ((0, _tanstack_router_core.isNotFound)(error)) throw error; (0, tiny_warning.default)(false, `Error in route match: ${matchState().routeId}`); routeOnCatch()?.(error); }, get children() { return (0, solid_js_web.createComponent)(solid_js_web.Dynamic, { get component() { return ResolvedNotFoundBoundary(); }, fallback: (error) => { if (!routeNotFoundComponent() || error.routeId && error.routeId !== matchState().routeId || !error.routeId && !route().isRoot) throw error; return (0, solid_js_web.createComponent)(solid_js_web.Dynamic, (0, solid_js_web.mergeProps)({ get component() { return routeNotFoundComponent(); } }, error)); }, get children() { return (0, solid_js_web.createComponent)(solid_js.Switch, { get children() { return [(0, solid_js_web.createComponent)(solid_js.Match, { when: resolvedNoSsr, get children() { return (0, solid_js_web.createComponent)(solid_js.Show, { get when() { return !(_tanstack_router_core_isServer.isServer ?? router.isServer); }, get fallback() { return (0, solid_js_web.createComponent)(solid_js_web.Dynamic, { get component() { return resolvePendingComponent(); } }); }, get children() { return (0, solid_js_web.createComponent)(MatchInner, { get matchId() { return props.matchId; } }); } }); } }), (0, solid_js_web.createComponent)(solid_js.Match, { when: !resolvedNoSsr, get children() { return (0, solid_js_web.createComponent)(MatchInner, { get matchId() { return props.matchId; } }); } })]; } }); } }); } }); } }); } }), (0, solid_js_web.memo)(() => (0, solid_js_web.memo)(() => parentRouteId() === _tanstack_router_core.rootRouteId)() ? [(0, solid_js_web.createComponent)(OnRendered, {}), (0, solid_js_web.createComponent)(require_scroll_restoration.ScrollRestoration, {})] : null)]; } }); }; function OnRendered() { const router = require_useRouter.useRouter(); const location = require_useRouterState.useRouterState({ select: (s) => { return s.resolvedLocation?.state.__TSR_key; } }); solid_js.createEffect(solid_js.on([location], () => { router.emit({ type: "onRendered", ...(0, _tanstack_router_core.getLocationChangeInfo)(router.state) }); })); return null; } var MatchInner = (props) => { const router = require_useRouter.useRouter(); const matchState = require_useRouterState.useRouterState({ select: (s) => { const match = s.matches.find((d) => d.id === props.matchId); if (!match) return null; const routeId = match.routeId; const remountDeps = (router.routesById[routeId].options.remountDeps ?? router.options.defaultRemountDeps)?.({ routeId, loaderDeps: match.loaderDeps, params: match._strictParams, search: match._strictSearch }); return { key: remountDeps ? JSON.stringify(remountDeps) : void 0, routeId, match: { id: match.id, status: match.status, error: match.error, _forcePending: match._forcePending, _displayPending: match._displayPending } }; } }); if (!matchState()) return null; const route = () => router.routesById[matchState().routeId]; const match = () => matchState().match; const componentKey = () => matchState().key ?? matchState().match.id; const out = () => { const Comp = route().options.component ?? router.options.defaultComponent; if (Comp) return (0, solid_js_web.createComponent)(Comp, {}); return (0, solid_js_web.createComponent)(Outlet, {}); }; const keyedOut = () => (0, solid_js_web.createComponent)(solid_js.Show, { get when() { return componentKey(); }, keyed: true, children: (_key) => out() }); return (0, solid_js_web.createComponent)(solid_js.Switch, { get children() { return [ (0, solid_js_web.createComponent)(solid_js.Match, { get when() { return match()._displayPending; }, children: (_) => { const [displayPendingResult] = solid_js.createResource(() => router.getMatch(match().id)?._nonReactive.displayPendingPromise); return (0, solid_js_web.memo)(displayPendingResult); } }), (0, solid_js_web.createComponent)(solid_js.Match, { get when() { return match()._forcePending; }, children: (_) => { const [minPendingResult] = solid_js.createResource(() => router.getMatch(match().id)?._nonReactive.minPendingPromise); return (0, solid_js_web.memo)(minPendingResult); } }), (0, solid_js_web.createComponent)(solid_js.Match, { get when() { return match().status === "pending"; }, children: (_) => { const pendingMinMs = route().options.pendingMinMs ?? router.options.defaultPendingMinMs; if (pendingMinMs) { const routerMatch = router.getMatch(match().id); if (routerMatch && !routerMatch._nonReactive.minPendingPromise) { if (!(_tanstack_router_core_isServer.isServer ?? router.isServer)) { const minPendingPromise = (0, _tanstack_router_core.createControlledPromise)(); routerMatch._nonReactive.minPendingPromise = minPendingPromise; setTimeout(() => { minPendingPromise.resolve(); routerMatch._nonReactive.minPendingPromise = void 0; }, pendingMinMs); } } } const [loaderResult] = solid_js.createResource(async () => { await new Promise((r) => setTimeout(r, 0)); return router.getMatch(match().id)?._nonReactive.loadPromise; }); const FallbackComponent = route().options.pendingComponent ?? router.options.defaultPendingComponent; return [FallbackComponent && pendingMinMs > 0 ? (0, solid_js_web.createComponent)(solid_js_web.Dynamic, { component: FallbackComponent }) : null, (0, solid_js_web.memo)(loaderResult)]; } }), (0, solid_js_web.createComponent)(solid_js.Match, { get when() { return match().status === "notFound"; }, children: (_) => { (0, tiny_invariant.default)((0, _tanstack_router_core.isNotFound)(match().error), "Expected a notFound error"); return (0, solid_js_web.createComponent)(solid_js.Show, { get when() { return matchState().routeId; }, keyed: true, children: (_routeId) => require_renderRouteNotFound.renderRouteNotFound(router, route(), match().error) }); } }), (0, solid_js_web.createComponent)(solid_js.Match, { get when() { return match().status === "redirected"; }, children: (_) => { (0, tiny_invariant.default)((0, _tanstack_router_core.isRedirect)(match().error), "Expected a redirect error"); const [loaderResult] = solid_js.createResource(async () => { await new Promise((r) => setTimeout(r, 0)); return router.getMatch(match().id)?._nonReactive.loadPromise; }); return (0, solid_js_web.memo)(loaderResult); } }), (0, solid_js_web.createComponent)(solid_js.Match, { get when() { return match().status === "error"; }, children: (_) => { throw match().error; } }), (0, solid_js_web.createComponent)(solid_js.Match, { get when() { return match().status === "success"; }, get children() { return keyedOut(); } }) ]; } }); }; var Outlet = () => { const router = require_useRouter.useRouter(); const matchId = solid_js.useContext(require_matchContext.matchContext); const routeId = require_useRouterState.useRouterState({ select: (s) => s.matches.find((d) => d.id === matchId())?.routeId }); const route = () => router.routesById[routeId()]; const parentGlobalNotFound = require_useRouterState.useRouterState({ select: (s) => { const parentMatch = s.matches.find((d) => d.id === matchId()); if (!parentMatch) return false; return parentMatch.globalNotFound; } }); const childMatchId = require_useRouterState.useRouterState({ select: (s) => { const matches = s.matches; return matches[matches.findIndex((d) => d.id === matchId()) + 1]?.id; } }); const childMatchStatus = require_useRouterState.useRouterState({ select: (s) => { const matches = s.matches; return matches[matches.findIndex((d) => d.id === matchId()) + 1]?.status; } }); const shouldShowNotFound = () => childMatchStatus() !== "redirected" && parentGlobalNotFound(); return (0, solid_js_web.createComponent)(solid_js.Show, { get when() { return (0, solid_js_web.memo)(() => !!!shouldShowNotFound())() && childMatchId(); }, get fallback() { return (0, solid_js_web.createComponent)(solid_js.Show, { get when() { return shouldShowNotFound(); }, get children() { return require_renderRouteNotFound.renderRouteNotFound(router, route(), void 0); } }); }, children: (matchIdAccessor) => { const currentMatchId = solid_js.createMemo(() => matchIdAccessor()); return (0, solid_js_web.createComponent)(solid_js.Show, { get when() { return routeId() === _tanstack_router_core.rootRouteId; }, get fallback() { return (0, solid_js_web.createComponent)(Match, { get matchId() { return currentMatchId(); } }); }, get children() { return (0, solid_js_web.createComponent)(solid_js.Suspense, { get fallback() { return (0, solid_js_web.createComponent)(solid_js_web.Dynamic, { get component() { return router.options.defaultPendingComponent; } }); }, get children() { return (0, solid_js_web.createComponent)(Match, { get matchId() { return currentMatchId(); } }); } }); } }); } }); }; //#endregion exports.Match = Match; exports.Outlet = Outlet; //# sourceMappingURL=Match.cjs.map