@devlusoft/devix 0.4.3 → 0.5.0

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/README.md +64 -9
  2. package/dist/cli/build.js +27 -17
  3. package/dist/cli/build.js.map +3 -3
  4. package/dist/cli/dev-server.js +31 -21
  5. package/dist/cli/dev-server.js.map +4 -4
  6. package/dist/cli/generate.js +29 -19
  7. package/dist/cli/generate.js.map +3 -3
  8. package/dist/cli/index.js +30 -20
  9. package/dist/cli/index.js.map +4 -4
  10. package/dist/cli/start.js +1 -1
  11. package/dist/cli/start.js.map +4 -4
  12. package/dist/config.d.ts +61 -0
  13. package/dist/config.js +1 -1
  14. package/dist/config.js.map +3 -3
  15. package/dist/runtime/api-context.d.ts +9 -4
  16. package/dist/runtime/api-context.js +1 -1
  17. package/dist/runtime/api-context.js.map +3 -3
  18. package/dist/runtime/context.d.ts +1 -0
  19. package/dist/runtime/context.js.map +2 -2
  20. package/dist/runtime/create-handler.d.ts +52 -2
  21. package/dist/runtime/create-handler.js +1 -1
  22. package/dist/runtime/create-handler.js.map +3 -3
  23. package/dist/runtime/error-boundary.d.ts +7 -1
  24. package/dist/runtime/error-boundary.js +1 -1
  25. package/dist/runtime/error-boundary.js.map +3 -3
  26. package/dist/runtime/fetch.d.ts +1 -0
  27. package/dist/runtime/fetch.js +1 -1
  28. package/dist/runtime/fetch.js.map +3 -3
  29. package/dist/runtime/index.d.ts +6 -2
  30. package/dist/runtime/index.js +1 -1
  31. package/dist/runtime/index.js.map +4 -4
  32. package/dist/runtime/link.js +1 -1
  33. package/dist/runtime/link.js.map +4 -4
  34. package/dist/runtime/router-provider.d.ts +24 -1
  35. package/dist/runtime/router-provider.js +1 -1
  36. package/dist/runtime/router-provider.js.map +4 -4
  37. package/dist/runtime/server-app.d.ts +2 -1
  38. package/dist/runtime/server-app.js +1 -1
  39. package/dist/runtime/server-app.js.map +3 -3
  40. package/dist/runtime/server-client.d.ts +66 -0
  41. package/dist/runtime/server-client.js +2 -0
  42. package/dist/runtime/server-client.js.map +7 -0
  43. package/dist/runtime/url.d.ts +9 -0
  44. package/dist/runtime/url.js +2 -0
  45. package/dist/runtime/url.js.map +7 -0
  46. package/dist/server/api.d.ts +2 -1
  47. package/dist/server/api.js +1 -1
  48. package/dist/server/api.js.map +4 -4
  49. package/dist/server/handler-store.d.ts +12 -0
  50. package/dist/server/handler-store.js.map +2 -2
  51. package/dist/server/public-index.js.map +2 -2
  52. package/dist/server/render.d.ts +8 -0
  53. package/dist/server/render.js +1 -1
  54. package/dist/server/render.js.map +4 -4
  55. package/dist/server/routes.d.ts +4 -2
  56. package/dist/server/routes.js +1 -1
  57. package/dist/server/routes.js.map +4 -4
  58. package/dist/server/server-bound.d.ts +11 -0
  59. package/dist/server/server-bound.js +2 -0
  60. package/dist/server/server-bound.js.map +7 -0
  61. package/dist/server/server-proxy.d.ts +15 -0
  62. package/dist/server/server-proxy.js +2 -0
  63. package/dist/server/server-proxy.js.map +7 -0
  64. package/dist/server/types.d.ts +1 -0
  65. package/dist/types.d.ts +22 -0
  66. package/dist/utils/banner.js +1 -1
  67. package/dist/utils/glob.d.ts +11 -0
  68. package/dist/utils/glob.js +2 -0
  69. package/dist/utils/glob.js.map +7 -0
  70. package/dist/utils/response.d.ts +33 -1
  71. package/dist/utils/response.js +1 -1
  72. package/dist/utils/response.js.map +3 -3
  73. package/dist/utils/standard-schema.d.ts +39 -0
  74. package/dist/utils/standard-schema.js +1 -0
  75. package/dist/utils/standard-schema.js.map +7 -0
  76. package/dist/vite/codegen/entry-client.js +5 -3
  77. package/dist/vite/codegen/entry-client.js.map +2 -2
  78. package/dist/vite/codegen/page-types.d.ts +11 -2
  79. package/dist/vite/codegen/page-types.js +3 -3
  80. package/dist/vite/codegen/page-types.js.map +3 -3
  81. package/dist/vite/codegen/server-entry.js +16 -8
  82. package/dist/vite/codegen/server-entry.js.map +2 -2
  83. package/dist/vite/index.js +26 -16
  84. package/dist/vite/index.js.map +3 -3
  85. package/package.json +5 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/runtime/router-provider.tsx", "../../src/runtime/head.tsx", "../../src/runtime/context.tsx", "../../src/runtime/error-boundary.tsx"],
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\";\n\nconst DEFAULT_VIEWPORT: Viewport = { width: 'device-width', initialScale: 1 }\nimport { getDefaultErrorPage, loadErrorPage, matchClientRoute } from \"virtual:devix/client-routes\";\nimport { HeadSlot } from \"./head\";\nimport { NavigateOptions, PageMetaContext, RouteDataContext } from \"./context\";\nimport { DevixErrorBoundary } from \"./error-boundary\";\nimport type { Redirect } from \"../utils/response\";\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\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\ninterface PrefetchEntry {\n promise: Promise<{ pageMod: any; layoutMods: any[]; data: any } | null>\n controller: AbortController\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 prefetchCacheRef = useRef<Map<string, PrefetchEntry>>(new Map())\n\n const prefetchRoute = useCallback((href: string) => {\n if (prefetchCacheRef.current.has(href)) return\n const pathname = href.split('?')[0].split('#')[0]\n const matched = matchClientRoute(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${href}`, { 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(href)\n }, 3000)\n promise.finally(() => clearTimeout(expireTimer))\n\n prefetchCacheRef.current.set(href, { 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; 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 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 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 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, '', to)\n await loadRoute(to, 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 revalidate = useCallback(async () => {\n const to = window.location.pathname + window.location.search\n const controller = new AbortController()\n const dataRes = await fetch(`/_data${to}`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n if (!dataRes.ok) return\n const data = await dataRes.json()\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 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 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 class DevixError extends Error {\n statusCode: number\n constructor(statusCode: number, message: string) {\n super(message)\n this.statusCode = statusCode\n }\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", "raw", "icon", "resolved", "parts", "HeadSlot", "buildHeadNodes", "t", "i", "createContext", "g", "RouterContext", "PageMetaContext", "RouteDataContext", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "statusCode", "message", "jsx", "jsxs", "DEFAULT_VIEWPORT", "useRouter", "useContext", "RouterContext", "noopNavigate", "noopRevalidate", "useNavigate", "useRevalidate", "useParams", "ctx", "RouteDataContext", "useLoaderData", "RouterProvider", "initialData", "initialParams", "initialPage", "initialLayouts", "initialLayoutsData", "initialMeta", "initialViewport", "initialError", "initialErrorPage", "clientEntry", "state", "setState", "useState", "navigatingRef", "useRef", "isNavigating", "setIsNavigating", "prefetchCacheRef", "prefetchRoute", "useCallback", "href", "pathname", "matched", "matchClientRoute", "controller", "promise", "l", "pageMod", "layoutMods", "dataRes", "data", "expireTimer", "loadRoute", "to", "ErrorPage", "loadErrorPage", "getDefaultErrorPage", "prev", "cached", "prefetched", "pm", "lm", "ct", "errorBody", "headers", "value", "key", "m", "hash", "scrollBehavior", "navigate", "options", "run", "revalidate", "useEffect", "handlePop", "err", "content", "tree", "Layout", "layoutData", "DevixErrorBoundary", "PageMetaContext", "HeadSlot"]
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 { RouterContext } from 'virtual:devix/context'\nimport { ErrorProps, LayoutProps, PageProps } from \"../server/types\";\nimport { Metadata, Viewport } from \"../types\";\n\nconst DEFAULT_VIEWPORT: Viewport = { width: 'device-width', initialScale: 1 }\nimport { getDefaultErrorPage, loadErrorPage, matchClientRoute } from \"virtual:devix/client-routes\";\nimport { HeadSlot } from \"./head\";\nimport { NavigateOptions, PageMetaContext, RouteDataContext } from \"./context\";\nimport { DevixErrorBoundary } from \"./error-boundary\";\nimport { resolveTo } from \"./url\";\nimport type { Redirect } from \"../utils/response\";\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 {\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}: 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", "RouterContext", "getDefaultErrorPage", "loadErrorPage", "matchClientRoute", "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", "state", "setState", "useState", "navigatingRef", "useRef", "isNavigating", "setIsNavigating", "prefetchCacheRef", "prefetchRoute", "useCallback", "href", "resolved", "resolveTo", "key", "matched", "matchClientRoute", "controller", "promise", "l", "pageMod", "layoutMods", "dataRes", "data", "expireTimer", "loadRoute", "to", "pathname", "ErrorPage", "loadErrorPage", "getDefaultErrorPage", "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
  }
@@ -6,10 +6,11 @@ export interface ServerAppProps {
6
6
  params: Record<string, string>;
7
7
  loaderData: unknown;
8
8
  layoutsData: unknown[];
9
+ guardData: unknown;
9
10
  Page: ComponentType<PageProps>;
10
11
  layouts: ComponentType<LayoutProps>[];
11
12
  metadata: Metadata | null;
12
13
  viewport?: Viewport;
13
14
  clientEntry: string;
14
15
  }
15
- export declare function ServerApp({ pathname, params, loaderData, layoutsData, Page, layouts, metadata, viewport, clientEntry, }: ServerAppProps): import("react/jsx-runtime").JSX.Element;
16
+ export declare function ServerApp({ pathname, params, loaderData, layoutsData, guardData, Page, layouts, metadata, viewport, clientEntry, }: ServerAppProps): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
- import{createContext as m}from"react";var g=globalThis;g.__devix_RouterContext__??=m(null);var C=g.__devix_RouterContext__;g.__devix_PageMetaContext__??=m(null);g.__devix_RouteDataContext__??=m(null);var P=g.__devix_PageMetaContext__,d=g.__devix_RouteDataContext__;import{Fragment as _,jsx as c}from"react/jsx-runtime";function M(t,e){let o=[];t.title&&o.push({tag:"title",children:t.title}),t.description&&o.push({tag:"meta",name:"description",content:t.description}),t.keywords?.length&&o.push({tag:"meta",name:"keywords",content:t.keywords.join(", ")});let r=t.og?.title??t.title;r&&o.push({tag:"meta",property:"og:title",content:r});let a=t.og?.description??t.description;a&&o.push({tag:"meta",property:"og:description",content:a}),t.og?.image&&o.push({tag:"meta",property:"og:image",content:t.og.image}),t.og?.type&&o.push({tag:"meta",property:"og:type",content:t.og.type}),t.og?.url&&o.push({tag:"meta",property:"og:url",content:t.og.url});let l=t.twitter?.title??t.title;l&&o.push({tag:"meta",name:"twitter:title",content:l});let u=t.twitter?.description??t.description;if(u&&o.push({tag:"meta",name:"twitter:description",content:u}),t.twitter?.card&&o.push({tag:"meta",name:"twitter:card",content:t.twitter.card}),t.twitter?.image&&o.push({tag:"meta",name:"twitter:image",content:t.twitter.image}),t.twitter?.creator&&o.push({tag:"meta",name:"twitter:creator",content:t.twitter.creator}),t.canonical&&o.push({tag:"link",rel:"canonical",href:t.canonical}),t.robots&&o.push({tag:"meta",name:"robots",content:t.robots}),t.alternates)for(let[n,s]of Object.entries(t.alternates))o.push({tag:"link",rel:"alternate",href:s,hrefLang:n});if(t.icons){let n=Array.isArray(t.icons)?t.icons:[t.icons];for(let s of n){let i=typeof s=="string"?{href:s}:s;o.push({tag:"link",rel:i.rel??"icon",href:i.href,...i.type&&{type:i.type},...i.sizes&&{sizes:i.sizes}})}}if(e){let n=[];e.width!==void 0&&n.push(`width=${e.width}`),e.initialScale!==void 0&&n.push(`initial-scale=${e.initialScale}`),e.maximumScale!==void 0&&n.push(`maximum-scale=${e.maximumScale}`),e.userScalable!==void 0&&n.push(`user-scalable=${e.userScalable?"yes":"no"}`),n.length&&o.push({tag:"meta",name:"viewport",content:n.join(", ")}),e.themeColor&&o.push({tag:"meta",name:"theme-color",content:e.themeColor})}return o}function w({metadata:t,viewport:e}){return typeof window>"u"||!t?null:c(_,{children:k(t,e)})}function k(t,e){let o=M(t,e);return c(_,{children:o.map((r,a)=>r.tag==="title"?c("title",{children:r.children},a):r.tag==="link"?c("link",{rel:r.rel,href:r.href,hrefLang:r.hrefLang,type:r.type,sizes:r.sizes},a):c("meta",{name:r.name,property:r.property,content:r.content},a))})}import{Component as V}from"react";import{jsx as R}from"react/jsx-runtime";var h=class extends V{state={error:null};static getDerivedStateFromError(e){return e instanceof y?{error:{statusCode:e.statusCode,message:e.message}}:{error:{statusCode:500,message:e instanceof Error?e.message:"Unknown error"}}}render(){return this.state.error&&this.props.ErrorPage?R(this.props.ErrorPage,{...this.state.error}):this.state.error?R("h1",{children:this.state.error.statusCode}):this.props.children}},y=class extends Error{statusCode;constructor(e,o){super(o),this.statusCode=e}};import{jsx as p,jsxs as b}from"react/jsx-runtime";var D=(t,e)=>Promise.resolve(),S=()=>Promise.resolve(),T=t=>{};function J({pathname:t,params:e,loaderData:o,layoutsData:r,Page:a,layouts:l,metadata:u,viewport:n,clientEntry:s}){let i=p(d,{value:{loaderData:o,params:e},children:p(a,{data:o,params:e,url:t})});for(let f=l.length-1;f>=0;f--){let v=l[f],x=r[f];i=p(d,{value:{loaderData:x,params:e},children:p(v,{data:x,params:e,children:i})})}return b(P,{value:{metadata:u,viewport:n,clientEntry:s},children:[p(w,{metadata:u,viewport:n}),p(C,{value:{pathname:t,params:e,loaderData:o,layoutsData:r,Page:a,layouts:l,metadata:u,viewport:n,isNavigating:!1,navigate:D,revalidate:S,prefetchRoute:T},children:p(h,{children:i},t)})]})}export{J as ServerApp};
1
+ import{createContext as m}from"react";var u=globalThis;u.__devix_RouterContext__??=m(null);var w=u.__devix_RouterContext__;u.__devix_PageMetaContext__??=m(null);u.__devix_RouteDataContext__??=m(null);var P=u.__devix_PageMetaContext__,x=u.__devix_RouteDataContext__;import{Fragment as v,jsx as g}from"react/jsx-runtime";function M(t,e){let o=[];t.title&&o.push({tag:"title",children:t.title}),t.description&&o.push({tag:"meta",name:"description",content:t.description}),t.keywords?.length&&o.push({tag:"meta",name:"keywords",content:t.keywords.join(", ")});let r=t.og?.title??t.title;r&&o.push({tag:"meta",property:"og:title",content:r});let a=t.og?.description??t.description;a&&o.push({tag:"meta",property:"og:description",content:a}),t.og?.image&&o.push({tag:"meta",property:"og:image",content:t.og.image}),t.og?.type&&o.push({tag:"meta",property:"og:type",content:t.og.type}),t.og?.url&&o.push({tag:"meta",property:"og:url",content:t.og.url});let c=t.twitter?.title??t.title;c&&o.push({tag:"meta",name:"twitter:title",content:c});let l=t.twitter?.description??t.description;if(l&&o.push({tag:"meta",name:"twitter:description",content:l}),t.twitter?.card&&o.push({tag:"meta",name:"twitter:card",content:t.twitter.card}),t.twitter?.image&&o.push({tag:"meta",name:"twitter:image",content:t.twitter.image}),t.twitter?.creator&&o.push({tag:"meta",name:"twitter:creator",content:t.twitter.creator}),t.canonical&&o.push({tag:"link",rel:"canonical",href:t.canonical}),t.robots&&o.push({tag:"meta",name:"robots",content:t.robots}),t.alternates)for(let[n,i]of Object.entries(t.alternates))o.push({tag:"link",rel:"alternate",href:i,hrefLang:n});if(t.icons){let n=Array.isArray(t.icons)?t.icons:[t.icons];for(let i of n){let s=typeof i=="string"?{href:i}:i;o.push({tag:"link",rel:s.rel??"icon",href:s.href,...s.type&&{type:s.type},...s.sizes&&{sizes:s.sizes}})}}if(e){let n=[];e.width!==void 0&&n.push(`width=${e.width}`),e.initialScale!==void 0&&n.push(`initial-scale=${e.initialScale}`),e.maximumScale!==void 0&&n.push(`maximum-scale=${e.maximumScale}`),e.userScalable!==void 0&&n.push(`user-scalable=${e.userScalable?"yes":"no"}`),n.length&&o.push({tag:"meta",name:"viewport",content:n.join(", ")}),e.themeColor&&o.push({tag:"meta",name:"theme-color",content:e.themeColor})}return o}function _({metadata:t,viewport:e}){return typeof window>"u"||!t?null:g(v,{children:D(t,e)})}function D(t,e){let o=M(t,e);return g(v,{children:o.map((r,a)=>r.tag==="title"?g("title",{children:r.children},a):r.tag==="link"?g("link",{rel:r.rel,href:r.href,hrefLang:r.hrefLang,type:r.type,sizes:r.sizes},a):g("meta",{name:r.name,property:r.property,content:r.content},a))})}import{Component as V}from"react";import{jsx as R}from"react/jsx-runtime";var h=class extends V{state={error:null};static getDerivedStateFromError(e){return e instanceof y?{error:{statusCode:e.statusCode,message:e.message}}:{error:{statusCode:500,message:e instanceof Error?e.message:"Unknown error"}}}render(){return this.state.error&&this.props.ErrorPage?R(this.props.ErrorPage,{...this.state.error}):this.state.error?R("h1",{children:this.state.error.statusCode}):this.props.children}},y=class extends Error{statusCode;code;data;constructor(e,o,r){super(o),this.name="DevixError",this.statusCode=e,this.code=r?.code,this.data=r?.data}};import{jsx as p,jsxs as E}from"react/jsx-runtime";var S=(t,e)=>Promise.resolve(),T=()=>Promise.resolve(),b=t=>{};function K({pathname:t,params:e,loaderData:o,layoutsData:r,guardData:a,Page:c,layouts:l,metadata:n,viewport:i,clientEntry:s}){let d=p(x,{value:{loaderData:o,params:e},children:p(c,{data:o,params:e,url:t})});for(let f=l.length-1;f>=0;f--){let k=l[f],C=r[f];d=p(x,{value:{loaderData:C,params:e},children:p(k,{data:C,params:e,children:d})})}return E(P,{value:{metadata:n,viewport:i,clientEntry:s},children:[p(_,{metadata:n,viewport:i}),p(w,{value:{pathname:t,params:e,loaderData:o,layoutsData:r,guardData:a,Page:c,layouts:l,metadata:n,viewport:i,isNavigating:!1,navigate:S,revalidate:T,prefetchRoute:b},children:p(h,{children:d},t)})]})}export{K as ServerApp};
2
2
  //# sourceMappingURL=server-app.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/runtime/context.tsx", "../../src/runtime/head.tsx", "../../src/runtime/error-boundary.tsx", "../../src/runtime/server-app.tsx"],
4
- "sourcesContent": ["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 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 { 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 {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 {ComponentType, ReactNode} from 'react'\nimport {RouterContext, PageMetaContext, RouteDataContext, NavigateOptions} from './context'\nimport {HeadSlot} from './head'\nimport {DevixErrorBoundary} from './error-boundary'\nimport {LayoutProps, PageProps} from '../server/types'\nimport {Metadata, Viewport} from '../types'\n\nconst noopNavigate = (_to: string, _opts?: NavigateOptions) => Promise.resolve()\nconst noopRevalidate = () => Promise.resolve()\nconst noopPrefetch = (_href: string) => {}\n\nexport interface ServerAppProps {\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 clientEntry: string\n}\n\nexport function ServerApp({\n pathname, params, loaderData, layoutsData,\n Page, layouts, metadata, viewport, clientEntry,\n}: ServerAppProps) {\n let tree: ReactNode = (\n <RouteDataContext value={{loaderData, params}}>\n <Page data={loaderData as any} params={params} url={pathname}/>\n </RouteDataContext>\n )\n\n for (let i = layouts.length - 1; i >= 0; i--) {\n const Layout = layouts[i]\n const layoutData = layoutsData[i]\n tree = (\n <RouteDataContext value={{loaderData: layoutData, params}}>\n <Layout data={layoutData as any} params={params}>{tree}</Layout>\n </RouteDataContext>\n )\n }\n\n return (\n <PageMetaContext value={{metadata, viewport, clientEntry}}>\n <HeadSlot metadata={metadata} viewport={viewport}/>\n <RouterContext value={{\n pathname,\n params,\n loaderData,\n layoutsData,\n Page,\n layouts,\n metadata,\n viewport,\n isNavigating: false,\n navigate: noopNavigate,\n revalidate: noopRevalidate,\n prefetchRoute: noopPrefetch,\n }}>\n <DevixErrorBoundary key={pathname}>\n {tree}\n </DevixErrorBoundary>\n </RouterContext>\n </PageMetaContext>\n )\n}\n"],
5
- "mappings": "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",
6
- "names": ["createContext", "RouterContext", "PageMetaContext", "RouteDataContext", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "raw", "icon", "resolved", "parts", "HeadSlot", "buildHeadNodes", "t", "i", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "statusCode", "message", "jsx", "jsxs", "noopNavigate", "_to", "_opts", "noopRevalidate", "noopPrefetch", "_href", "ServerApp", "pathname", "params", "loaderData", "layoutsData", "Page", "layouts", "metadata", "viewport", "clientEntry", "tree", "RouteDataContext", "i", "Layout", "layoutData", "PageMetaContext", "HeadSlot", "RouterContext", "DevixErrorBoundary"]
4
+ "sourcesContent": ["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 { 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 {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", "import {ComponentType, ReactNode} from 'react'\nimport {RouterContext, PageMetaContext, RouteDataContext, NavigateOptions} from './context'\nimport {HeadSlot} from './head'\nimport {DevixErrorBoundary} from './error-boundary'\nimport {LayoutProps, PageProps} from '../server/types'\nimport {Metadata, Viewport} from '../types'\n\nconst noopNavigate = (_to: string, _opts?: NavigateOptions) => Promise.resolve()\nconst noopRevalidate = () => Promise.resolve()\nconst noopPrefetch = (_href: string) => {}\n\nexport interface ServerAppProps {\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 clientEntry: string\n}\n\nexport function ServerApp({\n pathname, params, loaderData, layoutsData, guardData,\n Page, layouts, metadata, viewport, clientEntry,\n}: ServerAppProps) {\n let tree: ReactNode = (\n <RouteDataContext value={{loaderData, params}}>\n <Page data={loaderData as any} params={params} url={pathname}/>\n </RouteDataContext>\n )\n\n for (let i = layouts.length - 1; i >= 0; i--) {\n const Layout = layouts[i]\n const layoutData = layoutsData[i]\n tree = (\n <RouteDataContext value={{loaderData: layoutData, params}}>\n <Layout data={layoutData as any} params={params}>{tree}</Layout>\n </RouteDataContext>\n )\n }\n\n return (\n <PageMetaContext value={{metadata, viewport, clientEntry}}>\n <HeadSlot metadata={metadata} viewport={viewport}/>\n <RouterContext value={{\n pathname,\n params,\n loaderData,\n layoutsData,\n guardData,\n Page,\n layouts,\n metadata,\n viewport,\n isNavigating: false,\n navigate: noopNavigate,\n revalidate: noopRevalidate,\n prefetchRoute: noopPrefetch,\n }}>\n <DevixErrorBoundary key={pathname}>\n {tree}\n </DevixErrorBoundary>\n </RouterContext>\n </PageMetaContext>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["createContext", "g", "RouterContext", "PageMetaContext", "RouteDataContext", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "raw", "icon", "resolved", "parts", "HeadSlot", "buildHeadNodes", "t", "i", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "statusCode", "message", "options", "jsx", "jsxs", "noopNavigate", "_to", "_opts", "noopRevalidate", "noopPrefetch", "_href", "ServerApp", "pathname", "params", "loaderData", "layoutsData", "guardData", "Page", "layouts", "metadata", "viewport", "clientEntry", "tree", "RouteDataContext", "i", "Layout", "layoutData", "PageMetaContext", "HeadSlot", "RouterContext", "DevixErrorBoundary"]
7
7
  }
@@ -0,0 +1,66 @@
1
+ import { type HttpMethod } from './fetch';
2
+ /**
3
+ * Interface declarable por el usuario para tipar las rutas de cada backend
4
+ * configurado en `devix.config.ts`. Las claves siguen el formato
5
+ * `'<namespace> <METHOD> <path>'`.
6
+ *
7
+ * ```ts
8
+ * declare module '@devlusoft/devix' {
9
+ * interface BackendRoutes {
10
+ * 'api GET /v1/me': { __response: User }
11
+ * 'api POST /v1/posts': { __body: { title: string }; __response: Post }
12
+ * 'stripe POST /v1/customers': { __body: CreateCustomerInput; __response: Customer }
13
+ * }
14
+ * }
15
+ * ```
16
+ */
17
+ export interface BackendRoutes {
18
+ }
19
+ type BackendKey<NS extends string, M extends HttpMethod, P extends string> = `${NS} ${M} ${P}`;
20
+ type MatchingBackendKey<NS extends string, M extends HttpMethod, P extends string> = {
21
+ [K in keyof BackendRoutes]: K extends BackendKey<NS, M, P> ? K : never;
22
+ }[keyof BackendRoutes];
23
+ type BackendRouteData<NS extends string, M extends HttpMethod, P extends string> = BackendRoutes[MatchingBackendKey<NS, M, P>];
24
+ type ExtractBackendBody<D> = D extends {
25
+ __body: infer B;
26
+ } ? B : never;
27
+ type ExtractBackendResponse<D> = D extends {
28
+ __response: infer R;
29
+ } ? R : unknown;
30
+ type InferBackendBody<NS extends string, M extends HttpMethod, P extends string> = ExtractBackendBody<BackendRouteData<NS, M, P>>;
31
+ type InferBackendResult<NS extends string, M extends HttpMethod, P extends string> = ExtractBackendResponse<BackendRouteData<NS, M, P>>;
32
+ type BackendBodyOption<NS extends string, M extends HttpMethod, P extends string> = [
33
+ InferBackendBody<NS, M, P>
34
+ ] extends [never] ? unknown : InferBackendBody<NS, M, P>;
35
+ type BackendPaths<NS extends string> = {
36
+ [K in keyof BackendRoutes]: K extends `${NS} ${HttpMethod} ${infer P}` ? P : never;
37
+ }[keyof BackendRoutes];
38
+ type BackendPath<NS extends string> = BackendPaths<NS> | (string & {});
39
+ export interface ServerFetchOptions<NS extends string = string, M extends HttpMethod = 'GET', P extends string = string> {
40
+ body?: BackendBodyOption<NS, M, P>;
41
+ headers?: HeadersInit;
42
+ signal?: AbortSignal;
43
+ }
44
+ export interface BackendClient<NS extends string> {
45
+ get<P extends BackendPath<NS>>(path: P, options?: Omit<ServerFetchOptions<NS, 'GET', P>, 'body'>): Promise<InferBackendResult<NS, 'GET', P>>;
46
+ post<P extends BackendPath<NS>>(path: P, body?: BackendBodyOption<NS, 'POST', P>, options?: Omit<ServerFetchOptions<NS, 'POST', P>, 'body'>): Promise<InferBackendResult<NS, 'POST', P>>;
47
+ put<P extends BackendPath<NS>>(path: P, body?: BackendBodyOption<NS, 'PUT', P>, options?: Omit<ServerFetchOptions<NS, 'PUT', P>, 'body'>): Promise<InferBackendResult<NS, 'PUT', P>>;
48
+ patch<P extends BackendPath<NS>>(path: P, body?: BackendBodyOption<NS, 'PATCH', P>, options?: Omit<ServerFetchOptions<NS, 'PATCH', P>, 'body'>): Promise<InferBackendResult<NS, 'PATCH', P>>;
49
+ delete<P extends BackendPath<NS>>(path: P, options?: Omit<ServerFetchOptions<NS, 'DELETE', P>, 'body'>): Promise<InferBackendResult<NS, 'DELETE', P>>;
50
+ }
51
+ /**
52
+ * Cliente para llamar a backends remotos configurados en `devix.config.ts`.
53
+ *
54
+ * En cliente: las requests pasan por el proxy interno `/_devix/server/<namespace>/...`
55
+ * donde devix aplica `prepare` (auth pass-through, tracing, etc.) y reenvía al backend.
56
+ *
57
+ * En server (loaders/handlers): NO uses este import — usa `ctx.$server` que recibe
58
+ * el request del usuario para que `prepare` pueda leer cookies.
59
+ *
60
+ * ```ts
61
+ * const me = await $server.api.get('/v1/me')
62
+ * const post = await $server.api.post('/v1/posts', { title: 'Hola' })
63
+ * ```
64
+ */
65
+ export declare const $server: Record<string, BackendClient<string>>;
66
+ export {};
@@ -0,0 +1,2 @@
1
+ function u(t){if(t&&typeof t=="object"&&"message"in t){let e=t.message;if(typeof e=="string"&&e.length>0)return e}return null}var i=class extends Error{constructor(n,s,a,r){super(u(r)??`HTTP ${n}: ${s}`);this.status=n;this.statusText=s;this.response=a;this.body=r;this.name="FetchError"}get code(){if(this.body&&typeof this.body=="object"&&"code"in this.body){let n=this.body.code;return typeof n=="string"?n:void 0}}};var B="/_devix/server";async function o(t,e,n,s){let a=new Headers(s?.headers),r;s?.body!==void 0&&(s.body instanceof FormData||s.body instanceof Blob||s.body instanceof ArrayBuffer?r=s.body:(r=JSON.stringify(s.body),a.has("Content-Type")||a.set("Content-Type","application/json")));let y=`${B}/${t}${n}`,d=await fetch(y,{method:e,headers:a,body:r,signal:s?.signal}),c=d.status===204||d.headers.get("Content-Length")==="0";if(!d.ok){let p=d.headers.get("Content-Type")??"",P;if(!c&&p.includes("application/json"))try{P=await d.json()}catch{}throw new i(d.status,d.statusText,d,P)}return c?null:(d.headers.get("Content-Type")??"").includes("application/json")?d.json():d.text()}function S(t){return{get:(e,n)=>o(t,"GET",e,n),post:(e,n,s)=>o(t,"POST",e,{...s,body:n}),put:(e,n,s)=>o(t,"PUT",e,{...s,body:n}),patch:(e,n,s)=>o(t,"PATCH",e,{...s,body:n}),delete:(e,n)=>o(t,"DELETE",e,n)}}var h=new Proxy({},{get(t,e){if(typeof e=="string")return t[e]||(t[e]=S(e)),t[e]}});export{h as $server};
2
+ //# sourceMappingURL=server-client.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/runtime/fetch.ts", "../../src/runtime/server-client.ts"],
4
+ "sourcesContent": ["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\n/**\n * Interface declarable por el usuario para tipar las rutas de cada backend\n * configurado en `devix.config.ts`. Las claves siguen el formato\n * `'<namespace> <METHOD> <path>'`.\n *\n * ```ts\n * declare module '@devlusoft/devix' {\n * interface BackendRoutes {\n * 'api GET /v1/me': { __response: User }\n * 'api POST /v1/posts': { __body: { title: string }; __response: Post }\n * 'stripe POST /v1/customers': { __body: CreateCustomerInput; __response: Customer }\n * }\n * }\n * ```\n */\nexport interface BackendRoutes {}\n\ntype BackendKey<NS extends string, M extends HttpMethod, P extends string> = `${NS} ${M} ${P}`\ntype MatchingBackendKey<NS extends string, M extends HttpMethod, P extends string> = {\n [K in keyof BackendRoutes]: K extends BackendKey<NS, M, P> ? K : never\n}[keyof BackendRoutes]\ntype BackendRouteData<NS extends string, M extends HttpMethod, P extends string> = BackendRoutes[MatchingBackendKey<NS, M, P>]\n\ntype ExtractBackendBody<D> = D extends { __body: infer B } ? B : never\ntype ExtractBackendResponse<D> = D extends { __response: infer R } ? R : unknown\ntype InferBackendBody<NS extends string, M extends HttpMethod, P extends string> = ExtractBackendBody<BackendRouteData<NS, M, P>>\ntype InferBackendResult<NS extends string, M extends HttpMethod, P extends string> = ExtractBackendResponse<BackendRouteData<NS, M, P>>\ntype BackendBodyOption<NS extends string, M extends HttpMethod, P extends string> =\n [InferBackendBody<NS, M, P>] extends [never] ? unknown : InferBackendBody<NS, M, P>\n\ntype BackendPaths<NS extends string> = {\n [K in keyof BackendRoutes]: K extends `${NS} ${HttpMethod} ${infer P}` ? P : never\n}[keyof BackendRoutes]\ntype BackendPath<NS extends string> = BackendPaths<NS> | (string & {})\n\nexport interface ServerFetchOptions<NS extends string = string, M extends HttpMethod = 'GET', P extends string = string> {\n body?: BackendBodyOption<NS, M, P>\n headers?: HeadersInit\n signal?: AbortSignal\n}\n\nconst PROXY_PREFIX = '/_devix/server'\n\nasync function proxyFetch<NS extends string, M extends HttpMethod, P extends string>(\n namespace: NS,\n method: M,\n path: P,\n options?: ServerFetchOptions<NS, M, P>,\n): Promise<InferBackendResult<NS, M, P>> {\n const headers = new Headers(options?.headers)\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')) 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, 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 InferBackendResult<NS, M, P>\n\n const ct = response.headers.get('Content-Type') ?? ''\n if (ct.includes('application/json')) return response.json() as Promise<InferBackendResult<NS, M, P>>\n return response.text() as unknown as Promise<InferBackendResult<NS, M, P>>\n}\n\nexport interface BackendClient<NS extends string> {\n get<P extends BackendPath<NS>>(path: P, options?: Omit<ServerFetchOptions<NS, 'GET', P>, 'body'>): Promise<InferBackendResult<NS, 'GET', P>>\n post<P extends BackendPath<NS>>(path: P, body?: BackendBodyOption<NS, 'POST', P>, options?: Omit<ServerFetchOptions<NS, 'POST', P>, 'body'>): Promise<InferBackendResult<NS, 'POST', P>>\n put<P extends BackendPath<NS>>(path: P, body?: BackendBodyOption<NS, 'PUT', P>, options?: Omit<ServerFetchOptions<NS, 'PUT', P>, 'body'>): Promise<InferBackendResult<NS, 'PUT', P>>\n patch<P extends BackendPath<NS>>(path: P, body?: BackendBodyOption<NS, 'PATCH', P>, options?: Omit<ServerFetchOptions<NS, 'PATCH', P>, 'body'>): Promise<InferBackendResult<NS, 'PATCH', P>>\n delete<P extends BackendPath<NS>>(path: P, options?: Omit<ServerFetchOptions<NS, 'DELETE', P>, 'body'>): Promise<InferBackendResult<NS, 'DELETE', P>>\n}\n\nfunction makeBackendClient<NS extends string>(namespace: NS): BackendClient<NS> {\n return {\n get: (path, options) => proxyFetch(namespace, 'GET', path, options) as any,\n post: (path, body, options) => proxyFetch(namespace, 'POST', path, {...options, body} as any) as any,\n put: (path, body, options) => proxyFetch(namespace, 'PUT', path, {...options, body} as any) as any,\n patch: (path, body, options) => proxyFetch(namespace, 'PATCH', path, {...options, body} as any) as any,\n delete: (path, options) => proxyFetch(namespace, 'DELETE', path, options) as any,\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('/v1/me')\n * const post = await $server.api.post('/v1/posts', { title: 'Hola' })\n * ```\n */\nexport const $server: Record<string, BackendClient<string>> = new Proxy({} as Record<string, BackendClient<string>>, {\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"],
5
+ "mappings": "AAEA,SAASA,EAAeC,EAA8B,CAClD,GAAIA,GAAQ,OAAOA,GAAS,UAAY,YAAaA,EAAM,CACvD,IAAMC,EAAKD,EAA4B,QACvC,GAAI,OAAOC,GAAM,UAAYA,EAAE,OAAS,EAAG,OAAOA,CACtD,CACA,OAAO,IACX,CAEO,IAAMC,EAAN,cAAsC,KAAM,CAC/C,YACoBC,EACAC,EACAC,EACAL,EAClB,CACE,MAAMD,EAAeC,CAAI,GAAK,QAAQG,CAAM,KAAKC,CAAU,EAAE,EAL7C,YAAAD,EACA,gBAAAC,EACA,cAAAC,EACA,UAAAL,EAGhB,KAAK,KAAO,YAChB,CAEA,IAAI,MAA2B,CAC3B,GAAI,KAAK,MAAQ,OAAO,KAAK,MAAS,UAAY,SAAU,KAAK,KAAM,CACnE,IAAMM,EAAK,KAAK,KAAyB,KACzC,OAAO,OAAOA,GAAM,SAAWA,EAAI,MACvC,CAEJ,CACJ,ECeA,IAAMC,EAAe,iBAErB,eAAeC,EACXC,EACAC,EACAC,EACAC,EACqC,CACrC,IAAMC,EAAU,IAAI,QAAQD,GAAS,OAAO,EACxCE,EACAF,GAAS,OAAS,SACdA,EAAQ,gBAAgB,UAAYA,EAAQ,gBAAgB,MAAQA,EAAQ,gBAAgB,YAC5FE,EAAOF,EAAQ,MAEfE,EAAO,KAAK,UAAUF,EAAQ,IAAI,EAC7BC,EAAQ,IAAI,cAAc,GAAGA,EAAQ,IAAI,eAAgB,kBAAkB,IAIxF,IAAME,EAAM,GAAGR,CAAY,IAAIE,CAAS,GAAGE,CAAI,GACzCK,EAAW,MAAM,MAAMD,EAAK,CAAC,OAAAL,EAAQ,QAAAG,EAAS,KAAAC,EAAM,OAAQF,GAAS,MAAM,CAAC,EAE5EK,EAAcD,EAAS,SAAW,KAAOA,EAAS,QAAQ,IAAI,gBAAgB,IAAM,IAE1F,GAAI,CAACA,EAAS,GAAI,CACd,IAAME,EAAKF,EAAS,QAAQ,IAAI,cAAc,GAAK,GAC/CG,EACJ,GAAI,CAACF,GAAeC,EAAG,SAAS,kBAAkB,EAC9C,GAAI,CAAEC,EAAY,MAAMH,EAAS,KAAK,CAAE,MAAQ,CAA8B,CAElF,MAAM,IAAII,EAAWJ,EAAS,OAAQA,EAAS,WAAYA,EAAUG,CAAS,CAClF,CAEA,OAAIF,EAAoB,MAEbD,EAAS,QAAQ,IAAI,cAAc,GAAK,IAC5C,SAAS,kBAAkB,EAAUA,EAAS,KAAK,EACnDA,EAAS,KAAK,CACzB,CAUA,SAASK,EAAqCZ,EAAkC,CAC5E,MAAO,CACH,IAAK,CAACE,EAAMC,IAAYJ,EAAWC,EAAW,MAAOE,EAAMC,CAAO,EAClE,KAAM,CAACD,EAAMG,EAAMF,IAAYJ,EAAWC,EAAW,OAAQE,EAAM,CAAC,GAAGC,EAAS,KAAAE,CAAI,CAAQ,EAC5F,IAAK,CAACH,EAAMG,EAAMF,IAAYJ,EAAWC,EAAW,MAAOE,EAAM,CAAC,GAAGC,EAAS,KAAAE,CAAI,CAAQ,EAC1F,MAAO,CAACH,EAAMG,EAAMF,IAAYJ,EAAWC,EAAW,QAASE,EAAM,CAAC,GAAGC,EAAS,KAAAE,CAAI,CAAQ,EAC9F,OAAQ,CAACH,EAAMC,IAAYJ,EAAWC,EAAW,SAAUE,EAAMC,CAAO,CAC5E,CACJ,CAgBO,IAAMU,EAAiD,IAAI,MAAM,CAAC,EAA4C,CACjH,IAAIC,EAAQd,EAAmB,CAC3B,GAAI,OAAOA,GAAc,SACzB,OAAKc,EAAOd,CAAS,IAAGc,EAAOd,CAAS,EAAIY,EAAkBZ,CAAS,GAChEc,EAAOd,CAAS,CAC3B,CACJ,CAAC",
6
+ "names": ["extractMessage", "body", "m", "FetchError", "status", "statusText", "response", "c", "PROXY_PREFIX", "proxyFetch", "namespace", "method", "path", "options", "headers", "body", "url", "response", "isEmptyBody", "ct", "errorBody", "FetchError", "makeBackendClient", "$server", "target"]
7
+ }
@@ -0,0 +1,9 @@
1
+ export type ResolvedTo = {
2
+ kind: 'internal';
3
+ pathname: string;
4
+ href: string;
5
+ } | {
6
+ kind: 'external';
7
+ url: URL;
8
+ };
9
+ export declare function resolveTo(to: string): ResolvedTo;
@@ -0,0 +1,2 @@
1
+ function r(a){let e=new URL(window.location.href);e.pathname.endsWith("/")||(e.pathname+="/");let n=new URL(a,e);if(n.origin!==window.location.origin)return{kind:"external",url:n};let t=n.pathname.length>1?n.pathname.replace(/\/$/,""):n.pathname;return{kind:"internal",pathname:t,href:t+n.search+n.hash}}export{r as resolveTo};
2
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/runtime/url.ts"],
4
+ "sourcesContent": ["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": "AAIO,SAASA,EAAUC,EAAwB,CAC9C,IAAMC,EAAO,IAAI,IAAI,OAAO,SAAS,IAAI,EACpCA,EAAK,SAAS,SAAS,GAAG,IAAGA,EAAK,UAAY,KAEnD,IAAMC,EAAM,IAAI,IAAIF,EAAIC,CAAI,EAE5B,GAAIC,EAAI,SAAW,OAAO,SAAS,OAC/B,MAAO,CAAE,KAAM,WAAY,IAAAA,CAAI,EAGnC,IAAMC,EAAWD,EAAI,SAAS,OAAS,EACjCA,EAAI,SAAS,QAAQ,MAAO,EAAE,EAC9BA,EAAI,SAEV,MAAO,CACH,KAAM,WACN,SAAAC,EACA,KAAMA,EAAWD,EAAI,OAASA,EAAI,IACtC,CACJ",
6
+ "names": ["resolveTo", "to", "base", "url", "pathname"]
7
+ }
@@ -1,2 +1,3 @@
1
1
  import type { ApiGlob } from './types';
2
- export declare function handleApiRequest(url: string, request: Request, glob: ApiGlob): Promise<Response>;
2
+ import type { ServerBackendConfig } from '../config';
3
+ export declare function handleApiRequest(url: string, request: Request, glob: ApiGlob, serverConfig?: Record<string, ServerBackendConfig>): Promise<Response>;
@@ -1,2 +1,2 @@
1
- function w(e){return e.replace(/\.(tsx|ts|jsx|js)$/,"").replace(/\(.*?\)\//g,"").replace(/^index$|\/index$/,"").replace(/\[([^\]]+)]/g,":$1")||"/"}function _(e,t){let r=e.slice(t.length+1).replace(/\\/g,"/"),n=w(r);return n==="/"?"/api":`/api/${n}`.replace("/api//","/api/")}function A(e){return e.slice(0,e.lastIndexOf("/"))}function T(e,t,r){let n=[],s=[];for(let o of t)s.push({dir:A(o),key:o});for(let o of e){let a=_(o,r),i=[...a.matchAll(/:([^/]+)/g)].map(c=>c[1]),u=a.replace(/:[^/]+/g,"([^/]+)").replace(/\//g,"\\/");n.push({path:a,key:o,params:i,regex:new RegExp(`^${u}$`)})}return n.sort((o,a)=>{let i=(o.path.match(/:/g)||[]).length,u=(a.path.match(/:/g)||[]).length;return i!==u?i-u:a.path.length-o.path.length}),{routes:n,middlewares:s}}function H(e,t){let r=A(e);return t.filter(n=>r.startsWith(n.dir)).sort((n,s)=>n.dir.split("/").length-s.dir.split("/").length)}function C(e,t){for(let r of t){let n=e.match(r.regex);if(n){let s={};return r.params.forEach((o,a)=>{s[o]=decodeURIComponent(n[a+1])}),{route:r,params:s}}}return null}var l=class{params;_state=new Map;constructor(t={}){this.params=t}set(t,r){this._state.set(t,r)}get(t){return this._state.get(t)}};import{Component as I}from"react";import{jsx as W}from"react/jsx-runtime";var p=class extends Error{statusCode;constructor(t,r){super(r),this.statusCode=t}};var S="__devix_handler__";import{AsyncLocalStorage as N}from"node:async_hooks";var R=Symbol.for("@devlusoft/devix.handlerStore"),g=globalThis;g[R]||(g[R]=new N);var b=g[R];function E(e,t){return b.run(e,t)}var y=null,k=null;function j(e){return typeof e=="object"&&e!==null&&S in e}async function B(e){let t=e.headers.get("Content-Type")??"";return t.includes("application/json")?e.json():t.includes("multipart/form-data")||t.includes("application/x-www-form-urlencoded")?e.formData():e.text()}function F(e){return e instanceof Response?e:e==null?new Response(null,{status:204}):new Response(JSON.stringify(e),{headers:{"Content-Type":"application/json"}})}async function oe(e,t,r){try{let{pathname:n}=new URL(e,"http://localhost"),s=Object.keys(r.routes).sort().join("\0")+"|"+Object.keys(r.middlewares).sort().join("\0");(!y||k!==s)&&(y=T(Object.keys(r.routes),Object.keys(r.middlewares),r.apiDir),k=s);let{routes:o,middlewares:a}=y,i=C(n,o);if(!i)return new Response("Not Found",{status:404});let{route:u,params:c}=i,f=new l(c),P=await E({request:t,ctx:f},async()=>{let D=H(u.key,a);for(let m of D){let x=await r.middlewares[m.key]();if(x.middleware){let h=await x.middleware(f,t);if(h instanceof Response)return h}}let M=await r.routes[u.key](),v=t.method.toUpperCase(),d=M[v];if(!d)return new Response("Method Not Allowed",{status:405});if(j(d)){if(d.fn.length===0)return d.fn();let m=await B(t);return d.fn(m)}return d(f,t)});return F(P)}catch(n){return console.error("[devix] api error:",n),n instanceof p?new Response(n.message,{status:n.statusCode}):new Response("Internal Server Error",{status:500})}}export{oe as handleApiRequest};
1
+ function B(e){return e.replace(/\.(tsx|ts|jsx|js)$/,"").replace(/\(.*?\)\//g,"").replace(/^index$|\/index$/,"").replace(/\[([^\]]+)]/g,":$1")||"/"}function F(e,t){let n=e.slice(t.length+1).replace(/\\/g,"/"),o=B(n);return o==="/"?"/api":`/api/${o}`.replace("/api//","/api/")}function v(e){return e.slice(0,e.lastIndexOf("/"))}function b(e,t,n){let o=[],r=[];for(let s of t)r.push({dir:v(s),key:s});for(let s of e){let a=F(s,n),c=[...a.matchAll(/:([^/]+)/g)].map(l=>l[1]),d=a.replace(/:[^/]+/g,"([^/]+)").replace(/\//g,"\\/");o.push({path:a,key:s,params:c,regex:new RegExp(`^${d}$`)})}return o.sort((s,a)=>{let c=(s.path.match(/:/g)||[]).length,d=(a.path.match(/:/g)||[]).length;return c!==d?c-d:a.path.length-s.path.length}),{routes:o,middlewares:r}}function D(e,t){let n=v(e);return t.filter(o=>n.startsWith(o.dir)).sort((o,r)=>o.dir.split("/").length-r.dir.split("/").length)}function _(e,t){for(let n of t){let o=e.match(n.regex);if(o){let r={};return n.params.forEach((s,a)=>{r[s]=decodeURIComponent(o[a+1])}),{route:n,params:r}}}return null}var x=class{params;request;url;$server;_state=new Map;constructor(t,n,o,r={}){this.params=t,this.request=n,this.url=o,this.$server=r}set(t,n){this._state.set(t,n)}get(t){return this._state.get(t)}};import{Component as oe}from"react";import{jsx as de}from"react/jsx-runtime";var w=class extends Error{statusCode;code;data;constructor(t,n,o){super(n),this.name="DevixError",this.statusCode=t,this.code=o?.code,this.data=o?.data}};var j="__devix_handler__";import{AsyncLocalStorage as q}from"node:async_hooks";var T=Symbol.for("@devlusoft/devix.handlerStore"),C=globalThis;C[T]||(C[T]=new q);var G=C[T];function M(e,t){return G.run(e,t)}var N=Symbol.for("devix.loaderError");function $(e,t,n){return{[N]:!0,statusCode:e,message:t,code:n?.code,data:n?.data}}function L(e){return typeof e=="object"&&e!==null&&N in e}function E(e){let t={statusCode:e.statusCode,message:e.message};return e.code!==void 0&&(t.code=e.code),e.data!==void 0&&(t.data=e.data),t}function J(e){if(e&&typeof e=="object"&&"message"in e){let t=e.message;if(typeof t=="string"&&t.length>0)return t}return null}var g=class extends Error{constructor(n,o,r,s){super(J(s)??`HTTP ${n}: ${o}`);this.status=n;this.statusText=o;this.response=r;this.body=s;this.name="FetchError"}get code(){if(this.body&&typeof this.body=="object"&&"code"in this.body){let n=this.body.code;return typeof n=="string"?n:void 0}}};function V(e,t){return K(t).test(e)}function S(e,t){if(!t||t.length===0)return!1;for(let n of t)if(V(e,n))return!0;return!1}function K(e){let t="",n=0;for(;n<e.length;){let o=e[n];if(o==="*"&&e[n+1]==="*")t+=".*",n+=2;else if(o==="*")t+="[^/]*",n+=1;else if(o===":"){for(n+=1;n<e.length&&/[a-zA-Z0-9_]/.test(e[n]);)n+=1;t+="[^/]+"}else".+?^$()|[]{}\\".includes(o)?(t+="\\"+o,n+=1):(t+=o,n+=1)}return new RegExp(`^${t}$`)}function O(e,t){if(!t)return new Proxy({},{get(o,r){throw new Error(`[devix] ctx.$server.${String(r)} called but no 'server' config is defined in devix.config.ts`)}});let n=new Map;return new Proxy({},{get(o,r){if(typeof r!="string")return;let s=t[r];if(!s)throw new Error(`[devix] ctx.$server.${r} \u2014 namespace "${r}" not configured in devix.config.ts`);let a=n.get(r);return a||(a=W(r,s,e),n.set(r,a)),a}})}function W(e,t,n){async function o(r,s,a,c){if(!S(s,t.allowedPaths))throw new g(403,"Path not allowed",new Response(null,{status:403}),{statusCode:403,message:"Path not allowed",code:"PATH_NOT_ALLOWED"});if(S(s,t.deniedPaths))throw new g(403,"Path denied",new Response(null,{status:403}),{statusCode:403,message:"Path denied",code:"PATH_DENIED"});let d=new URL(s,t.url),l=new Headers(c?.headers);if(t.prepare){let R={request:n,headers:l,url:d},u=await t.prepare(R);if(u instanceof Response)throw new g(u.status,u.statusText,u,await z(u))}let m;a!=null&&r!=="GET"&&r!=="HEAD"&&(a instanceof FormData||a instanceof Blob||a instanceof ArrayBuffer?m=a:(m=JSON.stringify(a),l.has("Content-Type")||l.set("Content-Type","application/json")));let i=await fetch(d,{method:r,headers:l,body:m,signal:c?.signal}),f=i.status===204||i.headers.get("Content-Length")==="0";if(!i.ok){let R=i.headers.get("Content-Type")??"",u;if(!f&&R.includes("application/json"))try{u=await i.json()}catch{}throw new g(i.status,i.statusText,i,u)}return f?null:(i.headers.get("Content-Type")??"").includes("application/json")?await i.json():await i.text()}return{get:((r,s)=>o("GET",r,void 0,s)),post:((r,s,a)=>o("POST",r,s,a)),put:((r,s,a)=>o("PUT",r,s,a)),patch:((r,s,a)=>o("PATCH",r,s,a)),delete:((r,s)=>o("DELETE",r,void 0,s))}}async function z(e){if((e.headers.get("Content-Type")??"").includes("application/json"))try{return await e.json()}catch{return}}var k=null,I=null;function Y(e){return typeof e=="object"&&e!==null&&j in e}async function Z(e){let t=e.headers.get("Content-Type")??"";return t.includes("application/json")?e.json():t.includes("multipart/form-data")||t.includes("application/x-www-form-urlencoded")?e.formData():e.text()}function A(e,t){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}function Q(e){return e instanceof Response?e:L(e)?A(E(e),e.statusCode):e==null?new Response(null,{status:204}):new Response(JSON.stringify(e),{headers:{"Content-Type":"application/json"}})}async function He(e,t,n,o){try{let{pathname:r}=new URL(e,"http://localhost"),s=Object.keys(n.routes).sort().join("\0")+"|"+Object.keys(n.middlewares).sort().join("\0");(!k||I!==s)&&(k=b(Object.keys(n.routes),Object.keys(n.middlewares),n.apiDir),I=s);let{routes:a,middlewares:c}=k,d=_(r,a);if(!d)return new Response("Not Found",{status:404});let{route:l,params:m}=d,i=O(t,o),f=new x(m,t,new URL(e,"http://localhost"),i),H=await M({request:t,ctx:f},async()=>{let R=D(l.key,c);for(let h of R){let y=await n.middlewares[h.key]();if(y.middleware){let P=await y.middleware(f);if(P instanceof Response)return P}}let u=await n.routes[l.key](),U=t.method.toUpperCase(),p=u[U];if(!p)return new Response("Method Not Allowed",{status:405});if(Y(p)){if(p.fn.length===0)return p.fn();let h=await Z(t);if(p.schema){let y=await p.schema["~standard"].validate(h);return y.issues?$(400,"Validation failed",{code:"VALIDATION_ERROR",data:{issues:y.issues}}):p.fn(y.value,f)}return p.fn(h,f)}return p(f)});return Q(H)}catch(r){return r instanceof w?A(E(r),r.statusCode):(console.error("[devix] api error:",r),A({statusCode:500,message:"Internal Server Error"},500))}}export{He as handleApiRequest};
2
2
  //# sourceMappingURL=api.js.map