@devlusoft/devix 0.5.4 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/dev-server.js +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/runtime/error-boundary.d.ts +5 -0
- package/dist/runtime/error-boundary.js +1 -1
- package/dist/runtime/error-boundary.js.map +3 -3
- package/dist/runtime/fetch.d.ts +1 -0
- package/dist/runtime/fetch.js +1 -1
- package/dist/runtime/fetch.js.map +3 -3
- package/dist/runtime/index.js +1 -1
- package/dist/runtime/index.js.map +3 -3
- package/dist/runtime/router-provider.js +1 -1
- package/dist/runtime/router-provider.js.map +3 -3
- package/dist/runtime/server-app.js +1 -1
- package/dist/runtime/server-app.js.map +3 -3
- package/dist/runtime/server-client.js +1 -1
- package/dist/runtime/server-client.js.map +3 -3
- package/dist/server/api.js +1 -1
- package/dist/server/api.js.map +3 -3
- package/dist/server/render.js +1 -1
- package/dist/server/render.js.map +3 -3
- package/dist/server/server-bound.js +1 -1
- package/dist/server/server-bound.js.map +3 -3
- package/dist/utils/banner.js +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/runtime/router-provider.tsx", "../../src/runtime/head.tsx", "../../src/runtime/context.tsx", "../../src/runtime/error-boundary.tsx", "../../src/runtime/url.ts", "../../src/runtime/link.tsx", "../../src/utils/cookies.ts", "../../src/utils/response.ts", "../../src/runtime/create-handler.ts", "../../src/runtime/fetch.ts", "../../src/runtime/server-client.ts", "../../src/runtime/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { ComponentType, ReactNode, useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { ErrorProps, LayoutProps, PageProps } from \"../server/types\";\nimport { Metadata, Viewport } from \"../types\";\n\nconst DEFAULT_VIEWPORT: Viewport = { width: 'device-width', initialScale: 1 }\nimport { HeadSlot } from \"./head\";\nimport { NavigateOptions, PageMetaContext, RouteDataContext, RouterContext } from \"./context\";\nimport { DevixErrorBoundary } from \"./error-boundary\";\nimport { resolveTo } from \"./url\";\nimport type { Redirect } from \"../utils/response\";\n\nexport interface ClientRouteMatcher {\n matchClientRoute: (pathname: string) => {\n load: () => Promise<any>\n loadLayouts: (() => Promise<any>)[]\n params: Record<string, string>\n } | null\n loadErrorPage: () => Promise<ComponentType<ErrorProps> | null>\n getDefaultErrorPage: () => ComponentType<ErrorProps> | null\n}\n\ninterface RouteState {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n guardData: unknown\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n pendingError?: ErrorProps\n ErrorPage?: ComponentType<ErrorProps>\n}\n\nexport function useRouter() {\n return useContext(RouterContext)\n}\n\nconst noopNavigate = () => Promise.resolve()\nconst noopRevalidate = () => Promise.resolve()\n\nexport function useNavigate() {\n const ctx = useContext(RouterContext)\n return ctx?.navigate ?? noopNavigate\n}\n\nexport function useRevalidate() {\n const ctx = useContext(RouterContext)\n return ctx?.revalidate ?? noopRevalidate\n}\n\nexport function useParams<T extends Record<string, string>>() {\n const ctx = useContext(RouteDataContext)\n if (!ctx) throw new Error(\"useParams must be used within a route or layout\")\n return ctx.params as T\n}\n\ntype LoaderReturnType<T> = T extends (...args: any[]) => Promise<infer R>\n ? [Exclude<R, Redirect | void | undefined>] extends [never] ? undefined : Exclude<R, Redirect | void | undefined>\n : T extends (...args: any[]) => infer R\n ? [Exclude<R, Redirect | void | undefined>] extends [never] ? undefined : Exclude<R, Redirect | void | undefined>\n : T\n\nexport function useLoaderData<T>() {\n const ctx = useContext(RouteDataContext)\n if (!ctx) throw new Error(\"useLoaderData must be used within a route or layout\")\n return ctx.loaderData as LoaderReturnType<T>\n}\n\ntype GuardDataReturn<TGuard> =\n TGuard extends (...args: any[]) => infer R\n ? Exclude<Awaited<R>, string | Redirect | null | undefined | { readonly statusCode: number; readonly message: string }>\n : unknown\n\n/**\n * Devuelve el `guardData` resuelto en el \u00FAltimo guard que retorn\u00F3 un objeto\n * (layout \u2192 page, en orden). Tipado al retorno del guard si pasas `typeof guard`.\n *\n * ```ts\n * export async function guard({ request }: LoaderContext) {\n * const session = await getSession(request)\n * if (!session) return '/login'\n * return session\n * }\n *\n * function Header() {\n * const session = useGuardData<typeof guard>()\n * return <span>{session.user.name}</span>\n * }\n * ```\n */\nexport function useGuardData<TGuard = unknown>(): GuardDataReturn<TGuard> {\n const ctx = useContext(RouterContext)\n if (!ctx) throw new Error(\"useGuardData must be used within a route or layout\")\n return ctx.guardData as GuardDataReturn<TGuard>\n}\n\ninterface PrefetchEntry {\n promise: Promise<{ pageMod: any; layoutMods: any[]; data: any } | null>\n controller: AbortController\n}\n\ninterface RouterProviderProps extends ClientRouteMatcher {\n initialData: unknown\n initialParams: Record<string, string>\n initialPage: ComponentType<PageProps>\n initialLayouts?: ComponentType<LayoutProps>[]\n initialLayoutsData?: unknown[]\n initialGuardData?: unknown\n initialMeta?: Metadata | null\n initialViewport?: Viewport\n initialError?: ErrorProps\n initialErrorPage?: ComponentType<ErrorProps>\n clientEntry: string\n}\n\nexport function RouterProvider({\n initialData,\n initialParams,\n initialPage,\n initialLayouts = [],\n initialLayoutsData = [],\n initialGuardData = null,\n initialMeta,\n initialViewport,\n initialError,\n initialErrorPage,\n clientEntry,\n matchClientRoute,\n loadErrorPage,\n getDefaultErrorPage,\n}: RouterProviderProps) {\n\n const [state, setState] = useState<RouteState>({\n pathname: window.location.pathname,\n params: initialParams,\n loaderData: initialData,\n layoutsData: initialLayoutsData,\n guardData: initialGuardData,\n Page: initialPage,\n layouts: initialLayouts,\n metadata: initialMeta ?? null,\n viewport: initialViewport,\n pendingError: initialError,\n ErrorPage: initialErrorPage,\n })\n\n const navigatingRef = useRef<AbortController | null>(null)\n const [isNavigating, setIsNavigating] = useState(false)\n\n const prefetchCacheRef = useRef<Map<string, PrefetchEntry>>(new Map())\n\n const prefetchRoute = useCallback((href: string) => {\n const resolved = resolveTo(href)\n if (resolved.kind === 'external') return\n\n const key = resolved.href\n if (prefetchCacheRef.current.has(key)) return\n const matched = matchClientRoute(resolved.pathname)\n if (!matched) return\n\n const controller = new AbortController()\n const promise = Promise.all([\n Promise.all([matched.load(), ...matched.loadLayouts.map(l => l())]),\n fetch(`/_data${key}`, { headers: { Accept: 'application/json' }, signal: controller.signal })\n ]).then(async ([[pageMod, ...layoutMods], dataRes]) => {\n if (!dataRes.ok || !pageMod.default) return null\n const data = await dataRes.json()\n return { pageMod, layoutMods, data }\n }).catch(() => null)\n\n const expireTimer = setTimeout(() => {\n controller.abort()\n prefetchCacheRef.current.delete(key)\n }, 3000)\n promise.finally(() => clearTimeout(expireTimer))\n\n prefetchCacheRef.current.set(key, { promise, controller })\n }, [])\n\n const loadRoute = useCallback(async (to: string, controller: AbortController) => {\n const pathname = to.split('?')[0].split('#')[0]\n const matched = matchClientRoute(pathname)\n if (!matched) {\n const ErrorPage = await loadErrorPage() ?? getDefaultErrorPage()\n setState(prev => ({\n ...prev,\n pathname: pathname,\n pendingError: { statusCode: 404, message: 'Not found' },\n ErrorPage: ErrorPage ?? undefined,\n }))\n return\n }\n\n const cached = prefetchCacheRef.current.get(to)\n if (cached) prefetchCacheRef.current.delete(to)\n const prefetched = cached ? await cached.promise : null\n\n if (controller.signal.aborted) return\n\n let pageMod: any, layoutMods: any[], data: any\n\n if (prefetched) {\n ;({ pageMod, layoutMods, data } = prefetched)\n } else {\n const [[pm, ...lm], dataRes] = await Promise.all([\n Promise.all([\n matched.load(),\n ...matched.loadLayouts.map(l => l()),\n ]),\n fetch(`/_data${to}`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n ])\n\n if (controller.signal.aborted) return\n if (!pm.default) return\n\n if (!dataRes.ok) {\n const ct = dataRes.headers.get('Content-Type') ?? ''\n let errorBody: { statusCode?: number; message?: string; code?: string; data?: unknown } | null = null\n try {\n if (ct.includes('application/json')) errorBody = await dataRes.json()\n else if (ct.includes('text/plain')) errorBody = { message: await dataRes.text() }\n } catch { /* ignorar errores de parsing */ }\n\n const headers: Record<string, string> = {}\n dataRes.headers.forEach((value, key) => { headers[key] = value })\n\n const ErrorPage = await loadErrorPage() ?? getDefaultErrorPage()\n setState(prev => ({\n ...prev,\n pathname,\n pendingError: {\n statusCode: errorBody?.statusCode ?? dataRes.status,\n message: errorBody?.message ?? 'Server error',\n code: errorBody?.code,\n data: errorBody?.data,\n headers,\n },\n ErrorPage: ErrorPage ?? undefined,\n }))\n return\n }\n\n pageMod = pm\n layoutMods = lm\n data = await dataRes.json()\n }\n\n if (data.redirect) {\n if (data.redirectReplace) {\n window.history.replaceState(null, '', data.redirect)\n } else {\n window.history.pushState(null, '', data.redirect)\n }\n await loadRoute(data.redirect, controller)\n return\n }\n\n setState({\n pathname,\n params: data.params ?? {},\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n guardData: data.guardData ?? null,\n Page: pageMod.default,\n layouts: layoutMods.map(m => m.default),\n metadata: data.metadata ?? null,\n viewport: data.viewport ?? DEFAULT_VIEWPORT,\n })\n\n const hash = to.includes('#') ? to.split('#')[1] : null\n const scrollBehavior = getComputedStyle(document.documentElement).scrollBehavior as ScrollBehavior\n if (hash) {\n requestAnimationFrame(() => {\n document.getElementById(hash)?.scrollIntoView({ behavior: scrollBehavior })\n })\n } else {\n window.scrollTo({ top: 0, behavior: scrollBehavior })\n }\n }, [])\n\n const navigate = useCallback(async (to: string, options?: NavigateOptions) => {\n const resolved = resolveTo(to)\n if (resolved.kind === 'external') {\n window.location.href = resolved.url.href\n return\n }\n const href = resolved.href\n\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n setIsNavigating(true)\n const run = async () => {\n window.history[options?.replace ? 'replaceState' : 'pushState'](null, '', href)\n await loadRoute(href, controller)\n }\n try {\n if (options?.viewTransition && 'startViewTransition' in document) {\n await (document as any).startViewTransition(run).finished\n } else {\n await run()\n }\n } finally {\n if (!controller.signal.aborted) setIsNavigating(false)\n }\n }, [loadRoute])\n\n const revalidatingRef = useRef<AbortController | null>(null)\n\n const revalidate = useCallback(async () => {\n revalidatingRef.current?.abort()\n const controller = new AbortController()\n revalidatingRef.current = controller\n\n const to = window.location.pathname + window.location.search\n let dataRes: Response\n try {\n dataRes = await fetch(`/_data${to}`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n } catch (err) {\n if ((err as Error).name === 'AbortError') return\n throw err\n }\n\n if (controller.signal.aborted) return\n if (!dataRes.ok) return\n\n const data = await dataRes.json()\n if (controller.signal.aborted) return\n\n if (data.redirect) {\n await navigate(data.redirect, { replace: data.redirectReplace })\n return\n }\n setState(prev => ({\n ...prev,\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n guardData: data.guardData ?? null,\n params: data.params ?? prev.params,\n metadata: data.metadata ?? prev.metadata,\n viewport: data.viewport ?? prev.viewport,\n }))\n }, [navigate])\n\n useEffect(() => {\n const handlePop = () => {\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n const to = window.location.pathname + window.location.search\n loadRoute(to, controller).catch(err => {\n if (err.name !== 'AbortError') console.error('[router] popstate error:', err)\n })\n }\n window.addEventListener(\"popstate\", handlePop)\n return () => window.removeEventListener(\"popstate\", handlePop)\n }, [loadRoute])\n\n let content: ReactNode\n\n if (state.pendingError) {\n content = state.ErrorPage\n ? <state.ErrorPage {...state.pendingError} />\n : <h1>{state.pendingError.statusCode}</h1>\n } else {\n let tree: ReactNode = (\n <RouteDataContext value={{ loaderData: state.loaderData, params: state.params }}>\n <state.Page data={state.loaderData} params={state.params} url={state.pathname} />\n </RouteDataContext>\n )\n\n for (let i = state.layouts.length - 1; i >= 0; i--) {\n const Layout = state.layouts[i]\n const layoutData = state.layoutsData[i]\n tree = (\n <RouteDataContext value={{ loaderData: layoutData, params: state.params }}>\n <Layout data={layoutData} params={state.params}>{tree}</Layout>\n </RouteDataContext>\n )\n }\n\n content = (\n <DevixErrorBoundary key={state.pathname} ErrorPage={state.ErrorPage}>\n {tree}\n </DevixErrorBoundary>\n )\n }\n\n return (\n <PageMetaContext value={{\n metadata: state.metadata,\n viewport: state.viewport,\n clientEntry,\n }}>\n <HeadSlot metadata={state.metadata} viewport={state.viewport} />\n <RouterContext value={{ ...state, isNavigating, navigate, revalidate, prefetchRoute }}>\n {content}\n </RouterContext>\n </PageMetaContext>\n )\n}", "import { Metadata, MetadataIcon, Viewport } from \"../types\";\nimport { ReactNode } from \"react\";\n\ntype MetaTag =\n | { tag: 'title'; children: string }\n | { tag: 'meta'; name?: string; property?: string; content: string }\n | { tag: 'link'; rel: string; href: string; hrefLang?: string; type?: string; sizes?: string }\n\nfunction collectTags(metadata: Metadata, viewport?: Viewport): MetaTag[] {\n const tags: MetaTag[] = []\n\n if (metadata.title)\n tags.push({ tag: 'title', children: metadata.title })\n if (metadata.description)\n tags.push({ tag: 'meta', name: 'description', content: metadata.description })\n if (metadata.keywords?.length)\n tags.push({ tag: 'meta', name: 'keywords', content: metadata.keywords.join(', ') })\n\n const ogTitle = metadata.og?.title ?? metadata.title\n if (ogTitle) tags.push({ tag: 'meta', property: 'og:title', content: ogTitle })\n const ogDesc = metadata.og?.description ?? metadata.description\n if (ogDesc) tags.push({ tag: 'meta', property: 'og:description', content: ogDesc })\n if (metadata.og?.image) tags.push({ tag: 'meta', property: 'og:image', content: metadata.og.image })\n if (metadata.og?.type) tags.push({ tag: 'meta', property: 'og:type', content: metadata.og.type })\n if (metadata.og?.url) tags.push({ tag: 'meta', property: 'og:url', content: metadata.og.url })\n\n const twTitle = metadata.twitter?.title ?? metadata.title\n if (twTitle) tags.push({ tag: 'meta', name: 'twitter:title', content: twTitle })\n const twDesc = metadata.twitter?.description ?? metadata.description\n if (twDesc) tags.push({ tag: 'meta', name: 'twitter:description', content: twDesc })\n if (metadata.twitter?.card) tags.push({\n tag: 'meta', name: 'twitter:card', content:\n metadata.twitter.card\n })\n if (metadata.twitter?.image) tags.push({\n tag: 'meta', name: 'twitter:image', content:\n metadata.twitter.image\n })\n if (metadata.twitter?.creator) tags.push({\n tag: 'meta', name: 'twitter:creator', content:\n metadata.twitter.creator\n })\n\n if (metadata.canonical) tags.push({ tag: 'link', rel: 'canonical', href: metadata.canonical })\n if (metadata.robots) tags.push({ tag: 'meta', name: 'robots', content: metadata.robots })\n if (metadata.alternates) {\n for (const [lang, href] of Object.entries(metadata.alternates))\n tags.push({ tag: 'link', rel: 'alternate', href, hrefLang: lang })\n }\n\n if (metadata.icons) {\n const raw = Array.isArray(metadata.icons) ? metadata.icons : [metadata.icons]\n for (const icon of raw) {\n const resolved: MetadataIcon = typeof icon === 'string' ? { href: icon } : icon\n tags.push({\n tag: 'link',\n rel: resolved.rel ?? 'icon',\n href: resolved.href,\n ...(resolved.type && { type: resolved.type }),\n ...(resolved.sizes && { sizes: resolved.sizes }),\n })\n }\n }\n\n if (viewport) {\n const parts: string[] = []\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`)\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`)\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`)\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' :\n 'no'}`)\n if (parts.length) tags.push({ tag: 'meta', name: 'viewport', content: parts.join(', ') })\n if (viewport.themeColor) tags.push({\n tag: 'meta', name: 'theme-color', content: viewport.themeColor\n })\n }\n\n return tags\n}\n\nexport function HeadSlot({ metadata, viewport }: { metadata: Metadata | null, viewport?: Viewport }) {\n if (typeof window === 'undefined' || !metadata) return null\n return <>{buildHeadNodes(metadata, viewport)}</>\n}\n\nexport function buildHeadNodes(metadata: Metadata, viewport?: Viewport): ReactNode {\n const tags = collectTags(metadata, viewport)\n\n return <>\n {tags.map((t, i) => {\n if (t.tag === 'title') return <title key={i}>{t.children}</title>\n if (t.tag === 'link') return <link key={i} rel={t.rel} href={t.href} hrefLang={t.hrefLang} type={t.type} sizes={t.sizes} />\n return <meta key={i} name={t.name} property={t.property} content={t.content} />\n })}\n </>\n}", "import {createContext, Context, ComponentType} from \"react\";\nimport {Metadata, Viewport} from \"../types\";\nimport {LayoutProps, PageProps} from \"../server/types\";\n\nexport interface NavigateOptions {\n replace?: boolean\n viewTransition?: boolean\n}\n\nexport interface RouterContextValue {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n guardData: unknown\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n navigate: (to: string, options?: NavigateOptions) => Promise<void>\n revalidate: () => Promise<void>\n prefetchRoute: (href: string) => void\n isNavigating: boolean\n}\n\nexport interface PageMetaContextValue {\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry?: string\n}\n\nexport interface RouteDataContextValue {\n loaderData: unknown\n params: Record<string, string>\n}\n\nconst g = globalThis as any\n\ng.__devix_RouterContext__ ??= createContext<RouterContextValue | null>(null)\nexport const RouterContext: Context<RouterContextValue | null> = g.__devix_RouterContext__\n\ng.__devix_PageMetaContext__ ??= createContext<PageMetaContextValue | null>(null)\ng.__devix_RouteDataContext__ ??= createContext<RouteDataContextValue | null>(null)\n\nexport const PageMetaContext: Context<PageMetaContextValue | null> = g.__devix_PageMetaContext__\nexport const RouteDataContext: Context<RouteDataContextValue | null> = g.__devix_RouteDataContext__\n\n", "import {Component, ComponentType, ReactNode} from \"react\";\nimport {ErrorProps} from \"../server/types\";\n\ninterface Props {\n ErrorPage?: ComponentType<ErrorProps>\n children: ReactNode\n}\n\ninterface State {\n error: ErrorProps | null\n}\n\nexport class DevixErrorBoundary extends Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(err: unknown): State {\n if (err instanceof DevixError) {\n return {\n error: {statusCode: err.statusCode, message: err.message}\n }\n }\n return {\n error: {statusCode: 500, message: err instanceof Error ? err.message : 'Unknown error'}\n }\n }\n\n render() {\n if (this.state.error && this.props.ErrorPage) {\n return <this.props.ErrorPage {...this.state.error} />\n }\n if (this.state.error) {\n return <h1>{this.state.error.statusCode}</h1>\n }\n return this.props.children\n }\n}\n\nexport interface DevixErrorOptions {\n code?: string\n data?: unknown\n}\n\nexport class DevixError extends Error {\n statusCode: number\n code?: string\n data?: unknown\n constructor(statusCode: number, message: string, options?: DevixErrorOptions) {\n super(message)\n this.name = 'DevixError'\n this.statusCode = statusCode\n this.code = options?.code\n this.data = options?.data\n }\n}\n", "export type ResolvedTo =\n | { kind: 'internal'; pathname: string; href: string }\n | { kind: 'external'; url: URL }\n\nexport function resolveTo(to: string): ResolvedTo {\n const base = new URL(window.location.href)\n if (!base.pathname.endsWith('/')) base.pathname += '/'\n\n const url = new URL(to, base)\n\n if (url.origin !== window.location.origin) {\n return { kind: 'external', url }\n }\n\n const pathname = url.pathname.length > 1\n ? url.pathname.replace(/\\/$/, '')\n : url.pathname\n\n return {\n kind: 'internal',\n pathname,\n href: pathname + url.search + url.hash,\n }\n}\n", "import { AnchorHTMLAttributes, MouseEventHandler, useCallback, useContext, useRef } from \"react\"\nimport { NavigateOptions, RouterContext } from './context'\nimport { resolveTo } from './url'\n\ninterface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n href: string\n prefetch?: 'hover' | 'none'\n replace?: boolean\n viewTransition?: boolean\n}\n\nexport function Link({ href, prefetch = 'hover', replace = false, viewTransition = false, children, ...props }: LinkProps) {\n const router = useContext(RouterContext)\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const cancelHoverTimer = useCallback(() => {\n if (hoverTimerRef.current !== null) {\n clearTimeout(hoverTimerRef.current)\n hoverTimerRef.current = null\n }\n }, [])\n\n const triggerPrefetch = useCallback(() => {\n if (!router || prefetch === 'none') return\n router.prefetchRoute(href)\n }, [href, prefetch, router])\n\n const handleMouseEnter = useCallback(() => {\n if (prefetch === 'none') return\n hoverTimerRef.current = setTimeout(triggerPrefetch, 50)\n }, [prefetch, triggerPrefetch])\n\n const handleMouseLeave = useCallback(() => {\n cancelHoverTimer()\n }, [cancelHoverTimer])\n\n const handleTouchStart = useCallback(() => {\n cancelHoverTimer()\n triggerPrefetch()\n }, [cancelHoverTimer, triggerPrefetch])\n\n const handleClick: MouseEventHandler<HTMLAnchorElement> = (e) => {\n cancelHoverTimer()\n if (!router) return\n if (e.ctrlKey || e.metaKey || e.shiftKey || e.button !== 0) return\n if (resolveTo(href).kind === 'external') return\n e.preventDefault()\n const options: NavigateOptions = { replace, viewTransition }\n router.navigate(href, options)\n }\n\n return (\n <a\n href={href}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onTouchStart={handleTouchStart}\n {...props}\n >\n {children}\n </a>\n )\n}", "export interface CookieOptions {\n httpOnly?: boolean\n secure?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n maxAge?: number\n expires?: Date\n path?: string\n domain?: string\n}\n\nexport function getCookie(req: Request, name: string): string | undefined {\n const header = req.headers.get('cookie')\n if (!header) return undefined\n for (const part of header.split(';')) {\n const [key, ...rest] = part.trim().split('=')\n if (key.trim() === name) return decodeURIComponent(rest.join('='))\n }\n return undefined\n}\n\nexport function setCookie(headers: Headers, name: string, value: string, options: CookieOptions = {}): void {\n let cookie = `${name}=${encodeURIComponent(value)}; Path=${options.path ?? '/'}`\n if (options.domain) cookie += `; Domain=${options.domain}`\n if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`\n if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`\n if (options.httpOnly) cookie += `; HttpOnly`\n if (options.secure) cookie += `; Secure`\n if (options.sameSite) cookie += `; SameSite=${options.sameSite}`\n headers.append('Set-Cookie', cookie)\n}\n\nexport function deleteCookie(headers: Headers, name: string, options: Pick<CookieOptions, 'path' | 'domain'> = {}): void {\n setCookie(headers, name, '', {...options, maxAge: 0, expires: new Date(0)})\n}\n", "export type JsonResponse<T = unknown, S extends number = number> = Response & {\n readonly __body: T\n readonly __status: S\n}\n\nexport function json<const T>(data: T): JsonResponse<T, 200>\nexport function json<const T, const S extends number>(data: T, status: S): JsonResponse<T, S>\nexport function json<const T>(data: T, status: number = 200): JsonResponse<T, any> {\n return new Response(JSON.stringify(data), {\n status,\n headers: {'Content-Type': 'application/json'},\n }) as JsonResponse<T, any>\n}\n\nexport const text = (body: string, status = 200): Response =>\n new Response(body, {status, headers: {'Content-Type': 'text/plain; charset=utf-8'}})\n\nconst REDIRECT_BRAND = Symbol.for('devix.redirect')\n\nexport interface RedirectOptions {\n status?: number\n replace?: boolean\n}\n\nexport interface Redirect {\n readonly [REDIRECT_BRAND]: true\n readonly url: string\n readonly status: number\n readonly replace: boolean\n}\n\nexport function redirect(url: string, statusOrOptions?: number | RedirectOptions): Redirect {\n const status = typeof statusOrOptions === 'number' ? statusOrOptions : (statusOrOptions?.status ?? 302)\n const replace = typeof statusOrOptions === 'object' ? (statusOrOptions?.replace ?? false) : false\n return {[REDIRECT_BRAND]: true, url, status, replace} as Redirect\n}\n\nexport function isRedirect(value: unknown): value is Redirect {\n return typeof value === 'object' && value !== null && REDIRECT_BRAND in value\n}\n\nconst ERROR_BRAND = Symbol.for('devix.loaderError')\n\nexport interface RouteError {\n readonly [ERROR_BRAND]: true\n readonly statusCode: number\n readonly message: string\n readonly code?: string\n readonly data?: unknown\n}\n\nexport interface ErrorOptions {\n code?: string\n data?: unknown\n}\n\n/**\n * Crea un error tipado que funciona en loaders, guards y handlers API.\n *\n * En loaders/guards: ret\u00F3rnalo (no lo lances) y el sistema renderiza `error.tsx`.\n * En handlers API: ret\u00F3rnalo y el sistema serializa el shape `ErrorBody` como JSON\n * con el statusCode correcto.\n *\n * ```ts\n * return error(404, 'Post no encontrado', { code: 'POST_NOT_FOUND' })\n * ```\n */\nexport function error(statusCode: number, message: string, options?: ErrorOptions): RouteError {\n return {\n [ERROR_BRAND]: true,\n statusCode,\n message,\n code: options?.code,\n data: options?.data,\n } as RouteError\n}\n\nexport function isLoaderError(value: unknown): value is RouteError {\n return typeof value === 'object' && value !== null && ERROR_BRAND in value\n}\n\n/**\n * Shape p\u00FAblico del body de un error API. Todos los errores emitidos por `error()`\n * o `DevixError` se serializan a este shape. `FetchError.body` del cliente lo recibe.\n */\nexport interface ErrorBody {\n statusCode: number\n message: string\n code?: string\n data?: unknown\n}\n\nexport function errorToBody(err: { statusCode: number; message: string; code?: string; data?: unknown }): ErrorBody {\n const body: ErrorBody = { statusCode: err.statusCode, message: err.message }\n if (err.code !== undefined) body.code = err.code\n if (err.data !== undefined) body.data = err.data\n return body\n}\n", "import type {RouteContext} from './api-context'\nimport type {StandardSchemaV1} from '../utils/standard-schema'\n\nexport const HANDLER_BRAND = '__devix_handler__' as const\n\nexport interface DevixHandler<TBody = undefined, TReturn = unknown> {\n readonly [HANDLER_BRAND]: true\n readonly fn: (...args: any[]) => any\n readonly schema?: StandardSchemaV1\n readonly __body: TBody\n readonly __return: TReturn\n}\n\n/**\n * Crea un handler API tipado.\n *\n * El primer argumento (si lo declaras) es el body parseado autom\u00E1ticamente:\n * - `application/json` \u2192 objeto JS\n * - `multipart/form-data` o `application/x-www-form-urlencoded` \u2192 FormData\n * - cualquier otro \u2192 string\n *\n * El segundo argumento es `ctx: RouteContext` con `request`, `url`, `params`,\n * y los helpers `get`/`set` para state heredado de middleware.\n *\n * ```ts\n * // sin body\n * export const GET = createHandler(async () => ({ ok: true }))\n *\n * // con body tipado\n * export const POST = createHandler(async (body: Login) => ...)\n *\n * // con body y ctx\n * export const POST = createHandler(async (body: Login, ctx) => {\n * const user = ctx.get<User>('user')\n * const ua = ctx.request.headers.get('User-Agent')\n * })\n *\n * // solo ctx, sin body (ej. GET que necesita query params)\n * export const GET = createHandler(async (_body, ctx) => {\n * const filter = ctx.url.searchParams.get('filter')\n * })\n * ```\n */\ntype ExtractBody<TFn> =\n TFn extends () => any ? undefined :\n TFn extends (body: infer B, ...rest: any[]) => any ? B :\n undefined\n\ntype HandlerFn = ((body: any, ctx: RouteContext) => any) | (() => any)\n\nexport function createHandler<TFn extends HandlerFn>(\n fn: TFn,\n): DevixHandler<ExtractBody<TFn>, Awaited<ReturnType<TFn>>>\n\n/**\n * Overload con Standard Schema. devix valida el body autom\u00E1ticamente y, si\n * falla, devuelve `400` con shape `ErrorBody` y `code: 'VALIDATION_ERROR'`.\n * El body recibido por el handler est\u00E1 ya validado y tipado al output del schema.\n *\n * ```ts\n * import { z } from 'zod'\n *\n * const Input = z.object({ email: z.email(), password: z.string().min(8) })\n *\n * export const POST = createHandler(Input, async (body, ctx) => {\n * // body: z.infer<typeof Input>, ya validado\n * })\n * ```\n */\nexport function createHandler<TSchema extends StandardSchemaV1, TReturn>(\n schema: TSchema,\n fn: (body: StandardSchemaV1.InferOutput<TSchema>, ctx: RouteContext) => TReturn | Promise<TReturn>,\n): DevixHandler<StandardSchemaV1.InferInput<TSchema>, Awaited<TReturn>>\n\nexport function createHandler(\n schemaOrFn: StandardSchemaV1 | ((...args: any[]) => any),\n maybeFn?: (...args: any[]) => any,\n): DevixHandler<any, any> {\n if (maybeFn) {\n return {\n [HANDLER_BRAND]: true,\n fn: maybeFn,\n schema: schemaOrFn as StandardSchemaV1,\n } as unknown as DevixHandler<any, any>\n }\n return {\n [HANDLER_BRAND]: true,\n fn: schemaOrFn as (...args: any[]) => any,\n } as unknown as DevixHandler<any, any>\n}\n", "export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\n\nfunction extractMessage(body: unknown): string | null {\n if (body && typeof body === 'object' && 'message' in body) {\n const m = (body as {message: unknown}).message\n if (typeof m === 'string' && m.length > 0) return m\n }\n return null\n}\n\nexport class FetchError<E = unknown> extends Error {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly response: Response,\n public readonly body?: E,\n ) {\n super(extractMessage(body) ?? `HTTP ${status}: ${statusText}`)\n this.name = 'FetchError'\n }\n\n get code(): string | undefined {\n if (this.body && typeof this.body === 'object' && 'code' in this.body) {\n const c = (this.body as {code: unknown}).code\n return typeof c === 'string' ? c : undefined\n }\n return undefined\n }\n}\n", "import {FetchError, type HttpMethod} from './fetch'\n\nexport interface ServerFetchOptions {\n headers?: HeadersInit\n signal?: AbortSignal\n}\n\nconst PROXY_PREFIX = '/_devix/server'\n\nasync function proxyFetch<TResponse>(\n namespace: string,\n method: HttpMethod,\n path: string,\n body: unknown,\n options?: ServerFetchOptions,\n): Promise<TResponse> {\n const headers = new Headers(options?.headers)\n let sendBody: BodyInit | undefined\n if (body !== undefined && body !== null) {\n if (body instanceof FormData || body instanceof Blob || body instanceof ArrayBuffer) {\n sendBody = body\n } else {\n sendBody = JSON.stringify(body)\n if (!headers.has('Content-Type')) headers.set('Content-Type', 'application/json')\n }\n }\n\n const url = `${PROXY_PREFIX}/${namespace}${path}`\n const response = await fetch(url, {method, headers, body: sendBody, signal: options?.signal})\n\n const isEmptyBody = response.status === 204 || response.headers.get('Content-Length') === '0'\n\n if (!response.ok) {\n const ct = response.headers.get('Content-Type') ?? ''\n let errorBody: unknown\n if (!isEmptyBody && ct.includes('application/json')) {\n try { errorBody = await response.json() } catch { /* body vac\u00EDo o inv\u00E1lido */ }\n }\n throw new FetchError(response.status, response.statusText, response, errorBody)\n }\n\n if (isEmptyBody) return null as TResponse\n\n const ct = response.headers.get('Content-Type') ?? ''\n if (ct.includes('application/json')) return await response.json() as TResponse\n return await response.text() as unknown as TResponse\n}\n\n/**\n * Cliente para llamar a un backend remoto configurado en `devix.config.ts`.\n *\n * El tipo de respuesta se declara en cada call site con un generic:\n *\n * ```ts\n * const me = await $server.api.get<User>('/v1/me')\n * const post = await $server.api.post<Post>('/v1/posts', { title: 'Hola' })\n * ```\n *\n * Si no pasas el generic, el retorno es `unknown`. devix no puede inferir tipos del\n * backend remoto (vive fuera del repo) \u2014 el cast en el call site ES el contrato.\n */\nexport interface BackendClient {\n get<TResponse = unknown>(path: string, options?: ServerFetchOptions): Promise<TResponse>\n post<TResponse = unknown>(path: string, body?: unknown, options?: ServerFetchOptions): Promise<TResponse>\n put<TResponse = unknown>(path: string, body?: unknown, options?: ServerFetchOptions): Promise<TResponse>\n patch<TResponse = unknown>(path: string, body?: unknown, options?: ServerFetchOptions): Promise<TResponse>\n delete<TResponse = unknown>(path: string, options?: ServerFetchOptions): Promise<TResponse>\n}\n\nfunction makeBackendClient(namespace: string): BackendClient {\n return {\n get: (path, options) => proxyFetch(namespace, 'GET', path, undefined, options),\n post: (path, body, options) => proxyFetch(namespace, 'POST', path, body, options),\n put: (path, body, options) => proxyFetch(namespace, 'PUT', path, body, options),\n patch: (path, body, options) => proxyFetch(namespace, 'PATCH', path, body, options),\n delete: (path, options) => proxyFetch(namespace, 'DELETE', path, undefined, options),\n }\n}\n\n/**\n * Cliente para llamar a backends remotos configurados en `devix.config.ts`.\n *\n * En cliente: las requests pasan por el proxy interno `/_devix/server/<namespace>/...`\n * donde devix aplica `prepare` (auth pass-through, tracing, etc.) y reenv\u00EDa al backend.\n *\n * En server (loaders/handlers): NO uses este import \u2014 usa `ctx.$server` que recibe\n * el request del usuario para que `prepare` pueda leer cookies.\n *\n * ```ts\n * const me = await $server.api.get<User>('/v1/me')\n * const post = await $server.api.post<Post>('/v1/posts', { title: 'Hola' })\n * ```\n */\nexport const $server: Record<string, BackendClient> = new Proxy({} as Record<string, BackendClient>, {\n get(target, namespace: string) {\n if (typeof namespace !== 'string') return undefined\n if (!target[namespace]) target[namespace] = makeBackendClient(namespace)\n return target[namespace]\n },\n})\n", "export {useRouter, useNavigate, useRevalidate, useParams, useLoaderData, useGuardData, RouterProvider} from \"./router-provider\"\n\nexport {Link} from \"./link\"\n\nexport type { Metadata, MetadataIcon, Viewport, LoaderContext, LoaderContextWithGuard, LoaderFunction, GuardFunction } from '../types'\nexport type { NavigateOptions } from './context'\nexport type { PageProps, LayoutProps, PageModule, LayoutModule, ErrorProps } from '../server/types'\nexport type { RouteHandler, RouteResult, MiddlewareModule } from './api-context'\nexport {getCookie, setCookie, deleteCookie} from '../utils/cookies'\nexport type {CookieOptions} from '../utils/cookies'\nexport {json, text, redirect, error} from '../utils/response'\nexport type {JsonResponse, Redirect, RedirectOptions, RouteError, ErrorOptions, ErrorBody} from '../utils/response'\nexport {createHandler} from './create-handler'\nexport type {DevixHandler} from './create-handler'\nexport type {StandardSchemaV1} from '../utils/standard-schema'\nexport {FetchError} from './fetch'\nexport {$server} from './server-client'\nexport type {BackendClient, ServerFetchOptions} from './server-client'\nexport {DevixError} from './error-boundary'\nexport type {DevixErrorOptions} from './error-boundary'\nexport type {HttpMethod} from './fetch'\n\nimport {FetchError, type HttpMethod} from './fetch'\n\nexport interface ApiRoutes {}\n\ntype ApiKey<M extends HttpMethod, P extends string> = `${M} ${P}`\ntype MatchingKey<M extends HttpMethod, P extends string> = {\n [K in keyof ApiRoutes]: K extends ApiKey<M, P> ? K : never\n}[keyof ApiRoutes]\ntype RouteData<M extends HttpMethod, P extends string> = ApiRoutes[MatchingKey<M, P>]\ntype AllApiPaths = {\n [K in keyof ApiRoutes]: K extends `${HttpMethod} ${infer P}` ? P : never\n}[keyof ApiRoutes]\ntype ApiPath = AllApiPaths | (string & {})\ntype ExtractBody<D> = D extends { __body: infer B } ? B : never\ntype ExtractResponse<D> = D extends { __response: infer R } ? R : D\ntype InferBody<M extends HttpMethod, P extends string> = ExtractBody<RouteData<M, P>>\ntype InferResult<M extends HttpMethod, P extends string> = ExtractResponse<RouteData<M, P>>\ntype BodyOption<M extends HttpMethod, P extends string> = [InferBody<M, P>] extends [never] ? unknown : InferBody<M, P>\n\nexport interface FetchOptions<M extends HttpMethod = 'GET', P extends string = string> {\n method?: M\n body?: BodyOption<M, P>\n headers?: HeadersInit\n signal?: AbortSignal\n}\n\nexport async function $fetch<P extends ApiPath = ApiPath, M extends HttpMethod = 'GET'>(\n path: P,\n options?: FetchOptions<M, P>\n): Promise<InferResult<M, P>> {\n const method = options?.method ?? 'GET'\n const headers = new Headers(options?.headers)\n\n let body: BodyInit | undefined\n if (options?.body !== undefined) {\n if (options.body instanceof FormData || options.body instanceof Blob || options.body instanceof ArrayBuffer) {\n body = options.body\n } else {\n body = JSON.stringify(options.body)\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n }\n }\n\n const response = await fetch(path, {method, headers, body, signal: options?.signal})\n\n const isEmptyBody = response.status === 204 || response.headers.get('Content-Length') === '0'\n\n if (!response.ok) {\n const contentType = response.headers.get('Content-Type') ?? ''\n let errorBody: unknown\n if (!isEmptyBody && contentType.includes('application/json')) {\n try { errorBody = await response.json() } catch { /* body vac\u00EDo o inv\u00E1lido */ }\n }\n throw new FetchError(response.status, response.statusText, response, errorBody)\n }\n\n if (isEmptyBody) return null as InferResult<M, P>\n\n const contentType = response.headers.get('Content-Type') ?? ''\n if (contentType.includes('application/json')) {\n return response.json() as Promise<InferResult<M, P>>\n }\n\n return response.text() as unknown as Promise<InferResult<M, P>>\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["useCallback", "useContext", "useEffect", "useRef", "useState", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "raw", "icon", "resolved", "parts", "HeadSlot", "buildHeadNodes", "t", "i", "createContext", "g", "RouterContext", "PageMetaContext", "RouteDataContext", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "statusCode", "message", "options", "resolveTo", "to", "base", "url", "pathname", "jsx", "jsxs", "DEFAULT_VIEWPORT", "useRouter", "useContext", "RouterContext", "noopNavigate", "noopRevalidate", "useNavigate", "useRevalidate", "useParams", "ctx", "RouteDataContext", "useLoaderData", "useGuardData", "RouterProvider", "initialData", "initialParams", "initialPage", "initialLayouts", "initialLayoutsData", "initialGuardData", "initialMeta", "initialViewport", "initialError", "initialErrorPage", "clientEntry", "matchClientRoute", "loadErrorPage", "getDefaultErrorPage", "state", "setState", "useState", "navigatingRef", "useRef", "isNavigating", "setIsNavigating", "prefetchCacheRef", "prefetchRoute", "useCallback", "href", "resolved", "resolveTo", "key", "matched", "controller", "promise", "l", "pageMod", "layoutMods", "dataRes", "data", "expireTimer", "loadRoute", "to", "pathname", "ErrorPage", "prev", "cached", "prefetched", "pm", "lm", "ct", "errorBody", "headers", "value", "m", "hash", "scrollBehavior", "navigate", "options", "run", "revalidatingRef", "revalidate", "err", "useEffect", "handlePop", "content", "tree", "i", "Layout", "layoutData", "DevixErrorBoundary", "PageMetaContext", "HeadSlot", "useCallback", "useContext", "useRef", "jsx", "Link", "href", "prefetch", "replace", "viewTransition", "children", "props", "router", "useContext", "RouterContext", "hoverTimerRef", "useRef", "cancelHoverTimer", "useCallback", "triggerPrefetch", "handleMouseEnter", "handleMouseLeave", "handleTouchStart", "e", "resolveTo", "options", "getCookie", "req", "name", "header", "part", "key", "rest", "setCookie", "headers", "value", "options", "cookie", "deleteCookie", "json", "data", "status", "text", "body", "REDIRECT_BRAND", "redirect", "url", "statusOrOptions", "replace", "ERROR_BRAND", "error", "statusCode", "message", "options", "HANDLER_BRAND", "createHandler", "schemaOrFn", "maybeFn", "extractMessage", "body", "m", "FetchError", "status", "statusText", "response", "c", "PROXY_PREFIX", "proxyFetch", "namespace", "method", "path", "body", "options", "headers", "sendBody", "url", "response", "isEmptyBody", "ct", "errorBody", "FetchError", "makeBackendClient", "$server", "target", "$fetch", "path", "options", "method", "headers", "body", "response", "isEmptyBody", "contentType", "errorBody", "FetchError"]
|
|
4
|
+
"sourcesContent": ["import { ComponentType, ReactNode, useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { ErrorProps, LayoutProps, PageProps } from \"../server/types\";\nimport { Metadata, Viewport } from \"../types\";\n\nconst DEFAULT_VIEWPORT: Viewport = { width: 'device-width', initialScale: 1 }\nimport { HeadSlot } from \"./head\";\nimport { NavigateOptions, PageMetaContext, RouteDataContext, RouterContext } from \"./context\";\nimport { DevixErrorBoundary } from \"./error-boundary\";\nimport { resolveTo } from \"./url\";\nimport type { Redirect } from \"../utils/response\";\n\nexport interface ClientRouteMatcher {\n matchClientRoute: (pathname: string) => {\n load: () => Promise<any>\n loadLayouts: (() => Promise<any>)[]\n params: Record<string, string>\n } | null\n loadErrorPage: () => Promise<ComponentType<ErrorProps> | null>\n getDefaultErrorPage: () => ComponentType<ErrorProps> | null\n}\n\ninterface RouteState {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n guardData: unknown\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n pendingError?: ErrorProps\n ErrorPage?: ComponentType<ErrorProps>\n}\n\nexport function useRouter() {\n return useContext(RouterContext)\n}\n\nconst noopNavigate = () => Promise.resolve()\nconst noopRevalidate = () => Promise.resolve()\n\nexport function useNavigate() {\n const ctx = useContext(RouterContext)\n return ctx?.navigate ?? noopNavigate\n}\n\nexport function useRevalidate() {\n const ctx = useContext(RouterContext)\n return ctx?.revalidate ?? noopRevalidate\n}\n\nexport function useParams<T extends Record<string, string>>() {\n const ctx = useContext(RouteDataContext)\n if (!ctx) throw new Error(\"useParams must be used within a route or layout\")\n return ctx.params as T\n}\n\ntype LoaderReturnType<T> = T extends (...args: any[]) => Promise<infer R>\n ? [Exclude<R, Redirect | void | undefined>] extends [never] ? undefined : Exclude<R, Redirect | void | undefined>\n : T extends (...args: any[]) => infer R\n ? [Exclude<R, Redirect | void | undefined>] extends [never] ? undefined : Exclude<R, Redirect | void | undefined>\n : T\n\nexport function useLoaderData<T>() {\n const ctx = useContext(RouteDataContext)\n if (!ctx) throw new Error(\"useLoaderData must be used within a route or layout\")\n return ctx.loaderData as LoaderReturnType<T>\n}\n\ntype GuardDataReturn<TGuard> =\n TGuard extends (...args: any[]) => infer R\n ? Exclude<Awaited<R>, string | Redirect | null | undefined | { readonly statusCode: number; readonly message: string }>\n : unknown\n\n/**\n * Devuelve el `guardData` resuelto en el \u00FAltimo guard que retorn\u00F3 un objeto\n * (layout \u2192 page, en orden). Tipado al retorno del guard si pasas `typeof guard`.\n *\n * ```ts\n * export async function guard({ request }: LoaderContext) {\n * const session = await getSession(request)\n * if (!session) return '/login'\n * return session\n * }\n *\n * function Header() {\n * const session = useGuardData<typeof guard>()\n * return <span>{session.user.name}</span>\n * }\n * ```\n */\nexport function useGuardData<TGuard = unknown>(): GuardDataReturn<TGuard> {\n const ctx = useContext(RouterContext)\n if (!ctx) throw new Error(\"useGuardData must be used within a route or layout\")\n return ctx.guardData as GuardDataReturn<TGuard>\n}\n\ninterface PrefetchEntry {\n promise: Promise<{ pageMod: any; layoutMods: any[]; data: any } | null>\n controller: AbortController\n}\n\ninterface RouterProviderProps extends ClientRouteMatcher {\n initialData: unknown\n initialParams: Record<string, string>\n initialPage: ComponentType<PageProps>\n initialLayouts?: ComponentType<LayoutProps>[]\n initialLayoutsData?: unknown[]\n initialGuardData?: unknown\n initialMeta?: Metadata | null\n initialViewport?: Viewport\n initialError?: ErrorProps\n initialErrorPage?: ComponentType<ErrorProps>\n clientEntry: string\n}\n\nexport function RouterProvider({\n initialData,\n initialParams,\n initialPage,\n initialLayouts = [],\n initialLayoutsData = [],\n initialGuardData = null,\n initialMeta,\n initialViewport,\n initialError,\n initialErrorPage,\n clientEntry,\n matchClientRoute,\n loadErrorPage,\n getDefaultErrorPage,\n}: RouterProviderProps) {\n\n const [state, setState] = useState<RouteState>({\n pathname: window.location.pathname,\n params: initialParams,\n loaderData: initialData,\n layoutsData: initialLayoutsData,\n guardData: initialGuardData,\n Page: initialPage,\n layouts: initialLayouts,\n metadata: initialMeta ?? null,\n viewport: initialViewport,\n pendingError: initialError,\n ErrorPage: initialErrorPage,\n })\n\n const navigatingRef = useRef<AbortController | null>(null)\n const [isNavigating, setIsNavigating] = useState(false)\n\n const prefetchCacheRef = useRef<Map<string, PrefetchEntry>>(new Map())\n\n const prefetchRoute = useCallback((href: string) => {\n const resolved = resolveTo(href)\n if (resolved.kind === 'external') return\n\n const key = resolved.href\n if (prefetchCacheRef.current.has(key)) return\n const matched = matchClientRoute(resolved.pathname)\n if (!matched) return\n\n const controller = new AbortController()\n const promise = Promise.all([\n Promise.all([matched.load(), ...matched.loadLayouts.map(l => l())]),\n fetch(`/_data${key}`, { headers: { Accept: 'application/json' }, signal: controller.signal })\n ]).then(async ([[pageMod, ...layoutMods], dataRes]) => {\n if (!dataRes.ok || !pageMod.default) return null\n const data = await dataRes.json()\n return { pageMod, layoutMods, data }\n }).catch(() => null)\n\n const expireTimer = setTimeout(() => {\n controller.abort()\n prefetchCacheRef.current.delete(key)\n }, 3000)\n promise.finally(() => clearTimeout(expireTimer))\n\n prefetchCacheRef.current.set(key, { promise, controller })\n }, [])\n\n const loadRoute = useCallback(async (to: string, controller: AbortController) => {\n const pathname = to.split('?')[0].split('#')[0]\n const matched = matchClientRoute(pathname)\n if (!matched) {\n const ErrorPage = await loadErrorPage() ?? getDefaultErrorPage()\n setState(prev => ({\n ...prev,\n pathname: pathname,\n pendingError: { statusCode: 404, message: 'Not found' },\n ErrorPage: ErrorPage ?? undefined,\n }))\n return\n }\n\n const cached = prefetchCacheRef.current.get(to)\n if (cached) prefetchCacheRef.current.delete(to)\n const prefetched = cached ? await cached.promise : null\n\n if (controller.signal.aborted) return\n\n let pageMod: any, layoutMods: any[], data: any\n\n if (prefetched) {\n ;({ pageMod, layoutMods, data } = prefetched)\n } else {\n const [[pm, ...lm], dataRes] = await Promise.all([\n Promise.all([\n matched.load(),\n ...matched.loadLayouts.map(l => l()),\n ]),\n fetch(`/_data${to}`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n ])\n\n if (controller.signal.aborted) return\n if (!pm.default) return\n\n if (!dataRes.ok) {\n const ct = dataRes.headers.get('Content-Type') ?? ''\n let errorBody: { statusCode?: number; message?: string; code?: string; data?: unknown } | null = null\n try {\n if (ct.includes('application/json')) errorBody = await dataRes.json()\n else if (ct.includes('text/plain')) errorBody = { message: await dataRes.text() }\n } catch { /* ignorar errores de parsing */ }\n\n const headers: Record<string, string> = {}\n dataRes.headers.forEach((value, key) => { headers[key] = value })\n\n const ErrorPage = await loadErrorPage() ?? getDefaultErrorPage()\n setState(prev => ({\n ...prev,\n pathname,\n pendingError: {\n statusCode: errorBody?.statusCode ?? dataRes.status,\n message: errorBody?.message ?? 'Server error',\n code: errorBody?.code,\n data: errorBody?.data,\n headers,\n },\n ErrorPage: ErrorPage ?? undefined,\n }))\n return\n }\n\n pageMod = pm\n layoutMods = lm\n data = await dataRes.json()\n }\n\n if (data.redirect) {\n if (data.redirectReplace) {\n window.history.replaceState(null, '', data.redirect)\n } else {\n window.history.pushState(null, '', data.redirect)\n }\n await loadRoute(data.redirect, controller)\n return\n }\n\n setState({\n pathname,\n params: data.params ?? {},\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n guardData: data.guardData ?? null,\n Page: pageMod.default,\n layouts: layoutMods.map(m => m.default),\n metadata: data.metadata ?? null,\n viewport: data.viewport ?? DEFAULT_VIEWPORT,\n })\n\n const hash = to.includes('#') ? to.split('#')[1] : null\n const scrollBehavior = getComputedStyle(document.documentElement).scrollBehavior as ScrollBehavior\n if (hash) {\n requestAnimationFrame(() => {\n document.getElementById(hash)?.scrollIntoView({ behavior: scrollBehavior })\n })\n } else {\n window.scrollTo({ top: 0, behavior: scrollBehavior })\n }\n }, [])\n\n const navigate = useCallback(async (to: string, options?: NavigateOptions) => {\n const resolved = resolveTo(to)\n if (resolved.kind === 'external') {\n window.location.href = resolved.url.href\n return\n }\n const href = resolved.href\n\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n setIsNavigating(true)\n const run = async () => {\n window.history[options?.replace ? 'replaceState' : 'pushState'](null, '', href)\n await loadRoute(href, controller)\n }\n try {\n if (options?.viewTransition && 'startViewTransition' in document) {\n await (document as any).startViewTransition(run).finished\n } else {\n await run()\n }\n } finally {\n if (!controller.signal.aborted) setIsNavigating(false)\n }\n }, [loadRoute])\n\n const revalidatingRef = useRef<AbortController | null>(null)\n\n const revalidate = useCallback(async () => {\n revalidatingRef.current?.abort()\n const controller = new AbortController()\n revalidatingRef.current = controller\n\n const to = window.location.pathname + window.location.search\n let dataRes: Response\n try {\n dataRes = await fetch(`/_data${to}`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n } catch (err) {\n if ((err as Error).name === 'AbortError') return\n throw err\n }\n\n if (controller.signal.aborted) return\n if (!dataRes.ok) return\n\n const data = await dataRes.json()\n if (controller.signal.aborted) return\n\n if (data.redirect) {\n await navigate(data.redirect, { replace: data.redirectReplace })\n return\n }\n setState(prev => ({\n ...prev,\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n guardData: data.guardData ?? null,\n params: data.params ?? prev.params,\n metadata: data.metadata ?? prev.metadata,\n viewport: data.viewport ?? prev.viewport,\n }))\n }, [navigate])\n\n useEffect(() => {\n const handlePop = () => {\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n const to = window.location.pathname + window.location.search\n loadRoute(to, controller).catch(err => {\n if (err.name !== 'AbortError') console.error('[router] popstate error:', err)\n })\n }\n window.addEventListener(\"popstate\", handlePop)\n return () => window.removeEventListener(\"popstate\", handlePop)\n }, [loadRoute])\n\n let content: ReactNode\n\n if (state.pendingError) {\n content = state.ErrorPage\n ? <state.ErrorPage {...state.pendingError} />\n : <h1>{state.pendingError.statusCode}</h1>\n } else {\n let tree: ReactNode = (\n <RouteDataContext value={{ loaderData: state.loaderData, params: state.params }}>\n <state.Page data={state.loaderData} params={state.params} url={state.pathname} />\n </RouteDataContext>\n )\n\n for (let i = state.layouts.length - 1; i >= 0; i--) {\n const Layout = state.layouts[i]\n const layoutData = state.layoutsData[i]\n tree = (\n <RouteDataContext value={{ loaderData: layoutData, params: state.params }}>\n <Layout data={layoutData} params={state.params}>{tree}</Layout>\n </RouteDataContext>\n )\n }\n\n content = (\n <DevixErrorBoundary key={state.pathname} ErrorPage={state.ErrorPage}>\n {tree}\n </DevixErrorBoundary>\n )\n }\n\n return (\n <PageMetaContext value={{\n metadata: state.metadata,\n viewport: state.viewport,\n clientEntry,\n }}>\n <HeadSlot metadata={state.metadata} viewport={state.viewport} />\n <RouterContext value={{ ...state, isNavigating, navigate, revalidate, prefetchRoute }}>\n {content}\n </RouterContext>\n </PageMetaContext>\n )\n}", "import { Metadata, MetadataIcon, Viewport } from \"../types\";\nimport { ReactNode } from \"react\";\n\ntype MetaTag =\n | { tag: 'title'; children: string }\n | { tag: 'meta'; name?: string; property?: string; content: string }\n | { tag: 'link'; rel: string; href: string; hrefLang?: string; type?: string; sizes?: string }\n\nfunction collectTags(metadata: Metadata, viewport?: Viewport): MetaTag[] {\n const tags: MetaTag[] = []\n\n if (metadata.title)\n tags.push({ tag: 'title', children: metadata.title })\n if (metadata.description)\n tags.push({ tag: 'meta', name: 'description', content: metadata.description })\n if (metadata.keywords?.length)\n tags.push({ tag: 'meta', name: 'keywords', content: metadata.keywords.join(', ') })\n\n const ogTitle = metadata.og?.title ?? metadata.title\n if (ogTitle) tags.push({ tag: 'meta', property: 'og:title', content: ogTitle })\n const ogDesc = metadata.og?.description ?? metadata.description\n if (ogDesc) tags.push({ tag: 'meta', property: 'og:description', content: ogDesc })\n if (metadata.og?.image) tags.push({ tag: 'meta', property: 'og:image', content: metadata.og.image })\n if (metadata.og?.type) tags.push({ tag: 'meta', property: 'og:type', content: metadata.og.type })\n if (metadata.og?.url) tags.push({ tag: 'meta', property: 'og:url', content: metadata.og.url })\n\n const twTitle = metadata.twitter?.title ?? metadata.title\n if (twTitle) tags.push({ tag: 'meta', name: 'twitter:title', content: twTitle })\n const twDesc = metadata.twitter?.description ?? metadata.description\n if (twDesc) tags.push({ tag: 'meta', name: 'twitter:description', content: twDesc })\n if (metadata.twitter?.card) tags.push({\n tag: 'meta', name: 'twitter:card', content:\n metadata.twitter.card\n })\n if (metadata.twitter?.image) tags.push({\n tag: 'meta', name: 'twitter:image', content:\n metadata.twitter.image\n })\n if (metadata.twitter?.creator) tags.push({\n tag: 'meta', name: 'twitter:creator', content:\n metadata.twitter.creator\n })\n\n if (metadata.canonical) tags.push({ tag: 'link', rel: 'canonical', href: metadata.canonical })\n if (metadata.robots) tags.push({ tag: 'meta', name: 'robots', content: metadata.robots })\n if (metadata.alternates) {\n for (const [lang, href] of Object.entries(metadata.alternates))\n tags.push({ tag: 'link', rel: 'alternate', href, hrefLang: lang })\n }\n\n if (metadata.icons) {\n const raw = Array.isArray(metadata.icons) ? metadata.icons : [metadata.icons]\n for (const icon of raw) {\n const resolved: MetadataIcon = typeof icon === 'string' ? { href: icon } : icon\n tags.push({\n tag: 'link',\n rel: resolved.rel ?? 'icon',\n href: resolved.href,\n ...(resolved.type && { type: resolved.type }),\n ...(resolved.sizes && { sizes: resolved.sizes }),\n })\n }\n }\n\n if (viewport) {\n const parts: string[] = []\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`)\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`)\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`)\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' :\n 'no'}`)\n if (parts.length) tags.push({ tag: 'meta', name: 'viewport', content: parts.join(', ') })\n if (viewport.themeColor) tags.push({\n tag: 'meta', name: 'theme-color', content: viewport.themeColor\n })\n }\n\n return tags\n}\n\nexport function HeadSlot({ metadata, viewport }: { metadata: Metadata | null, viewport?: Viewport }) {\n if (typeof window === 'undefined' || !metadata) return null\n return <>{buildHeadNodes(metadata, viewport)}</>\n}\n\nexport function buildHeadNodes(metadata: Metadata, viewport?: Viewport): ReactNode {\n const tags = collectTags(metadata, viewport)\n\n return <>\n {tags.map((t, i) => {\n if (t.tag === 'title') return <title key={i}>{t.children}</title>\n if (t.tag === 'link') return <link key={i} rel={t.rel} href={t.href} hrefLang={t.hrefLang} type={t.type} sizes={t.sizes} />\n return <meta key={i} name={t.name} property={t.property} content={t.content} />\n })}\n </>\n}", "import {createContext, Context, ComponentType} from \"react\";\nimport {Metadata, Viewport} from \"../types\";\nimport {LayoutProps, PageProps} from \"../server/types\";\n\nexport interface NavigateOptions {\n replace?: boolean\n viewTransition?: boolean\n}\n\nexport interface RouterContextValue {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n guardData: unknown\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n navigate: (to: string, options?: NavigateOptions) => Promise<void>\n revalidate: () => Promise<void>\n prefetchRoute: (href: string) => void\n isNavigating: boolean\n}\n\nexport interface PageMetaContextValue {\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry?: string\n}\n\nexport interface RouteDataContextValue {\n loaderData: unknown\n params: Record<string, string>\n}\n\nconst g = globalThis as any\n\ng.__devix_RouterContext__ ??= createContext<RouterContextValue | null>(null)\nexport const RouterContext: Context<RouterContextValue | null> = g.__devix_RouterContext__\n\ng.__devix_PageMetaContext__ ??= createContext<PageMetaContextValue | null>(null)\ng.__devix_RouteDataContext__ ??= createContext<RouteDataContextValue | null>(null)\n\nexport const PageMetaContext: Context<PageMetaContextValue | null> = g.__devix_PageMetaContext__\nexport const RouteDataContext: Context<RouteDataContextValue | null> = g.__devix_RouteDataContext__\n\n", "import {Component, ComponentType, ReactNode} from \"react\";\nimport {ErrorProps} from \"../server/types\";\n\ninterface Props {\n ErrorPage?: ComponentType<ErrorProps>\n children: ReactNode\n}\n\ninterface State {\n error: ErrorProps | null\n}\n\nexport class DevixErrorBoundary extends Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(err: unknown): State {\n if (err instanceof DevixError) {\n return {\n error: {statusCode: err.statusCode, message: err.message}\n }\n }\n return {\n error: {statusCode: 500, message: err instanceof Error ? err.message : 'Unknown error'}\n }\n }\n\n render() {\n if (this.state.error && this.props.ErrorPage) {\n return <this.props.ErrorPage {...this.state.error} />\n }\n if (this.state.error) {\n return <h1>{this.state.error.statusCode}</h1>\n }\n return this.props.children\n }\n}\n\nexport interface DevixErrorOptions {\n code?: string\n data?: unknown\n}\n\nconst DEVIX_ERROR_BRAND = Symbol.for('@devlusoft/devix.DevixError')\n\nexport class DevixError extends Error {\n /**\n * Custom `instanceof` que matchea por brand cross-bundle. Ver nota en\n * `FetchError` para el detalle del dual package hazard.\n */\n static [Symbol.hasInstance](value: unknown): boolean {\n return value !== null && typeof value === 'object' && (value as any)[DEVIX_ERROR_BRAND] === true\n }\n\n statusCode: number\n code?: string\n data?: unknown\n constructor(statusCode: number, message: string, options?: DevixErrorOptions) {\n super(message)\n this.name = 'DevixError'\n this.statusCode = statusCode\n this.code = options?.code\n this.data = options?.data\n ;(this as any)[DEVIX_ERROR_BRAND] = true\n }\n}\n", "export type ResolvedTo =\n | { kind: 'internal'; pathname: string; href: string }\n | { kind: 'external'; url: URL }\n\nexport function resolveTo(to: string): ResolvedTo {\n const base = new URL(window.location.href)\n if (!base.pathname.endsWith('/')) base.pathname += '/'\n\n const url = new URL(to, base)\n\n if (url.origin !== window.location.origin) {\n return { kind: 'external', url }\n }\n\n const pathname = url.pathname.length > 1\n ? url.pathname.replace(/\\/$/, '')\n : url.pathname\n\n return {\n kind: 'internal',\n pathname,\n href: pathname + url.search + url.hash,\n }\n}\n", "import { AnchorHTMLAttributes, MouseEventHandler, useCallback, useContext, useRef } from \"react\"\nimport { NavigateOptions, RouterContext } from './context'\nimport { resolveTo } from './url'\n\ninterface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n href: string\n prefetch?: 'hover' | 'none'\n replace?: boolean\n viewTransition?: boolean\n}\n\nexport function Link({ href, prefetch = 'hover', replace = false, viewTransition = false, children, ...props }: LinkProps) {\n const router = useContext(RouterContext)\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const cancelHoverTimer = useCallback(() => {\n if (hoverTimerRef.current !== null) {\n clearTimeout(hoverTimerRef.current)\n hoverTimerRef.current = null\n }\n }, [])\n\n const triggerPrefetch = useCallback(() => {\n if (!router || prefetch === 'none') return\n router.prefetchRoute(href)\n }, [href, prefetch, router])\n\n const handleMouseEnter = useCallback(() => {\n if (prefetch === 'none') return\n hoverTimerRef.current = setTimeout(triggerPrefetch, 50)\n }, [prefetch, triggerPrefetch])\n\n const handleMouseLeave = useCallback(() => {\n cancelHoverTimer()\n }, [cancelHoverTimer])\n\n const handleTouchStart = useCallback(() => {\n cancelHoverTimer()\n triggerPrefetch()\n }, [cancelHoverTimer, triggerPrefetch])\n\n const handleClick: MouseEventHandler<HTMLAnchorElement> = (e) => {\n cancelHoverTimer()\n if (!router) return\n if (e.ctrlKey || e.metaKey || e.shiftKey || e.button !== 0) return\n if (resolveTo(href).kind === 'external') return\n e.preventDefault()\n const options: NavigateOptions = { replace, viewTransition }\n router.navigate(href, options)\n }\n\n return (\n <a\n href={href}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onTouchStart={handleTouchStart}\n {...props}\n >\n {children}\n </a>\n )\n}", "export interface CookieOptions {\n httpOnly?: boolean\n secure?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n maxAge?: number\n expires?: Date\n path?: string\n domain?: string\n}\n\nexport function getCookie(req: Request, name: string): string | undefined {\n const header = req.headers.get('cookie')\n if (!header) return undefined\n for (const part of header.split(';')) {\n const [key, ...rest] = part.trim().split('=')\n if (key.trim() === name) return decodeURIComponent(rest.join('='))\n }\n return undefined\n}\n\nexport function setCookie(headers: Headers, name: string, value: string, options: CookieOptions = {}): void {\n let cookie = `${name}=${encodeURIComponent(value)}; Path=${options.path ?? '/'}`\n if (options.domain) cookie += `; Domain=${options.domain}`\n if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`\n if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`\n if (options.httpOnly) cookie += `; HttpOnly`\n if (options.secure) cookie += `; Secure`\n if (options.sameSite) cookie += `; SameSite=${options.sameSite}`\n headers.append('Set-Cookie', cookie)\n}\n\nexport function deleteCookie(headers: Headers, name: string, options: Pick<CookieOptions, 'path' | 'domain'> = {}): void {\n setCookie(headers, name, '', {...options, maxAge: 0, expires: new Date(0)})\n}\n", "export type JsonResponse<T = unknown, S extends number = number> = Response & {\n readonly __body: T\n readonly __status: S\n}\n\nexport function json<const T>(data: T): JsonResponse<T, 200>\nexport function json<const T, const S extends number>(data: T, status: S): JsonResponse<T, S>\nexport function json<const T>(data: T, status: number = 200): JsonResponse<T, any> {\n return new Response(JSON.stringify(data), {\n status,\n headers: {'Content-Type': 'application/json'},\n }) as JsonResponse<T, any>\n}\n\nexport const text = (body: string, status = 200): Response =>\n new Response(body, {status, headers: {'Content-Type': 'text/plain; charset=utf-8'}})\n\nconst REDIRECT_BRAND = Symbol.for('devix.redirect')\n\nexport interface RedirectOptions {\n status?: number\n replace?: boolean\n}\n\nexport interface Redirect {\n readonly [REDIRECT_BRAND]: true\n readonly url: string\n readonly status: number\n readonly replace: boolean\n}\n\nexport function redirect(url: string, statusOrOptions?: number | RedirectOptions): Redirect {\n const status = typeof statusOrOptions === 'number' ? statusOrOptions : (statusOrOptions?.status ?? 302)\n const replace = typeof statusOrOptions === 'object' ? (statusOrOptions?.replace ?? false) : false\n return {[REDIRECT_BRAND]: true, url, status, replace} as Redirect\n}\n\nexport function isRedirect(value: unknown): value is Redirect {\n return typeof value === 'object' && value !== null && REDIRECT_BRAND in value\n}\n\nconst ERROR_BRAND = Symbol.for('devix.loaderError')\n\nexport interface RouteError {\n readonly [ERROR_BRAND]: true\n readonly statusCode: number\n readonly message: string\n readonly code?: string\n readonly data?: unknown\n}\n\nexport interface ErrorOptions {\n code?: string\n data?: unknown\n}\n\n/**\n * Crea un error tipado que funciona en loaders, guards y handlers API.\n *\n * En loaders/guards: ret\u00F3rnalo (no lo lances) y el sistema renderiza `error.tsx`.\n * En handlers API: ret\u00F3rnalo y el sistema serializa el shape `ErrorBody` como JSON\n * con el statusCode correcto.\n *\n * ```ts\n * return error(404, 'Post no encontrado', { code: 'POST_NOT_FOUND' })\n * ```\n */\nexport function error(statusCode: number, message: string, options?: ErrorOptions): RouteError {\n return {\n [ERROR_BRAND]: true,\n statusCode,\n message,\n code: options?.code,\n data: options?.data,\n } as RouteError\n}\n\nexport function isLoaderError(value: unknown): value is RouteError {\n return typeof value === 'object' && value !== null && ERROR_BRAND in value\n}\n\n/**\n * Shape p\u00FAblico del body de un error API. Todos los errores emitidos por `error()`\n * o `DevixError` se serializan a este shape. `FetchError.body` del cliente lo recibe.\n */\nexport interface ErrorBody {\n statusCode: number\n message: string\n code?: string\n data?: unknown\n}\n\nexport function errorToBody(err: { statusCode: number; message: string; code?: string; data?: unknown }): ErrorBody {\n const body: ErrorBody = { statusCode: err.statusCode, message: err.message }\n if (err.code !== undefined) body.code = err.code\n if (err.data !== undefined) body.data = err.data\n return body\n}\n", "import type {RouteContext} from './api-context'\nimport type {StandardSchemaV1} from '../utils/standard-schema'\n\nexport const HANDLER_BRAND = '__devix_handler__' as const\n\nexport interface DevixHandler<TBody = undefined, TReturn = unknown> {\n readonly [HANDLER_BRAND]: true\n readonly fn: (...args: any[]) => any\n readonly schema?: StandardSchemaV1\n readonly __body: TBody\n readonly __return: TReturn\n}\n\n/**\n * Crea un handler API tipado.\n *\n * El primer argumento (si lo declaras) es el body parseado autom\u00E1ticamente:\n * - `application/json` \u2192 objeto JS\n * - `multipart/form-data` o `application/x-www-form-urlencoded` \u2192 FormData\n * - cualquier otro \u2192 string\n *\n * El segundo argumento es `ctx: RouteContext` con `request`, `url`, `params`,\n * y los helpers `get`/`set` para state heredado de middleware.\n *\n * ```ts\n * // sin body\n * export const GET = createHandler(async () => ({ ok: true }))\n *\n * // con body tipado\n * export const POST = createHandler(async (body: Login) => ...)\n *\n * // con body y ctx\n * export const POST = createHandler(async (body: Login, ctx) => {\n * const user = ctx.get<User>('user')\n * const ua = ctx.request.headers.get('User-Agent')\n * })\n *\n * // solo ctx, sin body (ej. GET que necesita query params)\n * export const GET = createHandler(async (_body, ctx) => {\n * const filter = ctx.url.searchParams.get('filter')\n * })\n * ```\n */\ntype ExtractBody<TFn> =\n TFn extends () => any ? undefined :\n TFn extends (body: infer B, ...rest: any[]) => any ? B :\n undefined\n\ntype HandlerFn = ((body: any, ctx: RouteContext) => any) | (() => any)\n\nexport function createHandler<TFn extends HandlerFn>(\n fn: TFn,\n): DevixHandler<ExtractBody<TFn>, Awaited<ReturnType<TFn>>>\n\n/**\n * Overload con Standard Schema. devix valida el body autom\u00E1ticamente y, si\n * falla, devuelve `400` con shape `ErrorBody` y `code: 'VALIDATION_ERROR'`.\n * El body recibido por el handler est\u00E1 ya validado y tipado al output del schema.\n *\n * ```ts\n * import { z } from 'zod'\n *\n * const Input = z.object({ email: z.email(), password: z.string().min(8) })\n *\n * export const POST = createHandler(Input, async (body, ctx) => {\n * // body: z.infer<typeof Input>, ya validado\n * })\n * ```\n */\nexport function createHandler<TSchema extends StandardSchemaV1, TReturn>(\n schema: TSchema,\n fn: (body: StandardSchemaV1.InferOutput<TSchema>, ctx: RouteContext) => TReturn | Promise<TReturn>,\n): DevixHandler<StandardSchemaV1.InferInput<TSchema>, Awaited<TReturn>>\n\nexport function createHandler(\n schemaOrFn: StandardSchemaV1 | ((...args: any[]) => any),\n maybeFn?: (...args: any[]) => any,\n): DevixHandler<any, any> {\n if (maybeFn) {\n return {\n [HANDLER_BRAND]: true,\n fn: maybeFn,\n schema: schemaOrFn as StandardSchemaV1,\n } as unknown as DevixHandler<any, any>\n }\n return {\n [HANDLER_BRAND]: true,\n fn: schemaOrFn as (...args: any[]) => any,\n } as unknown as DevixHandler<any, any>\n}\n", "export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\n\nfunction extractMessage(body: unknown): string | null {\n if (body && typeof body === 'object' && 'message' in body) {\n const m = (body as {message: unknown}).message\n if (typeof m === 'string' && m.length > 0) return m\n }\n return null\n}\n\nconst FETCH_ERROR_BRAND = Symbol.for('@devlusoft/devix.FetchError')\n\nexport class FetchError<E = unknown> extends Error {\n static [Symbol.hasInstance](value: unknown): boolean {\n return value !== null && typeof value === 'object' && (value as any)[FETCH_ERROR_BRAND] === true\n }\n\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly response: Response,\n public readonly body?: E,\n ) {\n super(extractMessage(body) ?? `HTTP ${status}: ${statusText}`)\n this.name = 'FetchError'\n ;(this as any)[FETCH_ERROR_BRAND] = true\n }\n\n get code(): string | undefined {\n if (this.body && typeof this.body === 'object' && 'code' in this.body) {\n const c = (this.body as {code: unknown}).code\n return typeof c === 'string' ? c : undefined\n }\n return undefined\n }\n}\n", "import {FetchError, type HttpMethod} from './fetch'\n\nexport interface ServerFetchOptions {\n headers?: HeadersInit\n signal?: AbortSignal\n}\n\nconst PROXY_PREFIX = '/_devix/server'\n\nasync function proxyFetch<TResponse>(\n namespace: string,\n method: HttpMethod,\n path: string,\n body: unknown,\n options?: ServerFetchOptions,\n): Promise<TResponse> {\n const headers = new Headers(options?.headers)\n let sendBody: BodyInit | undefined\n if (body !== undefined && body !== null) {\n if (body instanceof FormData || body instanceof Blob || body instanceof ArrayBuffer) {\n sendBody = body\n } else {\n sendBody = JSON.stringify(body)\n if (!headers.has('Content-Type')) headers.set('Content-Type', 'application/json')\n }\n }\n\n const url = `${PROXY_PREFIX}/${namespace}${path}`\n const response = await fetch(url, {method, headers, body: sendBody, signal: options?.signal})\n\n const isEmptyBody = response.status === 204 || response.headers.get('Content-Length') === '0'\n\n if (!response.ok) {\n const ct = response.headers.get('Content-Type') ?? ''\n let errorBody: unknown\n if (!isEmptyBody && ct.includes('application/json')) {\n try { errorBody = await response.json() } catch { /* body vac\u00EDo o inv\u00E1lido */ }\n }\n throw new FetchError(response.status, response.statusText, response, errorBody)\n }\n\n if (isEmptyBody) return null as TResponse\n\n const ct = response.headers.get('Content-Type') ?? ''\n if (ct.includes('application/json')) return await response.json() as TResponse\n return await response.text() as unknown as TResponse\n}\n\n/**\n * Cliente para llamar a un backend remoto configurado en `devix.config.ts`.\n *\n * El tipo de respuesta se declara en cada call site con un generic:\n *\n * ```ts\n * const me = await $server.api.get<User>('/v1/me')\n * const post = await $server.api.post<Post>('/v1/posts', { title: 'Hola' })\n * ```\n *\n * Si no pasas el generic, el retorno es `unknown`. devix no puede inferir tipos del\n * backend remoto (vive fuera del repo) \u2014 el cast en el call site ES el contrato.\n */\nexport interface BackendClient {\n get<TResponse = unknown>(path: string, options?: ServerFetchOptions): Promise<TResponse>\n post<TResponse = unknown>(path: string, body?: unknown, options?: ServerFetchOptions): Promise<TResponse>\n put<TResponse = unknown>(path: string, body?: unknown, options?: ServerFetchOptions): Promise<TResponse>\n patch<TResponse = unknown>(path: string, body?: unknown, options?: ServerFetchOptions): Promise<TResponse>\n delete<TResponse = unknown>(path: string, options?: ServerFetchOptions): Promise<TResponse>\n}\n\nfunction makeBackendClient(namespace: string): BackendClient {\n return {\n get: (path, options) => proxyFetch(namespace, 'GET', path, undefined, options),\n post: (path, body, options) => proxyFetch(namespace, 'POST', path, body, options),\n put: (path, body, options) => proxyFetch(namespace, 'PUT', path, body, options),\n patch: (path, body, options) => proxyFetch(namespace, 'PATCH', path, body, options),\n delete: (path, options) => proxyFetch(namespace, 'DELETE', path, undefined, options),\n }\n}\n\n/**\n * Cliente para llamar a backends remotos configurados en `devix.config.ts`.\n *\n * En cliente: las requests pasan por el proxy interno `/_devix/server/<namespace>/...`\n * donde devix aplica `prepare` (auth pass-through, tracing, etc.) y reenv\u00EDa al backend.\n *\n * En server (loaders/handlers): NO uses este import \u2014 usa `ctx.$server` que recibe\n * el request del usuario para que `prepare` pueda leer cookies.\n *\n * ```ts\n * const me = await $server.api.get<User>('/v1/me')\n * const post = await $server.api.post<Post>('/v1/posts', { title: 'Hola' })\n * ```\n */\nexport const $server: Record<string, BackendClient> = new Proxy({} as Record<string, BackendClient>, {\n get(target, namespace: string) {\n if (typeof namespace !== 'string') return undefined\n if (!target[namespace]) target[namespace] = makeBackendClient(namespace)\n return target[namespace]\n },\n})\n", "export {useRouter, useNavigate, useRevalidate, useParams, useLoaderData, useGuardData, RouterProvider} from \"./router-provider\"\n\nexport {Link} from \"./link\"\n\nexport type { Metadata, MetadataIcon, Viewport, LoaderContext, LoaderContextWithGuard, LoaderFunction, GuardFunction } from '../types'\nexport type { NavigateOptions } from './context'\nexport type { PageProps, LayoutProps, PageModule, LayoutModule, ErrorProps } from '../server/types'\nexport type { RouteHandler, RouteResult, MiddlewareModule } from './api-context'\nexport {getCookie, setCookie, deleteCookie} from '../utils/cookies'\nexport type {CookieOptions} from '../utils/cookies'\nexport {json, text, redirect, error} from '../utils/response'\nexport type {JsonResponse, Redirect, RedirectOptions, RouteError, ErrorOptions, ErrorBody} from '../utils/response'\nexport {createHandler} from './create-handler'\nexport type {DevixHandler} from './create-handler'\nexport type {StandardSchemaV1} from '../utils/standard-schema'\nexport {FetchError} from './fetch'\nexport {$server} from './server-client'\nexport type {BackendClient, ServerFetchOptions} from './server-client'\nexport {DevixError} from './error-boundary'\nexport type {DevixErrorOptions} from './error-boundary'\nexport type {HttpMethod} from './fetch'\n\nimport {FetchError, type HttpMethod} from './fetch'\n\nexport interface ApiRoutes {}\n\ntype ApiKey<M extends HttpMethod, P extends string> = `${M} ${P}`\ntype MatchingKey<M extends HttpMethod, P extends string> = {\n [K in keyof ApiRoutes]: K extends ApiKey<M, P> ? K : never\n}[keyof ApiRoutes]\ntype RouteData<M extends HttpMethod, P extends string> = ApiRoutes[MatchingKey<M, P>]\ntype AllApiPaths = {\n [K in keyof ApiRoutes]: K extends `${HttpMethod} ${infer P}` ? P : never\n}[keyof ApiRoutes]\ntype ApiPath = AllApiPaths | (string & {})\ntype ExtractBody<D> = D extends { __body: infer B } ? B : never\ntype ExtractResponse<D> = D extends { __response: infer R } ? R : D\ntype InferBody<M extends HttpMethod, P extends string> = ExtractBody<RouteData<M, P>>\ntype InferResult<M extends HttpMethod, P extends string> = ExtractResponse<RouteData<M, P>>\ntype BodyOption<M extends HttpMethod, P extends string> = [InferBody<M, P>] extends [never] ? unknown : InferBody<M, P>\n\nexport interface FetchOptions<M extends HttpMethod = 'GET', P extends string = string> {\n method?: M\n body?: BodyOption<M, P>\n headers?: HeadersInit\n signal?: AbortSignal\n}\n\nexport async function $fetch<P extends ApiPath = ApiPath, M extends HttpMethod = 'GET'>(\n path: P,\n options?: FetchOptions<M, P>\n): Promise<InferResult<M, P>> {\n const method = options?.method ?? 'GET'\n const headers = new Headers(options?.headers)\n\n let body: BodyInit | undefined\n if (options?.body !== undefined) {\n if (options.body instanceof FormData || options.body instanceof Blob || options.body instanceof ArrayBuffer) {\n body = options.body\n } else {\n body = JSON.stringify(options.body)\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n }\n }\n\n const response = await fetch(path, {method, headers, body, signal: options?.signal})\n\n const isEmptyBody = response.status === 204 || response.headers.get('Content-Length') === '0'\n\n if (!response.ok) {\n const contentType = response.headers.get('Content-Type') ?? ''\n let errorBody: unknown\n if (!isEmptyBody && contentType.includes('application/json')) {\n try { errorBody = await response.json() } catch { /* body vac\u00EDo o inv\u00E1lido */ }\n }\n throw new FetchError(response.status, response.statusText, response, errorBody)\n }\n\n if (isEmptyBody) return null as InferResult<M, P>\n\n const contentType = response.headers.get('Content-Type') ?? ''\n if (contentType.includes('application/json')) {\n return response.json() as Promise<InferResult<M, P>>\n }\n\n return response.text() as unknown as Promise<InferResult<M, P>>\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useCallback", "useContext", "useEffect", "useRef", "useState", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "raw", "icon", "resolved", "parts", "HeadSlot", "buildHeadNodes", "t", "i", "createContext", "g", "RouterContext", "PageMetaContext", "RouteDataContext", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "DEVIX_ERROR_BRAND", "value", "statusCode", "message", "options", "resolveTo", "to", "base", "url", "pathname", "jsx", "jsxs", "DEFAULT_VIEWPORT", "useRouter", "useContext", "RouterContext", "noopNavigate", "noopRevalidate", "useNavigate", "useRevalidate", "useParams", "ctx", "RouteDataContext", "useLoaderData", "useGuardData", "RouterProvider", "initialData", "initialParams", "initialPage", "initialLayouts", "initialLayoutsData", "initialGuardData", "initialMeta", "initialViewport", "initialError", "initialErrorPage", "clientEntry", "matchClientRoute", "loadErrorPage", "getDefaultErrorPage", "state", "setState", "useState", "navigatingRef", "useRef", "isNavigating", "setIsNavigating", "prefetchCacheRef", "prefetchRoute", "useCallback", "href", "resolved", "resolveTo", "key", "matched", "controller", "promise", "l", "pageMod", "layoutMods", "dataRes", "data", "expireTimer", "loadRoute", "to", "pathname", "ErrorPage", "prev", "cached", "prefetched", "pm", "lm", "ct", "errorBody", "headers", "value", "m", "hash", "scrollBehavior", "navigate", "options", "run", "revalidatingRef", "revalidate", "err", "useEffect", "handlePop", "content", "tree", "i", "Layout", "layoutData", "DevixErrorBoundary", "PageMetaContext", "HeadSlot", "useCallback", "useContext", "useRef", "jsx", "Link", "href", "prefetch", "replace", "viewTransition", "children", "props", "router", "useContext", "RouterContext", "hoverTimerRef", "useRef", "cancelHoverTimer", "useCallback", "triggerPrefetch", "handleMouseEnter", "handleMouseLeave", "handleTouchStart", "e", "resolveTo", "options", "getCookie", "req", "name", "header", "part", "key", "rest", "setCookie", "headers", "value", "options", "cookie", "deleteCookie", "json", "data", "status", "text", "body", "REDIRECT_BRAND", "redirect", "url", "statusOrOptions", "replace", "ERROR_BRAND", "error", "statusCode", "message", "options", "HANDLER_BRAND", "createHandler", "schemaOrFn", "maybeFn", "extractMessage", "body", "m", "FETCH_ERROR_BRAND", "FetchError", "status", "statusText", "response", "value", "c", "PROXY_PREFIX", "proxyFetch", "namespace", "method", "path", "body", "options", "headers", "sendBody", "url", "response", "isEmptyBody", "ct", "errorBody", "FetchError", "makeBackendClient", "$server", "target", "$fetch", "path", "options", "method", "headers", "body", "response", "isEmptyBody", "contentType", "errorBody", "FetchError"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useCallback as j,useContext as v,useEffect as
|
|
1
|
+
import{useCallback as j,useContext as v,useEffect as gt,useRef as H,useState as at}from"react";import{Fragment as Z,jsx as k}from"react/jsx-runtime";function ct(t,r){let e=[];t.title&&e.push({tag:"title",children:t.title}),t.description&&e.push({tag:"meta",name:"description",content:t.description}),t.keywords?.length&&e.push({tag:"meta",name:"keywords",content:t.keywords.join(", ")});let o=t.og?.title??t.title;o&&e.push({tag:"meta",property:"og:title",content:o});let f=t.og?.description??t.description;f&&e.push({tag:"meta",property:"og:description",content:f}),t.og?.image&&e.push({tag:"meta",property:"og:image",content:t.og.image}),t.og?.type&&e.push({tag:"meta",property:"og:type",content:t.og.type}),t.og?.url&&e.push({tag:"meta",property:"og:url",content:t.og.url});let M=t.twitter?.title??t.title;M&&e.push({tag:"meta",name:"twitter:title",content:M});let S=t.twitter?.description??t.description;if(S&&e.push({tag:"meta",name:"twitter:description",content:S}),t.twitter?.card&&e.push({tag:"meta",name:"twitter:card",content:t.twitter.card}),t.twitter?.image&&e.push({tag:"meta",name:"twitter:image",content:t.twitter.image}),t.twitter?.creator&&e.push({tag:"meta",name:"twitter:creator",content:t.twitter.creator}),t.canonical&&e.push({tag:"link",rel:"canonical",href:t.canonical}),t.robots&&e.push({tag:"meta",name:"robots",content:t.robots}),t.alternates)for(let[p,y]of Object.entries(t.alternates))e.push({tag:"link",rel:"alternate",href:y,hrefLang:p});if(t.icons){let p=Array.isArray(t.icons)?t.icons:[t.icons];for(let y of p){let m=typeof y=="string"?{href:y}:y;e.push({tag:"link",rel:m.rel??"icon",href:m.href,...m.type&&{type:m.type},...m.sizes&&{sizes:m.sizes}})}}if(r){let p=[];r.width!==void 0&&p.push(`width=${r.width}`),r.initialScale!==void 0&&p.push(`initial-scale=${r.initialScale}`),r.maximumScale!==void 0&&p.push(`maximum-scale=${r.maximumScale}`),r.userScalable!==void 0&&p.push(`user-scalable=${r.userScalable?"yes":"no"}`),p.length&&e.push({tag:"meta",name:"viewport",content:p.join(", ")}),r.themeColor&&e.push({tag:"meta",name:"theme-color",content:r.themeColor})}return e}function Y({metadata:t,viewport:r}){return typeof window>"u"||!t?null:k(Z,{children:pt(t,r)})}function pt(t,r){let e=ct(t,r);return k(Z,{children:e.map((o,f)=>o.tag==="title"?k("title",{children:o.children},f):o.tag==="link"?k("link",{rel:o.rel,href:o.href,hrefLang:o.hrefLang,type:o.type,sizes:o.sizes},f):k("meta",{name:o.name,property:o.property,content:o.content},f))})}import{createContext as z}from"react";var P=globalThis;P.__devix_RouterContext__??=z(null);var C=P.__devix_RouterContext__;P.__devix_PageMetaContext__??=z(null);P.__devix_RouteDataContext__??=z(null);var tt=P.__devix_PageMetaContext__,_=P.__devix_RouteDataContext__;import{Component as dt}from"react";import{jsx as rt}from"react/jsx-runtime";var G=class extends dt{state={error:null};static getDerivedStateFromError(r){return r instanceof U?{error:{statusCode:r.statusCode,message:r.message}}:{error:{statusCode:500,message:r instanceof Error?r.message:"Unknown error"}}}render(){return this.state.error&&this.props.ErrorPage?rt(this.props.ErrorPage,{...this.state.error}):this.state.error?rt("h1",{children:this.state.error.statusCode}):this.props.children}},et=Symbol.for("@devlusoft/devix.DevixError"),U=class extends Error{static[Symbol.hasInstance](r){return r!==null&&typeof r=="object"&&r[et]===!0}statusCode;code;data;constructor(r,e,o){super(e),this.name="DevixError",this.statusCode=r,this.code=o?.code,this.data=o?.data,this[et]=!0}};function F(t){let r=new URL(window.location.href);r.pathname.endsWith("/")||(r.pathname+="/");let e=new URL(t,r);if(e.origin!==window.location.origin)return{kind:"external",url:e};let o=e.pathname.length>1?e.pathname.replace(/\/$/,""):e.pathname;return{kind:"internal",pathname:o,href:o+e.search+e.hash}}import{jsx as g,jsxs as wt}from"react/jsx-runtime";var ft={width:"device-width",initialScale:1};function Ot(){return v(C)}var mt=()=>Promise.resolve(),ht=()=>Promise.resolve();function It(){return v(C)?.navigate??mt}function $t(){return v(C)?.revalidate??ht}function Bt(){let t=v(_);if(!t)throw new Error("useParams must be used within a route or layout");return t.params}function zt(){let t=v(_);if(!t)throw new Error("useLoaderData must be used within a route or layout");return t.loaderData}function Ut(){let t=v(C);if(!t)throw new Error("useGuardData must be used within a route or layout");return t.guardData}function Ft({initialData:t,initialParams:r,initialPage:e,initialLayouts:o=[],initialLayoutsData:f=[],initialGuardData:M=null,initialMeta:S,initialViewport:p,initialError:y,initialErrorPage:m,clientEntry:nt,matchClientRoute:W,loadErrorPage:q,getDefaultErrorPage:X}){let[n,L]=at({pathname:window.location.pathname,params:r,loaderData:t,layoutsData:f,guardData:M,Page:e,layouts:o,metadata:S??null,viewport:p,pendingError:y,ErrorPage:m}),V=H(null),[ot,J]=at(!1),E=H(new Map),it=j(i=>{let s=F(i);if(s.kind==="external")return;let l=s.href;if(E.current.has(l))return;let a=W(s.pathname);if(!a)return;let u=new AbortController,d=Promise.all([Promise.all([a.load(),...a.loadLayouts.map(h=>h())]),fetch(`/_data${l}`,{headers:{Accept:"application/json"},signal:u.signal})]).then(async([[h,...c],b])=>{if(!b.ok||!h.default)return null;let A=await b.json();return{pageMod:h,layoutMods:c,data:A}}).catch(()=>null),T=setTimeout(()=>{u.abort(),E.current.delete(l)},3e3);d.finally(()=>clearTimeout(T)),E.current.set(l,{promise:d,controller:u})},[]),D=j(async(i,s)=>{let l=i.split("?")[0].split("#")[0],a=W(l);if(!a){let w=await q()??X();L($=>({...$,pathname:l,pendingError:{statusCode:404,message:"Not found"},ErrorPage:w??void 0}));return}let u=E.current.get(i);u&&E.current.delete(i);let d=u?await u.promise:null;if(s.signal.aborted)return;let T,h,c;if(d)({pageMod:T,layoutMods:h,data:c}=d);else{let[[w,...$],x]=await Promise.all([Promise.all([a.load(),...a.loadLayouts.map(N=>N())]),fetch(`/_data${i}`,{headers:{Accept:"application/json"},signal:s.signal})]);if(s.signal.aborted||!w.default)return;if(!x.ok){let N=x.headers.get("Content-Type")??"",R=null;try{N.includes("application/json")?R=await x.json():N.includes("text/plain")&&(R={message:await x.text()})}catch{}let Q={};x.headers.forEach((B,ut)=>{Q[ut]=B});let lt=await q()??X();L(B=>({...B,pathname:l,pendingError:{statusCode:R?.statusCode??x.status,message:R?.message??"Server error",code:R?.code,data:R?.data,headers:Q},ErrorPage:lt??void 0}));return}T=w,h=$,c=await x.json()}if(c.redirect){c.redirectReplace?window.history.replaceState(null,"",c.redirect):window.history.pushState(null,"",c.redirect),await D(c.redirect,s);return}L({pathname:l,params:c.params??{},loaderData:c.loaderData,layoutsData:(c.layouts??[]).map(w=>w.loaderData),guardData:c.guardData??null,Page:T.default,layouts:h.map(w=>w.default),metadata:c.metadata??null,viewport:c.viewport??ft});let b=i.includes("#")?i.split("#")[1]:null,A=getComputedStyle(document.documentElement).scrollBehavior;b?requestAnimationFrame(()=>{document.getElementById(b)?.scrollIntoView({behavior:A})}):window.scrollTo({top:0,behavior:A})},[]),O=j(async(i,s)=>{let l=F(i);if(l.kind==="external"){window.location.href=l.url.href;return}let a=l.href;V.current?.abort();let u=new AbortController;V.current=u,J(!0);let d=async()=>{window.history[s?.replace?"replaceState":"pushState"](null,"",a),await D(a,u)};try{s?.viewTransition&&"startViewTransition"in document?await document.startViewTransition(d).finished:await d()}finally{u.signal.aborted||J(!1)}},[D]),K=H(null),st=j(async()=>{K.current?.abort();let i=new AbortController;K.current=i;let s=window.location.pathname+window.location.search,l;try{l=await fetch(`/_data${s}`,{headers:{Accept:"application/json"},signal:i.signal})}catch(u){if(u.name==="AbortError")return;throw u}if(i.signal.aborted||!l.ok)return;let a=await l.json();if(!i.signal.aborted){if(a.redirect){await O(a.redirect,{replace:a.redirectReplace});return}L(u=>({...u,loaderData:a.loaderData,layoutsData:(a.layouts??[]).map(d=>d.loaderData),guardData:a.guardData??null,params:a.params??u.params,metadata:a.metadata??u.metadata,viewport:a.viewport??u.viewport}))}},[O]);gt(()=>{let i=()=>{V.current?.abort();let s=new AbortController;V.current=s;let l=window.location.pathname+window.location.search;D(l,s).catch(a=>{a.name!=="AbortError"&&console.error("[router] popstate error:",a)})};return window.addEventListener("popstate",i),()=>window.removeEventListener("popstate",i)},[D]);let I;if(n.pendingError)I=n.ErrorPage?g(n.ErrorPage,{...n.pendingError}):g("h1",{children:n.pendingError.statusCode});else{let i=g(_,{value:{loaderData:n.loaderData,params:n.params},children:g(n.Page,{data:n.loaderData,params:n.params,url:n.pathname})});for(let s=n.layouts.length-1;s>=0;s--){let l=n.layouts[s],a=n.layoutsData[s];i=g(_,{value:{loaderData:a,params:n.params},children:g(l,{data:a,params:n.params,children:i})})}I=g(G,{ErrorPage:n.ErrorPage,children:i},n.pathname)}return wt(tt,{value:{metadata:n.metadata,viewport:n.viewport,clientEntry:nt},children:[g(Y,{metadata:n.metadata,viewport:n.viewport}),g(C,{value:{...n,isNavigating:ot,navigate:O,revalidate:st,prefetchRoute:it},children:I})]})}export{Ft as RouterProvider,Ut as useGuardData,zt as useLoaderData,It as useNavigate,Bt as useParams,$t as useRevalidate,Ot as useRouter};
|
|
2
2
|
//# sourceMappingURL=router-provider.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/runtime/router-provider.tsx", "../../src/runtime/head.tsx", "../../src/runtime/context.tsx", "../../src/runtime/error-boundary.tsx", "../../src/runtime/url.ts"],
|
|
4
|
-
"sourcesContent": ["import { ComponentType, ReactNode, useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { ErrorProps, LayoutProps, PageProps } from \"../server/types\";\nimport { Metadata, Viewport } from \"../types\";\n\nconst DEFAULT_VIEWPORT: Viewport = { width: 'device-width', initialScale: 1 }\nimport { HeadSlot } from \"./head\";\nimport { NavigateOptions, PageMetaContext, RouteDataContext, RouterContext } from \"./context\";\nimport { DevixErrorBoundary } from \"./error-boundary\";\nimport { resolveTo } from \"./url\";\nimport type { Redirect } from \"../utils/response\";\n\nexport interface ClientRouteMatcher {\n matchClientRoute: (pathname: string) => {\n load: () => Promise<any>\n loadLayouts: (() => Promise<any>)[]\n params: Record<string, string>\n } | null\n loadErrorPage: () => Promise<ComponentType<ErrorProps> | null>\n getDefaultErrorPage: () => ComponentType<ErrorProps> | null\n}\n\ninterface RouteState {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n guardData: unknown\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n pendingError?: ErrorProps\n ErrorPage?: ComponentType<ErrorProps>\n}\n\nexport function useRouter() {\n return useContext(RouterContext)\n}\n\nconst noopNavigate = () => Promise.resolve()\nconst noopRevalidate = () => Promise.resolve()\n\nexport function useNavigate() {\n const ctx = useContext(RouterContext)\n return ctx?.navigate ?? noopNavigate\n}\n\nexport function useRevalidate() {\n const ctx = useContext(RouterContext)\n return ctx?.revalidate ?? noopRevalidate\n}\n\nexport function useParams<T extends Record<string, string>>() {\n const ctx = useContext(RouteDataContext)\n if (!ctx) throw new Error(\"useParams must be used within a route or layout\")\n return ctx.params as T\n}\n\ntype LoaderReturnType<T> = T extends (...args: any[]) => Promise<infer R>\n ? [Exclude<R, Redirect | void | undefined>] extends [never] ? undefined : Exclude<R, Redirect | void | undefined>\n : T extends (...args: any[]) => infer R\n ? [Exclude<R, Redirect | void | undefined>] extends [never] ? undefined : Exclude<R, Redirect | void | undefined>\n : T\n\nexport function useLoaderData<T>() {\n const ctx = useContext(RouteDataContext)\n if (!ctx) throw new Error(\"useLoaderData must be used within a route or layout\")\n return ctx.loaderData as LoaderReturnType<T>\n}\n\ntype GuardDataReturn<TGuard> =\n TGuard extends (...args: any[]) => infer R\n ? Exclude<Awaited<R>, string | Redirect | null | undefined | { readonly statusCode: number; readonly message: string }>\n : unknown\n\n/**\n * Devuelve el `guardData` resuelto en el \u00FAltimo guard que retorn\u00F3 un objeto\n * (layout \u2192 page, en orden). Tipado al retorno del guard si pasas `typeof guard`.\n *\n * ```ts\n * export async function guard({ request }: LoaderContext) {\n * const session = await getSession(request)\n * if (!session) return '/login'\n * return session\n * }\n *\n * function Header() {\n * const session = useGuardData<typeof guard>()\n * return <span>{session.user.name}</span>\n * }\n * ```\n */\nexport function useGuardData<TGuard = unknown>(): GuardDataReturn<TGuard> {\n const ctx = useContext(RouterContext)\n if (!ctx) throw new Error(\"useGuardData must be used within a route or layout\")\n return ctx.guardData as GuardDataReturn<TGuard>\n}\n\ninterface PrefetchEntry {\n promise: Promise<{ pageMod: any; layoutMods: any[]; data: any } | null>\n controller: AbortController\n}\n\ninterface RouterProviderProps extends ClientRouteMatcher {\n initialData: unknown\n initialParams: Record<string, string>\n initialPage: ComponentType<PageProps>\n initialLayouts?: ComponentType<LayoutProps>[]\n initialLayoutsData?: unknown[]\n initialGuardData?: unknown\n initialMeta?: Metadata | null\n initialViewport?: Viewport\n initialError?: ErrorProps\n initialErrorPage?: ComponentType<ErrorProps>\n clientEntry: string\n}\n\nexport function RouterProvider({\n initialData,\n initialParams,\n initialPage,\n initialLayouts = [],\n initialLayoutsData = [],\n initialGuardData = null,\n initialMeta,\n initialViewport,\n initialError,\n initialErrorPage,\n clientEntry,\n matchClientRoute,\n loadErrorPage,\n getDefaultErrorPage,\n}: RouterProviderProps) {\n\n const [state, setState] = useState<RouteState>({\n pathname: window.location.pathname,\n params: initialParams,\n loaderData: initialData,\n layoutsData: initialLayoutsData,\n guardData: initialGuardData,\n Page: initialPage,\n layouts: initialLayouts,\n metadata: initialMeta ?? null,\n viewport: initialViewport,\n pendingError: initialError,\n ErrorPage: initialErrorPage,\n })\n\n const navigatingRef = useRef<AbortController | null>(null)\n const [isNavigating, setIsNavigating] = useState(false)\n\n const prefetchCacheRef = useRef<Map<string, PrefetchEntry>>(new Map())\n\n const prefetchRoute = useCallback((href: string) => {\n const resolved = resolveTo(href)\n if (resolved.kind === 'external') return\n\n const key = resolved.href\n if (prefetchCacheRef.current.has(key)) return\n const matched = matchClientRoute(resolved.pathname)\n if (!matched) return\n\n const controller = new AbortController()\n const promise = Promise.all([\n Promise.all([matched.load(), ...matched.loadLayouts.map(l => l())]),\n fetch(`/_data${key}`, { headers: { Accept: 'application/json' }, signal: controller.signal })\n ]).then(async ([[pageMod, ...layoutMods], dataRes]) => {\n if (!dataRes.ok || !pageMod.default) return null\n const data = await dataRes.json()\n return { pageMod, layoutMods, data }\n }).catch(() => null)\n\n const expireTimer = setTimeout(() => {\n controller.abort()\n prefetchCacheRef.current.delete(key)\n }, 3000)\n promise.finally(() => clearTimeout(expireTimer))\n\n prefetchCacheRef.current.set(key, { promise, controller })\n }, [])\n\n const loadRoute = useCallback(async (to: string, controller: AbortController) => {\n const pathname = to.split('?')[0].split('#')[0]\n const matched = matchClientRoute(pathname)\n if (!matched) {\n const ErrorPage = await loadErrorPage() ?? getDefaultErrorPage()\n setState(prev => ({\n ...prev,\n pathname: pathname,\n pendingError: { statusCode: 404, message: 'Not found' },\n ErrorPage: ErrorPage ?? undefined,\n }))\n return\n }\n\n const cached = prefetchCacheRef.current.get(to)\n if (cached) prefetchCacheRef.current.delete(to)\n const prefetched = cached ? await cached.promise : null\n\n if (controller.signal.aborted) return\n\n let pageMod: any, layoutMods: any[], data: any\n\n if (prefetched) {\n ;({ pageMod, layoutMods, data } = prefetched)\n } else {\n const [[pm, ...lm], dataRes] = await Promise.all([\n Promise.all([\n matched.load(),\n ...matched.loadLayouts.map(l => l()),\n ]),\n fetch(`/_data${to}`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n ])\n\n if (controller.signal.aborted) return\n if (!pm.default) return\n\n if (!dataRes.ok) {\n const ct = dataRes.headers.get('Content-Type') ?? ''\n let errorBody: { statusCode?: number; message?: string; code?: string; data?: unknown } | null = null\n try {\n if (ct.includes('application/json')) errorBody = await dataRes.json()\n else if (ct.includes('text/plain')) errorBody = { message: await dataRes.text() }\n } catch { /* ignorar errores de parsing */ }\n\n const headers: Record<string, string> = {}\n dataRes.headers.forEach((value, key) => { headers[key] = value })\n\n const ErrorPage = await loadErrorPage() ?? getDefaultErrorPage()\n setState(prev => ({\n ...prev,\n pathname,\n pendingError: {\n statusCode: errorBody?.statusCode ?? dataRes.status,\n message: errorBody?.message ?? 'Server error',\n code: errorBody?.code,\n data: errorBody?.data,\n headers,\n },\n ErrorPage: ErrorPage ?? undefined,\n }))\n return\n }\n\n pageMod = pm\n layoutMods = lm\n data = await dataRes.json()\n }\n\n if (data.redirect) {\n if (data.redirectReplace) {\n window.history.replaceState(null, '', data.redirect)\n } else {\n window.history.pushState(null, '', data.redirect)\n }\n await loadRoute(data.redirect, controller)\n return\n }\n\n setState({\n pathname,\n params: data.params ?? {},\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n guardData: data.guardData ?? null,\n Page: pageMod.default,\n layouts: layoutMods.map(m => m.default),\n metadata: data.metadata ?? null,\n viewport: data.viewport ?? DEFAULT_VIEWPORT,\n })\n\n const hash = to.includes('#') ? to.split('#')[1] : null\n const scrollBehavior = getComputedStyle(document.documentElement).scrollBehavior as ScrollBehavior\n if (hash) {\n requestAnimationFrame(() => {\n document.getElementById(hash)?.scrollIntoView({ behavior: scrollBehavior })\n })\n } else {\n window.scrollTo({ top: 0, behavior: scrollBehavior })\n }\n }, [])\n\n const navigate = useCallback(async (to: string, options?: NavigateOptions) => {\n const resolved = resolveTo(to)\n if (resolved.kind === 'external') {\n window.location.href = resolved.url.href\n return\n }\n const href = resolved.href\n\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n setIsNavigating(true)\n const run = async () => {\n window.history[options?.replace ? 'replaceState' : 'pushState'](null, '', href)\n await loadRoute(href, controller)\n }\n try {\n if (options?.viewTransition && 'startViewTransition' in document) {\n await (document as any).startViewTransition(run).finished\n } else {\n await run()\n }\n } finally {\n if (!controller.signal.aborted) setIsNavigating(false)\n }\n }, [loadRoute])\n\n const revalidatingRef = useRef<AbortController | null>(null)\n\n const revalidate = useCallback(async () => {\n revalidatingRef.current?.abort()\n const controller = new AbortController()\n revalidatingRef.current = controller\n\n const to = window.location.pathname + window.location.search\n let dataRes: Response\n try {\n dataRes = await fetch(`/_data${to}`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n } catch (err) {\n if ((err as Error).name === 'AbortError') return\n throw err\n }\n\n if (controller.signal.aborted) return\n if (!dataRes.ok) return\n\n const data = await dataRes.json()\n if (controller.signal.aborted) return\n\n if (data.redirect) {\n await navigate(data.redirect, { replace: data.redirectReplace })\n return\n }\n setState(prev => ({\n ...prev,\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n guardData: data.guardData ?? null,\n params: data.params ?? prev.params,\n metadata: data.metadata ?? prev.metadata,\n viewport: data.viewport ?? prev.viewport,\n }))\n }, [navigate])\n\n useEffect(() => {\n const handlePop = () => {\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n const to = window.location.pathname + window.location.search\n loadRoute(to, controller).catch(err => {\n if (err.name !== 'AbortError') console.error('[router] popstate error:', err)\n })\n }\n window.addEventListener(\"popstate\", handlePop)\n return () => window.removeEventListener(\"popstate\", handlePop)\n }, [loadRoute])\n\n let content: ReactNode\n\n if (state.pendingError) {\n content = state.ErrorPage\n ? <state.ErrorPage {...state.pendingError} />\n : <h1>{state.pendingError.statusCode}</h1>\n } else {\n let tree: ReactNode = (\n <RouteDataContext value={{ loaderData: state.loaderData, params: state.params }}>\n <state.Page data={state.loaderData} params={state.params} url={state.pathname} />\n </RouteDataContext>\n )\n\n for (let i = state.layouts.length - 1; i >= 0; i--) {\n const Layout = state.layouts[i]\n const layoutData = state.layoutsData[i]\n tree = (\n <RouteDataContext value={{ loaderData: layoutData, params: state.params }}>\n <Layout data={layoutData} params={state.params}>{tree}</Layout>\n </RouteDataContext>\n )\n }\n\n content = (\n <DevixErrorBoundary key={state.pathname} ErrorPage={state.ErrorPage}>\n {tree}\n </DevixErrorBoundary>\n )\n }\n\n return (\n <PageMetaContext value={{\n metadata: state.metadata,\n viewport: state.viewport,\n clientEntry,\n }}>\n <HeadSlot metadata={state.metadata} viewport={state.viewport} />\n <RouterContext value={{ ...state, isNavigating, navigate, revalidate, prefetchRoute }}>\n {content}\n </RouterContext>\n </PageMetaContext>\n )\n}", "import { Metadata, MetadataIcon, Viewport } from \"../types\";\nimport { ReactNode } from \"react\";\n\ntype MetaTag =\n | { tag: 'title'; children: string }\n | { tag: 'meta'; name?: string; property?: string; content: string }\n | { tag: 'link'; rel: string; href: string; hrefLang?: string; type?: string; sizes?: string }\n\nfunction collectTags(metadata: Metadata, viewport?: Viewport): MetaTag[] {\n const tags: MetaTag[] = []\n\n if (metadata.title)\n tags.push({ tag: 'title', children: metadata.title })\n if (metadata.description)\n tags.push({ tag: 'meta', name: 'description', content: metadata.description })\n if (metadata.keywords?.length)\n tags.push({ tag: 'meta', name: 'keywords', content: metadata.keywords.join(', ') })\n\n const ogTitle = metadata.og?.title ?? metadata.title\n if (ogTitle) tags.push({ tag: 'meta', property: 'og:title', content: ogTitle })\n const ogDesc = metadata.og?.description ?? metadata.description\n if (ogDesc) tags.push({ tag: 'meta', property: 'og:description', content: ogDesc })\n if (metadata.og?.image) tags.push({ tag: 'meta', property: 'og:image', content: metadata.og.image })\n if (metadata.og?.type) tags.push({ tag: 'meta', property: 'og:type', content: metadata.og.type })\n if (metadata.og?.url) tags.push({ tag: 'meta', property: 'og:url', content: metadata.og.url })\n\n const twTitle = metadata.twitter?.title ?? metadata.title\n if (twTitle) tags.push({ tag: 'meta', name: 'twitter:title', content: twTitle })\n const twDesc = metadata.twitter?.description ?? metadata.description\n if (twDesc) tags.push({ tag: 'meta', name: 'twitter:description', content: twDesc })\n if (metadata.twitter?.card) tags.push({\n tag: 'meta', name: 'twitter:card', content:\n metadata.twitter.card\n })\n if (metadata.twitter?.image) tags.push({\n tag: 'meta', name: 'twitter:image', content:\n metadata.twitter.image\n })\n if (metadata.twitter?.creator) tags.push({\n tag: 'meta', name: 'twitter:creator', content:\n metadata.twitter.creator\n })\n\n if (metadata.canonical) tags.push({ tag: 'link', rel: 'canonical', href: metadata.canonical })\n if (metadata.robots) tags.push({ tag: 'meta', name: 'robots', content: metadata.robots })\n if (metadata.alternates) {\n for (const [lang, href] of Object.entries(metadata.alternates))\n tags.push({ tag: 'link', rel: 'alternate', href, hrefLang: lang })\n }\n\n if (metadata.icons) {\n const raw = Array.isArray(metadata.icons) ? metadata.icons : [metadata.icons]\n for (const icon of raw) {\n const resolved: MetadataIcon = typeof icon === 'string' ? { href: icon } : icon\n tags.push({\n tag: 'link',\n rel: resolved.rel ?? 'icon',\n href: resolved.href,\n ...(resolved.type && { type: resolved.type }),\n ...(resolved.sizes && { sizes: resolved.sizes }),\n })\n }\n }\n\n if (viewport) {\n const parts: string[] = []\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`)\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`)\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`)\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' :\n 'no'}`)\n if (parts.length) tags.push({ tag: 'meta', name: 'viewport', content: parts.join(', ') })\n if (viewport.themeColor) tags.push({\n tag: 'meta', name: 'theme-color', content: viewport.themeColor\n })\n }\n\n return tags\n}\n\nexport function HeadSlot({ metadata, viewport }: { metadata: Metadata | null, viewport?: Viewport }) {\n if (typeof window === 'undefined' || !metadata) return null\n return <>{buildHeadNodes(metadata, viewport)}</>\n}\n\nexport function buildHeadNodes(metadata: Metadata, viewport?: Viewport): ReactNode {\n const tags = collectTags(metadata, viewport)\n\n return <>\n {tags.map((t, i) => {\n if (t.tag === 'title') return <title key={i}>{t.children}</title>\n if (t.tag === 'link') return <link key={i} rel={t.rel} href={t.href} hrefLang={t.hrefLang} type={t.type} sizes={t.sizes} />\n return <meta key={i} name={t.name} property={t.property} content={t.content} />\n })}\n </>\n}", "import {createContext, Context, ComponentType} from \"react\";\nimport {Metadata, Viewport} from \"../types\";\nimport {LayoutProps, PageProps} from \"../server/types\";\n\nexport interface NavigateOptions {\n replace?: boolean\n viewTransition?: boolean\n}\n\nexport interface RouterContextValue {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n guardData: unknown\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n navigate: (to: string, options?: NavigateOptions) => Promise<void>\n revalidate: () => Promise<void>\n prefetchRoute: (href: string) => void\n isNavigating: boolean\n}\n\nexport interface PageMetaContextValue {\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry?: string\n}\n\nexport interface RouteDataContextValue {\n loaderData: unknown\n params: Record<string, string>\n}\n\nconst g = globalThis as any\n\ng.__devix_RouterContext__ ??= createContext<RouterContextValue | null>(null)\nexport const RouterContext: Context<RouterContextValue | null> = g.__devix_RouterContext__\n\ng.__devix_PageMetaContext__ ??= createContext<PageMetaContextValue | null>(null)\ng.__devix_RouteDataContext__ ??= createContext<RouteDataContextValue | null>(null)\n\nexport const PageMetaContext: Context<PageMetaContextValue | null> = g.__devix_PageMetaContext__\nexport const RouteDataContext: Context<RouteDataContextValue | null> = g.__devix_RouteDataContext__\n\n", "import {Component, ComponentType, ReactNode} from \"react\";\nimport {ErrorProps} from \"../server/types\";\n\ninterface Props {\n ErrorPage?: ComponentType<ErrorProps>\n children: ReactNode\n}\n\ninterface State {\n error: ErrorProps | null\n}\n\nexport class DevixErrorBoundary extends Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(err: unknown): State {\n if (err instanceof DevixError) {\n return {\n error: {statusCode: err.statusCode, message: err.message}\n }\n }\n return {\n error: {statusCode: 500, message: err instanceof Error ? err.message : 'Unknown error'}\n }\n }\n\n render() {\n if (this.state.error && this.props.ErrorPage) {\n return <this.props.ErrorPage {...this.state.error} />\n }\n if (this.state.error) {\n return <h1>{this.state.error.statusCode}</h1>\n }\n return this.props.children\n }\n}\n\nexport interface DevixErrorOptions {\n code?: string\n data?: unknown\n}\n\nexport class DevixError extends Error {\n statusCode: number\n code?: string\n data?: unknown\n constructor(statusCode: number, message: string, options?: DevixErrorOptions) {\n super(message)\n this.name = 'DevixError'\n this.statusCode = statusCode\n this.code = options?.code\n this.data = options?.data\n }\n}\n", "export type ResolvedTo =\n | { kind: 'internal'; pathname: string; href: string }\n | { kind: 'external'; url: URL }\n\nexport function resolveTo(to: string): ResolvedTo {\n const base = new URL(window.location.href)\n if (!base.pathname.endsWith('/')) base.pathname += '/'\n\n const url = new URL(to, base)\n\n if (url.origin !== window.location.origin) {\n return { kind: 'external', url }\n }\n\n const pathname = url.pathname.length > 1\n ? url.pathname.replace(/\\/$/, '')\n : url.pathname\n\n return {\n kind: 'internal',\n pathname,\n href: pathname + url.search + url.hash,\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["useCallback", "useContext", "useEffect", "useRef", "useState", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "raw", "icon", "resolved", "parts", "HeadSlot", "buildHeadNodes", "t", "i", "createContext", "g", "RouterContext", "PageMetaContext", "RouteDataContext", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "statusCode", "message", "options", "resolveTo", "to", "base", "url", "pathname", "jsx", "jsxs", "DEFAULT_VIEWPORT", "useRouter", "useContext", "RouterContext", "noopNavigate", "noopRevalidate", "useNavigate", "useRevalidate", "useParams", "ctx", "RouteDataContext", "useLoaderData", "useGuardData", "RouterProvider", "initialData", "initialParams", "initialPage", "initialLayouts", "initialLayoutsData", "initialGuardData", "initialMeta", "initialViewport", "initialError", "initialErrorPage", "clientEntry", "matchClientRoute", "loadErrorPage", "getDefaultErrorPage", "state", "setState", "useState", "navigatingRef", "useRef", "isNavigating", "setIsNavigating", "prefetchCacheRef", "prefetchRoute", "useCallback", "href", "resolved", "resolveTo", "key", "matched", "controller", "promise", "l", "pageMod", "layoutMods", "dataRes", "data", "expireTimer", "loadRoute", "to", "pathname", "ErrorPage", "prev", "cached", "prefetched", "pm", "lm", "ct", "errorBody", "headers", "value", "m", "hash", "scrollBehavior", "navigate", "options", "run", "revalidatingRef", "revalidate", "err", "useEffect", "handlePop", "content", "tree", "i", "Layout", "layoutData", "DevixErrorBoundary", "PageMetaContext", "HeadSlot"]
|
|
4
|
+
"sourcesContent": ["import { ComponentType, ReactNode, useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { ErrorProps, LayoutProps, PageProps } from \"../server/types\";\nimport { Metadata, Viewport } from \"../types\";\n\nconst DEFAULT_VIEWPORT: Viewport = { width: 'device-width', initialScale: 1 }\nimport { HeadSlot } from \"./head\";\nimport { NavigateOptions, PageMetaContext, RouteDataContext, RouterContext } from \"./context\";\nimport { DevixErrorBoundary } from \"./error-boundary\";\nimport { resolveTo } from \"./url\";\nimport type { Redirect } from \"../utils/response\";\n\nexport interface ClientRouteMatcher {\n matchClientRoute: (pathname: string) => {\n load: () => Promise<any>\n loadLayouts: (() => Promise<any>)[]\n params: Record<string, string>\n } | null\n loadErrorPage: () => Promise<ComponentType<ErrorProps> | null>\n getDefaultErrorPage: () => ComponentType<ErrorProps> | null\n}\n\ninterface RouteState {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n guardData: unknown\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n pendingError?: ErrorProps\n ErrorPage?: ComponentType<ErrorProps>\n}\n\nexport function useRouter() {\n return useContext(RouterContext)\n}\n\nconst noopNavigate = () => Promise.resolve()\nconst noopRevalidate = () => Promise.resolve()\n\nexport function useNavigate() {\n const ctx = useContext(RouterContext)\n return ctx?.navigate ?? noopNavigate\n}\n\nexport function useRevalidate() {\n const ctx = useContext(RouterContext)\n return ctx?.revalidate ?? noopRevalidate\n}\n\nexport function useParams<T extends Record<string, string>>() {\n const ctx = useContext(RouteDataContext)\n if (!ctx) throw new Error(\"useParams must be used within a route or layout\")\n return ctx.params as T\n}\n\ntype LoaderReturnType<T> = T extends (...args: any[]) => Promise<infer R>\n ? [Exclude<R, Redirect | void | undefined>] extends [never] ? undefined : Exclude<R, Redirect | void | undefined>\n : T extends (...args: any[]) => infer R\n ? [Exclude<R, Redirect | void | undefined>] extends [never] ? undefined : Exclude<R, Redirect | void | undefined>\n : T\n\nexport function useLoaderData<T>() {\n const ctx = useContext(RouteDataContext)\n if (!ctx) throw new Error(\"useLoaderData must be used within a route or layout\")\n return ctx.loaderData as LoaderReturnType<T>\n}\n\ntype GuardDataReturn<TGuard> =\n TGuard extends (...args: any[]) => infer R\n ? Exclude<Awaited<R>, string | Redirect | null | undefined | { readonly statusCode: number; readonly message: string }>\n : unknown\n\n/**\n * Devuelve el `guardData` resuelto en el \u00FAltimo guard que retorn\u00F3 un objeto\n * (layout \u2192 page, en orden). Tipado al retorno del guard si pasas `typeof guard`.\n *\n * ```ts\n * export async function guard({ request }: LoaderContext) {\n * const session = await getSession(request)\n * if (!session) return '/login'\n * return session\n * }\n *\n * function Header() {\n * const session = useGuardData<typeof guard>()\n * return <span>{session.user.name}</span>\n * }\n * ```\n */\nexport function useGuardData<TGuard = unknown>(): GuardDataReturn<TGuard> {\n const ctx = useContext(RouterContext)\n if (!ctx) throw new Error(\"useGuardData must be used within a route or layout\")\n return ctx.guardData as GuardDataReturn<TGuard>\n}\n\ninterface PrefetchEntry {\n promise: Promise<{ pageMod: any; layoutMods: any[]; data: any } | null>\n controller: AbortController\n}\n\ninterface RouterProviderProps extends ClientRouteMatcher {\n initialData: unknown\n initialParams: Record<string, string>\n initialPage: ComponentType<PageProps>\n initialLayouts?: ComponentType<LayoutProps>[]\n initialLayoutsData?: unknown[]\n initialGuardData?: unknown\n initialMeta?: Metadata | null\n initialViewport?: Viewport\n initialError?: ErrorProps\n initialErrorPage?: ComponentType<ErrorProps>\n clientEntry: string\n}\n\nexport function RouterProvider({\n initialData,\n initialParams,\n initialPage,\n initialLayouts = [],\n initialLayoutsData = [],\n initialGuardData = null,\n initialMeta,\n initialViewport,\n initialError,\n initialErrorPage,\n clientEntry,\n matchClientRoute,\n loadErrorPage,\n getDefaultErrorPage,\n}: RouterProviderProps) {\n\n const [state, setState] = useState<RouteState>({\n pathname: window.location.pathname,\n params: initialParams,\n loaderData: initialData,\n layoutsData: initialLayoutsData,\n guardData: initialGuardData,\n Page: initialPage,\n layouts: initialLayouts,\n metadata: initialMeta ?? null,\n viewport: initialViewport,\n pendingError: initialError,\n ErrorPage: initialErrorPage,\n })\n\n const navigatingRef = useRef<AbortController | null>(null)\n const [isNavigating, setIsNavigating] = useState(false)\n\n const prefetchCacheRef = useRef<Map<string, PrefetchEntry>>(new Map())\n\n const prefetchRoute = useCallback((href: string) => {\n const resolved = resolveTo(href)\n if (resolved.kind === 'external') return\n\n const key = resolved.href\n if (prefetchCacheRef.current.has(key)) return\n const matched = matchClientRoute(resolved.pathname)\n if (!matched) return\n\n const controller = new AbortController()\n const promise = Promise.all([\n Promise.all([matched.load(), ...matched.loadLayouts.map(l => l())]),\n fetch(`/_data${key}`, { headers: { Accept: 'application/json' }, signal: controller.signal })\n ]).then(async ([[pageMod, ...layoutMods], dataRes]) => {\n if (!dataRes.ok || !pageMod.default) return null\n const data = await dataRes.json()\n return { pageMod, layoutMods, data }\n }).catch(() => null)\n\n const expireTimer = setTimeout(() => {\n controller.abort()\n prefetchCacheRef.current.delete(key)\n }, 3000)\n promise.finally(() => clearTimeout(expireTimer))\n\n prefetchCacheRef.current.set(key, { promise, controller })\n }, [])\n\n const loadRoute = useCallback(async (to: string, controller: AbortController) => {\n const pathname = to.split('?')[0].split('#')[0]\n const matched = matchClientRoute(pathname)\n if (!matched) {\n const ErrorPage = await loadErrorPage() ?? getDefaultErrorPage()\n setState(prev => ({\n ...prev,\n pathname: pathname,\n pendingError: { statusCode: 404, message: 'Not found' },\n ErrorPage: ErrorPage ?? undefined,\n }))\n return\n }\n\n const cached = prefetchCacheRef.current.get(to)\n if (cached) prefetchCacheRef.current.delete(to)\n const prefetched = cached ? await cached.promise : null\n\n if (controller.signal.aborted) return\n\n let pageMod: any, layoutMods: any[], data: any\n\n if (prefetched) {\n ;({ pageMod, layoutMods, data } = prefetched)\n } else {\n const [[pm, ...lm], dataRes] = await Promise.all([\n Promise.all([\n matched.load(),\n ...matched.loadLayouts.map(l => l()),\n ]),\n fetch(`/_data${to}`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n ])\n\n if (controller.signal.aborted) return\n if (!pm.default) return\n\n if (!dataRes.ok) {\n const ct = dataRes.headers.get('Content-Type') ?? ''\n let errorBody: { statusCode?: number; message?: string; code?: string; data?: unknown } | null = null\n try {\n if (ct.includes('application/json')) errorBody = await dataRes.json()\n else if (ct.includes('text/plain')) errorBody = { message: await dataRes.text() }\n } catch { /* ignorar errores de parsing */ }\n\n const headers: Record<string, string> = {}\n dataRes.headers.forEach((value, key) => { headers[key] = value })\n\n const ErrorPage = await loadErrorPage() ?? getDefaultErrorPage()\n setState(prev => ({\n ...prev,\n pathname,\n pendingError: {\n statusCode: errorBody?.statusCode ?? dataRes.status,\n message: errorBody?.message ?? 'Server error',\n code: errorBody?.code,\n data: errorBody?.data,\n headers,\n },\n ErrorPage: ErrorPage ?? undefined,\n }))\n return\n }\n\n pageMod = pm\n layoutMods = lm\n data = await dataRes.json()\n }\n\n if (data.redirect) {\n if (data.redirectReplace) {\n window.history.replaceState(null, '', data.redirect)\n } else {\n window.history.pushState(null, '', data.redirect)\n }\n await loadRoute(data.redirect, controller)\n return\n }\n\n setState({\n pathname,\n params: data.params ?? {},\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n guardData: data.guardData ?? null,\n Page: pageMod.default,\n layouts: layoutMods.map(m => m.default),\n metadata: data.metadata ?? null,\n viewport: data.viewport ?? DEFAULT_VIEWPORT,\n })\n\n const hash = to.includes('#') ? to.split('#')[1] : null\n const scrollBehavior = getComputedStyle(document.documentElement).scrollBehavior as ScrollBehavior\n if (hash) {\n requestAnimationFrame(() => {\n document.getElementById(hash)?.scrollIntoView({ behavior: scrollBehavior })\n })\n } else {\n window.scrollTo({ top: 0, behavior: scrollBehavior })\n }\n }, [])\n\n const navigate = useCallback(async (to: string, options?: NavigateOptions) => {\n const resolved = resolveTo(to)\n if (resolved.kind === 'external') {\n window.location.href = resolved.url.href\n return\n }\n const href = resolved.href\n\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n setIsNavigating(true)\n const run = async () => {\n window.history[options?.replace ? 'replaceState' : 'pushState'](null, '', href)\n await loadRoute(href, controller)\n }\n try {\n if (options?.viewTransition && 'startViewTransition' in document) {\n await (document as any).startViewTransition(run).finished\n } else {\n await run()\n }\n } finally {\n if (!controller.signal.aborted) setIsNavigating(false)\n }\n }, [loadRoute])\n\n const revalidatingRef = useRef<AbortController | null>(null)\n\n const revalidate = useCallback(async () => {\n revalidatingRef.current?.abort()\n const controller = new AbortController()\n revalidatingRef.current = controller\n\n const to = window.location.pathname + window.location.search\n let dataRes: Response\n try {\n dataRes = await fetch(`/_data${to}`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n } catch (err) {\n if ((err as Error).name === 'AbortError') return\n throw err\n }\n\n if (controller.signal.aborted) return\n if (!dataRes.ok) return\n\n const data = await dataRes.json()\n if (controller.signal.aborted) return\n\n if (data.redirect) {\n await navigate(data.redirect, { replace: data.redirectReplace })\n return\n }\n setState(prev => ({\n ...prev,\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n guardData: data.guardData ?? null,\n params: data.params ?? prev.params,\n metadata: data.metadata ?? prev.metadata,\n viewport: data.viewport ?? prev.viewport,\n }))\n }, [navigate])\n\n useEffect(() => {\n const handlePop = () => {\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n const to = window.location.pathname + window.location.search\n loadRoute(to, controller).catch(err => {\n if (err.name !== 'AbortError') console.error('[router] popstate error:', err)\n })\n }\n window.addEventListener(\"popstate\", handlePop)\n return () => window.removeEventListener(\"popstate\", handlePop)\n }, [loadRoute])\n\n let content: ReactNode\n\n if (state.pendingError) {\n content = state.ErrorPage\n ? <state.ErrorPage {...state.pendingError} />\n : <h1>{state.pendingError.statusCode}</h1>\n } else {\n let tree: ReactNode = (\n <RouteDataContext value={{ loaderData: state.loaderData, params: state.params }}>\n <state.Page data={state.loaderData} params={state.params} url={state.pathname} />\n </RouteDataContext>\n )\n\n for (let i = state.layouts.length - 1; i >= 0; i--) {\n const Layout = state.layouts[i]\n const layoutData = state.layoutsData[i]\n tree = (\n <RouteDataContext value={{ loaderData: layoutData, params: state.params }}>\n <Layout data={layoutData} params={state.params}>{tree}</Layout>\n </RouteDataContext>\n )\n }\n\n content = (\n <DevixErrorBoundary key={state.pathname} ErrorPage={state.ErrorPage}>\n {tree}\n </DevixErrorBoundary>\n )\n }\n\n return (\n <PageMetaContext value={{\n metadata: state.metadata,\n viewport: state.viewport,\n clientEntry,\n }}>\n <HeadSlot metadata={state.metadata} viewport={state.viewport} />\n <RouterContext value={{ ...state, isNavigating, navigate, revalidate, prefetchRoute }}>\n {content}\n </RouterContext>\n </PageMetaContext>\n )\n}", "import { Metadata, MetadataIcon, Viewport } from \"../types\";\nimport { ReactNode } from \"react\";\n\ntype MetaTag =\n | { tag: 'title'; children: string }\n | { tag: 'meta'; name?: string; property?: string; content: string }\n | { tag: 'link'; rel: string; href: string; hrefLang?: string; type?: string; sizes?: string }\n\nfunction collectTags(metadata: Metadata, viewport?: Viewport): MetaTag[] {\n const tags: MetaTag[] = []\n\n if (metadata.title)\n tags.push({ tag: 'title', children: metadata.title })\n if (metadata.description)\n tags.push({ tag: 'meta', name: 'description', content: metadata.description })\n if (metadata.keywords?.length)\n tags.push({ tag: 'meta', name: 'keywords', content: metadata.keywords.join(', ') })\n\n const ogTitle = metadata.og?.title ?? metadata.title\n if (ogTitle) tags.push({ tag: 'meta', property: 'og:title', content: ogTitle })\n const ogDesc = metadata.og?.description ?? metadata.description\n if (ogDesc) tags.push({ tag: 'meta', property: 'og:description', content: ogDesc })\n if (metadata.og?.image) tags.push({ tag: 'meta', property: 'og:image', content: metadata.og.image })\n if (metadata.og?.type) tags.push({ tag: 'meta', property: 'og:type', content: metadata.og.type })\n if (metadata.og?.url) tags.push({ tag: 'meta', property: 'og:url', content: metadata.og.url })\n\n const twTitle = metadata.twitter?.title ?? metadata.title\n if (twTitle) tags.push({ tag: 'meta', name: 'twitter:title', content: twTitle })\n const twDesc = metadata.twitter?.description ?? metadata.description\n if (twDesc) tags.push({ tag: 'meta', name: 'twitter:description', content: twDesc })\n if (metadata.twitter?.card) tags.push({\n tag: 'meta', name: 'twitter:card', content:\n metadata.twitter.card\n })\n if (metadata.twitter?.image) tags.push({\n tag: 'meta', name: 'twitter:image', content:\n metadata.twitter.image\n })\n if (metadata.twitter?.creator) tags.push({\n tag: 'meta', name: 'twitter:creator', content:\n metadata.twitter.creator\n })\n\n if (metadata.canonical) tags.push({ tag: 'link', rel: 'canonical', href: metadata.canonical })\n if (metadata.robots) tags.push({ tag: 'meta', name: 'robots', content: metadata.robots })\n if (metadata.alternates) {\n for (const [lang, href] of Object.entries(metadata.alternates))\n tags.push({ tag: 'link', rel: 'alternate', href, hrefLang: lang })\n }\n\n if (metadata.icons) {\n const raw = Array.isArray(metadata.icons) ? metadata.icons : [metadata.icons]\n for (const icon of raw) {\n const resolved: MetadataIcon = typeof icon === 'string' ? { href: icon } : icon\n tags.push({\n tag: 'link',\n rel: resolved.rel ?? 'icon',\n href: resolved.href,\n ...(resolved.type && { type: resolved.type }),\n ...(resolved.sizes && { sizes: resolved.sizes }),\n })\n }\n }\n\n if (viewport) {\n const parts: string[] = []\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`)\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`)\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`)\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' :\n 'no'}`)\n if (parts.length) tags.push({ tag: 'meta', name: 'viewport', content: parts.join(', ') })\n if (viewport.themeColor) tags.push({\n tag: 'meta', name: 'theme-color', content: viewport.themeColor\n })\n }\n\n return tags\n}\n\nexport function HeadSlot({ metadata, viewport }: { metadata: Metadata | null, viewport?: Viewport }) {\n if (typeof window === 'undefined' || !metadata) return null\n return <>{buildHeadNodes(metadata, viewport)}</>\n}\n\nexport function buildHeadNodes(metadata: Metadata, viewport?: Viewport): ReactNode {\n const tags = collectTags(metadata, viewport)\n\n return <>\n {tags.map((t, i) => {\n if (t.tag === 'title') return <title key={i}>{t.children}</title>\n if (t.tag === 'link') return <link key={i} rel={t.rel} href={t.href} hrefLang={t.hrefLang} type={t.type} sizes={t.sizes} />\n return <meta key={i} name={t.name} property={t.property} content={t.content} />\n })}\n </>\n}", "import {createContext, Context, ComponentType} from \"react\";\nimport {Metadata, Viewport} from \"../types\";\nimport {LayoutProps, PageProps} from \"../server/types\";\n\nexport interface NavigateOptions {\n replace?: boolean\n viewTransition?: boolean\n}\n\nexport interface RouterContextValue {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n guardData: unknown\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n navigate: (to: string, options?: NavigateOptions) => Promise<void>\n revalidate: () => Promise<void>\n prefetchRoute: (href: string) => void\n isNavigating: boolean\n}\n\nexport interface PageMetaContextValue {\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry?: string\n}\n\nexport interface RouteDataContextValue {\n loaderData: unknown\n params: Record<string, string>\n}\n\nconst g = globalThis as any\n\ng.__devix_RouterContext__ ??= createContext<RouterContextValue | null>(null)\nexport const RouterContext: Context<RouterContextValue | null> = g.__devix_RouterContext__\n\ng.__devix_PageMetaContext__ ??= createContext<PageMetaContextValue | null>(null)\ng.__devix_RouteDataContext__ ??= createContext<RouteDataContextValue | null>(null)\n\nexport const PageMetaContext: Context<PageMetaContextValue | null> = g.__devix_PageMetaContext__\nexport const RouteDataContext: Context<RouteDataContextValue | null> = g.__devix_RouteDataContext__\n\n", "import {Component, ComponentType, ReactNode} from \"react\";\nimport {ErrorProps} from \"../server/types\";\n\ninterface Props {\n ErrorPage?: ComponentType<ErrorProps>\n children: ReactNode\n}\n\ninterface State {\n error: ErrorProps | null\n}\n\nexport class DevixErrorBoundary extends Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(err: unknown): State {\n if (err instanceof DevixError) {\n return {\n error: {statusCode: err.statusCode, message: err.message}\n }\n }\n return {\n error: {statusCode: 500, message: err instanceof Error ? err.message : 'Unknown error'}\n }\n }\n\n render() {\n if (this.state.error && this.props.ErrorPage) {\n return <this.props.ErrorPage {...this.state.error} />\n }\n if (this.state.error) {\n return <h1>{this.state.error.statusCode}</h1>\n }\n return this.props.children\n }\n}\n\nexport interface DevixErrorOptions {\n code?: string\n data?: unknown\n}\n\nconst DEVIX_ERROR_BRAND = Symbol.for('@devlusoft/devix.DevixError')\n\nexport class DevixError extends Error {\n /**\n * Custom `instanceof` que matchea por brand cross-bundle. Ver nota en\n * `FetchError` para el detalle del dual package hazard.\n */\n static [Symbol.hasInstance](value: unknown): boolean {\n return value !== null && typeof value === 'object' && (value as any)[DEVIX_ERROR_BRAND] === true\n }\n\n statusCode: number\n code?: string\n data?: unknown\n constructor(statusCode: number, message: string, options?: DevixErrorOptions) {\n super(message)\n this.name = 'DevixError'\n this.statusCode = statusCode\n this.code = options?.code\n this.data = options?.data\n ;(this as any)[DEVIX_ERROR_BRAND] = true\n }\n}\n", "export type ResolvedTo =\n | { kind: 'internal'; pathname: string; href: string }\n | { kind: 'external'; url: URL }\n\nexport function resolveTo(to: string): ResolvedTo {\n const base = new URL(window.location.href)\n if (!base.pathname.endsWith('/')) base.pathname += '/'\n\n const url = new URL(to, base)\n\n if (url.origin !== window.location.origin) {\n return { kind: 'external', url }\n }\n\n const pathname = url.pathname.length > 1\n ? url.pathname.replace(/\\/$/, '')\n : url.pathname\n\n return {\n kind: 'internal',\n pathname,\n href: pathname + url.search + url.hash,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useCallback", "useContext", "useEffect", "useRef", "useState", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "raw", "icon", "resolved", "parts", "HeadSlot", "buildHeadNodes", "t", "i", "createContext", "g", "RouterContext", "PageMetaContext", "RouteDataContext", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "DEVIX_ERROR_BRAND", "value", "statusCode", "message", "options", "resolveTo", "to", "base", "url", "pathname", "jsx", "jsxs", "DEFAULT_VIEWPORT", "useRouter", "useContext", "RouterContext", "noopNavigate", "noopRevalidate", "useNavigate", "useRevalidate", "useParams", "ctx", "RouteDataContext", "useLoaderData", "useGuardData", "RouterProvider", "initialData", "initialParams", "initialPage", "initialLayouts", "initialLayoutsData", "initialGuardData", "initialMeta", "initialViewport", "initialError", "initialErrorPage", "clientEntry", "matchClientRoute", "loadErrorPage", "getDefaultErrorPage", "state", "setState", "useState", "navigatingRef", "useRef", "isNavigating", "setIsNavigating", "prefetchCacheRef", "prefetchRoute", "useCallback", "href", "resolved", "resolveTo", "key", "matched", "controller", "promise", "l", "pageMod", "layoutMods", "dataRes", "data", "expireTimer", "loadRoute", "to", "pathname", "ErrorPage", "prev", "cached", "prefetched", "pm", "lm", "ct", "errorBody", "headers", "value", "m", "hash", "scrollBehavior", "navigate", "options", "run", "revalidatingRef", "revalidate", "err", "useEffect", "handlePop", "content", "tree", "i", "Layout", "layoutData", "DevixErrorBoundary", "PageMetaContext", "HeadSlot"]
|
|
7
7
|
}
|