@devlusoft/devix 0.5.3 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/build.js +15 -6
- package/dist/cli/build.js.map +2 -2
- package/dist/cli/dev-server.js +19 -10
- package/dist/cli/dev-server.js.map +2 -2
- package/dist/cli/generate.js +10 -1
- package/dist/cli/generate.js.map +2 -2
- package/dist/cli/index.js +12 -3
- package/dist/cli/index.js.map +2 -2
- package/dist/runtime/error-boundary.d.ts +5 -0
- package/dist/runtime/error-boundary.js +1 -1
- package/dist/runtime/error-boundary.js.map +3 -3
- package/dist/runtime/fetch.d.ts +1 -0
- package/dist/runtime/fetch.js +1 -1
- package/dist/runtime/fetch.js.map +3 -3
- package/dist/runtime/index.js +1 -1
- package/dist/runtime/index.js.map +3 -3
- package/dist/runtime/router-provider.d.ts +12 -3
- package/dist/runtime/router-provider.js +1 -1
- package/dist/runtime/router-provider.js.map +3 -3
- package/dist/runtime/server-app.js +1 -1
- package/dist/runtime/server-app.js.map +3 -3
- package/dist/runtime/server-client.js +1 -1
- package/dist/runtime/server-client.js.map +3 -3
- package/dist/server/api.js +1 -1
- package/dist/server/api.js.map +3 -3
- package/dist/server/render.js +1 -1
- package/dist/server/render.js.map +3 -3
- package/dist/server/server-bound.js +1 -1
- package/dist/server/server-bound.js.map +3 -3
- package/dist/utils/banner.js +1 -1
- package/dist/vite/codegen/entry-client.js +12 -3
- package/dist/vite/codegen/entry-client.js.map +2 -2
- package/dist/vite/index.js +14 -5
- package/dist/vite/index.js.map +2 -2
- package/package.json +6 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/runtime/router-provider.tsx", "../../src/runtime/head.tsx", "../../src/runtime/context.tsx", "../../src/runtime/error-boundary.tsx", "../../src/runtime/url.ts"],
|
|
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", "
|
|
4
|
+
"sourcesContent": ["import { ComponentType, ReactNode, useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { ErrorProps, LayoutProps, PageProps } from \"../server/types\";\nimport { Metadata, Viewport } from \"../types\";\n\nconst DEFAULT_VIEWPORT: Viewport = { width: 'device-width', initialScale: 1 }\nimport { HeadSlot } from \"./head\";\nimport { NavigateOptions, PageMetaContext, RouteDataContext, RouterContext } from \"./context\";\nimport { DevixErrorBoundary } from \"./error-boundary\";\nimport { resolveTo } from \"./url\";\nimport type { Redirect } from \"../utils/response\";\n\nexport interface ClientRouteMatcher {\n matchClientRoute: (pathname: string) => {\n load: () => Promise<any>\n loadLayouts: (() => Promise<any>)[]\n params: Record<string, string>\n } | null\n loadErrorPage: () => Promise<ComponentType<ErrorProps> | null>\n getDefaultErrorPage: () => ComponentType<ErrorProps> | null\n}\n\ninterface RouteState {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n guardData: unknown\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n pendingError?: ErrorProps\n ErrorPage?: ComponentType<ErrorProps>\n}\n\nexport function useRouter() {\n return useContext(RouterContext)\n}\n\nconst noopNavigate = () => Promise.resolve()\nconst noopRevalidate = () => Promise.resolve()\n\nexport function useNavigate() {\n const ctx = useContext(RouterContext)\n return ctx?.navigate ?? noopNavigate\n}\n\nexport function useRevalidate() {\n const ctx = useContext(RouterContext)\n return ctx?.revalidate ?? noopRevalidate\n}\n\nexport function useParams<T extends Record<string, string>>() {\n const ctx = useContext(RouteDataContext)\n if (!ctx) throw new Error(\"useParams must be used within a route or layout\")\n return ctx.params as T\n}\n\ntype LoaderReturnType<T> = T extends (...args: any[]) => Promise<infer R>\n ? [Exclude<R, Redirect | void | undefined>] extends [never] ? undefined : Exclude<R, Redirect | void | undefined>\n : T extends (...args: any[]) => infer R\n ? [Exclude<R, Redirect | void | undefined>] extends [never] ? undefined : Exclude<R, Redirect | void | undefined>\n : T\n\nexport function useLoaderData<T>() {\n const ctx = useContext(RouteDataContext)\n if (!ctx) throw new Error(\"useLoaderData must be used within a route or layout\")\n return ctx.loaderData as LoaderReturnType<T>\n}\n\ntype GuardDataReturn<TGuard> =\n TGuard extends (...args: any[]) => infer R\n ? Exclude<Awaited<R>, string | Redirect | null | undefined | { readonly statusCode: number; readonly message: string }>\n : unknown\n\n/**\n * Devuelve el `guardData` resuelto en el \u00FAltimo guard que retorn\u00F3 un objeto\n * (layout \u2192 page, en orden). Tipado al retorno del guard si pasas `typeof guard`.\n *\n * ```ts\n * export async function guard({ request }: LoaderContext) {\n * const session = await getSession(request)\n * if (!session) return '/login'\n * return session\n * }\n *\n * function Header() {\n * const session = useGuardData<typeof guard>()\n * return <span>{session.user.name}</span>\n * }\n * ```\n */\nexport function useGuardData<TGuard = unknown>(): GuardDataReturn<TGuard> {\n const ctx = useContext(RouterContext)\n if (!ctx) throw new Error(\"useGuardData must be used within a route or layout\")\n return ctx.guardData as GuardDataReturn<TGuard>\n}\n\ninterface PrefetchEntry {\n promise: Promise<{ pageMod: any; layoutMods: any[]; data: any } | null>\n controller: AbortController\n}\n\ninterface RouterProviderProps extends ClientRouteMatcher {\n initialData: unknown\n initialParams: Record<string, string>\n initialPage: ComponentType<PageProps>\n initialLayouts?: ComponentType<LayoutProps>[]\n initialLayoutsData?: unknown[]\n initialGuardData?: unknown\n initialMeta?: Metadata | null\n initialViewport?: Viewport\n initialError?: ErrorProps\n initialErrorPage?: ComponentType<ErrorProps>\n clientEntry: string\n}\n\nexport function RouterProvider({\n initialData,\n initialParams,\n initialPage,\n initialLayouts = [],\n initialLayoutsData = [],\n initialGuardData = null,\n initialMeta,\n initialViewport,\n initialError,\n initialErrorPage,\n clientEntry,\n matchClientRoute,\n loadErrorPage,\n getDefaultErrorPage,\n}: RouterProviderProps) {\n\n const [state, setState] = useState<RouteState>({\n pathname: window.location.pathname,\n params: initialParams,\n loaderData: initialData,\n layoutsData: initialLayoutsData,\n guardData: initialGuardData,\n Page: initialPage,\n layouts: initialLayouts,\n metadata: initialMeta ?? null,\n viewport: initialViewport,\n pendingError: initialError,\n ErrorPage: initialErrorPage,\n })\n\n const navigatingRef = useRef<AbortController | null>(null)\n const [isNavigating, setIsNavigating] = useState(false)\n\n const prefetchCacheRef = useRef<Map<string, PrefetchEntry>>(new Map())\n\n const prefetchRoute = useCallback((href: string) => {\n const resolved = resolveTo(href)\n if (resolved.kind === 'external') return\n\n const key = resolved.href\n if (prefetchCacheRef.current.has(key)) return\n const matched = matchClientRoute(resolved.pathname)\n if (!matched) return\n\n const controller = new AbortController()\n const promise = Promise.all([\n Promise.all([matched.load(), ...matched.loadLayouts.map(l => l())]),\n fetch(`/_data${key}`, { headers: { Accept: 'application/json' }, signal: controller.signal })\n ]).then(async ([[pageMod, ...layoutMods], dataRes]) => {\n if (!dataRes.ok || !pageMod.default) return null\n const data = await dataRes.json()\n return { pageMod, layoutMods, data }\n }).catch(() => null)\n\n const expireTimer = setTimeout(() => {\n controller.abort()\n prefetchCacheRef.current.delete(key)\n }, 3000)\n promise.finally(() => clearTimeout(expireTimer))\n\n prefetchCacheRef.current.set(key, { promise, controller })\n }, [])\n\n const loadRoute = useCallback(async (to: string, controller: AbortController) => {\n const pathname = to.split('?')[0].split('#')[0]\n const matched = matchClientRoute(pathname)\n if (!matched) {\n const ErrorPage = await loadErrorPage() ?? getDefaultErrorPage()\n setState(prev => ({\n ...prev,\n pathname: pathname,\n pendingError: { statusCode: 404, message: 'Not found' },\n ErrorPage: ErrorPage ?? undefined,\n }))\n return\n }\n\n const cached = prefetchCacheRef.current.get(to)\n if (cached) prefetchCacheRef.current.delete(to)\n const prefetched = cached ? await cached.promise : null\n\n if (controller.signal.aborted) return\n\n let pageMod: any, layoutMods: any[], data: any\n\n if (prefetched) {\n ;({ pageMod, layoutMods, data } = prefetched)\n } else {\n const [[pm, ...lm], dataRes] = await Promise.all([\n Promise.all([\n matched.load(),\n ...matched.loadLayouts.map(l => l()),\n ]),\n fetch(`/_data${to}`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n ])\n\n if (controller.signal.aborted) return\n if (!pm.default) return\n\n if (!dataRes.ok) {\n const ct = dataRes.headers.get('Content-Type') ?? ''\n let errorBody: { statusCode?: number; message?: string; code?: string; data?: unknown } | null = null\n try {\n if (ct.includes('application/json')) errorBody = await dataRes.json()\n else if (ct.includes('text/plain')) errorBody = { message: await dataRes.text() }\n } catch { /* ignorar errores de parsing */ }\n\n const headers: Record<string, string> = {}\n dataRes.headers.forEach((value, key) => { headers[key] = value })\n\n const ErrorPage = await loadErrorPage() ?? getDefaultErrorPage()\n setState(prev => ({\n ...prev,\n pathname,\n pendingError: {\n statusCode: errorBody?.statusCode ?? dataRes.status,\n message: errorBody?.message ?? 'Server error',\n code: errorBody?.code,\n data: errorBody?.data,\n headers,\n },\n ErrorPage: ErrorPage ?? undefined,\n }))\n return\n }\n\n pageMod = pm\n layoutMods = lm\n data = await dataRes.json()\n }\n\n if (data.redirect) {\n if (data.redirectReplace) {\n window.history.replaceState(null, '', data.redirect)\n } else {\n window.history.pushState(null, '', data.redirect)\n }\n await loadRoute(data.redirect, controller)\n return\n }\n\n setState({\n pathname,\n params: data.params ?? {},\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n guardData: data.guardData ?? null,\n Page: pageMod.default,\n layouts: layoutMods.map(m => m.default),\n metadata: data.metadata ?? null,\n viewport: data.viewport ?? DEFAULT_VIEWPORT,\n })\n\n const hash = to.includes('#') ? to.split('#')[1] : null\n const scrollBehavior = getComputedStyle(document.documentElement).scrollBehavior as ScrollBehavior\n if (hash) {\n requestAnimationFrame(() => {\n document.getElementById(hash)?.scrollIntoView({ behavior: scrollBehavior })\n })\n } else {\n window.scrollTo({ top: 0, behavior: scrollBehavior })\n }\n }, [])\n\n const navigate = useCallback(async (to: string, options?: NavigateOptions) => {\n const resolved = resolveTo(to)\n if (resolved.kind === 'external') {\n window.location.href = resolved.url.href\n return\n }\n const href = resolved.href\n\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n setIsNavigating(true)\n const run = async () => {\n window.history[options?.replace ? 'replaceState' : 'pushState'](null, '', href)\n await loadRoute(href, controller)\n }\n try {\n if (options?.viewTransition && 'startViewTransition' in document) {\n await (document as any).startViewTransition(run).finished\n } else {\n await run()\n }\n } finally {\n if (!controller.signal.aborted) setIsNavigating(false)\n }\n }, [loadRoute])\n\n const revalidatingRef = useRef<AbortController | null>(null)\n\n const revalidate = useCallback(async () => {\n revalidatingRef.current?.abort()\n const controller = new AbortController()\n revalidatingRef.current = controller\n\n const to = window.location.pathname + window.location.search\n let dataRes: Response\n try {\n dataRes = await fetch(`/_data${to}`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n } catch (err) {\n if ((err as Error).name === 'AbortError') return\n throw err\n }\n\n if (controller.signal.aborted) return\n if (!dataRes.ok) return\n\n const data = await dataRes.json()\n if (controller.signal.aborted) return\n\n if (data.redirect) {\n await navigate(data.redirect, { replace: data.redirectReplace })\n return\n }\n setState(prev => ({\n ...prev,\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n guardData: data.guardData ?? null,\n params: data.params ?? prev.params,\n metadata: data.metadata ?? prev.metadata,\n viewport: data.viewport ?? prev.viewport,\n }))\n }, [navigate])\n\n useEffect(() => {\n const handlePop = () => {\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n const to = window.location.pathname + window.location.search\n loadRoute(to, controller).catch(err => {\n if (err.name !== 'AbortError') console.error('[router] popstate error:', err)\n })\n }\n window.addEventListener(\"popstate\", handlePop)\n return () => window.removeEventListener(\"popstate\", handlePop)\n }, [loadRoute])\n\n let content: ReactNode\n\n if (state.pendingError) {\n content = state.ErrorPage\n ? <state.ErrorPage {...state.pendingError} />\n : <h1>{state.pendingError.statusCode}</h1>\n } else {\n let tree: ReactNode = (\n <RouteDataContext value={{ loaderData: state.loaderData, params: state.params }}>\n <state.Page data={state.loaderData} params={state.params} url={state.pathname} />\n </RouteDataContext>\n )\n\n for (let i = state.layouts.length - 1; i >= 0; i--) {\n const Layout = state.layouts[i]\n const layoutData = state.layoutsData[i]\n tree = (\n <RouteDataContext value={{ loaderData: layoutData, params: state.params }}>\n <Layout data={layoutData} params={state.params}>{tree}</Layout>\n </RouteDataContext>\n )\n }\n\n content = (\n <DevixErrorBoundary key={state.pathname} ErrorPage={state.ErrorPage}>\n {tree}\n </DevixErrorBoundary>\n )\n }\n\n return (\n <PageMetaContext value={{\n metadata: state.metadata,\n viewport: state.viewport,\n clientEntry,\n }}>\n <HeadSlot metadata={state.metadata} viewport={state.viewport} />\n <RouterContext value={{ ...state, isNavigating, navigate, revalidate, prefetchRoute }}>\n {content}\n </RouterContext>\n </PageMetaContext>\n )\n}", "import { Metadata, MetadataIcon, Viewport } from \"../types\";\nimport { ReactNode } from \"react\";\n\ntype MetaTag =\n | { tag: 'title'; children: string }\n | { tag: 'meta'; name?: string; property?: string; content: string }\n | { tag: 'link'; rel: string; href: string; hrefLang?: string; type?: string; sizes?: string }\n\nfunction collectTags(metadata: Metadata, viewport?: Viewport): MetaTag[] {\n const tags: MetaTag[] = []\n\n if (metadata.title)\n tags.push({ tag: 'title', children: metadata.title })\n if (metadata.description)\n tags.push({ tag: 'meta', name: 'description', content: metadata.description })\n if (metadata.keywords?.length)\n tags.push({ tag: 'meta', name: 'keywords', content: metadata.keywords.join(', ') })\n\n const ogTitle = metadata.og?.title ?? metadata.title\n if (ogTitle) tags.push({ tag: 'meta', property: 'og:title', content: ogTitle })\n const ogDesc = metadata.og?.description ?? metadata.description\n if (ogDesc) tags.push({ tag: 'meta', property: 'og:description', content: ogDesc })\n if (metadata.og?.image) tags.push({ tag: 'meta', property: 'og:image', content: metadata.og.image })\n if (metadata.og?.type) tags.push({ tag: 'meta', property: 'og:type', content: metadata.og.type })\n if (metadata.og?.url) tags.push({ tag: 'meta', property: 'og:url', content: metadata.og.url })\n\n const twTitle = metadata.twitter?.title ?? metadata.title\n if (twTitle) tags.push({ tag: 'meta', name: 'twitter:title', content: twTitle })\n const twDesc = metadata.twitter?.description ?? metadata.description\n if (twDesc) tags.push({ tag: 'meta', name: 'twitter:description', content: twDesc })\n if (metadata.twitter?.card) tags.push({\n tag: 'meta', name: 'twitter:card', content:\n metadata.twitter.card\n })\n if (metadata.twitter?.image) tags.push({\n tag: 'meta', name: 'twitter:image', content:\n metadata.twitter.image\n })\n if (metadata.twitter?.creator) tags.push({\n tag: 'meta', name: 'twitter:creator', content:\n metadata.twitter.creator\n })\n\n if (metadata.canonical) tags.push({ tag: 'link', rel: 'canonical', href: metadata.canonical })\n if (metadata.robots) tags.push({ tag: 'meta', name: 'robots', content: metadata.robots })\n if (metadata.alternates) {\n for (const [lang, href] of Object.entries(metadata.alternates))\n tags.push({ tag: 'link', rel: 'alternate', href, hrefLang: lang })\n }\n\n if (metadata.icons) {\n const raw = Array.isArray(metadata.icons) ? metadata.icons : [metadata.icons]\n for (const icon of raw) {\n const resolved: MetadataIcon = typeof icon === 'string' ? { href: icon } : icon\n tags.push({\n tag: 'link',\n rel: resolved.rel ?? 'icon',\n href: resolved.href,\n ...(resolved.type && { type: resolved.type }),\n ...(resolved.sizes && { sizes: resolved.sizes }),\n })\n }\n }\n\n if (viewport) {\n const parts: string[] = []\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`)\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`)\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`)\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' :\n 'no'}`)\n if (parts.length) tags.push({ tag: 'meta', name: 'viewport', content: parts.join(', ') })\n if (viewport.themeColor) tags.push({\n tag: 'meta', name: 'theme-color', content: viewport.themeColor\n })\n }\n\n return tags\n}\n\nexport function HeadSlot({ metadata, viewport }: { metadata: Metadata | null, viewport?: Viewport }) {\n if (typeof window === 'undefined' || !metadata) return null\n return <>{buildHeadNodes(metadata, viewport)}</>\n}\n\nexport function buildHeadNodes(metadata: Metadata, viewport?: Viewport): ReactNode {\n const tags = collectTags(metadata, viewport)\n\n return <>\n {tags.map((t, i) => {\n if (t.tag === 'title') return <title key={i}>{t.children}</title>\n if (t.tag === 'link') return <link key={i} rel={t.rel} href={t.href} hrefLang={t.hrefLang} type={t.type} sizes={t.sizes} />\n return <meta key={i} name={t.name} property={t.property} content={t.content} />\n })}\n </>\n}", "import {createContext, Context, ComponentType} from \"react\";\nimport {Metadata, Viewport} from \"../types\";\nimport {LayoutProps, PageProps} from \"../server/types\";\n\nexport interface NavigateOptions {\n replace?: boolean\n viewTransition?: boolean\n}\n\nexport interface RouterContextValue {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n guardData: unknown\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n navigate: (to: string, options?: NavigateOptions) => Promise<void>\n revalidate: () => Promise<void>\n prefetchRoute: (href: string) => void\n isNavigating: boolean\n}\n\nexport interface PageMetaContextValue {\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry?: string\n}\n\nexport interface RouteDataContextValue {\n loaderData: unknown\n params: Record<string, string>\n}\n\nconst g = globalThis as any\n\ng.__devix_RouterContext__ ??= createContext<RouterContextValue | null>(null)\nexport const RouterContext: Context<RouterContextValue | null> = g.__devix_RouterContext__\n\ng.__devix_PageMetaContext__ ??= createContext<PageMetaContextValue | null>(null)\ng.__devix_RouteDataContext__ ??= createContext<RouteDataContextValue | null>(null)\n\nexport const PageMetaContext: Context<PageMetaContextValue | null> = g.__devix_PageMetaContext__\nexport const RouteDataContext: Context<RouteDataContextValue | null> = g.__devix_RouteDataContext__\n\n", "import {Component, ComponentType, ReactNode} from \"react\";\nimport {ErrorProps} from \"../server/types\";\n\ninterface Props {\n ErrorPage?: ComponentType<ErrorProps>\n children: ReactNode\n}\n\ninterface State {\n error: ErrorProps | null\n}\n\nexport class DevixErrorBoundary extends Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(err: unknown): State {\n if (err instanceof DevixError) {\n return {\n error: {statusCode: err.statusCode, message: err.message}\n }\n }\n return {\n error: {statusCode: 500, message: err instanceof Error ? err.message : 'Unknown error'}\n }\n }\n\n render() {\n if (this.state.error && this.props.ErrorPage) {\n return <this.props.ErrorPage {...this.state.error} />\n }\n if (this.state.error) {\n return <h1>{this.state.error.statusCode}</h1>\n }\n return this.props.children\n }\n}\n\nexport interface DevixErrorOptions {\n code?: string\n data?: unknown\n}\n\nconst DEVIX_ERROR_BRAND = Symbol.for('@devlusoft/devix.DevixError')\n\nexport class DevixError extends Error {\n /**\n * Custom `instanceof` que matchea por brand cross-bundle. Ver nota en\n * `FetchError` para el detalle del dual package hazard.\n */\n static [Symbol.hasInstance](value: unknown): boolean {\n return value !== null && typeof value === 'object' && (value as any)[DEVIX_ERROR_BRAND] === true\n }\n\n statusCode: number\n code?: string\n data?: unknown\n constructor(statusCode: number, message: string, options?: DevixErrorOptions) {\n super(message)\n this.name = 'DevixError'\n this.statusCode = statusCode\n this.code = options?.code\n this.data = options?.data\n ;(this as any)[DEVIX_ERROR_BRAND] = true\n }\n}\n", "export type ResolvedTo =\n | { kind: 'internal'; pathname: string; href: string }\n | { kind: 'external'; url: URL }\n\nexport function resolveTo(to: string): ResolvedTo {\n const base = new URL(window.location.href)\n if (!base.pathname.endsWith('/')) base.pathname += '/'\n\n const url = new URL(to, base)\n\n if (url.origin !== window.location.origin) {\n return { kind: 'external', url }\n }\n\n const pathname = url.pathname.length > 1\n ? url.pathname.replace(/\\/$/, '')\n : url.pathname\n\n return {\n kind: 'internal',\n pathname,\n href: pathname + url.search + url.hash,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useCallback", "useContext", "useEffect", "useRef", "useState", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "raw", "icon", "resolved", "parts", "HeadSlot", "buildHeadNodes", "t", "i", "createContext", "g", "RouterContext", "PageMetaContext", "RouteDataContext", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "DEVIX_ERROR_BRAND", "value", "statusCode", "message", "options", "resolveTo", "to", "base", "url", "pathname", "jsx", "jsxs", "DEFAULT_VIEWPORT", "useRouter", "useContext", "RouterContext", "noopNavigate", "noopRevalidate", "useNavigate", "useRevalidate", "useParams", "ctx", "RouteDataContext", "useLoaderData", "useGuardData", "RouterProvider", "initialData", "initialParams", "initialPage", "initialLayouts", "initialLayoutsData", "initialGuardData", "initialMeta", "initialViewport", "initialError", "initialErrorPage", "clientEntry", "matchClientRoute", "loadErrorPage", "getDefaultErrorPage", "state", "setState", "useState", "navigatingRef", "useRef", "isNavigating", "setIsNavigating", "prefetchCacheRef", "prefetchRoute", "useCallback", "href", "resolved", "resolveTo", "key", "matched", "controller", "promise", "l", "pageMod", "layoutMods", "dataRes", "data", "expireTimer", "loadRoute", "to", "pathname", "ErrorPage", "prev", "cached", "prefetched", "pm", "lm", "ct", "errorBody", "headers", "value", "m", "hash", "scrollBehavior", "navigate", "options", "run", "revalidatingRef", "revalidate", "err", "useEffect", "handlePop", "content", "tree", "i", "Layout", "layoutData", "DevixErrorBoundary", "PageMetaContext", "HeadSlot"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
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
|
|
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 R,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(R,{children:V(t,e)})}function V(t,e){let o=M(t,e);return g(R,{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 b}from"react";import{jsx as k}from"react/jsx-runtime";var h=class extends b{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?k(this.props.ErrorPage,{...this.state.error}):this.state.error?k("h1",{children:this.state.error.statusCode}):this.props.children}},v=Symbol.for("@devlusoft/devix.DevixError"),y=class extends Error{static[Symbol.hasInstance](e){return e!==null&&typeof e=="object"&&e[v]===!0}statusCode;code;data;constructor(e,o,r){super(o),this.name="DevixError",this.statusCode=e,this.code=r?.code,this.data=r?.data,this[v]=!0}};import{jsx as p,jsxs as N}from"react/jsx-runtime";var S=(t,e)=>Promise.resolve(),E=()=>Promise.resolve(),T=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 D=l[f],C=r[f];d=p(x,{value:{loaderData:C,params:e},children:p(D,{data:C,params:e,children:d})})}return N(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:E,prefetchRoute:T},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 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"]
|
|
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\nconst DEVIX_ERROR_BRAND = Symbol.for('@devlusoft/devix.DevixError')\n\nexport class DevixError extends Error {\n /**\n * Custom `instanceof` que matchea por brand cross-bundle. Ver nota en\n * `FetchError` para el detalle del dual package hazard.\n */\n static [Symbol.hasInstance](value: unknown): boolean {\n return value !== null && typeof value === 'object' && (value as any)[DEVIX_ERROR_BRAND] === true\n }\n\n statusCode: number\n code?: string\n data?: unknown\n constructor(statusCode: number, message: string, options?: DevixErrorOptions) {\n super(message)\n this.name = 'DevixError'\n this.statusCode = statusCode\n this.code = options?.code\n this.data = options?.data\n ;(this as any)[DEVIX_ERROR_BRAND] = true\n }\n}\n", "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", "DEVIX_ERROR_BRAND", "value", "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
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
1
|
+
function T(t){if(t&&typeof t=="object"&&"message"in t){let n=t.message;if(typeof n=="string"&&n.length>0)return n}return null}var l=Symbol.for("@devlusoft/devix.FetchError"),p=class extends Error{constructor(e,s,c,r){super(T(r)??`HTTP ${e}: ${s}`);this.status=e;this.statusText=s;this.response=c;this.body=r;this.name="FetchError",this[l]=!0}static[Symbol.hasInstance](e){return e!==null&&typeof e=="object"&&e[l]===!0}get code(){if(this.body&&typeof this.body=="object"&&"code"in this.body){let e=this.body.code;return typeof e=="string"?e:void 0}}};var g="/_devix/server";async function i(t,n,e,s,c){let r=new Headers(c?.headers),u;s!=null&&(s instanceof FormData||s instanceof Blob||s instanceof ArrayBuffer?u=s:(u=JSON.stringify(s),r.has("Content-Type")||r.set("Content-Type","application/json")));let f=`${g}/${t}${e}`,o=await fetch(f,{method:n,headers:r,body:u,signal:c?.signal}),a=o.status===204||o.headers.get("Content-Length")==="0";if(!o.ok){let h=o.headers.get("Content-Type")??"",d;if(!a&&h.includes("application/json"))try{d=await o.json()}catch{}throw new p(o.status,o.statusText,o,d)}return a?null:(o.headers.get("Content-Type")??"").includes("application/json")?await o.json():await o.text()}function y(t){return{get:(n,e)=>i(t,"GET",n,void 0,e),post:(n,e,s)=>i(t,"POST",n,e,s),put:(n,e,s)=>i(t,"PUT",n,e,s),patch:(n,e,s)=>i(t,"PATCH",n,e,s),delete:(n,e)=>i(t,"DELETE",n,void 0,e)}}var E=new Proxy({},{get(t,n){if(typeof n=="string")return t[n]||(t[n]=y(n)),t[n]}});export{E as $server};
|
|
2
2
|
//# sourceMappingURL=server-client.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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\nexport interface ServerFetchOptions {\n headers?: HeadersInit\n signal?: AbortSignal\n}\n\nconst PROXY_PREFIX = '/_devix/server'\n\nasync function proxyFetch<TResponse>(\n namespace: string,\n method: HttpMethod,\n path: string,\n body: unknown,\n options?: ServerFetchOptions,\n): Promise<TResponse> {\n const headers = new Headers(options?.headers)\n let sendBody: BodyInit | undefined\n if (body !== undefined && body !== null) {\n if (body instanceof FormData || body instanceof Blob || body instanceof ArrayBuffer) {\n sendBody = body\n } else {\n sendBody = JSON.stringify(body)\n if (!headers.has('Content-Type')) headers.set('Content-Type', 'application/json')\n }\n }\n\n const url = `${PROXY_PREFIX}/${namespace}${path}`\n const response = await fetch(url, {method, headers, body: sendBody, signal: options?.signal})\n\n const isEmptyBody = response.status === 204 || response.headers.get('Content-Length') === '0'\n\n if (!response.ok) {\n const ct = response.headers.get('Content-Type') ?? ''\n let errorBody: unknown\n if (!isEmptyBody && ct.includes('application/json')) {\n try { errorBody = await response.json() } catch { /* body vac\u00EDo o inv\u00E1lido */ }\n }\n throw new FetchError(response.status, response.statusText, response, errorBody)\n }\n\n if (isEmptyBody) return null as TResponse\n\n const ct = response.headers.get('Content-Type') ?? ''\n if (ct.includes('application/json')) return await response.json() as TResponse\n return await response.text() as unknown as TResponse\n}\n\n/**\n * Cliente para llamar a un backend remoto configurado en `devix.config.ts`.\n *\n * El tipo de respuesta se declara en cada call site con un generic:\n *\n * ```ts\n * const me = await $server.api.get<User>('/v1/me')\n * const post = await $server.api.post<Post>('/v1/posts', { title: 'Hola' })\n * ```\n *\n * Si no pasas el generic, el retorno es `unknown`. devix no puede inferir tipos del\n * backend remoto (vive fuera del repo) \u2014 el cast en el call site ES el contrato.\n */\nexport interface BackendClient {\n get<TResponse = unknown>(path: string, options?: ServerFetchOptions): Promise<TResponse>\n post<TResponse = unknown>(path: string, body?: unknown, options?: ServerFetchOptions): Promise<TResponse>\n put<TResponse = unknown>(path: string, body?: unknown, options?: ServerFetchOptions): Promise<TResponse>\n patch<TResponse = unknown>(path: string, body?: unknown, options?: ServerFetchOptions): Promise<TResponse>\n delete<TResponse = unknown>(path: string, options?: ServerFetchOptions): Promise<TResponse>\n}\n\nfunction makeBackendClient(namespace: string): BackendClient {\n return {\n get: (path, options) => proxyFetch(namespace, 'GET', path, undefined, options),\n post: (path, body, options) => proxyFetch(namespace, 'POST', path, body, options),\n put: (path, body, options) => proxyFetch(namespace, 'PUT', path, body, options),\n patch: (path, body, options) => proxyFetch(namespace, 'PATCH', path, body, options),\n delete: (path, options) => proxyFetch(namespace, 'DELETE', path, undefined, options),\n }\n}\n\n/**\n * Cliente para llamar a backends remotos configurados en `devix.config.ts`.\n *\n * En cliente: las requests pasan por el proxy interno `/_devix/server/<namespace>/...`\n * donde devix aplica `prepare` (auth pass-through, tracing, etc.) y reenv\u00EDa al backend.\n *\n * En server (loaders/handlers): NO uses este import \u2014 usa `ctx.$server` que recibe\n * el request del usuario para que `prepare` pueda leer cookies.\n *\n * ```ts\n * const me = await $server.api.get<User>('/v1/me')\n * const post = await $server.api.post<Post>('/v1/posts', { title: 'Hola' })\n * ```\n */\nexport const $server: Record<string, BackendClient> = new Proxy({} as Record<string, BackendClient>, {\n get(target, namespace: string) {\n if (typeof namespace !== 'string') return undefined\n if (!target[namespace]) target[namespace] = makeBackendClient(namespace)\n return target[namespace]\n },\n})\n"],
|
|
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,
|
|
6
|
-
"names": ["extractMessage", "body", "m", "FetchError", "status", "statusText", "response", "c", "PROXY_PREFIX", "proxyFetch", "namespace", "method", "path", "body", "options", "headers", "sendBody", "url", "response", "isEmptyBody", "ct", "errorBody", "FetchError", "makeBackendClient", "$server", "target"]
|
|
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\nconst FETCH_ERROR_BRAND = Symbol.for('@devlusoft/devix.FetchError')\n\nexport class FetchError<E = unknown> extends Error {\n static [Symbol.hasInstance](value: unknown): boolean {\n return value !== null && typeof value === 'object' && (value as any)[FETCH_ERROR_BRAND] === true\n }\n\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly response: Response,\n public readonly body?: E,\n ) {\n super(extractMessage(body) ?? `HTTP ${status}: ${statusText}`)\n this.name = 'FetchError'\n ;(this as any)[FETCH_ERROR_BRAND] = true\n }\n\n get code(): string | undefined {\n if (this.body && typeof this.body === 'object' && 'code' in this.body) {\n const c = (this.body as {code: unknown}).code\n return typeof c === 'string' ? c : undefined\n }\n return undefined\n }\n}\n", "import {FetchError, type HttpMethod} from './fetch'\n\nexport interface ServerFetchOptions {\n headers?: HeadersInit\n signal?: AbortSignal\n}\n\nconst PROXY_PREFIX = '/_devix/server'\n\nasync function proxyFetch<TResponse>(\n namespace: string,\n method: HttpMethod,\n path: string,\n body: unknown,\n options?: ServerFetchOptions,\n): Promise<TResponse> {\n const headers = new Headers(options?.headers)\n let sendBody: BodyInit | undefined\n if (body !== undefined && body !== null) {\n if (body instanceof FormData || body instanceof Blob || body instanceof ArrayBuffer) {\n sendBody = body\n } else {\n sendBody = JSON.stringify(body)\n if (!headers.has('Content-Type')) headers.set('Content-Type', 'application/json')\n }\n }\n\n const url = `${PROXY_PREFIX}/${namespace}${path}`\n const response = await fetch(url, {method, headers, body: sendBody, signal: options?.signal})\n\n const isEmptyBody = response.status === 204 || response.headers.get('Content-Length') === '0'\n\n if (!response.ok) {\n const ct = response.headers.get('Content-Type') ?? ''\n let errorBody: unknown\n if (!isEmptyBody && ct.includes('application/json')) {\n try { errorBody = await response.json() } catch { /* body vac\u00EDo o inv\u00E1lido */ }\n }\n throw new FetchError(response.status, response.statusText, response, errorBody)\n }\n\n if (isEmptyBody) return null as TResponse\n\n const ct = response.headers.get('Content-Type') ?? ''\n if (ct.includes('application/json')) return await response.json() as TResponse\n return await response.text() as unknown as TResponse\n}\n\n/**\n * Cliente para llamar a un backend remoto configurado en `devix.config.ts`.\n *\n * El tipo de respuesta se declara en cada call site con un generic:\n *\n * ```ts\n * const me = await $server.api.get<User>('/v1/me')\n * const post = await $server.api.post<Post>('/v1/posts', { title: 'Hola' })\n * ```\n *\n * Si no pasas el generic, el retorno es `unknown`. devix no puede inferir tipos del\n * backend remoto (vive fuera del repo) \u2014 el cast en el call site ES el contrato.\n */\nexport interface BackendClient {\n get<TResponse = unknown>(path: string, options?: ServerFetchOptions): Promise<TResponse>\n post<TResponse = unknown>(path: string, body?: unknown, options?: ServerFetchOptions): Promise<TResponse>\n put<TResponse = unknown>(path: string, body?: unknown, options?: ServerFetchOptions): Promise<TResponse>\n patch<TResponse = unknown>(path: string, body?: unknown, options?: ServerFetchOptions): Promise<TResponse>\n delete<TResponse = unknown>(path: string, options?: ServerFetchOptions): Promise<TResponse>\n}\n\nfunction makeBackendClient(namespace: string): BackendClient {\n return {\n get: (path, options) => proxyFetch(namespace, 'GET', path, undefined, options),\n post: (path, body, options) => proxyFetch(namespace, 'POST', path, body, options),\n put: (path, body, options) => proxyFetch(namespace, 'PUT', path, body, options),\n patch: (path, body, options) => proxyFetch(namespace, 'PATCH', path, body, options),\n delete: (path, options) => proxyFetch(namespace, 'DELETE', path, undefined, options),\n }\n}\n\n/**\n * Cliente para llamar a backends remotos configurados en `devix.config.ts`.\n *\n * En cliente: las requests pasan por el proxy interno `/_devix/server/<namespace>/...`\n * donde devix aplica `prepare` (auth pass-through, tracing, etc.) y reenv\u00EDa al backend.\n *\n * En server (loaders/handlers): NO uses este import \u2014 usa `ctx.$server` que recibe\n * el request del usuario para que `prepare` pueda leer cookies.\n *\n * ```ts\n * const me = await $server.api.get<User>('/v1/me')\n * const post = await $server.api.post<Post>('/v1/posts', { title: 'Hola' })\n * ```\n */\nexport const $server: Record<string, BackendClient> = new Proxy({} as Record<string, BackendClient>, {\n get(target, namespace: string) {\n if (typeof namespace !== 'string') return undefined\n if (!target[namespace]) target[namespace] = makeBackendClient(namespace)\n return target[namespace]\n },\n})\n"],
|
|
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,CAEA,IAAMC,EAAoB,OAAO,IAAI,6BAA6B,EAErDC,EAAN,cAAsC,KAAM,CAK/C,YACoBC,EACAC,EACAC,EACAN,EAClB,CACE,MAAMD,EAAeC,CAAI,GAAK,QAAQI,CAAM,KAAKC,CAAU,EAAE,EAL7C,YAAAD,EACA,gBAAAC,EACA,cAAAC,EACA,UAAAN,EAGhB,KAAK,KAAO,aACV,KAAaE,CAAiB,EAAI,EACxC,CAbA,OAAQ,OAAO,WAAW,EAAEK,EAAyB,CACjD,OAAOA,IAAU,MAAQ,OAAOA,GAAU,UAAaA,EAAcL,CAAiB,IAAM,EAChG,CAaA,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,EC5BA,IAAMC,EAAe,iBAErB,eAAeC,EACXC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,IAAMC,EAAU,IAAI,QAAQD,GAAS,OAAO,EACxCE,EACsBH,GAAS,OAC3BA,aAAgB,UAAYA,aAAgB,MAAQA,aAAgB,YACpEG,EAAWH,GAEXG,EAAW,KAAK,UAAUH,CAAI,EACzBE,EAAQ,IAAI,cAAc,GAAGA,EAAQ,IAAI,eAAgB,kBAAkB,IAIxF,IAAME,EAAM,GAAGT,CAAY,IAAIE,CAAS,GAAGE,CAAI,GACzCM,EAAW,MAAM,MAAMD,EAAK,CAAC,OAAAN,EAAQ,QAAAI,EAAS,KAAMC,EAAU,OAAQF,GAAS,MAAM,CAAC,EAEtFK,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,EAAU,MAAMA,EAAS,KAAK,EACzD,MAAMA,EAAS,KAAK,CAC/B,CAuBA,SAASK,EAAkBb,EAAkC,CACzD,MAAO,CACH,IAAK,CAACE,EAAME,IAAYL,EAAWC,EAAW,MAAOE,EAAM,OAAWE,CAAO,EAC7E,KAAM,CAACF,EAAMC,EAAMC,IAAYL,EAAWC,EAAW,OAAQE,EAAMC,EAAMC,CAAO,EAChF,IAAK,CAACF,EAAMC,EAAMC,IAAYL,EAAWC,EAAW,MAAOE,EAAMC,EAAMC,CAAO,EAC9E,MAAO,CAACF,EAAMC,EAAMC,IAAYL,EAAWC,EAAW,QAASE,EAAMC,EAAMC,CAAO,EAClF,OAAQ,CAACF,EAAME,IAAYL,EAAWC,EAAW,SAAUE,EAAM,OAAWE,CAAO,CACvF,CACJ,CAgBO,IAAMU,EAAyC,IAAI,MAAM,CAAC,EAAoC,CACjG,IAAIC,EAAQf,EAAmB,CAC3B,GAAI,OAAOA,GAAc,SACzB,OAAKe,EAAOf,CAAS,IAAGe,EAAOf,CAAS,EAAIa,EAAkBb,CAAS,GAChEe,EAAOf,CAAS,CAC3B,CACJ,CAAC",
|
|
6
|
+
"names": ["extractMessage", "body", "m", "FETCH_ERROR_BRAND", "FetchError", "status", "statusText", "response", "value", "c", "PROXY_PREFIX", "proxyFetch", "namespace", "method", "path", "body", "options", "headers", "sendBody", "url", "response", "isEmptyBody", "ct", "errorBody", "FetchError", "makeBackendClient", "$server", "target"]
|
|
7
7
|
}
|
package/dist/server/api.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function B(e){return e.replace(/\.(tsx|ts|jsx|js)$/,"").replace(/\(.*?\)\//g,"").replace(/^index$|\/index$/,"").replace(/\[([^\]]+)]/g,":$1")||"/"}function
|
|
1
|
+
function B(e){return e.replace(/\.(tsx|ts|jsx|js)$/,"").replace(/\(.*?\)\//g,"").replace(/^index$|\/index$/,"").replace(/\[([^\]]+)]/g,":$1")||"/"}function V(e,t){let n=e.slice(t.length+1).replace(/\\/g,"/"),o=B(n);return o==="/"?"/api":`/api/${o}`.replace("/api//","/api/")}function P(e){return e.slice(0,e.lastIndexOf("/"))}function v(e,t,n){let o=[],r=[];for(let s of t)r.push({dir:P(s),key:s});for(let s of e){let a=V(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=P(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 ae}from"react";import{jsx as ce}from"react/jsx-runtime";var j=Symbol.for("@devlusoft/devix.DevixError"),w=class extends Error{static[Symbol.hasInstance](t){return t!==null&&typeof t=="object"&&t[j]===!0}statusCode;code;data;constructor(t,n,o){super(n),this.name="DevixError",this.statusCode=t,this.code=o?.code,this.data=o?.data,this[j]=!0}};var N="__devix_handler__";import{AsyncLocalStorage as G}from"node:async_hooks";var T=Symbol.for("@devlusoft/devix.handlerStore"),E=globalThis;E[T]||(E[T]=new G);var J=E[T];function M(e,t){return J.run(e,t)}var O=Symbol.for("devix.loaderError");function $(e,t,n){return{[O]:!0,statusCode:e,message:t,code:n?.code,data:n?.data}}function L(e){return typeof e=="object"&&e!==null&&O in e}function C(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 K(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 I=Symbol.for("@devlusoft/devix.FetchError"),y=class extends Error{constructor(n,o,r,s){super(K(s)??`HTTP ${n}: ${o}`);this.status=n;this.statusText=o;this.response=r;this.body=s;this.name="FetchError",this[I]=!0}static[Symbol.hasInstance](n){return n!==null&&typeof n=="object"&&n[I]===!0}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 W(e,t){return z(t).test(e)}function S(e,t){if(!t||t.length===0)return!1;for(let n of t)if(W(e,n))return!0;return!1}function z(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 F(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=X(r,s,e),n.set(r,a)),a}})}function X(e,t,n){async function o(r,s,a,c){if(!S(s,t.allowedPaths))throw new y(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 y(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 m={request:n,headers:l,url:d},u=await t.prepare(m);if(u instanceof Response)throw new y(u.status,u.statusText,u,await Y(u))}let R;a!=null&&r!=="GET"&&r!=="HEAD"&&(a instanceof FormData||a instanceof Blob||a instanceof ArrayBuffer?R=a:(R=JSON.stringify(a),l.has("Content-Type")||l.set("Content-Type","application/json")));let i=await fetch(d,{method:r,headers:l,body:R,signal:c?.signal}),f=i.status===204||i.headers.get("Content-Length")==="0";if(!i.ok){let m=i.headers.get("Content-Type")??"",u;if(!f&&m.includes("application/json"))try{u=await i.json()}catch{}throw new y(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 Y(e){if((e.headers.get("Content-Type")??"").includes("application/json"))try{return await e.json()}catch{return}}var k=null,U=null;function Z(e){return typeof e=="object"&&e!==null&&N in e}async function Q(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 ee(e){return e instanceof Response?e:L(e)?A(C(e),e.statusCode):e==null?new Response(null,{status:204}):new Response(JSON.stringify(e),{headers:{"Content-Type":"application/json"}})}async function Be(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||U!==s)&&(k=v(Object.keys(n.routes),Object.keys(n.middlewares),n.apiDir),U=s);let{routes:a,middlewares:c}=k,d=_(r,a);if(!d)return new Response("Not Found",{status:404});let{route:l,params:R}=d,i=F(t,o),f=new x(R,t,new URL(e,"http://localhost"),i),H=await M({request:t,ctx:f},async()=>{let m=D(l.key,c);for(let h of m){let g=await n.middlewares[h.key]();if(g.middleware){let b=await g.middleware(f);if(b instanceof Response)return b}}let u=await n.routes[l.key](),q=t.method.toUpperCase(),p=u[q];if(!p)return new Response("Method Not Allowed",{status:405});if(Z(p)){if(p.fn.length===0)return p.fn();let h=await Q(t);if(p.schema){let g=await p.schema["~standard"].validate(h);return g.issues?$(400,"Validation failed",{code:"VALIDATION_ERROR",data:{issues:g.issues}}):p.fn(g.value,f)}return p.fn(h,f)}return p(f)});return ee(H)}catch(r){return r instanceof w?A(C(r),r.statusCode):(console.error("[devix] api error:",r),A({statusCode:500,message:"Internal Server Error"},500))}}export{Be as handleApiRequest};
|
|
2
2
|
//# sourceMappingURL=api.js.map
|