@devlusoft/devix 0.2.0 → 0.2.2

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.
Files changed (85) hide show
  1. package/dist/cli/build.js +31 -308
  2. package/dist/cli/build.js.map +3 -3
  3. package/dist/cli/dev.js +33 -395
  4. package/dist/cli/dev.js.map +3 -3
  5. package/dist/cli/generate.js +31 -434
  6. package/dist/cli/generate.js.map +3 -3
  7. package/dist/cli/index.js +34 -698
  8. package/dist/cli/index.js.map +3 -3
  9. package/dist/cli/start.js +1 -89
  10. package/dist/cli/start.js.map +2 -2
  11. package/dist/config.js +1 -16
  12. package/dist/config.js.map +2 -2
  13. package/dist/runtime/api-context.js +1 -17
  14. package/dist/runtime/api-context.js.map +2 -2
  15. package/dist/runtime/client-router.js +1 -58
  16. package/dist/runtime/client-router.js.map +2 -2
  17. package/dist/runtime/context.js +1 -14
  18. package/dist/runtime/context.js.map +2 -2
  19. package/dist/runtime/error-boundary.js +1 -36
  20. package/dist/runtime/error-boundary.js.map +2 -2
  21. package/dist/runtime/fetch.js +1 -34
  22. package/dist/runtime/fetch.js.map +2 -2
  23. package/dist/runtime/head.js +1 -68
  24. package/dist/runtime/head.js.map +2 -2
  25. package/dist/runtime/index.d.ts +1 -0
  26. package/dist/runtime/index.js +1 -367
  27. package/dist/runtime/index.js.map +3 -3
  28. package/dist/runtime/link.js +1 -42
  29. package/dist/runtime/link.js.map +2 -2
  30. package/dist/runtime/metadata.js +1 -21
  31. package/dist/runtime/metadata.js.map +2 -2
  32. package/dist/runtime/router-provider.js +1 -258
  33. package/dist/runtime/router-provider.js.map +2 -2
  34. package/dist/server/api-router.js +1 -64
  35. package/dist/server/api-router.js.map +2 -2
  36. package/dist/server/api.js +1 -123
  37. package/dist/server/api.js.map +2 -2
  38. package/dist/server/collect-css.js +1 -14
  39. package/dist/server/collect-css.js.map +2 -2
  40. package/dist/server/index.js +1 -132
  41. package/dist/server/index.js.map +2 -2
  42. package/dist/server/pages-router.js +1 -63
  43. package/dist/server/pages-router.js.map +2 -2
  44. package/dist/server/render.js +1 -305
  45. package/dist/server/render.js.map +2 -2
  46. package/dist/server/routes.js +1 -41
  47. package/dist/server/routes.js.map +2 -2
  48. package/dist/utils/async.js +1 -13
  49. package/dist/utils/async.js.map +2 -2
  50. package/dist/utils/banner.js +1 -33
  51. package/dist/utils/banner.js.map +2 -2
  52. package/dist/utils/cookies.js +1 -28
  53. package/dist/utils/cookies.js.map +2 -2
  54. package/dist/utils/duration.js +1 -21
  55. package/dist/utils/duration.js.map +2 -2
  56. package/dist/utils/env.js +1 -13
  57. package/dist/utils/env.js.map +2 -2
  58. package/dist/utils/html.js +1 -11
  59. package/dist/utils/html.js.map +2 -2
  60. package/dist/utils/patterns.js +1 -7
  61. package/dist/utils/patterns.js.map +2 -2
  62. package/dist/utils/response.d.ts +4 -1
  63. package/dist/utils/response.js +1 -9
  64. package/dist/utils/response.js.map +3 -3
  65. package/dist/vite/codegen/api.js +6 -12
  66. package/dist/vite/codegen/api.js.map +2 -2
  67. package/dist/vite/codegen/client-routes.js +6 -12
  68. package/dist/vite/codegen/client-routes.js.map +2 -2
  69. package/dist/vite/codegen/context.js +2 -8
  70. package/dist/vite/codegen/context.js.map +2 -2
  71. package/dist/vite/codegen/entry-client.js +4 -10
  72. package/dist/vite/codegen/entry-client.js.map +2 -2
  73. package/dist/vite/codegen/extract-methods.js +1 -15
  74. package/dist/vite/codegen/extract-methods.js.map +2 -2
  75. package/dist/vite/codegen/render.js +6 -12
  76. package/dist/vite/codegen/render.js.map +2 -2
  77. package/dist/vite/codegen/routes-dts.js +12 -49
  78. package/dist/vite/codegen/routes-dts.js.map +3 -3
  79. package/dist/vite/codegen/scan-api.js +1 -77
  80. package/dist/vite/codegen/scan-api.js.map +3 -3
  81. package/dist/vite/codegen/write-routes-dts.js +1 -16
  82. package/dist/vite/codegen/write-routes-dts.js.map +2 -2
  83. package/dist/vite/index.js +31 -247
  84. package/dist/vite/index.js.map +3 -3
  85. package/package.json +2 -2
@@ -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/link.tsx", "../../src/utils/cookies.ts", "../../src/utils/response.ts", "../../src/runtime/fetch.ts"],
4
- "sourcesContent": ["import {ComponentType, ReactNode, useCallback, useContext, useEffect, useRef, useState} from \"react\";\nimport {RouterContext} from 'virtual:devix/context'\nimport {ErrorProps, LayoutProps, PageProps} from \"../server/types\";\nimport {Metadata, Viewport} from \"../types\";\nimport {getDefaultErrorPage, loadErrorPage, matchClientRoute} from \"virtual:devix/client-routes\";\nimport {buildHeadNodes} from \"./head\";\nimport {PageMetaContext, RouteDataContext} from \"./context\";\nimport {DevixErrorBoundary} from \"./error-boundary\";\n\ninterface RouteState {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: 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\nexport function useNavigate() {\n const ctx = useContext(RouterContext)\n if (!ctx) throw new Error(\"useNavigate must be used within a RouterProvider\")\n return ctx.navigate\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 ? R\n : T extends (...args: any[]) => infer R\n ? R\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\n\ninterface RouterProviderProps {\n initialData: unknown\n initialParams: Record<string, string>\n initialPage: ComponentType<PageProps>\n initialLayouts?: ComponentType<LayoutProps>[]\n initialLayoutsData?: 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 initialMeta,\n initialViewport,\n initialError,\n initialErrorPage,\n clientEntry,\n }: RouterProviderProps) {\n\n const [state, setState] = useState<RouteState>({\n pathname: window.location.pathname,\n params: initialParams,\n loaderData: initialData,\n layoutsData: initialLayoutsData,\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 loadRoute = useCallback(async (to: string, controller: AbortController) => {\n const pathname = to.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 [pageMod, ...layoutMods] = await Promise.all([\n matched.load(),\n ...matched.loadLayouts.map(l => l()),\n ])\n\n if (controller.signal.aborted) return\n if (!pageMod.default) return\n\n const dataRes = await fetch(`/_data${to}`, {\n headers: {Accept: 'application/json'},\n signal: controller.signal,\n })\n\n if (controller.signal.aborted) return\n\n if (!dataRes.ok) {\n if (dataRes.status === 404) {\n window.location.href = to\n return\n }\n console.error(`/_data${to} returned ${dataRes.status}`)\n return\n }\n\n const data = await dataRes.json()\n\n window.scrollTo(0, 0)\n setState({\n pathname,\n params: data.params ?? {},\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n Page: pageMod.default,\n layouts: layoutMods.map(m => m.default),\n metadata: data.metadata ?? null,\n viewport: data.viewport,\n })\n }, [])\n\n const navigate = useCallback(async (to: string) => {\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n setIsNavigating(true)\n try {\n window.history.pushState(null, \"\", to)\n await loadRoute(to, controller)\n } finally {\n if (!controller.signal.aborted) setIsNavigating(false)\n }\n }, [loadRoute])\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 {state.metadata && buildHeadNodes(state.metadata, state.viewport)}\n <RouterContext value={{...state, isNavigating, navigate}}>\n {content}\n </RouterContext>\n </PageMetaContext>\n )\n}", "import {Metadata, 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 }\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 (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 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}/>\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 RouterContextValue {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n navigate: (to: 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 class DevixError extends Error {\n statusCode: number\n constructor(statusCode: number, message: string) {\n super(message)\n this.statusCode = statusCode\n }\n}\n", "import {AnchorHTMLAttributes, MouseEventHandler, useCallback, useContext} from \"react\";\nimport {matchClientRoute} from \"virtual:devix/client-routes\";\nimport {RouterContext} from 'virtual:devix/context'\n\ninterface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n href: string\n prefetch?: boolean\n viewTransition?: boolean\n}\n\nfunction resolveHref(href: string): string {\n if (href.startsWith('/') || href.startsWith('http')) return href\n const base = window.location.pathname.endsWith('/')\n ? window.location.href\n : window.location.href + '/'\n const resolved = new URL(href, base).pathname\n return resolved.length > 1 ? resolved.replace(/\\/$/, '') : resolved\n}\n\nexport function Link({ href, prefetch = false, viewTransition = false, children, ...props }: LinkProps) {\n const router = useContext(RouterContext)\n\n const handleMouseEnter = useCallback(() => {\n if (!prefetch) return\n const resolved = resolveHref(href)\n const pathname = resolved.split('?')[0]\n const matched = matchClientRoute(pathname)\n if (matched) {\n matched.load().catch(() => {})\n fetch(`/_data${resolved}`, { headers: { Accept: 'application/json' } }).catch(() => {})\n }\n }, [href, prefetch])\n\n const handleClick: MouseEventHandler<HTMLAnchorElement> = (e) => {\n if (!router) return\n if (!e.ctrlKey && !e.metaKey && !e.shiftKey && e.button === 0) {\n e.preventDefault()\n const resolved = resolveHref(href)\n if (viewTransition && typeof document.startViewTransition === 'function') {\n document.startViewTransition(() => router.navigate(resolved))\n } else {\n router.navigate(resolved)\n }\n }\n }\n\n return (\n <a href={href} onClick={handleClick} onMouseEnter={handleMouseEnter} {...props}>\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 const json = (data: unknown, status = 200): Response =>\n Response.json(data, {status})\n\nexport const text = (body: string, status = 200): Response =>\n new Response(body, {status, headers: {'Content-Type': 'text/plain; charset=utf-8'}})\n\nexport const redirect = (url: string, status = 302): Response =>\n new Response(null, {status, headers: {Location: url}})\n", "export interface ApiRoutes {}\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\n\nexport interface FetchOptions<M extends HttpMethod = 'GET'> {\n method?: M\n body?: unknown\n headers?: HeadersInit\n signal?: AbortSignal\n}\n\ntype ApiKey<M extends HttpMethod, P extends string> = `${M} ${P}`\n\ntype InferResult<M extends HttpMethod, P extends string> =\n ApiKey<M, P> extends keyof ApiRoutes\n ? ApiRoutes[ApiKey<M, P>]\n : unknown\n\nexport class FetchError extends Error {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly response: Response,\n ) {\n super(`HTTP ${status}: ${statusText}`)\n this.name = 'FetchError'\n }\n}\n\nexport async function $fetch<\n P extends string,\n M extends HttpMethod = 'GET',\n>(path: P, options?: FetchOptions<M>): Promise<InferResult<M, P>> {\n const method = (options?.method ?? 'GET') as string\n const headers = new Headers(options?.headers)\n\n let body: BodyInit | undefined\n if (options?.body !== undefined) {\n body = JSON.stringify(options.body)\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n }\n\n const response = await fetch(path, {method, headers, body, signal: options?.signal})\n\n if (!response.ok) {\n throw new FetchError(response.status, response.statusText, response)\n }\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": ["RouterContext", "jsx", "jsx", "RouterContext", "useCallback", "useContext", "matchClientRoute", "RouterContext", "jsx"]
4
+ "sourcesContent": ["import {ComponentType, ReactNode, useCallback, useContext, useEffect, useRef, useState} from \"react\";\nimport {RouterContext} from 'virtual:devix/context'\nimport {ErrorProps, LayoutProps, PageProps} from \"../server/types\";\nimport {Metadata, Viewport} from \"../types\";\nimport {getDefaultErrorPage, loadErrorPage, matchClientRoute} from \"virtual:devix/client-routes\";\nimport {buildHeadNodes} from \"./head\";\nimport {PageMetaContext, RouteDataContext} from \"./context\";\nimport {DevixErrorBoundary} from \"./error-boundary\";\n\ninterface RouteState {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: 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\nexport function useNavigate() {\n const ctx = useContext(RouterContext)\n if (!ctx) throw new Error(\"useNavigate must be used within a RouterProvider\")\n return ctx.navigate\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 ? R\n : T extends (...args: any[]) => infer R\n ? R\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\n\ninterface RouterProviderProps {\n initialData: unknown\n initialParams: Record<string, string>\n initialPage: ComponentType<PageProps>\n initialLayouts?: ComponentType<LayoutProps>[]\n initialLayoutsData?: 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 initialMeta,\n initialViewport,\n initialError,\n initialErrorPage,\n clientEntry,\n }: RouterProviderProps) {\n\n const [state, setState] = useState<RouteState>({\n pathname: window.location.pathname,\n params: initialParams,\n loaderData: initialData,\n layoutsData: initialLayoutsData,\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 loadRoute = useCallback(async (to: string, controller: AbortController) => {\n const pathname = to.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 [pageMod, ...layoutMods] = await Promise.all([\n matched.load(),\n ...matched.loadLayouts.map(l => l()),\n ])\n\n if (controller.signal.aborted) return\n if (!pageMod.default) return\n\n const dataRes = await fetch(`/_data${to}`, {\n headers: {Accept: 'application/json'},\n signal: controller.signal,\n })\n\n if (controller.signal.aborted) return\n\n if (!dataRes.ok) {\n if (dataRes.status === 404) {\n window.location.href = to\n return\n }\n console.error(`/_data${to} returned ${dataRes.status}`)\n return\n }\n\n const data = await dataRes.json()\n\n window.scrollTo(0, 0)\n setState({\n pathname,\n params: data.params ?? {},\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n Page: pageMod.default,\n layouts: layoutMods.map(m => m.default),\n metadata: data.metadata ?? null,\n viewport: data.viewport,\n })\n }, [])\n\n const navigate = useCallback(async (to: string) => {\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n setIsNavigating(true)\n try {\n window.history.pushState(null, \"\", to)\n await loadRoute(to, controller)\n } finally {\n if (!controller.signal.aborted) setIsNavigating(false)\n }\n }, [loadRoute])\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 {state.metadata && buildHeadNodes(state.metadata, state.viewport)}\n <RouterContext value={{...state, isNavigating, navigate}}>\n {content}\n </RouterContext>\n </PageMetaContext>\n )\n}", "import {Metadata, 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 }\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 (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 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}/>\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 RouterContextValue {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n navigate: (to: 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 class DevixError extends Error {\n statusCode: number\n constructor(statusCode: number, message: string) {\n super(message)\n this.statusCode = statusCode\n }\n}\n", "import {AnchorHTMLAttributes, MouseEventHandler, useCallback, useContext} from \"react\";\nimport {matchClientRoute} from \"virtual:devix/client-routes\";\nimport {RouterContext} from 'virtual:devix/context'\n\ninterface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n href: string\n prefetch?: boolean\n viewTransition?: boolean\n}\n\nfunction resolveHref(href: string): string {\n if (href.startsWith('/') || href.startsWith('http')) return href\n const base = window.location.pathname.endsWith('/')\n ? window.location.href\n : window.location.href + '/'\n const resolved = new URL(href, base).pathname\n return resolved.length > 1 ? resolved.replace(/\\/$/, '') : resolved\n}\n\nexport function Link({ href, prefetch = false, viewTransition = false, children, ...props }: LinkProps) {\n const router = useContext(RouterContext)\n\n const handleMouseEnter = useCallback(() => {\n if (!prefetch) return\n const resolved = resolveHref(href)\n const pathname = resolved.split('?')[0]\n const matched = matchClientRoute(pathname)\n if (matched) {\n matched.load().catch(() => {})\n fetch(`/_data${resolved}`, { headers: { Accept: 'application/json' } }).catch(() => {})\n }\n }, [href, prefetch])\n\n const handleClick: MouseEventHandler<HTMLAnchorElement> = (e) => {\n if (!router) return\n if (!e.ctrlKey && !e.metaKey && !e.shiftKey && e.button === 0) {\n e.preventDefault()\n const resolved = resolveHref(href)\n if (viewTransition && typeof document.startViewTransition === 'function') {\n document.startViewTransition(() => router.navigate(resolved))\n } else {\n router.navigate(resolved)\n }\n }\n }\n\n return (\n <a href={href} onClick={handleClick} onMouseEnter={handleMouseEnter} {...props}>\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> = Response & { readonly __body: T }\n\nexport const json = <T>(data: T, status = 200): JsonResponse<T> =>\n Response.json(data, {status}) as JsonResponse<T>\n\nexport const text = (body: string, status = 200): Response =>\n new Response(body, {status, headers: {'Content-Type': 'text/plain; charset=utf-8'}})\n\nexport const redirect = (url: string, status = 302): Response =>\n new Response(null, {status, headers: {Location: url}})\n", "export interface ApiRoutes {}\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\n\nexport interface FetchOptions<M extends HttpMethod = 'GET'> {\n method?: M\n body?: unknown\n headers?: HeadersInit\n signal?: AbortSignal\n}\n\ntype ApiKey<M extends HttpMethod, P extends string> = `${M} ${P}`\n\ntype InferResult<M extends HttpMethod, P extends string> =\n ApiKey<M, P> extends keyof ApiRoutes\n ? ApiRoutes[ApiKey<M, P>]\n : unknown\n\nexport class FetchError extends Error {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly response: Response,\n ) {\n super(`HTTP ${status}: ${statusText}`)\n this.name = 'FetchError'\n }\n}\n\nexport async function $fetch<\n P extends string,\n M extends HttpMethod = 'GET',\n>(path: P, options?: FetchOptions<M>): Promise<InferResult<M, P>> {\n const method = (options?.method ?? 'GET') as string\n const headers = new Headers(options?.headers)\n\n let body: BodyInit | undefined\n if (options?.body !== undefined) {\n body = JSON.stringify(options.body)\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n }\n\n const response = await fetch(path, {method, headers, body, signal: options?.signal})\n\n if (!response.ok) {\n throw new FetchError(response.status, response.statusText, response)\n }\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", "RouterContext", "getDefaultErrorPage", "loadErrorPage", "matchClientRoute", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "parts", "buildHeadNodes", "t", "i", "createContext", "g", "RouterContext", "PageMetaContext", "RouteDataContext", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "statusCode", "message", "jsx", "jsxs", "useRouter", "useContext", "RouterContext", "useNavigate", "ctx", "useParams", "RouteDataContext", "useLoaderData", "RouterProvider", "initialData", "initialParams", "initialPage", "initialLayouts", "initialLayoutsData", "initialMeta", "initialViewport", "initialError", "initialErrorPage", "clientEntry", "state", "setState", "useState", "navigatingRef", "useRef", "isNavigating", "setIsNavigating", "loadRoute", "useCallback", "to", "controller", "pathname", "matched", "matchClientRoute", "ErrorPage", "loadErrorPage", "getDefaultErrorPage", "prev", "pageMod", "layoutMods", "l", "dataRes", "data", "navigate", "useEffect", "handlePop", "err", "content", "tree", "Layout", "layoutData", "DevixErrorBoundary", "PageMetaContext", "buildHeadNodes", "useCallback", "useContext", "matchClientRoute", "RouterContext", "jsx", "resolveHref", "href", "base", "resolved", "Link", "prefetch", "viewTransition", "children", "props", "router", "handleMouseEnter", "pathname", "matched", "e", "getCookie", "req", "name", "header", "part", "key", "rest", "setCookie", "headers", "value", "options", "cookie", "deleteCookie", "json", "data", "status", "text", "body", "redirect", "url", "FetchError", "status", "statusText", "response", "$fetch", "path", "options", "method", "headers", "body"]
7
7
  }
@@ -1,43 +1,2 @@
1
- // src/runtime/link.tsx
2
- import { useCallback, useContext } from "react";
3
- import { matchClientRoute } from "virtual:devix/client-routes";
4
- import { RouterContext } from "virtual:devix/context";
5
- import { jsx } from "react/jsx-runtime";
6
- function resolveHref(href) {
7
- if (href.startsWith("/") || href.startsWith("http")) return href;
8
- const base = window.location.pathname.endsWith("/") ? window.location.href : window.location.href + "/";
9
- const resolved = new URL(href, base).pathname;
10
- return resolved.length > 1 ? resolved.replace(/\/$/, "") : resolved;
11
- }
12
- function Link({ href, prefetch = false, viewTransition = false, children, ...props }) {
13
- const router = useContext(RouterContext);
14
- const handleMouseEnter = useCallback(() => {
15
- if (!prefetch) return;
16
- const resolved = resolveHref(href);
17
- const pathname = resolved.split("?")[0];
18
- const matched = matchClientRoute(pathname);
19
- if (matched) {
20
- matched.load().catch(() => {
21
- });
22
- fetch(`/_data${resolved}`, { headers: { Accept: "application/json" } }).catch(() => {
23
- });
24
- }
25
- }, [href, prefetch]);
26
- const handleClick = (e) => {
27
- if (!router) return;
28
- if (!e.ctrlKey && !e.metaKey && !e.shiftKey && e.button === 0) {
29
- e.preventDefault();
30
- const resolved = resolveHref(href);
31
- if (viewTransition && typeof document.startViewTransition === "function") {
32
- document.startViewTransition(() => router.navigate(resolved));
33
- } else {
34
- router.navigate(resolved);
35
- }
36
- }
37
- };
38
- return /* @__PURE__ */ jsx("a", { href, onClick: handleClick, onMouseEnter: handleMouseEnter, ...props, children });
39
- }
40
- export {
41
- Link
42
- };
1
+ import{useCallback as h,useContext as d}from"react";import{matchClientRoute as f}from"virtual:devix/client-routes";import{RouterContext as p}from"virtual:devix/context";import{jsx as m}from"react/jsx-runtime";function s(t){if(t.startsWith("/")||t.startsWith("http"))return t;let o=window.location.pathname.endsWith("/")?window.location.href:window.location.href+"/",e=new URL(t,o).pathname;return e.length>1?e.replace(/\/$/,""):e}function A({href:t,prefetch:o=!1,viewTransition:e=!1,children:c,...l}){let r=d(p),u=h(()=>{if(!o)return;let n=s(t),i=n.split("?")[0],a=f(i);a&&(a.load().catch(()=>{}),fetch(`/_data${n}`,{headers:{Accept:"application/json"}}).catch(()=>{}))},[t,o]);return m("a",{href:t,onClick:n=>{if(r&&!n.ctrlKey&&!n.metaKey&&!n.shiftKey&&n.button===0){n.preventDefault();let i=s(t);e&&typeof document.startViewTransition=="function"?document.startViewTransition(()=>r.navigate(i)):r.navigate(i)}},onMouseEnter:u,...l,children:c})}export{A as Link};
43
2
  //# sourceMappingURL=link.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/runtime/link.tsx"],
4
4
  "sourcesContent": ["import {AnchorHTMLAttributes, MouseEventHandler, useCallback, useContext} from \"react\";\nimport {matchClientRoute} from \"virtual:devix/client-routes\";\nimport {RouterContext} from 'virtual:devix/context'\n\ninterface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n href: string\n prefetch?: boolean\n viewTransition?: boolean\n}\n\nfunction resolveHref(href: string): string {\n if (href.startsWith('/') || href.startsWith('http')) return href\n const base = window.location.pathname.endsWith('/')\n ? window.location.href\n : window.location.href + '/'\n const resolved = new URL(href, base).pathname\n return resolved.length > 1 ? resolved.replace(/\\/$/, '') : resolved\n}\n\nexport function Link({ href, prefetch = false, viewTransition = false, children, ...props }: LinkProps) {\n const router = useContext(RouterContext)\n\n const handleMouseEnter = useCallback(() => {\n if (!prefetch) return\n const resolved = resolveHref(href)\n const pathname = resolved.split('?')[0]\n const matched = matchClientRoute(pathname)\n if (matched) {\n matched.load().catch(() => {})\n fetch(`/_data${resolved}`, { headers: { Accept: 'application/json' } }).catch(() => {})\n }\n }, [href, prefetch])\n\n const handleClick: MouseEventHandler<HTMLAnchorElement> = (e) => {\n if (!router) return\n if (!e.ctrlKey && !e.metaKey && !e.shiftKey && e.button === 0) {\n e.preventDefault()\n const resolved = resolveHref(href)\n if (viewTransition && typeof document.startViewTransition === 'function') {\n document.startViewTransition(() => router.navigate(resolved))\n } else {\n router.navigate(resolved)\n }\n }\n }\n\n return (\n <a href={href} onClick={handleClick} onMouseEnter={handleMouseEnter} {...props}>\n {children}\n </a>\n )\n}"],
5
- "mappings": ";AAAA,SAAiD,aAAa,kBAAiB;AAC/E,SAAQ,wBAAuB;AAC/B,SAAQ,qBAAoB;AA6CpB;AArCR,SAAS,YAAY,MAAsB;AACvC,MAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,MAAM,EAAG,QAAO;AAC5D,QAAM,OAAO,OAAO,SAAS,SAAS,SAAS,GAAG,IAC5C,OAAO,SAAS,OAChB,OAAO,SAAS,OAAO;AAC7B,QAAM,WAAW,IAAI,IAAI,MAAM,IAAI,EAAE;AACrC,SAAO,SAAS,SAAS,IAAI,SAAS,QAAQ,OAAO,EAAE,IAAI;AAC/D;AAEO,SAAS,KAAK,EAAE,MAAM,WAAW,OAAO,iBAAiB,OAAO,UAAU,GAAG,MAAM,GAAc;AACpG,QAAM,SAAS,WAAW,aAAa;AAEvC,QAAM,mBAAmB,YAAY,MAAM;AACvC,QAAI,CAAC,SAAU;AACf,UAAM,WAAW,YAAY,IAAI;AACjC,UAAM,WAAW,SAAS,MAAM,GAAG,EAAE,CAAC;AACtC,UAAM,UAAU,iBAAiB,QAAQ;AACzC,QAAI,SAAS;AACT,cAAQ,KAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAC7B,YAAM,SAAS,QAAQ,IAAI,EAAE,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC1F;AAAA,EACJ,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,QAAM,cAAoD,CAAC,MAAM;AAC7D,QAAI,CAAC,OAAQ;AACb,QAAI,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,EAAE,WAAW,GAAG;AAC3D,QAAE,eAAe;AACjB,YAAM,WAAW,YAAY,IAAI;AACjC,UAAI,kBAAkB,OAAO,SAAS,wBAAwB,YAAY;AACtE,iBAAS,oBAAoB,MAAM,OAAO,SAAS,QAAQ,CAAC;AAAA,MAChE,OAAO;AACH,eAAO,SAAS,QAAQ;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAEA,SACI,oBAAC,OAAE,MAAY,SAAS,aAAa,cAAc,kBAAmB,GAAG,OACpE,UACL;AAER;",
6
- "names": []
5
+ "mappings": "AAAA,OAAiD,eAAAA,EAAa,cAAAC,MAAiB,QAC/E,OAAQ,oBAAAC,MAAuB,8BAC/B,OAAQ,iBAAAC,MAAoB,wBA6CpB,cAAAC,MAAA,oBArCR,SAASC,EAAYC,EAAsB,CACvC,GAAIA,EAAK,WAAW,GAAG,GAAKA,EAAK,WAAW,MAAM,EAAG,OAAOA,EAC5D,IAAMC,EAAO,OAAO,SAAS,SAAS,SAAS,GAAG,EAC5C,OAAO,SAAS,KAChB,OAAO,SAAS,KAAO,IACvBC,EAAW,IAAI,IAAIF,EAAMC,CAAI,EAAE,SACrC,OAAOC,EAAS,OAAS,EAAIA,EAAS,QAAQ,MAAO,EAAE,EAAIA,CAC/D,CAEO,SAASC,EAAK,CAAE,KAAAH,EAAM,SAAAI,EAAW,GAAO,eAAAC,EAAiB,GAAO,SAAAC,EAAU,GAAGC,CAAM,EAAc,CACpG,IAAMC,EAASb,EAAWE,CAAa,EAEjCY,EAAmBf,EAAY,IAAM,CACvC,GAAI,CAACU,EAAU,OACf,IAAMF,EAAWH,EAAYC,CAAI,EAC3BU,EAAWR,EAAS,MAAM,GAAG,EAAE,CAAC,EAChCS,EAAUf,EAAiBc,CAAQ,EACrCC,IACAA,EAAQ,KAAK,EAAE,MAAM,IAAM,CAAC,CAAC,EAC7B,MAAM,SAAST,CAAQ,GAAI,CAAE,QAAS,CAAE,OAAQ,kBAAmB,CAAE,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,EAE9F,EAAG,CAACF,EAAMI,CAAQ,CAAC,EAenB,OACIN,EAAC,KAAE,KAAME,EAAM,QAdwCY,GAAM,CAC7D,GAAKJ,GACD,CAACI,EAAE,SAAW,CAACA,EAAE,SAAW,CAACA,EAAE,UAAYA,EAAE,SAAW,EAAG,CAC3DA,EAAE,eAAe,EACjB,IAAMV,EAAWH,EAAYC,CAAI,EAC7BK,GAAkB,OAAO,SAAS,qBAAwB,WAC1D,SAAS,oBAAoB,IAAMG,EAAO,SAASN,CAAQ,CAAC,EAE5DM,EAAO,SAASN,CAAQ,CAEhC,CACJ,EAGyC,aAAcO,EAAmB,GAAGF,EACpE,SAAAD,EACL,CAER",
6
+ "names": ["useCallback", "useContext", "matchClientRoute", "RouterContext", "jsx", "resolveHref", "href", "base", "resolved", "Link", "prefetch", "viewTransition", "children", "props", "router", "handleMouseEnter", "pathname", "matched", "e"]
7
7
  }
@@ -1,22 +1,2 @@
1
- // src/runtime/metadata.ts
2
- async function resolveMetadata(module, ctx) {
3
- const metadata = module.generateMetadata ? await module.generateMetadata(ctx) : module.metadata ?? {};
4
- const viewport = module.generateViewport ? await module.generateViewport(ctx) : module.viewport;
5
- return { metadata, viewport };
6
- }
7
- function mergeMetadata(...sources) {
8
- const result = {};
9
- for (const source of sources) {
10
- if (!source) continue;
11
- const { og, twitter, ...rest } = source;
12
- Object.assign(result, rest);
13
- if (og) result.og = { ...result.og, ...og };
14
- if (twitter) result.twitter = { ...result.twitter, ...twitter };
15
- }
16
- return result;
17
- }
18
- export {
19
- mergeMetadata,
20
- resolveMetadata
21
- };
1
+ async function i(e,t){let a=e.generateMetadata?await e.generateMetadata(t):e.metadata??{},o=e.generateViewport?await e.generateViewport(t):e.viewport;return{metadata:a,viewport:o}}function d(...e){let t={};for(let a of e){if(!a)continue;let{og:o,twitter:r,...n}=a;Object.assign(t,n),o&&(t.og={...t.og,...o}),r&&(t.twitter={...t.twitter,...r})}return t}export{d as mergeMetadata,i as resolveMetadata};
22
2
  //# sourceMappingURL=metadata.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/runtime/metadata.ts"],
4
4
  "sourcesContent": ["import {LayoutModule, PageModule} from \"../server\";\nimport {LoaderContext, Metadata, Viewport} from \"../types\"\n\nexport interface ResolvedMeta {\n metadata: Metadata\n viewport?: Viewport\n}\n\nexport async function resolveMetadata(module: PageModule | LayoutModule, ctx: LoaderContext & {\n loaderData: unknown\n}): Promise<ResolvedMeta> {\n const metadata = module.generateMetadata\n ? await module.generateMetadata(ctx)\n : module.metadata ?? {}\n\n const viewport = module.generateViewport\n ? await module.generateViewport(ctx)\n : module.viewport\n\n return {metadata, viewport}\n}\n\nexport function mergeMetadata(...sources: (Metadata | null | undefined)[]): Metadata {\n const result: Metadata = {}\n\n for (const source of sources) {\n if (!source) continue\n const { og, twitter, ...rest } = source\n Object.assign(result, rest)\n if (og) result.og = { ...result.og, ...og }\n if (twitter) result.twitter = { ...result.twitter, ...twitter }\n }\n\n return result\n}"],
5
- "mappings": ";AAQA,eAAsB,gBAAgB,QAAmC,KAE/C;AACtB,QAAM,WAAW,OAAO,mBAClB,MAAM,OAAO,iBAAiB,GAAG,IACjC,OAAO,YAAY,CAAC;AAE1B,QAAM,WAAW,OAAO,mBAClB,MAAM,OAAO,iBAAiB,GAAG,IACjC,OAAO;AAEb,SAAO,EAAC,UAAU,SAAQ;AAC9B;AAEO,SAAS,iBAAiB,SAAoD;AACjF,QAAM,SAAmB,CAAC;AAE1B,aAAW,UAAU,SAAS;AAC1B,QAAI,CAAC,OAAQ;AACb,UAAM,EAAE,IAAI,SAAS,GAAG,KAAK,IAAI;AACjC,WAAO,OAAO,QAAQ,IAAI;AAC1B,QAAI,GAAI,QAAO,KAAK,EAAE,GAAG,OAAO,IAAI,GAAG,GAAG;AAC1C,QAAI,QAAS,QAAO,UAAU,EAAE,GAAG,OAAO,SAAS,GAAG,QAAQ;AAAA,EAClE;AAEA,SAAO;AACX;",
6
- "names": []
5
+ "mappings": "AAQA,eAAsBA,EAAgBC,EAAmCC,EAE/C,CACtB,IAAMC,EAAWF,EAAO,iBAClB,MAAMA,EAAO,iBAAiBC,CAAG,EACjCD,EAAO,UAAY,CAAC,EAEpBG,EAAWH,EAAO,iBAClB,MAAMA,EAAO,iBAAiBC,CAAG,EACjCD,EAAO,SAEb,MAAO,CAAC,SAAAE,EAAU,SAAAC,CAAQ,CAC9B,CAEO,SAASC,KAAiBC,EAAoD,CACjF,IAAMC,EAAmB,CAAC,EAE1B,QAAWC,KAAUF,EAAS,CAC1B,GAAI,CAACE,EAAQ,SACb,GAAM,CAAE,GAAAC,EAAI,QAAAC,EAAS,GAAGC,CAAK,EAAIH,EACjC,OAAO,OAAOD,EAAQI,CAAI,EACtBF,IAAIF,EAAO,GAAK,CAAE,GAAGA,EAAO,GAAI,GAAGE,CAAG,GACtCC,IAASH,EAAO,QAAU,CAAE,GAAGA,EAAO,QAAS,GAAGG,CAAQ,EAClE,CAEA,OAAOH,CACX",
6
+ "names": ["resolveMetadata", "module", "ctx", "metadata", "viewport", "mergeMetadata", "sources", "result", "source", "og", "twitter", "rest"]
7
7
  }
@@ -1,259 +1,2 @@
1
- // src/runtime/router-provider.tsx
2
- import { useCallback, useContext, useEffect, useRef, useState } from "react";
3
- import { RouterContext as RouterContext2 } from "virtual:devix/context";
4
- import { getDefaultErrorPage, loadErrorPage, matchClientRoute } from "virtual:devix/client-routes";
5
-
6
- // src/runtime/head.tsx
7
- import { Fragment, jsx } from "react/jsx-runtime";
8
- function collectTags(metadata, viewport) {
9
- const tags = [];
10
- if (metadata.title)
11
- tags.push({ tag: "title", children: metadata.title });
12
- if (metadata.description)
13
- tags.push({ tag: "meta", name: "description", content: metadata.description });
14
- if (metadata.keywords?.length)
15
- tags.push({ tag: "meta", name: "keywords", content: metadata.keywords.join(", ") });
16
- const ogTitle = metadata.og?.title ?? metadata.title;
17
- if (ogTitle) tags.push({ tag: "meta", property: "og:title", content: ogTitle });
18
- const ogDesc = metadata.og?.description ?? metadata.description;
19
- if (ogDesc) tags.push({ tag: "meta", property: "og:description", content: ogDesc });
20
- if (metadata.og?.image) tags.push({ tag: "meta", property: "og:image", content: metadata.og.image });
21
- if (metadata.og?.type) tags.push({ tag: "meta", property: "og:type", content: metadata.og.type });
22
- if (metadata.og?.url) tags.push({ tag: "meta", property: "og:url", content: metadata.og.url });
23
- const twTitle = metadata.twitter?.title ?? metadata.title;
24
- if (twTitle) tags.push({ tag: "meta", name: "twitter:title", content: twTitle });
25
- const twDesc = metadata.twitter?.description ?? metadata.description;
26
- if (twDesc) tags.push({ tag: "meta", name: "twitter:description", content: twDesc });
27
- if (metadata.twitter?.card) tags.push({
28
- tag: "meta",
29
- name: "twitter:card",
30
- content: metadata.twitter.card
31
- });
32
- if (metadata.twitter?.image) tags.push({
33
- tag: "meta",
34
- name: "twitter:image",
35
- content: metadata.twitter.image
36
- });
37
- if (metadata.twitter?.creator) tags.push({
38
- tag: "meta",
39
- name: "twitter:creator",
40
- content: metadata.twitter.creator
41
- });
42
- if (metadata.canonical) tags.push({ tag: "link", rel: "canonical", href: metadata.canonical });
43
- if (metadata.robots) tags.push({ tag: "meta", name: "robots", content: metadata.robots });
44
- if (metadata.alternates) {
45
- for (const [lang, href] of Object.entries(metadata.alternates))
46
- tags.push({ tag: "link", rel: "alternate", href, hrefLang: lang });
47
- }
48
- if (viewport) {
49
- const parts = [];
50
- if (viewport.width !== void 0) parts.push(`width=${viewport.width}`);
51
- if (viewport.initialScale !== void 0) parts.push(`initial-scale=${viewport.initialScale}`);
52
- if (viewport.maximumScale !== void 0) parts.push(`maximum-scale=${viewport.maximumScale}`);
53
- if (viewport.userScalable !== void 0) parts.push(`user-scalable=${viewport.userScalable ? "yes" : "no"}`);
54
- if (parts.length) tags.push({ tag: "meta", name: "viewport", content: parts.join(", ") });
55
- if (viewport.themeColor) tags.push({
56
- tag: "meta",
57
- name: "theme-color",
58
- content: viewport.themeColor
59
- });
60
- }
61
- return tags;
62
- }
63
- function buildHeadNodes(metadata, viewport) {
64
- const tags = collectTags(metadata, viewport);
65
- return /* @__PURE__ */ jsx(Fragment, { children: tags.map((t, i) => {
66
- if (t.tag === "title") return /* @__PURE__ */ jsx("title", { children: t.children }, i);
67
- if (t.tag === "link") return /* @__PURE__ */ jsx("link", { rel: t.rel, href: t.href, hrefLang: t.hrefLang }, i);
68
- return /* @__PURE__ */ jsx("meta", { name: t.name, property: t.property, content: t.content }, i);
69
- }) });
70
- }
71
-
72
- // src/runtime/context.tsx
73
- import { createContext } from "react";
74
- var g = globalThis;
75
- g.__devix_RouterContext__ ??= createContext(null);
76
- var RouterContext = g.__devix_RouterContext__;
77
- g.__devix_PageMetaContext__ ??= createContext(null);
78
- g.__devix_RouteDataContext__ ??= createContext(null);
79
- var PageMetaContext = g.__devix_PageMetaContext__;
80
- var RouteDataContext = g.__devix_RouteDataContext__;
81
-
82
- // src/runtime/error-boundary.tsx
83
- import { Component } from "react";
84
- import { jsx as jsx2 } from "react/jsx-runtime";
85
- var DevixErrorBoundary = class extends Component {
86
- state = { error: null };
87
- static getDerivedStateFromError(err) {
88
- if (err instanceof DevixError) {
89
- return {
90
- error: { statusCode: err.statusCode, message: err.message }
91
- };
92
- }
93
- return {
94
- error: { statusCode: 500, message: err instanceof Error ? err.message : "Unknown error" }
95
- };
96
- }
97
- render() {
98
- if (this.state.error && this.props.ErrorPage) {
99
- return /* @__PURE__ */ jsx2(this.props.ErrorPage, { ...this.state.error });
100
- }
101
- if (this.state.error) {
102
- return /* @__PURE__ */ jsx2("h1", { children: this.state.error.statusCode });
103
- }
104
- return this.props.children;
105
- }
106
- };
107
- var DevixError = class extends Error {
108
- statusCode;
109
- constructor(statusCode, message) {
110
- super(message);
111
- this.statusCode = statusCode;
112
- }
113
- };
114
-
115
- // src/runtime/router-provider.tsx
116
- import { jsx as jsx3, jsxs } from "react/jsx-runtime";
117
- function useRouter() {
118
- return useContext(RouterContext2);
119
- }
120
- function useNavigate() {
121
- const ctx = useContext(RouterContext2);
122
- if (!ctx) throw new Error("useNavigate must be used within a RouterProvider");
123
- return ctx.navigate;
124
- }
125
- function useParams() {
126
- const ctx = useContext(RouteDataContext);
127
- if (!ctx) throw new Error("useParams must be used within a route or layout");
128
- return ctx.params;
129
- }
130
- function useLoaderData() {
131
- const ctx = useContext(RouteDataContext);
132
- if (!ctx) throw new Error("useLoaderData must be used within a route or layout");
133
- return ctx.loaderData;
134
- }
135
- function RouterProvider({
136
- initialData,
137
- initialParams,
138
- initialPage,
139
- initialLayouts = [],
140
- initialLayoutsData = [],
141
- initialMeta,
142
- initialViewport,
143
- initialError,
144
- initialErrorPage,
145
- clientEntry
146
- }) {
147
- const [state, setState] = useState({
148
- pathname: window.location.pathname,
149
- params: initialParams,
150
- loaderData: initialData,
151
- layoutsData: initialLayoutsData,
152
- Page: initialPage,
153
- layouts: initialLayouts,
154
- metadata: initialMeta ?? null,
155
- viewport: initialViewport,
156
- pendingError: initialError,
157
- ErrorPage: initialErrorPage
158
- });
159
- const navigatingRef = useRef(null);
160
- const [isNavigating, setIsNavigating] = useState(false);
161
- const loadRoute = useCallback(async (to, controller) => {
162
- const pathname = to.split("?")[0];
163
- const matched = matchClientRoute(pathname);
164
- if (!matched) {
165
- const ErrorPage = await loadErrorPage() ?? getDefaultErrorPage();
166
- setState((prev) => ({
167
- ...prev,
168
- pathname,
169
- pendingError: { statusCode: 404, message: "Not found" },
170
- ErrorPage: ErrorPage ?? void 0
171
- }));
172
- return;
173
- }
174
- const [pageMod, ...layoutMods] = await Promise.all([
175
- matched.load(),
176
- ...matched.loadLayouts.map((l) => l())
177
- ]);
178
- if (controller.signal.aborted) return;
179
- if (!pageMod.default) return;
180
- const dataRes = await fetch(`/_data${to}`, {
181
- headers: { Accept: "application/json" },
182
- signal: controller.signal
183
- });
184
- if (controller.signal.aborted) return;
185
- if (!dataRes.ok) {
186
- if (dataRes.status === 404) {
187
- window.location.href = to;
188
- return;
189
- }
190
- console.error(`/_data${to} returned ${dataRes.status}`);
191
- return;
192
- }
193
- const data = await dataRes.json();
194
- window.scrollTo(0, 0);
195
- setState({
196
- pathname,
197
- params: data.params ?? {},
198
- loaderData: data.loaderData,
199
- layoutsData: (data.layouts ?? []).map((l) => l.loaderData),
200
- Page: pageMod.default,
201
- layouts: layoutMods.map((m) => m.default),
202
- metadata: data.metadata ?? null,
203
- viewport: data.viewport
204
- });
205
- }, []);
206
- const navigate = useCallback(async (to) => {
207
- navigatingRef.current?.abort();
208
- const controller = new AbortController();
209
- navigatingRef.current = controller;
210
- setIsNavigating(true);
211
- try {
212
- window.history.pushState(null, "", to);
213
- await loadRoute(to, controller);
214
- } finally {
215
- if (!controller.signal.aborted) setIsNavigating(false);
216
- }
217
- }, [loadRoute]);
218
- useEffect(() => {
219
- const handlePop = () => {
220
- navigatingRef.current?.abort();
221
- const controller = new AbortController();
222
- navigatingRef.current = controller;
223
- const to = window.location.pathname + window.location.search;
224
- loadRoute(to, controller).catch((err) => {
225
- if (err.name !== "AbortError") console.error("[router] popstate error:", err);
226
- });
227
- };
228
- window.addEventListener("popstate", handlePop);
229
- return () => window.removeEventListener("popstate", handlePop);
230
- }, [loadRoute]);
231
- let content;
232
- if (state.pendingError) {
233
- content = state.ErrorPage ? /* @__PURE__ */ jsx3(state.ErrorPage, { ...state.pendingError }) : /* @__PURE__ */ jsx3("h1", { children: state.pendingError.statusCode });
234
- } else {
235
- let tree = /* @__PURE__ */ jsx3(RouteDataContext, { value: { loaderData: state.loaderData, params: state.params }, children: /* @__PURE__ */ jsx3(state.Page, { data: state.loaderData, params: state.params, url: state.pathname }) });
236
- for (let i = state.layouts.length - 1; i >= 0; i--) {
237
- const Layout = state.layouts[i];
238
- const layoutData = state.layoutsData[i];
239
- tree = /* @__PURE__ */ jsx3(RouteDataContext, { value: { loaderData: layoutData, params: state.params }, children: /* @__PURE__ */ jsx3(Layout, { data: layoutData, params: state.params, children: tree }) });
240
- }
241
- content = /* @__PURE__ */ jsx3(DevixErrorBoundary, { ErrorPage: state.ErrorPage, children: tree }, state.pathname);
242
- }
243
- return /* @__PURE__ */ jsxs(PageMetaContext, { value: {
244
- metadata: state.metadata,
245
- viewport: state.viewport,
246
- clientEntry
247
- }, children: [
248
- state.metadata && buildHeadNodes(state.metadata, state.viewport),
249
- /* @__PURE__ */ jsx3(RouterContext2, { value: { ...state, isNavigating, navigate }, children: content })
250
- ] });
251
- }
252
- export {
253
- RouterProvider,
254
- useLoaderData,
255
- useNavigate,
256
- useParams,
257
- useRouter
258
- };
1
+ import{useCallback as $,useContext as E,useEffect as z,useRef as G,useState as A}from"react";import{RouterContext as b}from"virtual:devix/context";import{getDefaultErrorPage as J,loadErrorPage as K,matchClientRoute as Q}from"virtual:devix/client-routes";import{Fragment as U,jsx as x}from"react/jsx-runtime";function O(t,o){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 n=t.og?.title??t.title;n&&e.push({tag:"meta",property:"og:title",content:n});let u=t.og?.description??t.description;u&&e.push({tag:"meta",property:"og:description",content:u}),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 h=t.twitter?.title??t.title;h&&e.push({tag:"meta",name:"twitter:title",content:h});let y=t.twitter?.description??t.description;if(y&&e.push({tag:"meta",name:"twitter:description",content:y}),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[s,D]of Object.entries(t.alternates))e.push({tag:"link",rel:"alternate",href:D,hrefLang:s});if(o){let s=[];o.width!==void 0&&s.push(`width=${o.width}`),o.initialScale!==void 0&&s.push(`initial-scale=${o.initialScale}`),o.maximumScale!==void 0&&s.push(`maximum-scale=${o.maximumScale}`),o.userScalable!==void 0&&s.push(`user-scalable=${o.userScalable?"yes":"no"}`),s.length&&e.push({tag:"meta",name:"viewport",content:s.join(", ")}),o.themeColor&&e.push({tag:"meta",name:"theme-color",content:o.themeColor})}return e}function V(t,o){let e=O(t,o);return x(U,{children:e.map((n,u)=>n.tag==="title"?x("title",{children:n.children},u):n.tag==="link"?x("link",{rel:n.rel,href:n.href,hrefLang:n.hrefLang},u):x("meta",{name:n.name,property:n.property,content:n.content},u))})}import{createContext as T}from"react";var d=globalThis;d.__devix_RouterContext__??=T(null);var rt=d.__devix_RouterContext__;d.__devix_PageMetaContext__??=T(null);d.__devix_RouteDataContext__??=T(null);var S=d.__devix_PageMetaContext__,f=d.__devix_RouteDataContext__;import{Component as q}from"react";import{jsx as N}from"react/jsx-runtime";var R=class extends q{state={error:null};static getDerivedStateFromError(o){return o instanceof v?{error:{statusCode:o.statusCode,message:o.message}}:{error:{statusCode:500,message:o instanceof Error?o.message:"Unknown error"}}}render(){return this.state.error&&this.props.ErrorPage?N(this.props.ErrorPage,{...this.state.error}):this.state.error?N("h1",{children:this.state.error.statusCode}):this.props.children}},v=class extends Error{statusCode;constructor(o,e){super(e),this.statusCode=o}};import{jsx as p,jsxs as W}from"react/jsx-runtime";function yt(){return E(b)}function wt(){let t=E(b);if(!t)throw new Error("useNavigate must be used within a RouterProvider");return t.navigate}function Pt(){let t=E(f);if(!t)throw new Error("useParams must be used within a route or layout");return t.params}function Ct(){let t=E(f);if(!t)throw new Error("useLoaderData must be used within a route or layout");return t.loaderData}function xt({initialData:t,initialParams:o,initialPage:e,initialLayouts:n=[],initialLayoutsData:u=[],initialMeta:h,initialViewport:y,initialError:s,initialErrorPage:D,clientEntry:j}){let[r,k]=A({pathname:window.location.pathname,params:o,loaderData:t,layoutsData:u,Page:e,layouts:n,metadata:h??null,viewport:y,pendingError:s,ErrorPage:D}),w=G(null),[H,M]=A(!1),P=$(async(i,a)=>{let g=i.split("?")[0],l=Q(g);if(!l){let c=await K()??J();k(I=>({...I,pathname:g,pendingError:{statusCode:404,message:"Not found"},ErrorPage:c??void 0}));return}let[L,...F]=await Promise.all([l.load(),...l.loadLayouts.map(c=>c())]);if(a.signal.aborted||!L.default)return;let C=await fetch(`/_data${i}`,{headers:{Accept:"application/json"},signal:a.signal});if(a.signal.aborted)return;if(!C.ok){if(C.status===404){window.location.href=i;return}console.error(`/_data${i} returned ${C.status}`);return}let m=await C.json();window.scrollTo(0,0),k({pathname:g,params:m.params??{},loaderData:m.loaderData,layoutsData:(m.layouts??[]).map(c=>c.loaderData),Page:L.default,layouts:F.map(c=>c.default),metadata:m.metadata??null,viewport:m.viewport})},[]),B=$(async i=>{w.current?.abort();let a=new AbortController;w.current=a,M(!0);try{window.history.pushState(null,"",i),await P(i,a)}finally{a.signal.aborted||M(!1)}},[P]);z(()=>{let i=()=>{w.current?.abort();let a=new AbortController;w.current=a;let g=window.location.pathname+window.location.search;P(g,a).catch(l=>{l.name!=="AbortError"&&console.error("[router] popstate error:",l)})};return window.addEventListener("popstate",i),()=>window.removeEventListener("popstate",i)},[P]);let _;if(r.pendingError)_=r.ErrorPage?p(r.ErrorPage,{...r.pendingError}):p("h1",{children:r.pendingError.statusCode});else{let i=p(f,{value:{loaderData:r.loaderData,params:r.params},children:p(r.Page,{data:r.loaderData,params:r.params,url:r.pathname})});for(let a=r.layouts.length-1;a>=0;a--){let g=r.layouts[a],l=r.layoutsData[a];i=p(f,{value:{loaderData:l,params:r.params},children:p(g,{data:l,params:r.params,children:i})})}_=p(R,{ErrorPage:r.ErrorPage,children:i},r.pathname)}return W(S,{value:{metadata:r.metadata,viewport:r.viewport,clientEntry:j},children:[r.metadata&&V(r.metadata,r.viewport),p(b,{value:{...r,isNavigating:H,navigate:B},children:_})]})}export{xt as RouterProvider,Ct as useLoaderData,wt as useNavigate,Pt as useParams,yt as useRouter};
259
2
  //# sourceMappingURL=router-provider.js.map