olova 2.0.61 → 2.0.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +42 -61
  3. package/dist/compiler.d.ts +44 -0
  4. package/dist/compiler.js +2139 -0
  5. package/dist/compiler.js.map +1 -0
  6. package/dist/core.d.ts +4 -0
  7. package/dist/core.js +859 -0
  8. package/dist/core.js.map +1 -0
  9. package/dist/global.d.ts +15 -0
  10. package/dist/global.js +226 -0
  11. package/dist/global.js.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +2302 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/runtime.d.ts +89 -0
  16. package/dist/runtime.js +633 -0
  17. package/dist/runtime.js.map +1 -0
  18. package/dist/signals-core-BdfWh1Yt.d.ts +43 -0
  19. package/dist/vite.d.ts +5 -0
  20. package/dist/vite.js +2302 -0
  21. package/dist/vite.js.map +1 -0
  22. package/package.json +83 -65
  23. package/dist/chunk-D7SIC5TC.js +0 -367
  24. package/dist/chunk-D7SIC5TC.js.map +0 -1
  25. package/dist/entry-server.cjs +0 -120
  26. package/dist/entry-server.cjs.map +0 -1
  27. package/dist/entry-server.js +0 -115
  28. package/dist/entry-server.js.map +0 -1
  29. package/dist/entry-worker.cjs +0 -133
  30. package/dist/entry-worker.cjs.map +0 -1
  31. package/dist/entry-worker.js +0 -127
  32. package/dist/entry-worker.js.map +0 -1
  33. package/dist/main.cjs +0 -18
  34. package/dist/main.cjs.map +0 -1
  35. package/dist/main.js +0 -16
  36. package/dist/main.js.map +0 -1
  37. package/dist/olova.cjs +0 -1680
  38. package/dist/olova.cjs.map +0 -1
  39. package/dist/olova.d.cts +0 -72
  40. package/dist/olova.d.ts +0 -72
  41. package/dist/olova.js +0 -1321
  42. package/dist/olova.js.map +0 -1
  43. package/dist/performance.cjs +0 -386
  44. package/dist/performance.cjs.map +0 -1
  45. package/dist/performance.js +0 -3
  46. package/dist/performance.js.map +0 -1
  47. package/dist/router.cjs +0 -646
  48. package/dist/router.cjs.map +0 -1
  49. package/dist/router.d.cts +0 -113
  50. package/dist/router.d.ts +0 -113
  51. package/dist/router.js +0 -632
  52. package/dist/router.js.map +0 -1
  53. package/main.tsx +0 -76
  54. package/olova.ts +0 -619
  55. package/src/entry-server.tsx +0 -165
  56. package/src/entry-worker.tsx +0 -201
  57. package/src/generator/index.ts +0 -409
  58. package/src/hydration/flight.ts +0 -320
  59. package/src/hydration/index.ts +0 -12
  60. package/src/hydration/types.ts +0 -225
  61. package/src/logger.ts +0 -182
  62. package/src/main.tsx +0 -24
  63. package/src/performance.ts +0 -488
  64. package/src/plugin/index.ts +0 -204
  65. package/src/router/ErrorBoundary.tsx +0 -145
  66. package/src/router/Link.tsx +0 -117
  67. package/src/router/OlovaRouter.tsx +0 -354
  68. package/src/router/Outlet.tsx +0 -8
  69. package/src/router/context.ts +0 -117
  70. package/src/router/index.ts +0 -29
  71. package/src/router/matching.ts +0 -63
  72. package/src/router/router.tsx +0 -23
  73. package/src/router/search-params.ts +0 -29
  74. package/src/scanner/index.ts +0 -114
  75. package/src/types/index.ts +0 -190
  76. package/src/utils/export.ts +0 -85
  77. package/src/utils/index.ts +0 -4
  78. package/src/utils/naming.ts +0 -54
  79. package/src/utils/path.ts +0 -45
  80. package/tsup.config.ts +0 -35
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/router/context.ts","../src/router/ErrorBoundary.tsx","../src/router/Link.tsx","../src/router/matching.ts","../src/router/search-params.ts","../src/router/OlovaRouter.tsx","../src/router/Outlet.tsx"],"names":["createContext","useContext","useMemo","useRef","useEffect","useCallback","Component","jsxs","jsx","useState","useTransition","content","Suspense","Fragment"],"mappings":"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","file":"router.cjs","sourcesContent":["import { createContext, useContext, useMemo, useEffect, useRef, useCallback } from 'react';\r\nimport type { RouterContextType, OutletContextType, NavigateOptions } from '../types';\r\n\r\nexport const RouterContext = createContext<RouterContextType | null>(null);\r\n\r\nexport const OutletContext = createContext<OutletContextType | null>(null);\r\n\r\nconst ssrRouter: RouterContextType = {\r\n currentPath: '/',\r\n params: {},\r\n searchParams: {},\r\n navigate: () => {},\r\n push: () => {},\r\n replace: () => {},\r\n back: () => {},\r\n forward: () => {},\r\n refresh: () => {},\r\n setSearchParams: () => {},\r\n isNavigating: false,\r\n prefetch: () => {},\r\n};\r\n\r\nexport function useRouter() {\r\n const context = useContext(RouterContext);\r\n if (!context) {\r\n if (typeof window === 'undefined') return ssrRouter;\r\n throw new Error('useRouter must be used within OlovaRouter');\r\n }\r\n return context;\r\n}\r\n\r\nexport function useParams<T extends Record<string, string> = Record<string, string>>(): T {\r\n const context = useContext(RouterContext);\r\n return (context?.params || {}) as T;\r\n}\r\n\r\nexport function useSearchParams(): URLSearchParams {\r\n const context = useContext(RouterContext);\r\n const searchParams = context?.searchParams || {};\r\n\r\n return useMemo(() => {\r\n const params = new URLSearchParams();\r\n Object.entries(searchParams).forEach(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n value.forEach(v => params.append(key, v));\r\n } else {\r\n params.set(key, value);\r\n }\r\n });\r\n return params;\r\n }, [searchParams]);\r\n}\r\n\r\nexport function usePathname(): string {\r\n const context = useContext(RouterContext);\r\n if (!context) {\r\n if (typeof window === 'undefined') return '/';\r\n throw new Error('usePathname must be used within OlovaRouter');\r\n }\r\n return context.currentPath;\r\n}\r\n\r\nexport function useSelectedLayoutSegment(): string | null {\r\n const context = useContext(RouterContext);\r\n if (!context) return null;\r\n const segments = context.currentPath.split('/').filter(Boolean);\r\n return segments[0] || null;\r\n}\r\n\r\nexport function useSelectedLayoutSegments(): string[] {\r\n const context = useContext(RouterContext);\r\n if (!context) return [];\r\n return context.currentPath.split('/').filter(Boolean);\r\n}\r\n\r\nexport function useIsNavigating(): boolean {\r\n const context = useContext(RouterContext);\r\n return context?.isNavigating ?? false;\r\n}\r\n\r\nexport function useNavigationEvent(callback: (from: string, to: string) => void) {\r\n const context = useContext(RouterContext);\r\n const currentPath = context?.currentPath;\r\n const prevPath = useRef(currentPath || '/');\r\n\r\n useEffect(() => {\r\n if (!currentPath) return;\r\n if (prevPath.current !== currentPath) {\r\n callback(prevPath.current, currentPath);\r\n prevPath.current = currentPath;\r\n }\r\n }, [currentPath, callback]);\r\n}\r\n\r\nexport function redirect(path: string, options?: NavigateOptions): never {\r\n if (typeof window !== 'undefined') {\r\n if (options?.replace) {\r\n window.history.replaceState({}, '', path);\r\n } else {\r\n window.history.pushState({}, '', path);\r\n }\r\n window.dispatchEvent(new PopStateEvent('popstate'));\r\n }\r\n throw new Error(`REDIRECT:${path}`);\r\n}\r\n\r\nexport function useRedirect() {\r\n const { navigate, replace } = useRouter();\r\n\r\n return useCallback((path: string, options?: NavigateOptions) => {\r\n if (options?.replace) {\r\n replace(path, options);\r\n } else {\r\n navigate(path, options);\r\n }\r\n }, [navigate, replace]);\r\n}\r\n","import { Component, type ComponentType, type ErrorInfo, type ReactNode } from 'react';\r\n\r\ninterface ErrorBoundaryProps {\r\n children: ReactNode;\r\n fallback?: ReactNode;\r\n}\r\n\r\ninterface ErrorBoundaryState {\r\n hasError: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport class ErrorBoundary 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: ErrorInfo) {\r\n console.error('[olova] Uncaught error:', error, errorInfo);\r\n }\r\n\r\n handleReset = () => {\r\n this.setState({ hasError: false, error: null });\r\n };\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n if (this.props.fallback) {\r\n return this.props.fallback;\r\n }\r\n\r\n return (\r\n <div style={{\r\n padding: '2rem',\r\n maxWidth: '600px',\r\n margin: '4rem auto',\r\n fontFamily: 'system-ui, -apple-system, sans-serif',\r\n textAlign: 'center',\r\n }}>\r\n <h1 style={{ fontSize: '2rem', marginBottom: '1rem', color: '#e11d48' }}>\r\n Something went wrong\r\n </h1>\r\n <p style={{ color: '#6b7280', marginBottom: '1.5rem' }}>\r\n An unexpected error occurred while rendering this page.\r\n </p>\r\n {this.state.error && (\r\n <pre style={{\r\n padding: '1rem',\r\n backgroundColor: '#f3f4f6',\r\n borderRadius: '0.5rem',\r\n fontSize: '0.875rem',\r\n textAlign: 'left',\r\n overflow: 'auto',\r\n marginBottom: '1.5rem',\r\n color: '#374151',\r\n }}>\r\n {this.state.error.message}\r\n </pre>\r\n )}\r\n <div style={{ display: 'flex', gap: '0.75rem', justifyContent: 'center' }}>\r\n <button\r\n onClick={this.handleReset}\r\n style={{\r\n padding: '0.5rem 1.5rem',\r\n backgroundColor: '#3b82f6',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer',\r\n fontSize: '0.875rem',\r\n }}\r\n >\r\n Try Again\r\n </button>\r\n <button\r\n onClick={() => window.location.reload()}\r\n style={{\r\n padding: '0.5rem 1.5rem',\r\n backgroundColor: 'transparent',\r\n color: '#3b82f6',\r\n border: '1px solid #3b82f6',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer',\r\n fontSize: '0.875rem',\r\n }}\r\n >\r\n Reload Page\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\ninterface RouteErrorBoundaryProps {\r\n children: ReactNode;\r\n fallbackComponent: ComponentType<{ error: Error; reset: () => void }>;\r\n routePath: string;\r\n}\r\n\r\ninterface RouteErrorBoundaryState {\r\n hasError: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport class RouteErrorBoundary extends Component<RouteErrorBoundaryProps, RouteErrorBoundaryState> {\r\n constructor(props: RouteErrorBoundaryProps) {\r\n super(props);\r\n this.state = { hasError: false, error: null };\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): RouteErrorBoundaryState {\r\n return { hasError: true, error };\r\n }\r\n\r\n componentDidUpdate(prevProps: RouteErrorBoundaryProps) {\r\n if (prevProps.routePath !== this.props.routePath && this.state.hasError) {\r\n this.setState({ hasError: false, error: null });\r\n }\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\r\n console.error('[olova] Route error:', error, errorInfo);\r\n }\r\n\r\n handleReset = () => {\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.fallbackComponent;\r\n return <FallbackComponent error={this.state.error} reset={this.handleReset} />;\r\n }\r\n return this.props.children;\r\n }\r\n}\r\n","import { useCallback, useEffect, useRef, type AnchorHTMLAttributes, type ReactNode } from 'react';\r\nimport { useRouter } from './context';\r\n\r\ntype ResolveSegment<S extends string> =\r\n S extends `:${string}` ? string :\r\n S extends '*' ? string :\r\n S;\r\n\r\ntype ResolvePathSegments<Path extends string> =\r\n Path extends `${infer Segment}/${infer Rest}`\r\n ? `${ResolveSegment<Segment>}/${ResolvePathSegments<Rest>}`\r\n : ResolveSegment<Path>;\r\n\r\nexport type ResolveRoutePath<Path extends string> =\r\n Path extends `${infer Base}/*`\r\n ? `${ResolvePathSegments<Base>}/${string}`\r\n : ResolvePathSegments<Path>;\r\n\r\ntype ResolveRoutes<T extends string> = T extends string ? ResolveRoutePath<T> : never;\r\n\r\ninterface LinkProps<T extends string> extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\r\n href: ResolveRoutes<T>;\r\n children: ReactNode;\r\n className?: string;\r\n activeClassName?: string;\r\n exactActiveClassName?: string;\r\n prefetch?: boolean | 'hover' | 'viewport';\r\n replace?: boolean;\r\n scroll?: boolean;\r\n target?: string;\r\n}\r\n\r\nfunction isActive(currentPath: string, href: string, exact: boolean): boolean {\r\n const normalizedCurrent = currentPath.replace(/\\/$/, '') || '/';\r\n const normalizedHref = (href.split('?')[0]).replace(/\\/$/, '') || '/';\r\n if (exact) return normalizedCurrent === normalizedHref;\r\n if (normalizedHref === '/') return normalizedCurrent === '/';\r\n return normalizedCurrent === normalizedHref || normalizedCurrent.startsWith(normalizedHref + '/');\r\n}\r\n\r\nexport function createLink<T extends string>() {\r\n const Link = ({\r\n href,\r\n children,\r\n className,\r\n activeClassName,\r\n exactActiveClassName,\r\n prefetch = 'hover',\r\n replace: shouldReplace = false,\r\n scroll = true,\r\n target,\r\n ...rest\r\n }: LinkProps<T>) => {\r\n const { push, replace, currentPath, prefetch: prefetchRoute } = useRouter();\r\n const isSSR = typeof window === 'undefined';\r\n const linkRef = useRef<HTMLAnchorElement>(null);\r\n const prefetched = useRef(false);\r\n\r\n const isExactActive = isActive(currentPath, href, true);\r\n const isPartialActive = isActive(currentPath, href, false);\r\n\r\n const computedClassName = [\r\n className,\r\n isPartialActive && activeClassName,\r\n isExactActive && exactActiveClassName,\r\n ].filter(Boolean).join(' ') || undefined;\r\n\r\n const handlePrefetch = useCallback(() => {\r\n if (!prefetched.current && prefetch !== false) {\r\n prefetched.current = true;\r\n prefetchRoute(href);\r\n }\r\n }, [href, prefetch, prefetchRoute]);\r\n\r\n useEffect(() => {\r\n if (isSSR || prefetch !== 'viewport' || !linkRef.current) return;\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n if (entries[0]?.isIntersecting) {\r\n handlePrefetch();\r\n observer.disconnect();\r\n }\r\n },\r\n { rootMargin: '200px' }\r\n );\r\n observer.observe(linkRef.current);\r\n return () => observer.disconnect();\r\n }, [isSSR, prefetch, handlePrefetch]);\r\n\r\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\r\n if (rest.onClick) rest.onClick(e);\r\n if (e.defaultPrevented) return;\r\n if (target === '_blank' || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\r\n e.preventDefault();\r\n const navFn = shouldReplace ? replace : push;\r\n navFn(href, { scroll });\r\n };\r\n\r\n return (\r\n <a\r\n ref={linkRef}\r\n href={href}\r\n className={computedClassName}\r\n data-active={isPartialActive || undefined}\r\n data-exact-active={isExactActive || undefined}\r\n onClick={isSSR ? undefined : handleClick}\r\n onMouseEnter={isSSR || prefetch !== 'hover' ? undefined : handlePrefetch}\r\n onFocus={isSSR || prefetch !== 'hover' ? undefined : handlePrefetch}\r\n target={target}\r\n {...rest}\r\n >\r\n {children}\r\n </a>\r\n );\r\n };\r\n return Link;\r\n}\r\n","import type { ComponentType } from 'react';\r\nimport type { NotFoundPageConfig } from '../types';\r\n\r\nexport function matchRoute(patternParts: string[], pathParts: string[]) {\r\n const params: Record<string, string> = {};\r\n\r\n // Filter out empty parts (handles trailing slashes)\r\n const filteredPathParts = pathParts.filter(Boolean);\r\n const filteredPatternParts = patternParts.filter(Boolean);\r\n\r\n for (let i = 0; i < filteredPatternParts.length; i++) {\r\n const patternPart = filteredPatternParts[i];\r\n const pathPart = filteredPathParts[i];\r\n\r\n if (patternPart === '*') {\r\n params['*'] = filteredPathParts.slice(i).join('/');\r\n return { match: true, params };\r\n }\r\n\r\n if (pathPart === undefined) {\r\n return { match: false, params: {} };\r\n }\r\n\r\n if (patternPart.startsWith(':')) {\r\n params[patternPart.slice(1)] = decodeURIComponent(pathPart);\r\n } else if (patternPart !== pathPart) {\r\n return { match: false, params: {} };\r\n }\r\n }\r\n\r\n if (filteredPathParts.length > filteredPatternParts.length) {\r\n return { match: false, params: {} };\r\n }\r\n\r\n return { match: true, params };\r\n}\r\n\r\nexport function matchLayoutScope(layoutPath: string, pathname: string): boolean {\r\n if (layoutPath === '/') return true;\r\n const normalizedPathname = pathname.replace(/\\/+$/, '') || '/';\r\n const normalizedLayout = layoutPath.replace(/\\/+$/, '') || '/';\r\n return normalizedPathname === normalizedLayout || normalizedPathname.startsWith(normalizedLayout + '/');\r\n}\r\n\r\nexport function findNotFoundPage(path: string, notFoundPages: NotFoundPageConfig[]): ComponentType | null {\r\n if (!notFoundPages || notFoundPages.length === 0) return null;\r\n\r\n const normalizedPath = path.replace(/\\/+$/, '') || '/';\r\n\r\n const sorted = [...notFoundPages].sort((a, b) =>\r\n b.pathPrefix.length - a.pathPrefix.length\r\n );\r\n\r\n for (const nf of sorted) {\r\n if (nf.pathPrefix === '') {\r\n return nf.component;\r\n }\r\n if (normalizedPath === nf.pathPrefix || normalizedPath.startsWith(nf.pathPrefix + '/')) {\r\n return nf.component;\r\n }\r\n }\r\n return null;\r\n}\r\n","import type { SearchParams } from '../types';\r\n\r\nexport function parseSearchParams(search: string): SearchParams {\r\n const params: SearchParams = {};\r\n const urlParams = new URLSearchParams(search);\r\n\r\n for (const key of urlParams.keys()) {\r\n const values = urlParams.getAll(key);\r\n params[key] = values.length === 1 ? values[0] : values;\r\n }\r\n\r\n return params;\r\n}\r\n\r\nexport function buildSearchString(params: Record<string, string | string[] | null>): string {\r\n const urlParams = new URLSearchParams();\r\n\r\n for (const [key, value] of Object.entries(params)) {\r\n if (value === null || value === undefined) continue;\r\n if (Array.isArray(value)) {\r\n value.forEach(v => urlParams.append(key, v));\r\n } else {\r\n urlParams.set(key, value);\r\n }\r\n }\r\n\r\n const str = urlParams.toString();\r\n return str ? `?${str}` : '';\r\n}\r\n","import { Suspense, useCallback, useEffect, useMemo, useRef, useState, useTransition, type ComponentType, type ReactNode } from 'react';\r\nimport type { LayoutRoute, Metadata, NavigateOptions, NotFoundPageConfig, Route, SearchParams, SetSearchParamsOptions } from '../types';\r\nimport { OutletContext, RouterContext } from './context';\r\nimport { ErrorBoundary, RouteErrorBoundary } from './ErrorBoundary';\r\nimport { findNotFoundPage, matchLayoutScope, matchRoute } from './matching';\r\nimport { buildSearchString, parseSearchParams } from './search-params';\r\n\r\nfunction normalizePath(path: string): string {\r\n if (path === '/') return path;\r\n return path.replace(/\\/+$/, '') || '/';\r\n}\r\n\r\ninterface OlovaRouterProps {\r\n routes: Route[];\r\n layouts?: LayoutRoute[];\r\n notFoundPages?: NotFoundPageConfig[];\r\n notFound?: ReactNode;\r\n loadingFallback?: ReactNode;\r\n initialPath?: string;\r\n onNavigate?: (from: string, to: string) => void;\r\n onBeforeNavigate?: (from: string, to: string) => boolean | void;\r\n}\r\n\r\nexport function OlovaRouter({\r\n routes,\r\n layouts = [],\r\n notFoundPages = [],\r\n notFound = <div>404 - Not Found</div>,\r\n loadingFallback = <div>Loading...</div>,\r\n initialPath,\r\n onNavigate,\r\n onBeforeNavigate,\r\n}: OlovaRouterProps) {\r\n const isSSR = typeof window === 'undefined';\r\n const [currentPath, setCurrentPath] = useState(() => normalizePath(initialPath || (isSSR ? '/' : window.location.pathname)));\r\n const [searchParams, setSearchParamsState] = useState<SearchParams>(() =>\r\n isSSR ? {} : parseSearchParams(window.location.search)\r\n );\r\n const [isPending, startTransition] = useTransition();\r\n const prevPathRef = useRef(currentPath);\r\n\r\n const [defaultTitle] = useState(() => isSSR ? '' : document.title);\r\n\r\n useEffect(() => {\r\n if (isSSR) return;\r\n const onPopState = () => {\r\n const newPath = normalizePath(window.location.pathname);\r\n startTransition(() => {\r\n setCurrentPath(newPath);\r\n setSearchParamsState(parseSearchParams(window.location.search));\r\n });\r\n };\r\n window.addEventListener('popstate', onPopState);\r\n return () => window.removeEventListener('popstate', onPopState);\r\n }, [isSSR]);\r\n\r\n const performNavigation = useCallback((path: string, options: NavigateOptions = {}, historyMethod: 'push' | 'replace' = 'push') => {\r\n if (isSSR) return;\r\n const { scroll = true } = options;\r\n\r\n const normalizedPath = normalizePath(path.split('?')[0].split('#')[0]);\r\n const hash = path.includes('#') ? '#' + path.split('#')[1] : '';\r\n const search = path.includes('?') ? '?' + path.split('?')[1].split('#')[0] : '';\r\n const fullUrl = normalizedPath + search + hash;\r\n\r\n if (onBeforeNavigate) {\r\n const result = onBeforeNavigate(currentPath, normalizedPath);\r\n if (result === false) return;\r\n }\r\n\r\n const prevPath = currentPath;\r\n\r\n if (historyMethod === 'replace') {\r\n window.history.replaceState({}, '', fullUrl);\r\n } else {\r\n window.history.pushState({}, '', fullUrl);\r\n }\r\n\r\n startTransition(() => {\r\n setCurrentPath(normalizedPath);\r\n setSearchParamsState(parseSearchParams(search));\r\n });\r\n\r\n if (scroll) {\r\n if (hash) {\r\n const el = document.getElementById(hash.slice(1));\r\n if (el) {\r\n el.scrollIntoView({ behavior: 'smooth' });\r\n } else {\r\n window.scrollTo(0, 0);\r\n }\r\n } else {\r\n window.scrollTo(0, 0);\r\n }\r\n }\r\n\r\n if (onNavigate) {\r\n onNavigate(prevPath, normalizedPath);\r\n }\r\n }, [isSSR, currentPath, onBeforeNavigate, onNavigate]);\r\n\r\n const navigate = useCallback((path: string, options?: NavigateOptions) => {\r\n performNavigation(path, options, options?.replace ? 'replace' : 'push');\r\n }, [performNavigation]);\r\n\r\n const push = useCallback((path: string, options?: NavigateOptions) => {\r\n performNavigation(path, options, 'push');\r\n }, [performNavigation]);\r\n\r\n const replace = useCallback((path: string, options?: NavigateOptions) => {\r\n performNavigation(path, options, 'replace');\r\n }, [performNavigation]);\r\n\r\n const back = useCallback(() => {\r\n if (!isSSR) window.history.back();\r\n }, [isSSR]);\r\n\r\n const forward = useCallback(() => {\r\n if (!isSSR) window.history.forward();\r\n }, [isSSR]);\r\n\r\n const refresh = useCallback(() => {\r\n if (!isSSR) {\r\n startTransition(() => {\r\n setCurrentPath(prev => prev);\r\n });\r\n }\r\n }, [isSSR]);\r\n\r\n const prefetch = useCallback((path: string) => {\r\n // Trigger lazy component import by finding the matching route\r\n const normalizedPath = normalizePath(path.split('?')[0]);\r\n const pathParts = normalizedPath.split('/').filter(Boolean);\r\n for (const route of routes) {\r\n const segments = route.path.split('/').filter(Boolean);\r\n const result = matchRoute(segments, pathParts);\r\n if (result.match && route.component) {\r\n // Accessing the component triggers React.lazy to load the chunk\r\n break;\r\n }\r\n }\r\n }, [routes]);\r\n\r\n const setSearchParams = useCallback((\r\n newParams: Record<string, string | string[] | null>,\r\n options: SetSearchParamsOptions = {}\r\n ) => {\r\n if (isSSR) return;\r\n const { replace: shouldReplace = false, merge = false } = options;\r\n\r\n let finalParams: Record<string, string | string[] | null>;\r\n\r\n if (merge) {\r\n finalParams = { ...searchParams, ...newParams };\r\n for (const key of Object.keys(finalParams)) {\r\n if (finalParams[key] === null) {\r\n delete finalParams[key];\r\n }\r\n }\r\n } else {\r\n finalParams = newParams;\r\n }\r\n\r\n const searchString = buildSearchString(finalParams as Record<string, string | string[] | null>);\r\n const newUrl = currentPath + searchString;\r\n\r\n if (shouldReplace) {\r\n window.history.replaceState({}, '', newUrl);\r\n } else {\r\n window.history.pushState({}, '', newUrl);\r\n }\r\n\r\n setSearchParamsState(parseSearchParams(searchString));\r\n }, [isSSR, searchParams, currentPath]);\r\n\r\n const sortedRoutes = useMemo(() => {\r\n return [...routes]\r\n .sort((a, b) => {\r\n const aHasCatchAll = a.path.includes('*');\r\n const bHasCatchAll = b.path.includes('*');\r\n const aHasDynamic = a.path.includes(':');\r\n const bHasDynamic = b.path.includes(':');\r\n\r\n if (aHasCatchAll && !bHasCatchAll) return 1;\r\n if (!aHasCatchAll && bHasCatchAll) return -1;\r\n if (aHasDynamic && !bHasDynamic) return 1;\r\n if (!aHasDynamic && bHasDynamic) return -1;\r\n return b.path.length - a.path.length;\r\n })\r\n .map(route => ({\r\n ...route,\r\n segments: route.path.split('/').filter(Boolean)\r\n }));\r\n }, [routes]);\r\n\r\n const applyMetadata = useCallback((metadata: Metadata | undefined) => {\r\n if (isSSR) return;\r\n if (metadata?.title) {\r\n document.title = metadata.title;\r\n } else {\r\n document.title = defaultTitle;\r\n }\r\n\r\n const setMetaTag = (name: string, content: string | undefined, attr = 'name') => {\r\n let meta = document.querySelector(`meta[${attr}=\"${name}\"]`);\r\n if (content) {\r\n if (!meta) {\r\n meta = document.createElement('meta');\r\n meta.setAttribute(attr, name);\r\n document.head.appendChild(meta);\r\n }\r\n meta.setAttribute('content', content);\r\n } else if (meta) {\r\n document.head.removeChild(meta);\r\n }\r\n };\r\n\r\n setMetaTag('description', metadata?.description);\r\n setMetaTag('keywords', metadata?.keywords\r\n ? (Array.isArray(metadata.keywords) ? metadata.keywords.join(', ') : metadata.keywords)\r\n : undefined\r\n );\r\n\r\n // Open Graph tags\r\n if (metadata?.openGraph) {\r\n setMetaTag('og:title', metadata.openGraph.title || metadata.title, 'property');\r\n setMetaTag('og:description', metadata.openGraph.description || metadata.description, 'property');\r\n setMetaTag('og:image', metadata.openGraph.image, 'property');\r\n setMetaTag('og:url', metadata.openGraph.url, 'property');\r\n setMetaTag('og:type', metadata.openGraph.type || 'website', 'property');\r\n }\r\n\r\n // Canonical URL\r\n let canonical = document.querySelector('link[rel=\"canonical\"]') as HTMLLinkElement | null;\r\n if (metadata?.openGraph?.url) {\r\n if (!canonical) {\r\n canonical = document.createElement('link');\r\n canonical.setAttribute('rel', 'canonical');\r\n document.head.appendChild(canonical);\r\n }\r\n canonical.setAttribute('href', metadata.openGraph.url);\r\n }\r\n }, [defaultTitle, isSSR]);\r\n\r\n const { currentRoute, MatchedComponent, params } = useMemo(() => {\r\n const pathParts = currentPath.split('/').filter(Boolean);\r\n\r\n for (const route of sortedRoutes) {\r\n if (route.path === '/' && currentPath === '/') {\r\n return {\r\n currentRoute: route,\r\n MatchedComponent: route.component || null,\r\n params: {} as Record<string, string>\r\n };\r\n }\r\n\r\n const result = matchRoute(route.segments, pathParts);\r\n if (result.match) {\r\n return {\r\n currentRoute: route,\r\n MatchedComponent: route.component || null,\r\n params: result.params\r\n };\r\n }\r\n }\r\n return {\r\n currentRoute: null as Route | null,\r\n MatchedComponent: null as ComponentType | null,\r\n params: {} as Record<string, string>\r\n };\r\n }, [sortedRoutes, currentPath]);\r\n\r\n // Track path changes for onNavigate callback\r\n useEffect(() => {\r\n prevPathRef.current = currentPath;\r\n }, [currentPath]);\r\n\r\n useEffect(() => {\r\n if (isSSR) return;\r\n applyMetadata(currentRoute?.metadata);\r\n }, [currentRoute, applyMetadata, isSSR]);\r\n\r\n const matchingLayouts = useMemo(() => {\r\n return layouts\r\n .filter(layout => matchLayoutScope(layout.path, currentPath))\r\n .sort((a, b) => a.path.length - b.path.length);\r\n }, [layouts, currentPath]);\r\n\r\n const FinalComponent = useMemo(() => {\r\n if (MatchedComponent) return MatchedComponent;\r\n return findNotFoundPage(currentPath, notFoundPages);\r\n }, [MatchedComponent, currentPath, notFoundPages]);\r\n\r\n const content = useMemo(() => {\r\n const LoadingComponent = currentRoute?.loading;\r\n const ErrorComponent = currentRoute?.error;\r\n\r\n let result: ReactNode = FinalComponent ? <FinalComponent /> : notFound;\r\n\r\n // Only wrap with Suspense if route has explicit loading component\r\n // (eager imports don't need Suspense fallback)\r\n if (LoadingComponent) {\r\n result = (\r\n <Suspense fallback={<LoadingComponent />}>\r\n {result}\r\n </Suspense>\r\n );\r\n }\r\n\r\n // Wrap with per-route error boundary (error.tsx)\r\n if (ErrorComponent) {\r\n result = (\r\n <RouteErrorBoundary fallbackComponent={ErrorComponent} routePath={currentPath}>\r\n {result}\r\n </RouteErrorBoundary>\r\n );\r\n }\r\n\r\n for (let i = matchingLayouts.length - 1; i >= 0; i--) {\r\n const Layout = matchingLayouts[i].layout;\r\n if (!Layout) continue;\r\n\r\n const wrapped = result;\r\n result = (\r\n <OutletContext.Provider value={{ content: wrapped }}>\r\n <Layout />\r\n </OutletContext.Provider>\r\n );\r\n }\r\n\r\n return result;\r\n }, [FinalComponent, matchingLayouts, notFound, loadingFallback, currentRoute, currentPath]);\r\n\r\n return (\r\n <ErrorBoundary>\r\n <RouterContext.Provider value={{\r\n currentPath,\r\n params,\r\n searchParams,\r\n navigate,\r\n push,\r\n replace,\r\n back,\r\n forward,\r\n refresh,\r\n setSearchParams,\r\n isNavigating: isPending,\r\n prefetch,\r\n }}>\r\n {content}\r\n </RouterContext.Provider>\r\n </ErrorBoundary>\r\n );\r\n}\r\n","import { useContext } from 'react';\r\nimport { OutletContext } from './context';\r\n\r\nexport function Outlet() {\r\n const context = useContext(OutletContext);\r\n if (!context) return null;\r\n return <>{context.content}</>;\r\n}\r\n"]}
package/dist/router.d.cts DELETED
@@ -1,113 +0,0 @@
1
- import { ComponentType, AnchorHTMLAttributes, ReactNode } from 'react';
2
- import * as react_jsx_runtime from 'react/jsx-runtime';
3
-
4
- interface Metadata {
5
- title?: string;
6
- description?: string;
7
- keywords?: string[];
8
- openGraph?: {
9
- title?: string;
10
- description?: string;
11
- image?: string;
12
- url?: string;
13
- type?: string;
14
- };
15
- [key: string]: any;
16
- }
17
- interface NotFoundPageConfig {
18
- pathPrefix: string;
19
- component: ComponentType;
20
- metadata?: Metadata;
21
- }
22
- interface RouteErrorProps {
23
- error: Error;
24
- reset: () => void;
25
- }
26
- interface LoaderContext {
27
- request: Request;
28
- params: Record<string, string>;
29
- }
30
- interface Route {
31
- id?: string;
32
- path: string;
33
- component?: ComponentType;
34
- metadata?: Metadata;
35
- loading?: ComponentType;
36
- error?: ComponentType<RouteErrorProps>;
37
- filePath?: string;
38
- params?: string[];
39
- loader?: (ctx: LoaderContext) => Promise<Record<string, unknown>>;
40
- }
41
- interface LayoutRoute {
42
- path: string;
43
- layout?: ComponentType;
44
- children: Route[];
45
- metadata?: Metadata;
46
- }
47
- type SearchParams = Record<string, string | string[]>;
48
- interface SetSearchParamsOptions {
49
- replace?: boolean;
50
- merge?: boolean;
51
- }
52
- interface NavigateOptions {
53
- scroll?: boolean;
54
- replace?: boolean;
55
- }
56
- interface RouterContextType {
57
- currentPath: string;
58
- params: Record<string, string>;
59
- searchParams: SearchParams;
60
- navigate: (path: string, options?: NavigateOptions) => void;
61
- push: (path: string, options?: NavigateOptions) => void;
62
- replace: (path: string, options?: NavigateOptions) => void;
63
- back: () => void;
64
- forward: () => void;
65
- refresh: () => void;
66
- setSearchParams: (params: Record<string, string | string[] | null>, options?: SetSearchParamsOptions) => void;
67
- isNavigating: boolean;
68
- prefetch: (path: string) => void;
69
- }
70
-
71
- declare function useRouter(): RouterContextType;
72
- declare function useParams<T extends Record<string, string> = Record<string, string>>(): T;
73
- declare function useSearchParams(): URLSearchParams;
74
- declare function usePathname(): string;
75
- declare function useSelectedLayoutSegment(): string | null;
76
- declare function useSelectedLayoutSegments(): string[];
77
- declare function useIsNavigating(): boolean;
78
- declare function useNavigationEvent(callback: (from: string, to: string) => void): void;
79
- declare function redirect(path: string, options?: NavigateOptions): never;
80
- declare function useRedirect(): (path: string, options?: NavigateOptions) => void;
81
-
82
- type ResolveSegment<S extends string> = S extends `:${string}` ? string : S extends '*' ? string : S;
83
- type ResolvePathSegments<Path extends string> = Path extends `${infer Segment}/${infer Rest}` ? `${ResolveSegment<Segment>}/${ResolvePathSegments<Rest>}` : ResolveSegment<Path>;
84
- type ResolveRoutePath<Path extends string> = Path extends `${infer Base}/*` ? `${ResolvePathSegments<Base>}/${string}` : ResolvePathSegments<Path>;
85
- type ResolveRoutes<T extends string> = T extends string ? ResolveRoutePath<T> : never;
86
- interface LinkProps<T extends string> extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {
87
- href: ResolveRoutes<T>;
88
- children: ReactNode;
89
- className?: string;
90
- activeClassName?: string;
91
- exactActiveClassName?: string;
92
- prefetch?: boolean | 'hover' | 'viewport';
93
- replace?: boolean;
94
- scroll?: boolean;
95
- target?: string;
96
- }
97
- declare function createLink<T extends string>(): ({ href, children, className, activeClassName, exactActiveClassName, prefetch, replace: shouldReplace, scroll, target, ...rest }: LinkProps<T>) => react_jsx_runtime.JSX.Element;
98
-
99
- interface OlovaRouterProps {
100
- routes: Route[];
101
- layouts?: LayoutRoute[];
102
- notFoundPages?: NotFoundPageConfig[];
103
- notFound?: ReactNode;
104
- loadingFallback?: ReactNode;
105
- initialPath?: string;
106
- onNavigate?: (from: string, to: string) => void;
107
- onBeforeNavigate?: (from: string, to: string) => boolean | void;
108
- }
109
- declare function OlovaRouter({ routes, layouts, notFoundPages, notFound, loadingFallback, initialPath, onNavigate, onBeforeNavigate, }: OlovaRouterProps): react_jsx_runtime.JSX.Element;
110
-
111
- declare function Outlet(): react_jsx_runtime.JSX.Element | null;
112
-
113
- export { type LayoutRoute, type Metadata, type NavigateOptions, type NotFoundPageConfig, OlovaRouter, Outlet, type Route, type SearchParams, type SetSearchParamsOptions, createLink, redirect, useIsNavigating, useNavigationEvent, useParams, usePathname, useRedirect, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments };
package/dist/router.d.ts DELETED
@@ -1,113 +0,0 @@
1
- import { ComponentType, AnchorHTMLAttributes, ReactNode } from 'react';
2
- import * as react_jsx_runtime from 'react/jsx-runtime';
3
-
4
- interface Metadata {
5
- title?: string;
6
- description?: string;
7
- keywords?: string[];
8
- openGraph?: {
9
- title?: string;
10
- description?: string;
11
- image?: string;
12
- url?: string;
13
- type?: string;
14
- };
15
- [key: string]: any;
16
- }
17
- interface NotFoundPageConfig {
18
- pathPrefix: string;
19
- component: ComponentType;
20
- metadata?: Metadata;
21
- }
22
- interface RouteErrorProps {
23
- error: Error;
24
- reset: () => void;
25
- }
26
- interface LoaderContext {
27
- request: Request;
28
- params: Record<string, string>;
29
- }
30
- interface Route {
31
- id?: string;
32
- path: string;
33
- component?: ComponentType;
34
- metadata?: Metadata;
35
- loading?: ComponentType;
36
- error?: ComponentType<RouteErrorProps>;
37
- filePath?: string;
38
- params?: string[];
39
- loader?: (ctx: LoaderContext) => Promise<Record<string, unknown>>;
40
- }
41
- interface LayoutRoute {
42
- path: string;
43
- layout?: ComponentType;
44
- children: Route[];
45
- metadata?: Metadata;
46
- }
47
- type SearchParams = Record<string, string | string[]>;
48
- interface SetSearchParamsOptions {
49
- replace?: boolean;
50
- merge?: boolean;
51
- }
52
- interface NavigateOptions {
53
- scroll?: boolean;
54
- replace?: boolean;
55
- }
56
- interface RouterContextType {
57
- currentPath: string;
58
- params: Record<string, string>;
59
- searchParams: SearchParams;
60
- navigate: (path: string, options?: NavigateOptions) => void;
61
- push: (path: string, options?: NavigateOptions) => void;
62
- replace: (path: string, options?: NavigateOptions) => void;
63
- back: () => void;
64
- forward: () => void;
65
- refresh: () => void;
66
- setSearchParams: (params: Record<string, string | string[] | null>, options?: SetSearchParamsOptions) => void;
67
- isNavigating: boolean;
68
- prefetch: (path: string) => void;
69
- }
70
-
71
- declare function useRouter(): RouterContextType;
72
- declare function useParams<T extends Record<string, string> = Record<string, string>>(): T;
73
- declare function useSearchParams(): URLSearchParams;
74
- declare function usePathname(): string;
75
- declare function useSelectedLayoutSegment(): string | null;
76
- declare function useSelectedLayoutSegments(): string[];
77
- declare function useIsNavigating(): boolean;
78
- declare function useNavigationEvent(callback: (from: string, to: string) => void): void;
79
- declare function redirect(path: string, options?: NavigateOptions): never;
80
- declare function useRedirect(): (path: string, options?: NavigateOptions) => void;
81
-
82
- type ResolveSegment<S extends string> = S extends `:${string}` ? string : S extends '*' ? string : S;
83
- type ResolvePathSegments<Path extends string> = Path extends `${infer Segment}/${infer Rest}` ? `${ResolveSegment<Segment>}/${ResolvePathSegments<Rest>}` : ResolveSegment<Path>;
84
- type ResolveRoutePath<Path extends string> = Path extends `${infer Base}/*` ? `${ResolvePathSegments<Base>}/${string}` : ResolvePathSegments<Path>;
85
- type ResolveRoutes<T extends string> = T extends string ? ResolveRoutePath<T> : never;
86
- interface LinkProps<T extends string> extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {
87
- href: ResolveRoutes<T>;
88
- children: ReactNode;
89
- className?: string;
90
- activeClassName?: string;
91
- exactActiveClassName?: string;
92
- prefetch?: boolean | 'hover' | 'viewport';
93
- replace?: boolean;
94
- scroll?: boolean;
95
- target?: string;
96
- }
97
- declare function createLink<T extends string>(): ({ href, children, className, activeClassName, exactActiveClassName, prefetch, replace: shouldReplace, scroll, target, ...rest }: LinkProps<T>) => react_jsx_runtime.JSX.Element;
98
-
99
- interface OlovaRouterProps {
100
- routes: Route[];
101
- layouts?: LayoutRoute[];
102
- notFoundPages?: NotFoundPageConfig[];
103
- notFound?: ReactNode;
104
- loadingFallback?: ReactNode;
105
- initialPath?: string;
106
- onNavigate?: (from: string, to: string) => void;
107
- onBeforeNavigate?: (from: string, to: string) => boolean | void;
108
- }
109
- declare function OlovaRouter({ routes, layouts, notFoundPages, notFound, loadingFallback, initialPath, onNavigate, onBeforeNavigate, }: OlovaRouterProps): react_jsx_runtime.JSX.Element;
110
-
111
- declare function Outlet(): react_jsx_runtime.JSX.Element | null;
112
-
113
- export { type LayoutRoute, type Metadata, type NavigateOptions, type NotFoundPageConfig, OlovaRouter, Outlet, type Route, type SearchParams, type SetSearchParamsOptions, createLink, redirect, useIsNavigating, useNavigationEvent, useParams, usePathname, useRedirect, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments };