one
Version:
One is a new React Framework that makes Vite serve both native and web.
53 lines (45 loc) • 1.32 kB
text/typescript
import { useActiveParams, useParams, usePathname } from '../hooks'
import type { OneRouter } from '../interfaces/router'
import type { LoaderProps } from '../types'
export function createRoute<Path extends string = string>() {
type Route = OneRouter.RouteType<Path>
type Params = Route['Params']
type TypedLoaderProps = LoaderProps<Params>
return {
useParams: () => useParams<Params>(),
useActiveParams: () => useActiveParams<Params>(),
/**
* Creates a typed loader function for this route.
* The loader receives LoaderProps with typed params.
*
* @example
* const route = createRoute<'(site)/docs/[slug]'>()
* export const loader = route.createLoader(({ params }) => {
* // params is typed as { slug: string }
* return { doc: getDoc(params.slug) }
* })
*/
createLoader: <T>(fn: (props: TypedLoaderProps) => T) => fn,
}
}
const defaults = createRoute()
const getProxy = () =>
new Proxy(
{},
{
get(target, key) {
if (Reflect.has(defaults, key)) {
return Reflect.get(defaults, key)
}
return getProxy()
},
}
)
const postIdRoute = createRoute<'/feed/[id]'>()
export const route = getProxy() as {
feed: {
$id: typeof postIdRoute
}
notifications: {}
profile: {}
}