olova 2.0.55 → 2.0.56
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/README.md +28 -288
- package/dist/chunk-23UAGQ6N.js +2208 -0
- package/dist/chunk-23UAGQ6N.js.map +1 -0
- package/dist/chunk-D7SIC5TC.js +367 -0
- package/dist/chunk-D7SIC5TC.js.map +1 -0
- package/dist/entry-server.cjs +2341 -0
- package/dist/entry-server.cjs.map +1 -0
- package/dist/entry-server.js +114 -0
- package/dist/entry-server.js.map +1 -0
- package/dist/entry-worker.cjs +2354 -0
- package/dist/entry-worker.cjs.map +1 -0
- package/dist/entry-worker.js +126 -0
- package/dist/entry-worker.js.map +1 -0
- package/dist/main.cjs +18 -0
- package/dist/main.cjs.map +1 -0
- package/dist/main.js +16 -0
- package/dist/main.js.map +1 -0
- package/dist/olova.cjs +1684 -0
- package/dist/olova.cjs.map +1 -0
- package/dist/olova.d.cts +72 -0
- package/dist/olova.d.ts +72 -0
- package/dist/olova.js +1325 -0
- package/dist/olova.js.map +1 -0
- package/dist/performance.cjs +386 -0
- package/dist/performance.cjs.map +1 -0
- package/dist/performance.js +3 -0
- package/dist/performance.js.map +1 -0
- package/dist/router.cjs +646 -0
- package/dist/router.cjs.map +1 -0
- package/dist/router.d.cts +113 -0
- package/dist/router.d.ts +113 -0
- package/dist/router.js +632 -0
- package/dist/router.js.map +1 -0
- package/main.tsx +76 -0
- package/olova.ts +619 -0
- package/package.json +42 -61
- package/src/entry-server.tsx +165 -0
- package/src/entry-worker.tsx +201 -0
- package/src/generator/index.ts +409 -0
- package/src/hydration/flight.ts +320 -0
- package/src/hydration/index.ts +12 -0
- package/src/hydration/types.ts +225 -0
- package/src/logger.ts +182 -0
- package/src/main.tsx +24 -0
- package/src/performance.ts +488 -0
- package/src/plugin/index.ts +204 -0
- package/src/router/ErrorBoundary.tsx +145 -0
- package/src/router/Link.tsx +117 -0
- package/src/router/OlovaRouter.tsx +354 -0
- package/src/router/Outlet.tsx +8 -0
- package/src/router/context.ts +117 -0
- package/src/router/index.ts +29 -0
- package/src/router/matching.ts +63 -0
- package/src/router/router.tsx +23 -0
- package/src/router/search-params.ts +29 -0
- package/src/scanner/index.ts +116 -0
- package/src/types/index.ts +191 -0
- package/src/utils/export.ts +85 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/naming.ts +54 -0
- package/src/utils/path.ts +45 -0
- package/tsup.config.ts +35 -0
- package/CHANGELOG.md +0 -31
- package/LICENSE +0 -21
- package/dist/index.cjs +0 -883
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -138
- package/dist/index.d.ts +0 -138
- package/dist/index.js +0 -832
- package/dist/index.js.map +0 -1
- package/dist/plugin.cjs +0 -927
- package/dist/plugin.cjs.map +0 -1
- package/dist/plugin.d.cts +0 -18
- package/dist/plugin.d.ts +0 -18
- package/dist/plugin.js +0 -894
- package/dist/plugin.js.map +0 -1
- package/dist/ssg.cjs +0 -637
- package/dist/ssg.cjs.map +0 -1
- package/dist/ssg.d.cts +0 -191
- package/dist/ssg.d.ts +0 -191
- package/dist/ssg.js +0 -585
- package/dist/ssg.js.map +0 -1
- package/dist/types-BT6YsBGO.d.cts +0 -143
- package/dist/types-BT6YsBGO.d.ts +0 -143
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/router.tsx","../src/context.tsx","../src/components/ErrorBoundary.tsx","../src/components/Loading.tsx","../src/components/NotFound.tsx","../src/components/Metadata.tsx","../src/components/Link.tsx"],"sourcesContent":["// Olova - Next.js-style File-Based Routing for Vite\r\n// Main runtime exports\r\n\r\n// Router\r\nexport { OlovaRouter } from './router';\r\n\r\n// Context and Hooks\r\nexport {\r\n usePathname,\r\n useParams,\r\n useSearchParams,\r\n useRouter,\r\n useOlovaRouter,\r\n setSSRContext,\r\n} from './context';\r\n\r\n// Components\r\nexport { Link, NavLink } from './components/Link';\r\nexport { RouteErrorBoundary, DefaultErrorComponent } from './components/ErrorBoundary';\r\nexport { \r\n RouteLoadingBoundary, \r\n DefaultLoadingComponent,\r\n Skeleton,\r\n SkeletonText,\r\n SkeletonCard,\r\n} from './components/Loading';\r\nexport { \r\n NotFoundBoundary, \r\n DefaultNotFoundComponent, \r\n notFound,\r\n NotFoundError,\r\n} from './components/NotFound';\r\nexport {\r\n MetadataHead,\r\n MetadataProvider,\r\n useMetadata,\r\n usePageMetadata,\r\n generateMetadataHtml,\r\n} from './components/Metadata';\r\n\r\n// Types\r\nexport type {\r\n RouteConfig,\r\n RouteMatch,\r\n RouteNode,\r\n RouteSegment,\r\n OlovaOptions,\r\n LayoutProps,\r\n PageProps,\r\n ErrorProps,\r\n LoadingProps,\r\n NotFoundProps,\r\n NavigateOptions,\r\n Metadata,\r\n RouteMetadata,\r\n StaticParams,\r\n GenerateStaticParams,\r\n GenerateMetadata,\r\n RouteManifest,\r\n} from './types';\r\n","import React, { useMemo, lazy, Suspense, useEffect } from 'react';\r\nimport { OlovaRouterProvider, usePathname, useParamsUpdater } from './context';\r\nimport { RouteErrorBoundary } from './components/ErrorBoundary';\r\nimport { RouteLoadingBoundary, DefaultLoadingComponent } from './components/Loading';\r\nimport { NotFoundBoundary, DefaultNotFoundComponent } from './components/NotFound';\r\nimport { MetadataHead } from './components/Metadata';\r\nimport type { RouteConfig, RouteMatch, LayoutProps, Metadata } from './types';\r\n\r\ninterface OlovaRouterProps {\r\n routes: RouteConfig[];\r\n basePath?: string;\r\n defaultLoading?: React.ReactNode;\r\n defaultNotFound?: React.ComponentType;\r\n defaultError?: React.ComponentType<{ error: Error; reset: () => void }>;\r\n /** Root metadata to use as fallback when route has no metadata */\r\n rootMetadata?: Metadata;\r\n /** Metadata map by route path */\r\n routeMetadata?: Record<string, Metadata>;\r\n}\r\n\r\nexport function OlovaRouter({ \r\n routes, \r\n basePath = '',\r\n defaultLoading,\r\n defaultNotFound,\r\n defaultError,\r\n rootMetadata,\r\n routeMetadata,\r\n}: OlovaRouterProps) {\r\n return (\r\n <OlovaRouterProvider basePath={basePath}>\r\n <RouteRenderer \r\n routes={routes}\r\n defaultLoading={defaultLoading}\r\n defaultNotFound={defaultNotFound}\r\n defaultError={defaultError}\r\n rootMetadata={rootMetadata}\r\n routeMetadata={routeMetadata}\r\n />\r\n </OlovaRouterProvider>\r\n );\r\n}\r\n\r\ninterface RouteRendererProps {\r\n routes: RouteConfig[];\r\n defaultLoading?: React.ReactNode;\r\n defaultNotFound?: React.ComponentType;\r\n defaultError?: React.ComponentType<{ error: Error; reset: () => void }>;\r\n rootMetadata?: Metadata;\r\n routeMetadata?: Record<string, Metadata>;\r\n}\r\n\r\nfunction RouteRenderer({ \r\n routes, \r\n defaultLoading, \r\n defaultNotFound, \r\n defaultError,\r\n rootMetadata,\r\n routeMetadata,\r\n}: RouteRendererProps) {\r\n const pathname = usePathname();\r\n const updateParams = useParamsUpdater();\r\n\r\n // Match the current route\r\n const match = useMemo(() => {\r\n return matchRoute(routes, pathname);\r\n }, [routes, pathname]);\r\n\r\n // Update params in context when match changes\r\n useEffect(() => {\r\n if (updateParams && match) {\r\n updateParams(match.params);\r\n }\r\n }, [match, updateParams]);\r\n\r\n // Get metadata for current route\r\n const currentMetadata = useMemo(() => {\r\n if (!routeMetadata) return null;\r\n \r\n // Try exact match first\r\n if (routeMetadata[pathname]) {\r\n return routeMetadata[pathname];\r\n }\r\n \r\n // For dynamic routes, try to find a matching pattern\r\n // This is a simplified approach - the actual metadata is extracted at build time\r\n return null;\r\n }, [pathname, routeMetadata]);\r\n\r\n if (!match) {\r\n const NotFoundComponent = defaultNotFound || DefaultNotFoundComponent;\r\n return (\r\n <>\r\n <MetadataHead metadata={currentMetadata} fallback={rootMetadata} />\r\n <NotFoundComponent />\r\n </>\r\n );\r\n }\r\n\r\n // Build the layout tree\r\n return (\r\n <>\r\n <MetadataHead metadata={currentMetadata} fallback={rootMetadata} />\r\n <LayoutRenderer\r\n match={match}\r\n routes={routes}\r\n defaultLoading={defaultLoading}\r\n defaultError={defaultError}\r\n />\r\n </>\r\n );\r\n}\r\n\r\ninterface LayoutRendererProps {\r\n match: RouteMatch;\r\n routes: RouteConfig[];\r\n defaultLoading?: React.ReactNode;\r\n defaultError?: React.ComponentType<{ error: Error; reset: () => void }>;\r\n}\r\n\r\nfunction LayoutRenderer({ match, routes, defaultLoading, defaultError }: LayoutRendererProps) {\r\n const { route, params } = match;\r\n \r\n // Find all layouts in the route hierarchy\r\n const layoutChain = useMemo(() => {\r\n return findLayoutChain(routes, route);\r\n }, [routes, route]);\r\n\r\n // Render parallel route slots for a given route\r\n const renderSlots = (currentRoute: RouteConfig): Record<string, React.ReactNode> => {\r\n const slots: Record<string, React.ReactNode> = {};\r\n \r\n if (currentRoute.slots) {\r\n for (const [slotName, slotRoute] of Object.entries(currentRoute.slots)) {\r\n if (slotRoute.component) {\r\n const SlotComponent = slotRoute.component;\r\n const SlotLoading = slotRoute.loading;\r\n const SlotError = slotRoute.error || defaultError;\r\n \r\n slots[slotName] = (\r\n <RouteErrorBoundary fallback={SlotError} key={slotName}>\r\n <RouteLoadingBoundary fallback={SlotLoading ? <SlotLoading /> : defaultLoading}>\r\n <SlotComponent params={params} searchParams={{}} />\r\n </RouteLoadingBoundary>\r\n </RouteErrorBoundary>\r\n );\r\n }\r\n }\r\n }\r\n \r\n return slots;\r\n };\r\n\r\n // Render layouts from outermost to innermost\r\n const renderLayouts = (index: number): React.ReactNode => {\r\n if (index >= layoutChain.length) {\r\n // Render the actual page component\r\n if (!route.component) {\r\n return null;\r\n }\r\n\r\n const PageComponent = route.component;\r\n const LoadingComponent = route.loading;\r\n const ErrorComponent = route.error || defaultError;\r\n\r\n return (\r\n <RouteErrorBoundary fallback={ErrorComponent}>\r\n <RouteLoadingBoundary fallback={LoadingComponent ? <LoadingComponent /> : defaultLoading}>\r\n <PageComponent params={params} searchParams={{}} />\r\n </RouteLoadingBoundary>\r\n </RouteErrorBoundary>\r\n );\r\n }\r\n\r\n const currentLayout = layoutChain[index];\r\n if (!currentLayout.layout) {\r\n return renderLayouts(index + 1);\r\n }\r\n\r\n const LayoutComponent = currentLayout.layout;\r\n const LoadingComponent = currentLayout.loading;\r\n const ErrorComponent = currentLayout.error || defaultError;\r\n \r\n // Get parallel route slots for this layout\r\n const slots = renderSlots(currentLayout);\r\n\r\n return (\r\n <RouteErrorBoundary fallback={ErrorComponent}>\r\n <RouteLoadingBoundary fallback={LoadingComponent ? <LoadingComponent /> : defaultLoading}>\r\n <LayoutComponent params={params} {...slots}>\r\n {renderLayouts(index + 1)}\r\n </LayoutComponent>\r\n </RouteLoadingBoundary>\r\n </RouteErrorBoundary>\r\n );\r\n };\r\n\r\n return <>{renderLayouts(0)}</>;\r\n}\r\n\r\n// Route matching algorithm\r\nfunction matchRoute(routes: RouteConfig[], pathname: string): RouteMatch | null {\r\n const segments = pathname.split('/').filter(Boolean);\r\n \r\n function matchRecursive(\r\n routeList: RouteConfig[], \r\n segmentIndex: number,\r\n params: Record<string, string>\r\n ): RouteMatch | null {\r\n // Base case: we've matched all segments\r\n if (segmentIndex >= segments.length) {\r\n // Find a route that matches at this level (with hasPage)\r\n for (const route of routeList) {\r\n if (route.path === '' || route.path === '/') {\r\n if (route.component) {\r\n return {\r\n route,\r\n params,\r\n pathname,\r\n searchParams: new URLSearchParams(window.location.search),\r\n };\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n const currentSegment = segments[segmentIndex];\r\n\r\n for (const route of routeList) {\r\n // Skip route groups in URL matching (they don't consume segments)\r\n if (route.path.startsWith('(') && route.path.endsWith(')')) {\r\n // Check children without consuming segment\r\n if (route.children.length > 0) {\r\n const childMatch = matchRecursive(route.children, segmentIndex, params);\r\n if (childMatch) return childMatch;\r\n }\r\n continue;\r\n }\r\n\r\n // Dynamic catch-all route\r\n if (route.isCatchAll && route.paramName) {\r\n const remainingSegments = segments.slice(segmentIndex);\r\n const newParams = { ...params, [route.paramName]: remainingSegments.join('/') };\r\n \r\n if (route.component) {\r\n return {\r\n route,\r\n params: newParams,\r\n pathname,\r\n searchParams: new URLSearchParams(window.location.search),\r\n };\r\n }\r\n }\r\n\r\n // Dynamic route segment\r\n if (route.isDynamic && route.paramName) {\r\n const newParams = { ...params, [route.paramName]: currentSegment };\r\n \r\n // Check if this is the last segment\r\n if (segmentIndex === segments.length - 1) {\r\n if (route.component) {\r\n return {\r\n route,\r\n params: newParams,\r\n pathname,\r\n searchParams: new URLSearchParams(window.location.search),\r\n };\r\n }\r\n }\r\n \r\n // Try to match children\r\n if (route.children.length > 0) {\r\n const childMatch = matchRecursive(route.children, segmentIndex + 1, newParams);\r\n if (childMatch) return childMatch;\r\n }\r\n }\r\n\r\n // Static route segment\r\n if (route.path === currentSegment) {\r\n // Check if this is the last segment\r\n if (segmentIndex === segments.length - 1) {\r\n if (route.component) {\r\n return {\r\n route,\r\n params,\r\n pathname,\r\n searchParams: new URLSearchParams(window.location.search),\r\n };\r\n }\r\n // Look for index page in children\r\n for (const child of route.children) {\r\n if ((child.path === '' || child.path === '/') && child.component) {\r\n return {\r\n route: child,\r\n params,\r\n pathname,\r\n searchParams: new URLSearchParams(window.location.search),\r\n };\r\n }\r\n }\r\n }\r\n \r\n // Try to match children\r\n if (route.children.length > 0) {\r\n const childMatch = matchRecursive(route.children, segmentIndex + 1, params);\r\n if (childMatch) return childMatch;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // Handle root path\r\n if (pathname === '/' || pathname === '') {\r\n for (const route of routes) {\r\n if ((route.path === '' || route.path === '/') && route.component) {\r\n return {\r\n route,\r\n params: {},\r\n pathname: '/',\r\n searchParams: new URLSearchParams(window.location.search),\r\n };\r\n }\r\n }\r\n }\r\n\r\n return matchRecursive(routes, 0, {});\r\n}\r\n\r\n// Find all layouts in the hierarchy for a matched route\r\nfunction findLayoutChain(routes: RouteConfig[], targetRoute: RouteConfig): RouteConfig[] {\r\n const chain: RouteConfig[] = [];\r\n \r\n function findRecursive(routeList: RouteConfig[], path: RouteConfig[]): boolean {\r\n for (const route of routeList) {\r\n const currentPath = [...path, route];\r\n \r\n if (route.id === targetRoute.id) {\r\n // Found the target, collect all layouts\r\n for (const r of currentPath) {\r\n if (r.layout) {\r\n chain.push(r);\r\n }\r\n }\r\n return true;\r\n }\r\n \r\n if (route.children.length > 0) {\r\n if (findRecursive(route.children, currentPath)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n findRecursive(routes, []);\r\n return chain;\r\n}\r\n\r\nexport { matchRoute, findLayoutChain };\r\n","import React, { createContext, useContext, useState, useCallback, useEffect, useTransition } from 'react';\r\nimport type { OlovaRouterContextValue, NavigateOptions } from './types';\r\n\r\nconst OlovaRouterContext = createContext<OlovaRouterContextValue | null>(null);\r\n\r\n// Check if we're in a browser environment\r\nconst isBrowser = typeof window !== 'undefined';\r\n\r\n// Mutable SSR context for SSG rendering\r\nlet ssrContextValue: OlovaRouterContextValue = {\r\n pathname: '/',\r\n params: {},\r\n searchParams: new URLSearchParams(),\r\n navigate: () => {},\r\n replace: () => {},\r\n back: () => {},\r\n forward: () => {},\r\n refresh: () => {},\r\n prefetch: () => {},\r\n isNavigating: false,\r\n};\r\n\r\n/**\r\n * Set the SSR context value before rendering a page during SSG\r\n * @internal Used by SSG renderer\r\n */\r\nexport function setSSRContext(pathname: string, params: Record<string, string> = {}): void {\r\n ssrContextValue = {\r\n pathname,\r\n params,\r\n searchParams: new URLSearchParams(),\r\n navigate: () => {},\r\n replace: () => {},\r\n back: () => {},\r\n forward: () => {},\r\n refresh: () => {},\r\n prefetch: () => {},\r\n isNavigating: false,\r\n };\r\n}\r\n\r\nexport function useOlovaRouter(): OlovaRouterContextValue {\r\n const context = useContext(OlovaRouterContext);\r\n \r\n // During SSR, return fallback values instead of throwing\r\n if (!context) {\r\n if (!isBrowser) {\r\n // SSR mode - return mutable SSR context\r\n return ssrContextValue;\r\n }\r\n throw new Error('useOlovaRouter must be used within an OlovaRouter');\r\n }\r\n return context;\r\n}\r\n\r\n// Convenience hooks matching Next.js API\r\nexport function usePathname(): string {\r\n return useOlovaRouter().pathname;\r\n}\r\n\r\nexport function useParams<T extends Record<string, string> = Record<string, string>>(): T {\r\n return useOlovaRouter().params as T;\r\n}\r\n\r\nexport function useSearchParams(): URLSearchParams {\r\n return useOlovaRouter().searchParams;\r\n}\r\n\r\nexport function useRouter() {\r\n const { navigate, replace, back, forward, refresh, prefetch, isNavigating } = useOlovaRouter();\r\n return {\r\n push: navigate,\r\n replace,\r\n back,\r\n forward,\r\n refresh,\r\n prefetch,\r\n isNavigating,\r\n };\r\n}\r\n\r\ninterface OlovaRouterProviderProps {\r\n children: React.ReactNode;\r\n basePath?: string;\r\n}\r\n\r\nexport function OlovaRouterProvider({ children, basePath = '' }: OlovaRouterProviderProps) {\r\n const [pathname, setPathname] = useState(() => {\r\n const path = window.location.pathname;\r\n return basePath ? path.replace(new RegExp(`^${basePath}`), '') || '/' : path;\r\n });\r\n \r\n const [searchParams, setSearchParams] = useState(() => new URLSearchParams(window.location.search));\r\n const [params, setParams] = useState<Record<string, string>>({});\r\n const [isPending, startTransition] = useTransition();\r\n\r\n // Handle browser navigation (back/forward)\r\n useEffect(() => {\r\n const handlePopState = () => {\r\n startTransition(() => {\r\n const path = window.location.pathname;\r\n setPathname(basePath ? path.replace(new RegExp(`^${basePath}`), '') || '/' : path);\r\n setSearchParams(new URLSearchParams(window.location.search));\r\n });\r\n };\r\n\r\n window.addEventListener('popstate', handlePopState);\r\n return () => window.removeEventListener('popstate', handlePopState);\r\n }, [basePath]);\r\n\r\n const navigate = useCallback((to: string, options: NavigateOptions = {}) => {\r\n const url = new URL(to, window.location.origin);\r\n const fullPath = basePath + url.pathname;\r\n \r\n startTransition(() => {\r\n if (options.replace) {\r\n window.history.replaceState(null, '', fullPath + url.search);\r\n } else {\r\n window.history.pushState(null, '', fullPath + url.search);\r\n }\r\n \r\n setPathname(url.pathname);\r\n setSearchParams(new URLSearchParams(url.search));\r\n \r\n if (options.scroll !== false) {\r\n window.scrollTo(0, 0);\r\n }\r\n });\r\n }, [basePath]);\r\n\r\n const replace = useCallback((to: string, options: NavigateOptions = {}) => {\r\n navigate(to, { ...options, replace: true });\r\n }, [navigate]);\r\n\r\n const back = useCallback(() => {\r\n window.history.back();\r\n }, []);\r\n\r\n const forward = useCallback(() => {\r\n window.history.forward();\r\n }, []);\r\n\r\n const refresh = useCallback(() => {\r\n startTransition(() => {\r\n setPathname(prev => prev);\r\n });\r\n }, []);\r\n\r\n const prefetch = useCallback((href: string) => {\r\n // Prefetching logic - could preload route chunks\r\n console.log('[Olova] Prefetching:', href);\r\n }, []);\r\n\r\n // Function to update params (called by route matching)\r\n const updateParams = useCallback((newParams: Record<string, string>) => {\r\n setParams(newParams);\r\n }, []);\r\n\r\n const contextValue: OlovaRouterContextValue = {\r\n pathname,\r\n params,\r\n searchParams,\r\n navigate,\r\n replace,\r\n back,\r\n forward,\r\n refresh,\r\n prefetch,\r\n isNavigating: isPending,\r\n };\r\n\r\n return (\r\n <OlovaRouterContext.Provider value={contextValue}>\r\n <OlovaParamsUpdater updateParams={updateParams}>\r\n {children}\r\n </OlovaParamsUpdater>\r\n </OlovaRouterContext.Provider>\r\n );\r\n}\r\n\r\n// Internal context for updating params from route matching\r\nconst ParamsUpdaterContext = createContext<((params: Record<string, string>) => void) | null>(null);\r\n\r\nfunction OlovaParamsUpdater({ \r\n children, \r\n updateParams \r\n}: { \r\n children: React.ReactNode; \r\n updateParams: (params: Record<string, string>) => void;\r\n}) {\r\n return (\r\n <ParamsUpdaterContext.Provider value={updateParams}>\r\n {children}\r\n </ParamsUpdaterContext.Provider>\r\n );\r\n}\r\n\r\nexport function useParamsUpdater() {\r\n return useContext(ParamsUpdaterContext);\r\n}\r\n\r\nexport { OlovaRouterContext };\r\n","import React, { Component, type ReactNode } from 'react';\r\nimport type { ErrorProps } from '../types';\r\n\r\ninterface ErrorBoundaryProps {\r\n children: ReactNode;\r\n fallback?: React.ComponentType<ErrorProps>;\r\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\r\n}\r\n\r\ninterface ErrorBoundaryState {\r\n hasError: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport class RouteErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props);\r\n this.state = { hasError: false, error: null };\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\r\n return { hasError: true, error };\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\r\n console.error('[Olova] Route error:', error, errorInfo);\r\n this.props.onError?.(error, errorInfo);\r\n }\r\n\r\n reset = () => {\r\n this.setState({ hasError: false, error: null });\r\n };\r\n\r\n render() {\r\n if (this.state.hasError && this.state.error) {\r\n const FallbackComponent = this.props.fallback;\r\n \r\n if (FallbackComponent) {\r\n return <FallbackComponent error={this.state.error} reset={this.reset} />;\r\n }\r\n\r\n // Default error UI\r\n return (\r\n <div className=\"flex min-h-[400px] flex-col items-center justify-center p-8\">\r\n <div className=\"rounded-lg border border-destructive/20 bg-destructive/5 p-6 text-center\">\r\n <h2 className=\"mb-2 text-xl font-semibold text-destructive\">Something went wrong!</h2>\r\n <p className=\"mb-4 text-sm text-muted-foreground\">\r\n {this.state.error.message}\r\n </p>\r\n <button\r\n onClick={this.reset}\r\n className=\"rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\r\n >\r\n Try again\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n\r\n// Default error component\r\nexport function DefaultErrorComponent({ error, reset }: ErrorProps) {\r\n return (\r\n <div className=\"flex min-h-[400px] flex-col items-center justify-center p-8\">\r\n <div className=\"max-w-md rounded-lg border border-destructive/20 bg-destructive/5 p-6 text-center\">\r\n <div className=\"mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-destructive/10\">\r\n <svg\r\n className=\"h-6 w-6 text-destructive\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\r\n />\r\n </svg>\r\n </div>\r\n <h2 className=\"mb-2 text-xl font-semibold text-foreground\">Something went wrong!</h2>\r\n <p className=\"mb-4 text-sm text-muted-foreground\">{error.message}</p>\r\n <button\r\n onClick={reset}\r\n className=\"rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90\"\r\n >\r\n Try again\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { Suspense, type ReactNode } from 'react';\r\n\r\ninterface RouteLoadingBoundaryProps {\r\n children: ReactNode;\r\n fallback?: ReactNode;\r\n}\r\n\r\nexport function RouteLoadingBoundary({ children, fallback }: RouteLoadingBoundaryProps) {\r\n return (\r\n <Suspense fallback={fallback || <DefaultLoadingComponent />}>\r\n {children}\r\n </Suspense>\r\n );\r\n}\r\n\r\n// Default loading component with skeleton animation\r\nexport function DefaultLoadingComponent() {\r\n return (\r\n <div className=\"flex min-h-[400px] flex-col items-center justify-center p-8\">\r\n <div className=\"flex flex-col items-center gap-4\">\r\n <div className=\"relative h-10 w-10\">\r\n <div className=\"absolute inset-0 animate-ping rounded-full bg-primary/20\" />\r\n <div className=\"absolute inset-0 animate-pulse rounded-full bg-primary/40\" />\r\n <div className=\"absolute inset-2 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\r\n </div>\r\n <p className=\"text-sm text-muted-foreground\">Loading...</p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// Skeleton components for building custom loading states\r\nexport function Skeleton({ className = '' }: { className?: string }) {\r\n return (\r\n <div \r\n className={`animate-pulse rounded-md bg-muted ${className}`}\r\n aria-hidden=\"true\"\r\n />\r\n );\r\n}\r\n\r\nexport function SkeletonText({ lines = 3, className = '' }: { lines?: number; className?: string }) {\r\n return (\r\n <div className={`space-y-2 ${className}`}>\r\n {Array.from({ length: lines }).map((_, i) => (\r\n <Skeleton \r\n key={i} \r\n className={`h-4 ${i === lines - 1 ? 'w-3/4' : 'w-full'}`} \r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport function SkeletonCard({ className = '' }: { className?: string }) {\r\n return (\r\n <div className={`rounded-lg border bg-card p-6 ${className}`}>\r\n <Skeleton className=\"mb-4 h-6 w-1/2\" />\r\n <SkeletonText lines={3} />\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\nimport type { NotFoundProps } from '../types';\r\n\r\ninterface NotFoundBoundaryProps {\r\n children: React.ReactNode;\r\n fallback?: React.ComponentType<NotFoundProps>;\r\n show404?: boolean;\r\n}\r\n\r\nexport function NotFoundBoundary({ children, fallback: Fallback, show404 }: NotFoundBoundaryProps) {\r\n if (show404) {\r\n if (Fallback) {\r\n return <Fallback />;\r\n }\r\n return <DefaultNotFoundComponent />;\r\n }\r\n\r\n return <>{children}</>;\r\n}\r\n\r\nexport function DefaultNotFoundComponent() {\r\n return (\r\n <div className=\"flex min-h-[60vh] flex-col items-center justify-center p-8\">\r\n <div className=\"text-center\">\r\n <h1 className=\"mb-2 text-8xl font-bold text-primary\">404</h1>\r\n <h2 className=\"mb-4 text-2xl font-semibold text-foreground\">Page Not Found</h2>\r\n <p className=\"mb-8 max-w-md text-muted-foreground\">\r\n The page you're looking for doesn't exist or has been moved.\r\n </p>\r\n <a\r\n href=\"/\"\r\n className=\"inline-flex items-center gap-2 rounded-md bg-primary px-6 py-3 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90\"\r\n >\r\n <svg\r\n className=\"h-4 w-4\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M10 19l-7-7m0 0l7-7m-7 7h18\"\r\n />\r\n </svg>\r\n Go back home\r\n </a>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// Hook to programmatically trigger 404\r\nexport function notFound(): never {\r\n throw new NotFoundError();\r\n}\r\n\r\nexport class NotFoundError extends Error {\r\n constructor() {\r\n super('NEXT_NOT_FOUND');\r\n this.name = 'NotFoundError';\r\n }\r\n}\r\n","/**\r\n * Olova Metadata Component\r\n * \r\n * Handles runtime metadata updates for single-page navigation\r\n * and provides metadata injection for SSG.\r\n */\r\n\r\nimport React, { useEffect, useContext, createContext, useState, useCallback } from 'react';\r\nimport type { Metadata } from '../types';\r\n\r\n// Context to provide metadata throughout the app\r\ninterface MetadataContextValue {\r\n metadata: Metadata | null;\r\n rootMetadata: Metadata | null;\r\n setMetadata: (metadata: Metadata | null) => void;\r\n}\r\n\r\nconst MetadataContext = createContext<MetadataContextValue | null>(null);\r\n\r\nexport interface MetadataProviderProps {\r\n children: React.ReactNode;\r\n rootMetadata?: Metadata;\r\n}\r\n\r\n/**\r\n * Provider component that manages metadata state\r\n */\r\nexport function MetadataProvider({ children, rootMetadata }: MetadataProviderProps) {\r\n const [metadata, setMetadataState] = useState<Metadata | null>(rootMetadata || null);\r\n\r\n const setMetadata = useCallback((newMetadata: Metadata | null) => {\r\n setMetadataState(newMetadata);\r\n }, []);\r\n\r\n return (\r\n <MetadataContext.Provider value={{ metadata, rootMetadata: rootMetadata || null, setMetadata }}>\r\n <MetadataHead metadata={metadata} fallback={rootMetadata} />\r\n {children}\r\n </MetadataContext.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * Hook to access and update metadata\r\n */\r\nexport function useMetadata() {\r\n const context = useContext(MetadataContext);\r\n if (!context) {\r\n throw new Error('useMetadata must be used within a MetadataProvider');\r\n }\r\n return context;\r\n}\r\n\r\n/**\r\n * Hook to apply metadata for A page component\r\n */\r\nexport function usePageMetadata(metadata: Metadata | undefined) {\r\n const context = useContext(MetadataContext);\r\n \r\n useEffect(() => {\r\n if (context && metadata) {\r\n context.setMetadata(metadata);\r\n }\r\n return () => {\r\n // Reset to root metadata when unmounting\r\n if (context) {\r\n context.setMetadata(context.rootMetadata);\r\n }\r\n };\r\n }, [metadata, context]);\r\n}\r\n\r\ninterface MetadataHeadProps {\r\n metadata: Metadata | null;\r\n fallback?: Metadata;\r\n}\r\n\r\n/**\r\n * Component that updates document head with metadata\r\n * Works at runtime for SPA navigation\r\n */\r\nexport function MetadataHead({ metadata, fallback }: MetadataHeadProps) {\r\n useEffect(() => {\r\n const activeMetadata = metadata || fallback;\r\n if (!activeMetadata) return;\r\n\r\n // Update title\r\n if (activeMetadata.title) {\r\n document.title = activeMetadata.title;\r\n }\r\n\r\n // Track added meta tags for cleanup\r\n const addedMetas: HTMLMetaElement[] = [];\r\n\r\n // Helper to set or update meta tag\r\n const setMeta = (name: string, content: string, property?: boolean) => {\r\n const attr = property ? 'property' : 'name';\r\n let meta = document.querySelector(`meta[${attr}=\"${name}\"]`) as HTMLMetaElement | null;\r\n \r\n if (!meta) {\r\n meta = document.createElement('meta');\r\n meta.setAttribute(attr, name);\r\n document.head.appendChild(meta);\r\n addedMetas.push(meta);\r\n }\r\n meta.content = content;\r\n };\r\n\r\n // Basic meta tags\r\n if (activeMetadata.description) {\r\n setMeta('description', activeMetadata.description);\r\n }\r\n\r\n if (activeMetadata.keywords?.length) {\r\n setMeta('keywords', activeMetadata.keywords.join(', '));\r\n }\r\n\r\n if (activeMetadata.authors?.length) {\r\n setMeta('author', activeMetadata.authors.map(a => a.name).join(', '));\r\n }\r\n\r\n if (activeMetadata.robots) {\r\n setMeta('robots', activeMetadata.robots);\r\n }\r\n\r\n // OpenGraph meta tags\r\n if (activeMetadata.openGraph) {\r\n const og = activeMetadata.openGraph;\r\n \r\n if (og.title) {\r\n setMeta('og:title', og.title, true);\r\n }\r\n if (og.description) {\r\n setMeta('og:description', og.description, true);\r\n }\r\n if (og.url) {\r\n setMeta('og:url', og.url, true);\r\n }\r\n if (og.siteName) {\r\n setMeta('og:site_name', og.siteName, true);\r\n }\r\n if (og.type) {\r\n setMeta('og:type', og.type, true);\r\n }\r\n if (og.images?.length) {\r\n const img = og.images[0];\r\n setMeta('og:image', img.url, true);\r\n if (img.width) setMeta('og:image:width', String(img.width), true);\r\n if (img.height) setMeta('og:image:height', String(img.height), true);\r\n if (img.alt) setMeta('og:image:alt', img.alt, true);\r\n }\r\n }\r\n\r\n // Twitter meta tags\r\n if (activeMetadata.twitter) {\r\n const tw = activeMetadata.twitter;\r\n \r\n if (tw.card) {\r\n setMeta('twitter:card', tw.card);\r\n }\r\n if (tw.title) {\r\n setMeta('twitter:title', tw.title);\r\n }\r\n if (tw.description) {\r\n setMeta('twitter:description', tw.description);\r\n }\r\n if (tw.site) {\r\n setMeta('twitter:site', tw.site);\r\n }\r\n if (tw.creator) {\r\n setMeta('twitter:creator', tw.creator);\r\n }\r\n if (tw.images?.length) {\r\n setMeta('twitter:image', tw.images[0]);\r\n }\r\n }\r\n\r\n // Canonical URL\r\n if (activeMetadata.canonical) {\r\n let link = document.querySelector('link[rel=\"canonical\"]') as HTMLLinkElement | null;\r\n if (!link) {\r\n link = document.createElement('link');\r\n link.rel = 'canonical';\r\n document.head.appendChild(link);\r\n }\r\n link.href = activeMetadata.canonical;\r\n }\r\n\r\n // Cleanup function - remove only the meta tags we added\r\n return () => {\r\n addedMetas.forEach(meta => {\r\n if (meta.parentNode) {\r\n meta.parentNode.removeChild(meta);\r\n }\r\n });\r\n };\r\n }, [metadata, fallback]);\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Generate HTML string for metadata (used in SSG)\r\n */\r\nexport function generateMetadataHtml(metadata: Metadata): string {\r\n const tags: string[] = [];\r\n\r\n if (metadata.title) {\r\n tags.push(` <title>${escapeHtml(metadata.title)}</title>`);\r\n }\r\n\r\n if (metadata.description) {\r\n tags.push(` <meta name=\"description\" content=\"${escapeHtml(metadata.description)}\" />`);\r\n }\r\n\r\n if (metadata.keywords?.length) {\r\n tags.push(` <meta name=\"keywords\" content=\"${escapeHtml(metadata.keywords.join(', '))}\" />`);\r\n }\r\n\r\n if (metadata.authors?.length) {\r\n tags.push(` <meta name=\"author\" content=\"${escapeHtml(metadata.authors.map(a => a.name).join(', '))}\" />`);\r\n }\r\n\r\n if (metadata.robots) {\r\n tags.push(` <meta name=\"robots\" content=\"${escapeHtml(metadata.robots)}\" />`);\r\n }\r\n\r\n // OpenGraph\r\n if (metadata.openGraph) {\r\n const og = metadata.openGraph;\r\n if (og.title) tags.push(` <meta property=\"og:title\" content=\"${escapeHtml(og.title)}\" />`);\r\n if (og.description) tags.push(` <meta property=\"og:description\" content=\"${escapeHtml(og.description)}\" />`);\r\n if (og.url) tags.push(` <meta property=\"og:url\" content=\"${escapeHtml(og.url)}\" />`);\r\n if (og.siteName) tags.push(` <meta property=\"og:site_name\" content=\"${escapeHtml(og.siteName)}\" />`);\r\n if (og.type) tags.push(` <meta property=\"og:type\" content=\"${escapeHtml(og.type)}\" />`);\r\n if (og.images?.length) {\r\n const img = og.images[0];\r\n tags.push(` <meta property=\"og:image\" content=\"${escapeHtml(img.url)}\" />`);\r\n if (img.width) tags.push(` <meta property=\"og:image:width\" content=\"${img.width}\" />`);\r\n if (img.height) tags.push(` <meta property=\"og:image:height\" content=\"${img.height}\" />`);\r\n if (img.alt) tags.push(` <meta property=\"og:image:alt\" content=\"${escapeHtml(img.alt)}\" />`);\r\n }\r\n }\r\n\r\n // Twitter\r\n if (metadata.twitter) {\r\n const tw = metadata.twitter;\r\n if (tw.card) tags.push(` <meta name=\"twitter:card\" content=\"${escapeHtml(tw.card)}\" />`);\r\n if (tw.title) tags.push(` <meta name=\"twitter:title\" content=\"${escapeHtml(tw.title)}\" />`);\r\n if (tw.description) tags.push(` <meta name=\"twitter:description\" content=\"${escapeHtml(tw.description)}\" />`);\r\n if (tw.site) tags.push(` <meta name=\"twitter:site\" content=\"${escapeHtml(tw.site)}\" />`);\r\n if (tw.creator) tags.push(` <meta name=\"twitter:creator\" content=\"${escapeHtml(tw.creator)}\" />`);\r\n if (tw.images?.length) tags.push(` <meta name=\"twitter:image\" content=\"${escapeHtml(tw.images[0])}\" />`);\r\n }\r\n\r\n // Canonical\r\n if (metadata.canonical) {\r\n tags.push(` <link rel=\"canonical\" href=\"${escapeHtml(metadata.canonical)}\" />`);\r\n }\r\n\r\n return tags.join('\\n');\r\n}\r\n\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n\r\nexport default MetadataHead;\r\n","import React, { forwardRef, useCallback, type AnchorHTMLAttributes, type MouseEvent } from 'react';\r\nimport { useOlovaRouter } from '../context';\r\n\r\ninterface LinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\r\n href: string;\r\n replace?: boolean;\r\n scroll?: boolean;\r\n prefetch?: boolean;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(\r\n ({ href, replace = false, scroll = true, prefetch = true, children, onClick, ...props }, ref) => {\r\n const router = useOlovaRouter();\r\n\r\n const handleClick = useCallback(\r\n (e: MouseEvent<HTMLAnchorElement>) => {\r\n // Call original onClick if provided\r\n onClick?.(e);\r\n\r\n // Don't handle if default was prevented or modifier keys pressed\r\n if (\r\n e.defaultPrevented ||\r\n e.metaKey ||\r\n e.ctrlKey ||\r\n e.shiftKey ||\r\n e.altKey ||\r\n e.button !== 0\r\n ) {\r\n return;\r\n }\r\n\r\n // Don't handle external links\r\n if (href.startsWith('http://') || href.startsWith('https://') || href.startsWith('//')) {\r\n return;\r\n }\r\n\r\n // Don't handle hash links to same page\r\n if (href.startsWith('#')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n\r\n if (replace) {\r\n router.replace(href, { scroll });\r\n } else {\r\n router.navigate(href, { scroll });\r\n }\r\n },\r\n [href, replace, scroll, router, onClick]\r\n );\r\n\r\n const handleMouseEnter = useCallback(() => {\r\n if (prefetch && !href.startsWith('http')) {\r\n router.prefetch(href);\r\n }\r\n }, [href, prefetch, router]);\r\n\r\n return (\r\n <a\r\n ref={ref}\r\n href={href}\r\n onClick={handleClick}\r\n onMouseEnter={handleMouseEnter}\r\n {...props}\r\n >\r\n {children}\r\n </a>\r\n );\r\n }\r\n);\r\n\r\nLink.displayName = 'Link';\r\n\r\n// NavLink component with active state\r\ninterface NavLinkProps extends LinkProps {\r\n activeClassName?: string;\r\n inactiveClassName?: string;\r\n exact?: boolean;\r\n}\r\n\r\nexport const NavLink = forwardRef<HTMLAnchorElement, NavLinkProps>(\r\n ({ href, activeClassName = '', inactiveClassName = '', exact = false, className = '', ...props }, ref) => {\r\n const { pathname } = useOlovaRouter();\r\n \r\n const isActive = exact \r\n ? pathname === href \r\n : pathname.startsWith(href) && (href === '/' ? pathname === '/' : true);\r\n\r\n const combinedClassName = `${className} ${isActive ? activeClassName : inactiveClassName}`.trim();\r\n\r\n return (\r\n <Link\r\n ref={ref}\r\n href={href}\r\n className={combinedClassName}\r\n aria-current={isActive ? 'page' : undefined}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\n\r\nNavLink.displayName = 'NavLink';\r\n"],"mappings":"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","names":["import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","LoadingComponent","ErrorComponent","import_react","import_jsx_runtime"]}
|
package/dist/index.d.cts
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import React, { AnchorHTMLAttributes, Component, ReactNode } from 'react';
|
|
3
|
-
import { R as RouteConfig, M as Metadata, N as NavigateOptions, O as OlovaRouterContextValue, E as ErrorProps, a as NotFoundProps } from './types-BT6YsBGO.cjs';
|
|
4
|
-
export { h as GenerateMetadata, G as GenerateStaticParams, L as LayoutProps, f as LoadingProps, e as OlovaOptions, P as PageProps, i as RouteManifest, b as RouteMatch, g as RouteMetadata, c as RouteNode, d as RouteSegment, S as StaticParams } from './types-BT6YsBGO.cjs';
|
|
5
|
-
|
|
6
|
-
interface OlovaRouterProps {
|
|
7
|
-
routes: RouteConfig[];
|
|
8
|
-
basePath?: string;
|
|
9
|
-
defaultLoading?: React.ReactNode;
|
|
10
|
-
defaultNotFound?: React.ComponentType;
|
|
11
|
-
defaultError?: React.ComponentType<{
|
|
12
|
-
error: Error;
|
|
13
|
-
reset: () => void;
|
|
14
|
-
}>;
|
|
15
|
-
/** Root metadata to use as fallback when route has no metadata */
|
|
16
|
-
rootMetadata?: Metadata;
|
|
17
|
-
/** Metadata map by route path */
|
|
18
|
-
routeMetadata?: Record<string, Metadata>;
|
|
19
|
-
}
|
|
20
|
-
declare function OlovaRouter({ routes, basePath, defaultLoading, defaultNotFound, defaultError, rootMetadata, routeMetadata, }: OlovaRouterProps): react_jsx_runtime.JSX.Element;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Set the SSR context value before rendering a page during SSG
|
|
24
|
-
* @internal Used by SSG renderer
|
|
25
|
-
*/
|
|
26
|
-
declare function setSSRContext(pathname: string, params?: Record<string, string>): void;
|
|
27
|
-
declare function useOlovaRouter(): OlovaRouterContextValue;
|
|
28
|
-
declare function usePathname(): string;
|
|
29
|
-
declare function useParams<T extends Record<string, string> = Record<string, string>>(): T;
|
|
30
|
-
declare function useSearchParams(): URLSearchParams;
|
|
31
|
-
declare function useRouter(): {
|
|
32
|
-
push: (to: string, options?: NavigateOptions) => void;
|
|
33
|
-
replace: (to: string, options?: NavigateOptions) => void;
|
|
34
|
-
back: () => void;
|
|
35
|
-
forward: () => void;
|
|
36
|
-
refresh: () => void;
|
|
37
|
-
prefetch: (href: string) => void;
|
|
38
|
-
isNavigating: boolean;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
interface LinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {
|
|
42
|
-
href: string;
|
|
43
|
-
replace?: boolean;
|
|
44
|
-
scroll?: boolean;
|
|
45
|
-
prefetch?: boolean;
|
|
46
|
-
children: React.ReactNode;
|
|
47
|
-
}
|
|
48
|
-
declare const Link: React.ForwardRefExoticComponent<LinkProps & React.RefAttributes<HTMLAnchorElement>>;
|
|
49
|
-
interface NavLinkProps extends LinkProps {
|
|
50
|
-
activeClassName?: string;
|
|
51
|
-
inactiveClassName?: string;
|
|
52
|
-
exact?: boolean;
|
|
53
|
-
}
|
|
54
|
-
declare const NavLink: React.ForwardRefExoticComponent<NavLinkProps & React.RefAttributes<HTMLAnchorElement>>;
|
|
55
|
-
|
|
56
|
-
interface ErrorBoundaryProps {
|
|
57
|
-
children: ReactNode;
|
|
58
|
-
fallback?: React.ComponentType<ErrorProps>;
|
|
59
|
-
onError?: (error: Error, errorInfo: React.ErrorInfo) => void;
|
|
60
|
-
}
|
|
61
|
-
interface ErrorBoundaryState {
|
|
62
|
-
hasError: boolean;
|
|
63
|
-
error: Error | null;
|
|
64
|
-
}
|
|
65
|
-
declare class RouteErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
66
|
-
constructor(props: ErrorBoundaryProps);
|
|
67
|
-
static getDerivedStateFromError(error: Error): ErrorBoundaryState;
|
|
68
|
-
componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void;
|
|
69
|
-
reset: () => void;
|
|
70
|
-
render(): string | number | boolean | Iterable<React.ReactNode> | react_jsx_runtime.JSX.Element | null | undefined;
|
|
71
|
-
}
|
|
72
|
-
declare function DefaultErrorComponent({ error, reset }: ErrorProps): react_jsx_runtime.JSX.Element;
|
|
73
|
-
|
|
74
|
-
interface RouteLoadingBoundaryProps {
|
|
75
|
-
children: ReactNode;
|
|
76
|
-
fallback?: ReactNode;
|
|
77
|
-
}
|
|
78
|
-
declare function RouteLoadingBoundary({ children, fallback }: RouteLoadingBoundaryProps): react_jsx_runtime.JSX.Element;
|
|
79
|
-
declare function DefaultLoadingComponent(): react_jsx_runtime.JSX.Element;
|
|
80
|
-
declare function Skeleton({ className }: {
|
|
81
|
-
className?: string;
|
|
82
|
-
}): react_jsx_runtime.JSX.Element;
|
|
83
|
-
declare function SkeletonText({ lines, className }: {
|
|
84
|
-
lines?: number;
|
|
85
|
-
className?: string;
|
|
86
|
-
}): react_jsx_runtime.JSX.Element;
|
|
87
|
-
declare function SkeletonCard({ className }: {
|
|
88
|
-
className?: string;
|
|
89
|
-
}): react_jsx_runtime.JSX.Element;
|
|
90
|
-
|
|
91
|
-
interface NotFoundBoundaryProps {
|
|
92
|
-
children: React.ReactNode;
|
|
93
|
-
fallback?: React.ComponentType<NotFoundProps>;
|
|
94
|
-
show404?: boolean;
|
|
95
|
-
}
|
|
96
|
-
declare function NotFoundBoundary({ children, fallback: Fallback, show404 }: NotFoundBoundaryProps): react_jsx_runtime.JSX.Element;
|
|
97
|
-
declare function DefaultNotFoundComponent(): react_jsx_runtime.JSX.Element;
|
|
98
|
-
declare function notFound(): never;
|
|
99
|
-
declare class NotFoundError extends Error {
|
|
100
|
-
constructor();
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
interface MetadataContextValue {
|
|
104
|
-
metadata: Metadata | null;
|
|
105
|
-
rootMetadata: Metadata | null;
|
|
106
|
-
setMetadata: (metadata: Metadata | null) => void;
|
|
107
|
-
}
|
|
108
|
-
interface MetadataProviderProps {
|
|
109
|
-
children: React.ReactNode;
|
|
110
|
-
rootMetadata?: Metadata;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Provider component that manages metadata state
|
|
114
|
-
*/
|
|
115
|
-
declare function MetadataProvider({ children, rootMetadata }: MetadataProviderProps): react_jsx_runtime.JSX.Element;
|
|
116
|
-
/**
|
|
117
|
-
* Hook to access and update metadata
|
|
118
|
-
*/
|
|
119
|
-
declare function useMetadata(): MetadataContextValue;
|
|
120
|
-
/**
|
|
121
|
-
* Hook to apply metadata for A page component
|
|
122
|
-
*/
|
|
123
|
-
declare function usePageMetadata(metadata: Metadata | undefined): void;
|
|
124
|
-
interface MetadataHeadProps {
|
|
125
|
-
metadata: Metadata | null;
|
|
126
|
-
fallback?: Metadata;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Component that updates document head with metadata
|
|
130
|
-
* Works at runtime for SPA navigation
|
|
131
|
-
*/
|
|
132
|
-
declare function MetadataHead({ metadata, fallback }: MetadataHeadProps): null;
|
|
133
|
-
/**
|
|
134
|
-
* Generate HTML string for metadata (used in SSG)
|
|
135
|
-
*/
|
|
136
|
-
declare function generateMetadataHtml(metadata: Metadata): string;
|
|
137
|
-
|
|
138
|
-
export { DefaultErrorComponent, DefaultLoadingComponent, DefaultNotFoundComponent, ErrorProps, Link, Metadata, MetadataHead, MetadataProvider, NavLink, NavigateOptions, NotFoundBoundary, NotFoundError, NotFoundProps, OlovaRouter, RouteConfig, RouteErrorBoundary, RouteLoadingBoundary, Skeleton, SkeletonCard, SkeletonText, generateMetadataHtml, notFound, setSSRContext, useMetadata, useOlovaRouter, usePageMetadata, useParams, usePathname, useRouter, useSearchParams };
|
package/dist/index.d.ts
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import React, { AnchorHTMLAttributes, Component, ReactNode } from 'react';
|
|
3
|
-
import { R as RouteConfig, M as Metadata, N as NavigateOptions, O as OlovaRouterContextValue, E as ErrorProps, a as NotFoundProps } from './types-BT6YsBGO.js';
|
|
4
|
-
export { h as GenerateMetadata, G as GenerateStaticParams, L as LayoutProps, f as LoadingProps, e as OlovaOptions, P as PageProps, i as RouteManifest, b as RouteMatch, g as RouteMetadata, c as RouteNode, d as RouteSegment, S as StaticParams } from './types-BT6YsBGO.js';
|
|
5
|
-
|
|
6
|
-
interface OlovaRouterProps {
|
|
7
|
-
routes: RouteConfig[];
|
|
8
|
-
basePath?: string;
|
|
9
|
-
defaultLoading?: React.ReactNode;
|
|
10
|
-
defaultNotFound?: React.ComponentType;
|
|
11
|
-
defaultError?: React.ComponentType<{
|
|
12
|
-
error: Error;
|
|
13
|
-
reset: () => void;
|
|
14
|
-
}>;
|
|
15
|
-
/** Root metadata to use as fallback when route has no metadata */
|
|
16
|
-
rootMetadata?: Metadata;
|
|
17
|
-
/** Metadata map by route path */
|
|
18
|
-
routeMetadata?: Record<string, Metadata>;
|
|
19
|
-
}
|
|
20
|
-
declare function OlovaRouter({ routes, basePath, defaultLoading, defaultNotFound, defaultError, rootMetadata, routeMetadata, }: OlovaRouterProps): react_jsx_runtime.JSX.Element;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Set the SSR context value before rendering a page during SSG
|
|
24
|
-
* @internal Used by SSG renderer
|
|
25
|
-
*/
|
|
26
|
-
declare function setSSRContext(pathname: string, params?: Record<string, string>): void;
|
|
27
|
-
declare function useOlovaRouter(): OlovaRouterContextValue;
|
|
28
|
-
declare function usePathname(): string;
|
|
29
|
-
declare function useParams<T extends Record<string, string> = Record<string, string>>(): T;
|
|
30
|
-
declare function useSearchParams(): URLSearchParams;
|
|
31
|
-
declare function useRouter(): {
|
|
32
|
-
push: (to: string, options?: NavigateOptions) => void;
|
|
33
|
-
replace: (to: string, options?: NavigateOptions) => void;
|
|
34
|
-
back: () => void;
|
|
35
|
-
forward: () => void;
|
|
36
|
-
refresh: () => void;
|
|
37
|
-
prefetch: (href: string) => void;
|
|
38
|
-
isNavigating: boolean;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
interface LinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {
|
|
42
|
-
href: string;
|
|
43
|
-
replace?: boolean;
|
|
44
|
-
scroll?: boolean;
|
|
45
|
-
prefetch?: boolean;
|
|
46
|
-
children: React.ReactNode;
|
|
47
|
-
}
|
|
48
|
-
declare const Link: React.ForwardRefExoticComponent<LinkProps & React.RefAttributes<HTMLAnchorElement>>;
|
|
49
|
-
interface NavLinkProps extends LinkProps {
|
|
50
|
-
activeClassName?: string;
|
|
51
|
-
inactiveClassName?: string;
|
|
52
|
-
exact?: boolean;
|
|
53
|
-
}
|
|
54
|
-
declare const NavLink: React.ForwardRefExoticComponent<NavLinkProps & React.RefAttributes<HTMLAnchorElement>>;
|
|
55
|
-
|
|
56
|
-
interface ErrorBoundaryProps {
|
|
57
|
-
children: ReactNode;
|
|
58
|
-
fallback?: React.ComponentType<ErrorProps>;
|
|
59
|
-
onError?: (error: Error, errorInfo: React.ErrorInfo) => void;
|
|
60
|
-
}
|
|
61
|
-
interface ErrorBoundaryState {
|
|
62
|
-
hasError: boolean;
|
|
63
|
-
error: Error | null;
|
|
64
|
-
}
|
|
65
|
-
declare class RouteErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
66
|
-
constructor(props: ErrorBoundaryProps);
|
|
67
|
-
static getDerivedStateFromError(error: Error): ErrorBoundaryState;
|
|
68
|
-
componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void;
|
|
69
|
-
reset: () => void;
|
|
70
|
-
render(): string | number | boolean | Iterable<React.ReactNode> | react_jsx_runtime.JSX.Element | null | undefined;
|
|
71
|
-
}
|
|
72
|
-
declare function DefaultErrorComponent({ error, reset }: ErrorProps): react_jsx_runtime.JSX.Element;
|
|
73
|
-
|
|
74
|
-
interface RouteLoadingBoundaryProps {
|
|
75
|
-
children: ReactNode;
|
|
76
|
-
fallback?: ReactNode;
|
|
77
|
-
}
|
|
78
|
-
declare function RouteLoadingBoundary({ children, fallback }: RouteLoadingBoundaryProps): react_jsx_runtime.JSX.Element;
|
|
79
|
-
declare function DefaultLoadingComponent(): react_jsx_runtime.JSX.Element;
|
|
80
|
-
declare function Skeleton({ className }: {
|
|
81
|
-
className?: string;
|
|
82
|
-
}): react_jsx_runtime.JSX.Element;
|
|
83
|
-
declare function SkeletonText({ lines, className }: {
|
|
84
|
-
lines?: number;
|
|
85
|
-
className?: string;
|
|
86
|
-
}): react_jsx_runtime.JSX.Element;
|
|
87
|
-
declare function SkeletonCard({ className }: {
|
|
88
|
-
className?: string;
|
|
89
|
-
}): react_jsx_runtime.JSX.Element;
|
|
90
|
-
|
|
91
|
-
interface NotFoundBoundaryProps {
|
|
92
|
-
children: React.ReactNode;
|
|
93
|
-
fallback?: React.ComponentType<NotFoundProps>;
|
|
94
|
-
show404?: boolean;
|
|
95
|
-
}
|
|
96
|
-
declare function NotFoundBoundary({ children, fallback: Fallback, show404 }: NotFoundBoundaryProps): react_jsx_runtime.JSX.Element;
|
|
97
|
-
declare function DefaultNotFoundComponent(): react_jsx_runtime.JSX.Element;
|
|
98
|
-
declare function notFound(): never;
|
|
99
|
-
declare class NotFoundError extends Error {
|
|
100
|
-
constructor();
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
interface MetadataContextValue {
|
|
104
|
-
metadata: Metadata | null;
|
|
105
|
-
rootMetadata: Metadata | null;
|
|
106
|
-
setMetadata: (metadata: Metadata | null) => void;
|
|
107
|
-
}
|
|
108
|
-
interface MetadataProviderProps {
|
|
109
|
-
children: React.ReactNode;
|
|
110
|
-
rootMetadata?: Metadata;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Provider component that manages metadata state
|
|
114
|
-
*/
|
|
115
|
-
declare function MetadataProvider({ children, rootMetadata }: MetadataProviderProps): react_jsx_runtime.JSX.Element;
|
|
116
|
-
/**
|
|
117
|
-
* Hook to access and update metadata
|
|
118
|
-
*/
|
|
119
|
-
declare function useMetadata(): MetadataContextValue;
|
|
120
|
-
/**
|
|
121
|
-
* Hook to apply metadata for A page component
|
|
122
|
-
*/
|
|
123
|
-
declare function usePageMetadata(metadata: Metadata | undefined): void;
|
|
124
|
-
interface MetadataHeadProps {
|
|
125
|
-
metadata: Metadata | null;
|
|
126
|
-
fallback?: Metadata;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Component that updates document head with metadata
|
|
130
|
-
* Works at runtime for SPA navigation
|
|
131
|
-
*/
|
|
132
|
-
declare function MetadataHead({ metadata, fallback }: MetadataHeadProps): null;
|
|
133
|
-
/**
|
|
134
|
-
* Generate HTML string for metadata (used in SSG)
|
|
135
|
-
*/
|
|
136
|
-
declare function generateMetadataHtml(metadata: Metadata): string;
|
|
137
|
-
|
|
138
|
-
export { DefaultErrorComponent, DefaultLoadingComponent, DefaultNotFoundComponent, ErrorProps, Link, Metadata, MetadataHead, MetadataProvider, NavLink, NavigateOptions, NotFoundBoundary, NotFoundError, NotFoundProps, OlovaRouter, RouteConfig, RouteErrorBoundary, RouteLoadingBoundary, Skeleton, SkeletonCard, SkeletonText, generateMetadataHtml, notFound, setSSRContext, useMetadata, useOlovaRouter, usePageMetadata, useParams, usePathname, useRouter, useSearchParams };
|