UNPKG

dew-router

Version:

1 lines 18 kB
{"version":3,"file":"index.mjs","sources":["../../src/Router.tsx","../../src/hooks.ts","../../src/matchRoutes.tsx","../../src/BrowserRouter.tsx","../../src/Route.tsx","../../src/RouterLink.tsx"],"sourcesContent":["import { parseUrlQuery, stringifyUrlQuery } from 'dew-qs'\nimport { WebsiteRoute } from 'dew-types'\nimport { compile, PathFunction } from 'path-to-regexp'\nimport React, { createContext, ReactNode, useCallback, useContext, useMemo } from 'react'\n\nimport {\n LinkValue,\n MatchedRoute,\n RouterLocation,\n RouterNavigator,\n StringOrStringArray,\n UrlParams,\n} from './types'\n\nexport interface LocationContextValue {\n routes: WebsiteRoute[]\n matchedRoutes: MatchedRoute[]\n location: RouterLocation\n navigator: RouterNavigator\n query: Record<string, StringOrStringArray>\n pathFnMap: Record<string, PathFunction<UrlParams>>\n}\n\nexport const LocationContext = createContext<LocationContextValue | undefined>(undefined)\n\nexport interface RouterProps {\n routes: WebsiteRoute[]\n matchedRoutes: MatchedRoute[]\n children: ReactNode\n location: RouterLocation\n navigator: RouterNavigator\n}\n\nexport function makePathFnMap(_routes: WebsiteRoute[]) {\n const routes = [..._routes]\n const result: Record<string, PathFunction<UrlParams>> = {}\n while (routes.length > 0) {\n const r = routes.shift()\n if (!r) {\n break\n }\n const { children, name, lang, pattern } = r\n result[`${name}:${lang}`] = compile(pattern)\n if (Array.isArray(children)) {\n routes.push(\n ...children.map((child) => ({\n ...child,\n pattern: [pattern, child.pattern.replace(/^\\//, '')].join('/'),\n })),\n )\n }\n }\n return result\n}\n\nexport function Router({\n location,\n routes,\n matchedRoutes,\n navigator,\n children,\n}: RouterProps) {\n const pathFnMap: Record<string, PathFunction<UrlParams>> = useMemo(() => {\n return makePathFnMap(routes)\n }, [routes])\n\n return (\n <LocationContext.Provider\n value={{\n location,\n navigator,\n routes,\n matchedRoutes,\n pathFnMap,\n query: parseUrlQuery(location.search),\n }}\n >\n {children}\n </LocationContext.Provider>\n )\n}\n\nexport function useRouter() {\n const context = useContext(LocationContext)\n if (!context) {\n throw new Error('useRouter must be use within StaticRouter or BrowserRouter')\n }\n const { pathFnMap } = context\n\n const parseLink = useCallback(\n ({ name, lang, params, query }: LinkValue) => {\n const key = `${name}:${lang}`\n const fn = pathFnMap[key]\n if (!fn) {\n console.warn(`Cannot find route with key = ${key}`)\n return null\n }\n return [fn(params), query && stringifyUrlQuery(query)].filter(Boolean).join('?')\n },\n [pathFnMap],\n )\n\n return {\n routes: context.routes,\n matchedRoutes: context.matchedRoutes,\n location: context.location,\n query: context.query,\n navigator: context.navigator,\n parseLink,\n pathFnMap,\n }\n}\n","import { useContext } from 'react'\n\nimport { LocationContext } from './Router'\nimport { StringOrStringArray } from './types'\n\nexport function useUrlParams() {\n const ctx = useContext(LocationContext)\n if (!ctx) {\n throw new Error(\n `useUrlParams must be use with Router (BrowserRouter or StaticRouter) component`,\n )\n }\n const { matchedRoutes } = ctx\n return matchedRoutes.reduce<Record<string, StringOrStringArray>>(\n (acc, { params }) => ({\n ...acc,\n ...params,\n }),\n {},\n )\n}\n\nexport function useUrlQuery() {\n const ctx = useContext(LocationContext)\n if (!ctx) {\n throw new Error(\n `useUrlQuery must be use with Router (BrowserRouter or StaticRouter) component`,\n )\n }\n const { query } = ctx\n return query\n}\n\nexport function useStringUrlParam(key: string): string {\n const params = useUrlParams()\n const v = params[key]\n if (typeof v === 'string') return v\n return (v && v[0]) ?? ''\n}\n\nexport function useIntUrlParam(key: string): number | undefined {\n const v = useStringUrlParam(key)\n return parseInt(v, 10) ?? undefined\n}\n\nexport function useFloatUrlParam(key: string): number | undefined {\n const v = useStringUrlParam(key)\n return parseFloat(v) ?? undefined\n}\n\nexport function useStringUrlQuery(key: string): string {\n const params = useUrlQuery()\n const v = params[key]\n if (typeof v === 'string') return v\n return (v && v[0]) ?? ''\n}\n\nexport function useIntUrlQuery(key: string): number | undefined {\n const v = useStringUrlQuery(key)\n return parseInt(v, 10) ?? undefined\n}\n\nexport function useFloatUrlQuery(key: string): number | undefined {\n const v = useStringUrlQuery(key)\n return parseFloat(v) ?? undefined\n}\n","import { WebsiteRoute } from 'dew-types'\nimport { compile, match } from 'path-to-regexp'\n\nimport { MatchedRoute, UrlParams } from './types'\n\nexport function matchRoutes(path: string, routes: WebsiteRoute[]) {\n const result: MatchedRoute[] = []\n let iter = [...routes]\n let prefix = ''\n while (iter.length > 0) {\n const [current, ...nextIter] = iter\n const hasChildren = !!current?.children?.length\n let pattern = prefix + current.pattern\n if (hasChildren) {\n pattern = pattern + '/:others*'\n }\n if (pattern !== '/' && pattern.endsWith('/')) {\n pattern = pattern.substring(0, pattern.length - 1)\n }\n const matcher = match<UrlParams>(pattern, { decode: decodeURIComponent })\n const matchResult = matcher(path)\n if (matchResult) {\n prefix = prefix + current.pattern\n iter = hasChildren ? [...(current.children || [])] : []\n result.push({\n name: current.name,\n page: current.page,\n pattern: current.pattern,\n lang: current.lang,\n path,\n params: matchResult.params,\n matcher,\n pathFn: compile(pattern),\n })\n } else {\n iter = nextIter\n }\n }\n return result\n}\n","import { WebsiteRoute } from 'dew-types'\nimport React, { ReactNode, useEffect, useMemo, useState } from 'react'\n\nimport { Router } from './index'\nimport { matchRoutes } from './matchRoutes'\n\nexport interface BrowserRouterProps {\n routes: WebsiteRoute[]\n children: ReactNode\n}\n\nexport function BrowserRouter({ routes, children }: BrowserRouterProps) {\n const [location, setLocation] = useState(() => {\n return {\n pathname: document.location.pathname,\n search: document.location.search,\n }\n })\n\n // Add events listenner when mounted\n useEffect(() => {\n const cb = () => {\n setLocation({\n pathname: document.location.pathname,\n search: document.location.search,\n })\n }\n const toTop = () => {\n window.scrollTo({ top: 0 })\n }\n window.addEventListener('popstate', cb)\n window.addEventListener('historychange', cb)\n window.addEventListener('historychange', toTop)\n return () => {\n window.removeEventListener('popstate', cb)\n window.removeEventListener('historychange', cb)\n window.removeEventListener('historychange', toTop)\n }\n }, [])\n\n const matchedRoutes = useMemo(() => {\n return matchRoutes(location.pathname, routes)\n }, [location, routes])\n\n return (\n <Router\n navigator={{\n pushState: (...args) => {\n window.history.pushState(...args)\n window.dispatchEvent(new Event('historychange', {}))\n },\n navigate: (to) => {\n window.history.pushState({}, '', to)\n window.dispatchEvent(new Event('historychange', {}))\n },\n }}\n matchedRoutes={matchedRoutes}\n routes={routes}\n location={location}\n >\n {children}\n </Router>\n )\n}\n","import { cloneElement, ReactElement } from 'react'\n\nimport { useRouter } from './Router'\nimport { StringOrStringArray } from './types'\n\nexport function Route({\n name,\n lang,\n children,\n}: {\n name: string\n lang: string\n children:\n | ((props: { params?: Record<string, StringOrStringArray> }) => ReactElement)\n | ReactElement\n}) {\n const { matchedRoutes } = useRouter()\n const route = matchedRoutes.find((x) => x.name === name && x.lang === lang)\n if (!route) {\n return null\n }\n const props = { params: route.params }\n if (typeof children === 'function') {\n return children(props)\n }\n return cloneElement(children, props)\n}\n","import React from 'react'\n\nimport { useRouter } from './Router'\n\ntype HtmlAnchorProps = JSX.IntrinsicElements['a']\nexport interface RouterLinkProps extends HtmlAnchorProps {\n to: string\n}\n\nexport function RouterLink({ to, onClick, ...rest }: RouterLinkProps) {\n const { navigator } = useRouter()\n return (\n <a\n {...rest}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n navigator.navigate(to)\n if (onClick) {\n onClick(e)\n }\n }}\n href={to}\n />\n )\n}\n"],"names":["LocationContext","createContext","undefined","makePathFnMap","_routes","routes","result","r","shift","children","name","lang","pattern","compile","Array","isArray","push","map","child","replace","join","length","Router","location","matchedRoutes","navigator","pathFnMap","useMemo","query","parseUrlQuery","search","useRouter","context","useContext","Error","parseLink","useCallback","params","key","fn","console","warn","stringifyUrlQuery","filter","Boolean","useUrlParams","ctx","reduce","acc","useUrlQuery","useStringUrlParam","v","useIntUrlParam","parseInt","useFloatUrlParam","parseFloat","useStringUrlQuery","useIntUrlQuery","useFloatUrlQuery","matchRoutes","path","iter","prefix","current","nextIter","hasChildren","endsWith","substring","matcher","match","decode","decodeURIComponent","matchResult","page","pathFn","BrowserRouter","setLocation","useState","pathname","document","useEffect","cb","toTop","window","scrollTo","top","addEventListener","removeEventListener","pushState","history","dispatchEvent","Event","navigate","to","Route","route","find","x","props","cloneElement","RouterLink","onClick","rest","e","preventDefault","stopPropagation"],"mappings":"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"}