@modastar/z-router 0.0.14 → 0.0.16
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/.github/workflows/publish.yml +38 -0
- package/README.md +12 -0
- package/demo/dist/assets/index-BnRxLDj4.js +23 -0
- package/demo/dist/assets/index-C0uITd16.css +1 -0
- package/demo/dist/assets/index-CejLCVJl.js +1 -0
- package/demo/dist/index.html +14 -0
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/.oxlintrc.json +0 -24
- package/.vscode/settings.json +0 -6
- package/vite.config.ts +0 -10
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useRouter.ts","../src/context/router-context.ts","../src/components/link.tsx","../src/context/location-context.ts","../src/components/location-provider.tsx","../src/context/outlet-context.ts","../src/hooks/useOutlet.ts","../src/context/route-match-context.ts","../src/hooks/useRouteMatch.ts","../src/components/outlet-provider.tsx","../src/hooks/useLocation.ts","../src/context/route-context.ts","../src/hooks/useRoute.ts","../src/components/route-component.tsx","../src/hooks/useRootRoute.ts","../src/context/root-route-context.ts","../src/components/route-provider.tsx","../src/components/outlet.tsx","../src/components/router-provider.tsx","../src/constants.ts","../src/utils.ts","../src/components/stack.tsx","../src/components/page-renderer.tsx","../src/components/root-route-provider.tsx"],"sourcesContent":["import { useContext } from \"react\";\n\nimport { RouterContext } from \"@/context/router-context.js\";\n\nexport const useRouter = () => {\n const router = useContext(RouterContext);\n if (router === null) {\n throw new Error(\"useRouter must be used within a Stack\");\n }\n return router;\n};\n","import { createContext } from \"react\";\n\nimport type {\n BackActionOptions,\n ForwardActionOptions,\n Location,\n NavigateActionOptions,\n NavigationOptions,\n RouterOptions,\n TransitionType,\n} from \"@/types.js\";\n\nexport interface RouterContextType {\n // Router Config\n options: RouterOptions;\n\n // Navigation State\n history: Location[];\n location: Location;\n canGoBack: boolean;\n canGoForward: boolean;\n\n // Transition state\n isTransitioning: boolean;\n transitioningToLocation?: Location;\n transitionType?: TransitionType;\n transitionDuration: number;\n\n // Utilities\n buildLocation: (to: NavigationOptions) => Location;\n\n // Navigation Actions\n navigate: (options: NavigateActionOptions) => void;\n back: (options?: BackActionOptions) => void;\n forward: (options?: ForwardActionOptions) => void;\n\n // Low-level state action\n setLocationState: (\n index: number,\n state:\n | Record<string, any>\n | ((prev: Record<string, any>) => Record<string, any>)\n ) => void;\n setLocationSearch: (\n locationIndex: number,\n search: Record<string, string>\n ) => void;\n}\n\nexport const RouterContext = createContext<RouterContextType | null>(null);\n","import { useRouter } from \"@/hooks/useRouter.js\";\nimport type { NavigateActionOptions } from \"@/types.js\";\nimport { memo } from \"react\";\n\nexport type LinkProps = React.ComponentPropsWithoutRef<\"a\"> &\n NavigateActionOptions;\n\nexport const Link: React.FC<LinkProps> = memo(\n ({ to, replace, transitionType, duration, onFinish, ...props }) => {\n const router = useRouter();\n return (\n <a\n {...props}\n href={to}\n onClick={(e) => {\n e.preventDefault();\n router.navigate({\n to,\n replace,\n transitionType,\n duration,\n onFinish,\n });\n }}\n />\n );\n }\n);\n","import { createContext } from \"react\";\n\nimport type { Location } from \"@/types.js\";\n\nexport interface LocationContextType extends Location {\n canGoBack: boolean;\n canGoForward: boolean;\n state: Record<string, any>;\n setState: (key: string, value: any) => void;\n deleteState: (key: string) => void;\n setSearch: (key: string, value: string) => void;\n}\n\nexport const LocationContext = createContext<LocationContextType | null>(null);\n","import { LocationContext } from \"@/context/location-context.js\";\nimport { useRouter } from \"@/hooks/useRouter.js\";\nimport type { Location } from \"@/types.js\";\nimport { memo, useCallback, useMemo } from \"react\";\n\nexport const LocationProvider = memo(\n ({\n location,\n ...props\n }: {\n location: Location;\n children: React.ReactNode;\n }) => {\n const router = useRouter();\n const state = useMemo(() => location.state, [location]);\n const setState = useCallback(\n (key: string, value: any) => {\n router.setLocationState(location.index, (prev) => ({\n ...prev,\n [key]: value,\n }));\n },\n [router, location]\n );\n const deleteState = useCallback(\n (key: string) => {\n router.setLocationState(location.index, (prev) => {\n delete prev[key];\n return prev;\n });\n },\n [router, location]\n );\n const setSearch = useCallback(\n (key: string, value: string) => {\n router.setLocationSearch(location.index, {\n ...location.search,\n [key]: value,\n });\n },\n [router, location]\n );\n return (\n <LocationContext.Provider\n value={{\n ...location,\n canGoBack: !router.isTransitioning && location.index > 0,\n canGoForward:\n !router.isTransitioning &&\n location.index + 1 < router.history.length,\n state,\n setState,\n deleteState,\n setSearch,\n }}\n {...props}\n />\n );\n },\n (a, b) => a.location === b.location\n);\n","import { createContext } from \"react\";\n\nexport const OutletContext = createContext<number>(0);\n","import { OutletContext } from \"@/context/outlet-context.js\";\nimport { useContext } from \"react\";\n\nexport const useOutlet = () => useContext(OutletContext);\n","import type { RouteMatch } from \"@/types.js\";\nimport { createContext } from \"react\";\n\nexport const RouteMatchContext = createContext<RouteMatch | null>(null);\n","import { RouteMatchContext } from \"@/context/route-match-context.js\";\nimport { useContext } from \"react\";\n\nexport const useRouteMatch = () => {\n const routeMatch = useContext(RouteMatchContext);\n if (routeMatch === null) {\n throw new Error(\"useRouteMatch must be used within a RouteMatchProvider\");\n }\n return routeMatch;\n};\n","import { OutletContext } from \"@/context/outlet-context.js\";\n\nexport const OutletProvider = ({\n depth,\n ...props\n}: {\n depth: number;\n children?: React.ReactNode;\n}) => <OutletContext.Provider value={depth} {...props} />;\n","import { useContext } from \"react\";\n\nimport { LocationContext } from \"@/context/location-context.js\";\n\nexport const useLocation = () => {\n const context = useContext(LocationContext);\n if (context === null) {\n throw new Error(\"useLocation must be used within a LocationProvider\");\n }\n return context;\n};\n","import type { ParsedRoute } from \"@/types.js\";\nimport { createContext } from \"react\";\n\nexport interface RouteContextType extends ParsedRoute {\n state: Record<string, any>;\n getState: (key: string) => any;\n setState: (key: string, value: any) => void;\n}\n\nexport const RouteContext = createContext<RouteContextType | null>(null);\n","import { RouteContext } from \"@/context/route-context.js\";\nimport { useContext } from \"react\";\n\nexport const useRoute = () => {\n const route = useContext(RouteContext);\n if (route === null) {\n throw new Error(\"useRoute must be used within a RouteProvider\");\n }\n return route;\n};\n","import { useLocation } from \"@/hooks/useLocation.js\";\nimport { useRoute } from \"@/hooks/useRoute.js\";\nimport { useRouteMatch } from \"@/hooks/useRouteMatch.js\";\nimport { useRouter } from \"@/hooks/useRouter.js\";\nimport { useEffect } from \"react\";\nimport { Outlet } from \"./outlet.js\";\n\nexport const RouteComponent = ({ depth = 0 }: { depth?: number }) => {\n const router = useRouter();\n const location = useLocation();\n const routeMatch = useRouteMatch();\n const route = useRoute();\n\n const pendingStateKey = `_Z.${route.id}.pending`;\n const pending =\n !!route.beforeLoad && route.getState(pendingStateKey) !== false;\n\n useEffect(() => {\n if (!route) {\n return;\n }\n if (route.beforeLoad && route.getState(pendingStateKey) === undefined) {\n route.setState(pendingStateKey, true);\n route\n .beforeLoad?.({ location })\n .then(() => route.setState(pendingStateKey, false))\n .catch(({ cause }: Error) => {\n if (!!cause && \"to\" in (cause as any)) {\n console.log(\"Redirecting to:\", (cause as any).to);\n router.navigate({\n ...(cause as any),\n onFinish: () => {\n route.setState(pendingStateKey, false);\n },\n });\n } else {\n route.setState(pendingStateKey, false);\n }\n });\n }\n }, [route]);\n\n if (!route) {\n return null;\n }\n\n if (pending) {\n const PendingComponent = route.pendingComponent!;\n return <PendingComponent />;\n }\n\n if (depth >= routeMatch.matches.length) {\n const NotFoundComponent = route.notFoundComponent!;\n return <NotFoundComponent />;\n }\n\n const Component = route.component;\n return Component ? <Component /> : <Outlet />;\n};\n","import { useContext } from \"react\";\n\nimport { RootRouteContext } from \"@/context/root-route-context.js\";\n\nexport const useRootRoute = () => {\n const route = useContext(RootRouteContext);\n if (route === null) {\n throw new Error(\"useRootRoute must be used within a RootRouteProvider\");\n }\n return route;\n};\n","import { createContext } from \"react\";\n\nimport type { ParsedRoute } from \"@/types.js\";\n\nexport interface RootRouteContextType extends ParsedRoute {\n state: Record<string, Record<string, any>>;\n getRouteState: (id: string, key: string) => any;\n setRouteState: (id: string, key: string, value: any) => void;\n}\n\nexport const RootRouteContext = createContext<RootRouteContextType | null>(\n null\n);\n","import { RouteContext } from \"@/context/route-context.js\";\nimport { useRootRoute } from \"@/hooks/useRootRoute.js\";\nimport type { ParsedRoute } from \"@/types.js\";\nimport { useCallback } from \"react\";\n\nexport const RouteProvider = ({\n route,\n ...props\n}: {\n route?: ParsedRoute;\n children?: React.ReactNode;\n}) => {\n if (!route) {\n return <RouteContext.Provider value={null} {...props} />;\n }\n\n const { state, getRouteState, setRouteState } = useRootRoute();\n\n const getState = useCallback(\n (key: string) => getRouteState(route.id, key),\n [getRouteState, route.id]\n );\n\n const setState = useCallback(\n (key: string, value: any) => {\n setRouteState(route.id, key, value);\n },\n [setRouteState, route.id]\n );\n\n return (\n <RouteContext.Provider\n value={{ ...route, state: state[route.id], getState, setState }}\n {...props}\n />\n );\n};\n","import { useOutlet } from \"@/hooks/useOutlet.js\";\nimport { useRouteMatch } from \"@/hooks/useRouteMatch.js\";\nimport { OutletProvider } from \"./outlet-provider.js\";\nimport { RouteComponent } from \"./route-component.js\";\nimport { RouteProvider } from \"./route-provider.js\";\n\nexport const Outlet = () => {\n const routeMatch = useRouteMatch();\n const depth = useOutlet() + 1;\n return (\n <OutletProvider depth={depth}>\n <RouteProvider route={routeMatch.matches.at(depth)}>\n <RouteComponent depth={depth} />\n </RouteProvider>\n </OutletProvider>\n );\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { RouterContext } from \"@/context/router-context.js\";\nimport type {\n BackActionOptions,\n ForwardActionOptions,\n Location,\n NavigateActionOptions,\n NavigationOptions,\n RouterOptions,\n TransitionType,\n} from \"@/types.js\";\nimport {\n buildUrlFromLocation,\n parseLocation,\n resolveRelativeUrl,\n} from \"@/utils.js\";\nimport { LocationProvider } from \"./location-provider.js\";\n\nexport const RouterProvider = ({\n options,\n ...props\n}: {\n options: RouterOptions;\n children: React.ReactNode;\n}) => {\n const [history, setHistory] = useState<Location[]>([\n parseLocation(window.location),\n ]);\n const [currentLocationIndex, setCurrentLocationIndex] = useState<number>(0);\n const location = useMemo(\n () => history.at(currentLocationIndex)!,\n [history, currentLocationIndex]\n );\n const [isTransitioning, setIsTransitioning] = useState<boolean>(false);\n const [transitioningToLocation, setTransitioningToLocation] =\n useState<Location>();\n const [transitionType, setTransitionType] = useState<TransitionType>();\n const [transitionDuration, setTransitionDuration] = useState<number>(0);\n\n const canGoBack = !isTransitioning && currentLocationIndex > 0;\n const canGoForward =\n !isTransitioning && currentLocationIndex + 1 < history.length;\n\n useEffect(() => {\n window.history.replaceState(\n location.state,\n \"\",\n buildUrlFromLocation(location)\n );\n }, []);\n\n useEffect(() => {\n const handlePopState = ({ state }: PopStateEvent) => {\n console.log(\"popstate event:\", state);\n setCurrentLocationIndex(state?.index);\n };\n\n addEventListener(\"popstate\", handlePopState);\n return () => {\n removeEventListener(\"popstate\", handlePopState);\n };\n }, [currentLocationIndex]);\n\n // Utilities\n const buildLocation = useCallback(\n ({ to, replace }: NavigationOptions): Location => {\n if (!to) return location;\n const index = replace ? currentLocationIndex : currentLocationIndex + 1;\n\n // Resolve to with absolute or relative paths like \"..\" or \".\"\n const url = to.startsWith(\"/\")\n ? to\n : resolveRelativeUrl(location.pathname, to);\n const [pathname, search] = url.split(\"?\");\n const searchParams = new URLSearchParams(search ?? \"\");\n const state = {\n index,\n };\n return {\n index,\n href: origin + pathname + (search ? `?${searchParams.toString()}` : \"\"),\n search: Object.fromEntries(searchParams.entries()),\n state,\n pathname,\n };\n },\n [currentLocationIndex, location]\n );\n\n // Transition helper\n const transitionTo = (\n location: Location,\n transitionType: TransitionType,\n duration: number = options.defaultTransitionDuration,\n callback?: () => void\n ) => {\n setIsTransitioning(true);\n setTransitionType(transitionType);\n setTransitionDuration(duration);\n setTransitioningToLocation(location);\n setTimeout(() => {\n setIsTransitioning(false);\n setTransitionType(undefined);\n setTransitioningToLocation(undefined);\n callback?.();\n }, duration);\n };\n\n // Navigation actions\n const navigate = useCallback(\n ({\n to,\n replace,\n transitionType,\n duration,\n onFinish,\n }: NavigateActionOptions) => {\n if (isTransitioning) return;\n\n const index = replace ? currentLocationIndex : currentLocationIndex + 1;\n const newLocation = buildLocation({ to, replace });\n\n const updateHistory = () => {\n if (replace) {\n setHistory((prevHistory) => [\n ...prevHistory.slice(0, index),\n newLocation,\n ...prevHistory.slice(index + 1),\n ]);\n window.history.replaceState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n } else {\n setHistory((prevHistory) => [\n ...prevHistory.slice(0, index),\n newLocation,\n ]);\n setCurrentLocationIndex(index);\n window.history.pushState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n onFinish?.();\n };\n\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-left\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const back = useCallback(\n ({ transitionType, duration, onFinish, depth }: BackActionOptions = {}) => {\n if (!canGoBack) return;\n const backDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex - backDepth);\n if (!newLocation) return;\n\n const updateHistory = () => {\n window.history.go(-backDepth);\n onFinish?.();\n };\n\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-right\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const forward = useCallback(\n ({\n transitionType,\n duration,\n depth,\n onFinish,\n }: ForwardActionOptions = {}) => {\n if (!canGoForward) return;\n const forwardDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex + forwardDepth);\n if (!newLocation) return;\n\n const updateHistory = () => {\n window.history.go(forwardDepth);\n onFinish?.();\n };\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-left\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n // Low-level state action\n const setLocationState = useCallback(\n (\n index: number,\n state:\n | Record<string, any>\n | ((prev: Record<string, any>) => Record<string, any>)\n ) => {\n setHistory((prevHistory) =>\n prevHistory.map((location) => {\n if (location.index !== index) {\n return location;\n }\n const newState =\n typeof state === \"function\" ? state(location.state) : state;\n const newLocation = { ...location, state: newState };\n if (index === currentLocationIndex) {\n window.history.replaceState(\n newState,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n return newLocation;\n })\n );\n },\n [currentLocationIndex]\n );\n\n const setLocationSearch = useCallback(\n (locationIndex: number, search: Record<string, string>) => {\n setHistory((prev) =>\n prev.map((location) => {\n if (location.index !== locationIndex) return location;\n const newLocation = {\n ...location,\n search: {\n ...location.search,\n ...search,\n },\n };\n if (locationIndex === currentLocationIndex) {\n window.history.replaceState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n return newLocation;\n })\n );\n },\n []\n );\n\n return (\n <RouterContext.Provider\n // oxlint-disable-next-line jsx-no-new-object-as-prop\n value={{\n options,\n\n history,\n location,\n canGoBack,\n canGoForward,\n\n isTransitioning,\n transitioningToLocation,\n transitionType,\n transitionDuration,\n\n buildLocation,\n\n navigate,\n back,\n forward,\n\n setLocationState,\n setLocationSearch,\n }}\n >\n <LocationProvider location={location} {...props} />\n </RouterContext.Provider>\n );\n};\n","import type { RouterOptions } from \"./types.js\";\n\nexport const DefaultRouterOptions: RouterOptions = {\n defaultTransitionDuration: 300,\n};\n","import { DefaultRouterOptions } from \"./constants.js\";\nimport type {\n Location,\n NavigateActionOptions,\n ParsedRoute,\n Route,\n RouteMatch,\n RouterOptions,\n} from \"./types.js\";\n\nexport const DefaultTransitionDuration = 300;\n\nexport const redirect = (options: NavigateActionOptions) => {\n return new Error(\"\", { cause: options });\n};\n\n/**\n * @param pattern pathname pattern like `/users/:id`. Leading and trailing slashes are optional.\n * @param url URL to match against the pattern. Can be href or pathname with query string.\n * @returns extracted params and query if matched, otherwise null\n */\nexport const matchPattern = (\n pattern: string,\n url: string\n): { params: Record<string, string>; query: Record<string, string> } | null => {\n try {\n // 解析 URL\n let pathname, searchParams;\n\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) {\n const urlObj = new URL(url);\n pathname = urlObj.pathname;\n searchParams = urlObj.searchParams;\n } else {\n // 處理相對路徑\n const [path, queryString] = url.split(\"?\");\n if (!path) {\n return null;\n }\n pathname = path;\n searchParams = new URLSearchParams(queryString || \"\");\n }\n\n // 移除路徑首尾的斜線以便比較\n const cleanPath = pathname.replaceAll(/^\\/|\\/$/g, \"\");\n const cleanPattern = pattern.replaceAll(/^\\/|\\/$/g, \"\");\n\n // 分割路徑段\n const pathSegments = cleanPath.split(\"/\");\n const patternSegments = cleanPattern.split(\"/\");\n\n // 路徑段數量不同則不匹配\n if (pathSegments.length !== patternSegments.length) {\n return null;\n }\n\n // 提取路徑參數\n const params: Record<string, string> = {};\n for (let i = 0; i < patternSegments.length; i++) {\n const patternSegment = patternSegments[i];\n const pathSegment = pathSegments[i];\n\n if (patternSegment.startsWith(\":\")) {\n // 動態參數\n const paramName = patternSegment.slice(1);\n params[paramName] = decodeURIComponent(pathSegment);\n } else if (patternSegment !== pathSegment) {\n // 靜態段不匹配\n return null;\n }\n }\n\n // 提取查詢參數\n const query = Object.fromEntries(searchParams.entries());\n\n return { params, query };\n } catch {\n return null;\n }\n};\n\nexport const matchRoute = (route: ParsedRoute, url: string): RouteMatch => {\n const _matchRoute = (\n matches: ParsedRoute[],\n { children }: ParsedRoute\n ): RouteMatch | null => {\n if (children && children.length > 0) {\n for (const childRoute of children) {\n const matchesResult = _matchRoute([...matches, childRoute], childRoute);\n if (matchesResult) {\n return matchesResult;\n }\n }\n return null;\n }\n\n const result = matchPattern(buildPathnameFromMatches(matches), url);\n return result ? { matches, ...result } : null;\n };\n\n return (\n _matchRoute([route], route) || {\n matches: [],\n params: {},\n query: {},\n }\n );\n};\n\nexport const buildPathnameFromMatches = (matches: Route[]): string => {\n let cleanedPathnames: string[] = []; // pathnames without leading/trailing slashes\n for (const match of matches) {\n if (match.pathname === undefined) continue;\n cleanedPathnames.push(match.pathname.replaceAll(/^\\/|\\/$/g, \"\"));\n }\n return \"/\" + cleanedPathnames.join(\"/\");\n};\n\nexport const parseLocation = ({\n href,\n pathname,\n search,\n}: globalThis.Location): Location => ({\n index: 0,\n href,\n state: {\n index: 0,\n },\n pathname,\n search: Object.fromEntries(new URLSearchParams(search)),\n});\n\nexport const createRouterOptions = (\n options?: Partial<RouterOptions>\n): RouterOptions => ({\n ...DefaultRouterOptions,\n ...options,\n});\n\nexport const parseRoute = (route: Route): ParsedRoute => {\n const parseRouteRecursive = (route: Route, parentId: string): ParsedRoute => {\n const id =\n route.name ??\n (route.pathname\n ? `${parentId}/${route.pathname.replaceAll(/^\\/|\\/$/g, \"\")}`\n : parentId);\n\n const parsedRoute: ParsedRoute = {\n ...route,\n id,\n children: route.children?.map((child) => parseRouteRecursive(child, id)),\n };\n\n return parsedRoute;\n };\n return parseRouteRecursive(route, \"\");\n};\n\nconst isPathSegmentValid = (segment: string): boolean => segment.length > 0;\n\n/**\n * Resolves a relative path against a base url.\n * @param url The base url.\n * @param to The relative path to resolve.\n * @returns The resolved absolute url.\n */\nexport const resolveRelativeUrl = (url: string, to: string): string => {\n const currentPathSegments = url.split(\"/\").filter(isPathSegmentValid);\n const toPathSegments = to.split(\"/\").filter(isPathSegmentValid);\n for (const segment of toPathSegments) {\n if (segment === \".\") {\n continue;\n } else if (segment === \"..\") {\n currentPathSegments.pop();\n } else {\n currentPathSegments.push(segment);\n }\n }\n return \"/\" + currentPathSegments.join(\"/\");\n};\n\nexport const buildUrlFromLocation = (location: Location): string => {\n const searchParams = new URLSearchParams(location.search).toString();\n return searchParams\n ? `${location.pathname}?${searchParams}`\n : location.pathname;\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useRouter } from \"@/hooks/useRouter.js\";\nimport type { Route } from \"@/types.js\";\n\nimport { LocationProvider } from \"./location-provider.js\";\nimport { PageRenderer } from \"./page-renderer.js\";\nimport { RootRouteProvider } from \"./root-route-provider.js\";\n\nconst PreviousComponentStyle = {\n position: \"absolute\",\n inset: 0,\n zIndex: -1,\n} as const;\n\nexport interface StackComponentProps\n extends React.ComponentPropsWithoutRef<\"div\"> {\n allowSwipeForward?: boolean;\n allowSwipeBack?: boolean;\n}\n\nconst StackComponent: React.FC<StackComponentProps> = ({\n allowSwipeBack = true,\n allowSwipeForward = true,\n style,\n ...props\n}) => {\n const {\n history,\n location,\n canGoBack,\n canGoForward,\n isTransitioning,\n transitioningToLocation,\n transitionType,\n transitionDuration,\n back,\n forward,\n } = useRouter();\n const currentLocationIndex = location.index;\n\n const isTouching = useRef(false);\n const startX = useRef(0);\n const startY = useRef(0);\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState(0);\n const [showPreviousComponent, setShowPreviousComponent] = useState(false);\n const [showNextComponent, setShowNextComponent] = useState(false);\n const [isCanceling, setIsCanceling] = useState(false);\n const [isTransitionStarted, setIsTransitionStarted] = useState(false);\n\n useEffect(() => {\n if (!isTransitioning || !transitioningToLocation) return;\n setIsTransitionStarted(true);\n setTimeout(() => {\n setIsTransitionStarted(false);\n }, transitionDuration);\n }, [isTransitioning, transitioningToLocation, transitionDuration]);\n\n if (currentLocationIndex === undefined) return;\n\n const reset = () => {\n setIsDragging(false);\n setDragOffset(0);\n setShowPreviousComponent(false);\n setShowNextComponent(false);\n setIsCanceling(false);\n };\n\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n if (isTransitioning || (!canGoForward && !canGoBack)) return;\n isTouching.current = true;\n startX.current = e.touches[0].clientX;\n startY.current = e.touches[0].clientY;\n },\n [isTransitioning, canGoBack, canGoForward]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n if (!isTouching.current) return;\n // Skip vertical drag\n const { clientX, clientY } = e.touches[0];\n if (!isDragging && Math.abs(clientY - startY.current) > 30) {\n isTouching.current = false;\n return;\n }\n const offset = clientX - startX.current;\n if (Math.abs(offset) < 10) return;\n if (!isDragging) {\n setIsDragging(true);\n }\n if (\n (offset > 0 && currentLocationIndex === 0) ||\n (offset < 0 && currentLocationIndex + 1 === history.length)\n ) {\n setDragOffset(0);\n return;\n }\n if (!showPreviousComponent && offset < 0 && allowSwipeForward)\n setShowPreviousComponent(true);\n if (!showNextComponent && offset > 0 && allowSwipeBack)\n setShowNextComponent(true);\n setDragOffset(\n Math.max(Math.min(offset, window.innerWidth), -window.innerWidth)\n );\n },\n [\n isDragging,\n currentLocationIndex,\n history.length,\n showPreviousComponent,\n showNextComponent,\n allowSwipeBack,\n allowSwipeForward,\n ]\n );\n\n const handleTouchEnd = useCallback(() => {\n isTouching.current = false;\n if (!isDragging) return;\n\n const options = {\n onFinish: reset,\n };\n if (dragOffset > innerWidth * 0.3 && canGoBack && allowSwipeBack) {\n back(options);\n } else if (\n dragOffset < -innerWidth * 0.3 &&\n canGoForward &&\n allowSwipeForward\n ) {\n forward(options);\n } else {\n setIsCanceling(true);\n setTimeout(reset, transitionDuration);\n }\n }, [\n back,\n forward,\n isDragging,\n dragOffset,\n canGoBack,\n canGoForward,\n transitionDuration,\n ]);\n\n return (\n <div\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n ...style,\n }}\n {...props}\n >\n {((isTransitioning && transitionType === \"slide-right\") ||\n (isDragging && showNextComponent)) && (\n <div style={PreviousComponentStyle}>\n <LocationProvider\n location={\n isTransitioning\n ? transitioningToLocation!\n : history.at(currentLocationIndex - 1)!\n }\n >\n <PageRenderer key={currentLocationIndex - 1} />\n </LocationProvider>\n </div>\n )}\n <div\n key={currentLocationIndex}\n style={{\n background: \"white\",\n position: \"absolute\",\n inset: 0,\n transform:\n isTransitioning && transitionType === \"slide-right\"\n ? `translateX(100%)`\n : isDragging && dragOffset > 0 && !isCanceling\n ? `translateX(${dragOffset}px)`\n : \"translateX(0px)\",\n transition:\n isCanceling || (isTransitioning && transitionType === \"slide-right\")\n ? `transform ${transitionDuration}ms ease-out`\n : \"\",\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n <PageRenderer />\n </div>\n {((isTransitioning && transitionType === \"slide-left\") ||\n (isDragging && showPreviousComponent)) && (\n <div\n style={{\n background: \"white\",\n position: \"absolute\",\n inset: 0,\n zIndex: 1,\n transform: `translateX(${\n isTransitionStarted\n ? \"0px\"\n : isTransitioning || isCanceling\n ? \"100%\"\n : `${innerWidth + dragOffset}px`\n })`,\n transition: `transform ${\n isTransitioning || isCanceling ? transitionDuration : 0\n }ms ease-in`,\n }}\n >\n <LocationProvider\n location={\n isTransitioning\n ? transitioningToLocation!\n : history.at(currentLocationIndex + 1)!\n }\n >\n <PageRenderer key={transitioningToLocation?.index} />\n </LocationProvider>\n </div>\n )}\n </div>\n );\n};\n\nexport interface StackProps extends StackComponentProps {\n route: Route;\n}\n\nexport const Stack: React.FC<StackProps> = ({ route, ...props }) => (\n <RootRouteProvider route={route}>\n <StackComponent {...props} />\n </RootRouteProvider>\n);\n","import { RouteMatchContext } from \"@/context/route-match-context.js\";\nimport { useLocation } from \"@/hooks/useLocation.js\";\nimport { useRootRoute } from \"@/hooks/useRootRoute.js\";\nimport { matchRoute } from \"@/utils.js\";\nimport { memo, useMemo } from \"react\";\nimport { RouteComponent } from \"./route-component.js\";\nimport { RouteProvider } from \"./route-provider.js\";\n\nexport const PageRenderer = memo(() => {\n const rootRoute = useRootRoute();\n const location = useLocation();\n const routeMatch = useMemo(\n () => matchRoute(rootRoute, location.pathname),\n [rootRoute, location.pathname]\n );\n return (\n <RouteMatchContext.Provider value={routeMatch}>\n <RouteProvider route={rootRoute}>\n <RouteComponent />\n </RouteProvider>\n </RouteMatchContext.Provider>\n );\n});\n","import { RootRouteContext } from \"@/context/root-route-context.js\";\nimport type { Route } from \"@/types.js\";\nimport { parseRoute } from \"@/utils.js\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport const RootRouteProvider = ({\n route,\n ...props\n}: {\n route: Route;\n children: React.ReactNode;\n}) => {\n const parsedRoute = useMemo(() => parseRoute(route), [route]);\n const [state, setState] = useState<Record<string, Record<string, any>>>({});\n\n const getRouteState = useCallback(\n (id: string, key: string) => {\n return state[id]?.[key];\n },\n [state]\n );\n\n const setRouteState = useCallback((id: string, key: string, value: any) => {\n setState((prevState) => ({\n ...prevState,\n [id]: {\n ...prevState[id],\n [key]: value,\n },\n }));\n }, []);\n\n return (\n <RootRouteContext.Provider\n value={{ ...parsedRoute, state, getRouteState, setRouteState }}\n {...props}\n />\n );\n};\n"],"mappings":"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","names":["useContext","createContext","RouterContext","useRouter","router","useContext","RouterContext","memo","jsx","Link","to","replace","transitionType","duration","onFinish","props","router","useRouter","e","createContext","LocationContext","memo","useCallback","useMemo","jsx","LocationProvider","location","props","router","useRouter","state","setState","key","value","prev","deleteState","setSearch","LocationContext","a","b","createContext","OutletContext","useContext","useOutlet","OutletContext","createContext","RouteMatchContext","useContext","useRouteMatch","routeMatch","RouteMatchContext","jsx","OutletProvider","depth","props","OutletContext","useContext","useLocation","context","useContext","LocationContext","createContext","RouteContext","useContext","useRoute","route","RouteContext","useEffect","jsx","RouteComponent","depth","router","useRouter","location","useLocation","routeMatch","useRouteMatch","route","useRoute","pendingStateKey","pending","useEffect","cause","PendingComponent","NotFoundComponent","Component","Outlet","useContext","createContext","RootRouteContext","useRootRoute","route","useContext","RootRouteContext","useCallback","jsx","RouteProvider","route","props","RouteContext","state","getRouteState","setRouteState","useRootRoute","getState","key","setState","value","jsx","Outlet","routeMatch","useRouteMatch","depth","useOutlet","OutletProvider","RouteProvider","RouteComponent","useCallback","useEffect","useMemo","useState","DefaultRouterOptions","DefaultTransitionDuration","redirect","options","matchPattern","pattern","url","pathname","searchParams","urlObj","path","queryString","cleanPath","cleanPattern","pathSegments","patternSegments","params","i","patternSegment","pathSegment","paramName","query","matchRoute","route","_matchRoute","matches","children","childRoute","matchesResult","result","buildPathnameFromMatches","cleanedPathnames","match","parseLocation","href","search","createRouterOptions","DefaultRouterOptions","parseRoute","parseRouteRecursive","parentId","id","child","isPathSegmentValid","segment","resolveRelativeUrl","to","currentPathSegments","toPathSegments","buildUrlFromLocation","location","jsx","RouterProvider","options","props","history","setHistory","useState","parseLocation","currentLocationIndex","setCurrentLocationIndex","location","useMemo","isTransitioning","setIsTransitioning","transitioningToLocation","setTransitioningToLocation","transitionType","setTransitionType","transitionDuration","setTransitionDuration","canGoBack","canGoForward","useEffect","buildUrlFromLocation","handlePopState","state","buildLocation","useCallback","to","replace","index","url","resolveRelativeUrl","pathname","search","searchParams","transitionTo","duration","callback","navigate","onFinish","newLocation","updateHistory","prevHistory","finalTransitionType","back","depth","backDepth","forward","forwardDepth","setLocationState","newState","setLocationSearch","locationIndex","prev","RouterContext","LocationProvider","useCallback","useEffect","useRef","useState","memo","useMemo","jsx","PageRenderer","memo","rootRoute","useRootRoute","location","useLocation","routeMatch","useMemo","matchRoute","RouteMatchContext","RouteProvider","RouteComponent","useCallback","useMemo","useState","jsx","RootRouteProvider","route","props","parsedRoute","parseRoute","state","setState","getRouteState","id","key","setRouteState","value","prevState","RootRouteContext","jsx","jsxs","PreviousComponentStyle","StackComponent","allowSwipeBack","allowSwipeForward","style","props","history","location","canGoBack","canGoForward","isTransitioning","transitioningToLocation","transitionType","transitionDuration","back","forward","useRouter","currentLocationIndex","isTouching","useRef","startX","startY","isDragging","setIsDragging","useState","dragOffset","setDragOffset","showPreviousComponent","setShowPreviousComponent","showNextComponent","setShowNextComponent","isCanceling","setIsCanceling","isTransitionStarted","setIsTransitionStarted","useEffect","reset","handleTouchStart","useCallback","e","handleTouchMove","clientX","clientY","offset","handleTouchEnd","options","LocationProvider","PageRenderer","Stack","route","RootRouteProvider"]}
|
|
1
|
+
{"version":3,"sources":["../src/context/router-context.ts","../src/hooks/useRouter.ts","../src/components/link.tsx","../src/context/location-context.ts","../src/components/location-provider.tsx","../src/context/outlet-context.ts","../src/hooks/useOutlet.ts","../src/context/route-match-context.ts","../src/hooks/useRouteMatch.ts","../src/components/outlet-provider.tsx","../src/hooks/useLocation.ts","../src/context/route-context.ts","../src/hooks/useRoute.ts","../src/components/route-component.tsx","../src/context/root-route-context.ts","../src/hooks/useRootRoute.ts","../src/components/route-provider.tsx","../src/components/outlet.tsx","../src/constants.ts","../src/utils.ts","../src/components/router-provider.tsx","../src/components/page-renderer.tsx","../src/components/root-route-provider.tsx","../src/components/stack.tsx"],"names":["RouterContext","createContext","useRouter","router","useContext","Link","memo","to","replace","transitionType","duration","onFinish","props","jsx","e","LocationContext","LocationProvider","location","state","useMemo","setState","useCallback","key","value","prev","deleteState","setSearch","a","b","OutletContext","useOutlet","RouteMatchContext","useRouteMatch","routeMatch","OutletProvider","depth","useLocation","context","RouteContext","useRoute","route","RouteComponent","pendingStateKey","pending","useEffect","cause","PendingComponent","NotFoundComponent","Component","Outlet","RootRouteContext","useRootRoute","RouteProvider","getRouteState","setRouteState","getState","DefaultRouterOptions","DefaultTransitionDuration","redirect","options","matchPattern","pattern","url","pathname","searchParams","urlObj","path","queryString","cleanPath","cleanPattern","pathSegments","patternSegments","params","i","patternSegment","pathSegment","paramName","query","matchRoute","_matchRoute","matches","children","childRoute","matchesResult","result","buildPathnameFromMatches","cleanedPathnames","match","parseLocation","href","search","createRouterOptions","parseRoute","parseRouteRecursive","parentId","id","child","isPathSegmentValid","segment","resolveRelativeUrl","currentPathSegments","toPathSegments","buildUrlFromLocation","RouterProvider","history","setHistory","useState","currentLocationIndex","setCurrentLocationIndex","isTransitioning","setIsTransitioning","transitioningToLocation","setTransitioningToLocation","setTransitionType","transitionDuration","setTransitionDuration","canGoBack","canGoForward","handlePopState","buildLocation","index","transitionTo","callback","navigate","newLocation","updateHistory","prevHistory","finalTransitionType","back","backDepth","forward","forwardDepth","setLocationState","newState","setLocationSearch","locationIndex","PageRenderer","rootRoute","RootRouteProvider","parsedRoute","prevState","PreviousComponentStyle","StackComponent","allowSwipeBack","allowSwipeForward","style","isTouching","useRef","startX","startY","isDragging","setIsDragging","dragOffset","setDragOffset","showPreviousComponent","setShowPreviousComponent","showNextComponent","setShowNextComponent","isCanceling","setIsCanceling","isTransitionStarted","setIsTransitionStarted","reset","handleTouchStart","handleTouchMove","clientX","clientY","offset","handleTouchEnd","jsxs","Stack"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext } from \"react\";\n\nimport type {\n BackActionOptions,\n ForwardActionOptions,\n Location,\n NavigateActionOptions,\n NavigationOptions,\n RouterOptions,\n TransitionType,\n} from \"@/types.js\";\n\nexport interface RouterContextType {\n // Router Config\n options: RouterOptions;\n\n // Navigation State\n history: Location[];\n location: Location;\n canGoBack: boolean;\n canGoForward: boolean;\n\n // Transition state\n isTransitioning: boolean;\n transitioningToLocation?: Location;\n transitionType?: TransitionType;\n transitionDuration: number;\n\n // Utilities\n buildLocation: (to: NavigationOptions) => Location;\n\n // Navigation Actions\n navigate: (options: NavigateActionOptions) => void;\n back: (options?: BackActionOptions) => void;\n forward: (options?: ForwardActionOptions) => void;\n\n // Low-level state action\n setLocationState: (\n index: number,\n state:\n | Record<string, any>\n | ((prev: Record<string, any>) => Record<string, any>)\n ) => void;\n setLocationSearch: (\n locationIndex: number,\n search: Record<string, string>\n ) => void;\n}\n\nexport const RouterContext = createContext<RouterContextType | null>(null);\n","import { useContext } from \"react\";\n\nimport { RouterContext } from \"@/context/router-context.js\";\n\nexport const useRouter = () => {\n const router = useContext(RouterContext);\n if (router === null) {\n throw new Error(\"useRouter must be used within a Stack\");\n }\n return router;\n};\n","import { useRouter } from \"@/hooks/useRouter.js\";\nimport type { NavigateActionOptions } from \"@/types.js\";\nimport { memo } from \"react\";\n\nexport type LinkProps = React.ComponentPropsWithoutRef<\"a\"> &\n NavigateActionOptions;\n\nexport const Link: React.FC<LinkProps> = memo(\n ({ to, replace, transitionType, duration, onFinish, ...props }) => {\n const router = useRouter();\n return (\n <a\n {...props}\n href={to}\n onClick={(e) => {\n e.preventDefault();\n router.navigate({\n to,\n replace,\n transitionType,\n duration,\n onFinish,\n });\n }}\n />\n );\n }\n);\n","import { createContext } from \"react\";\n\nimport type { Location } from \"@/types.js\";\n\nexport interface LocationContextType extends Location {\n canGoBack: boolean;\n canGoForward: boolean;\n state: Record<string, any>;\n setState: (key: string, value: any) => void;\n deleteState: (key: string) => void;\n setSearch: (key: string, value: string) => void;\n}\n\nexport const LocationContext = createContext<LocationContextType | null>(null);\n","import { LocationContext } from \"@/context/location-context.js\";\nimport { useRouter } from \"@/hooks/useRouter.js\";\nimport type { Location } from \"@/types.js\";\nimport { memo, useCallback, useMemo } from \"react\";\n\nexport const LocationProvider = memo(\n ({\n location,\n ...props\n }: {\n location: Location;\n children: React.ReactNode;\n }) => {\n const router = useRouter();\n const state = useMemo(() => location.state, [location]);\n const setState = useCallback(\n (key: string, value: any) => {\n router.setLocationState(location.index, (prev) => ({\n ...prev,\n [key]: value,\n }));\n },\n [router, location]\n );\n const deleteState = useCallback(\n (key: string) => {\n router.setLocationState(location.index, (prev) => {\n delete prev[key];\n return prev;\n });\n },\n [router, location]\n );\n const setSearch = useCallback(\n (key: string, value: string) => {\n router.setLocationSearch(location.index, {\n ...location.search,\n [key]: value,\n });\n },\n [router, location]\n );\n return (\n <LocationContext.Provider\n value={{\n ...location,\n canGoBack: !router.isTransitioning && location.index > 0,\n canGoForward:\n !router.isTransitioning &&\n location.index + 1 < router.history.length,\n state,\n setState,\n deleteState,\n setSearch,\n }}\n {...props}\n />\n );\n },\n (a, b) => a.location === b.location\n);\n","import { createContext } from \"react\";\n\nexport const OutletContext = createContext<number>(0);\n","import { OutletContext } from \"@/context/outlet-context.js\";\nimport { useContext } from \"react\";\n\nexport const useOutlet = () => useContext(OutletContext);\n","import type { RouteMatch } from \"@/types.js\";\nimport { createContext } from \"react\";\n\nexport const RouteMatchContext = createContext<RouteMatch | null>(null);\n","import { RouteMatchContext } from \"@/context/route-match-context.js\";\nimport { useContext } from \"react\";\n\nexport const useRouteMatch = () => {\n const routeMatch = useContext(RouteMatchContext);\n if (routeMatch === null) {\n throw new Error(\"useRouteMatch must be used within a RouteMatchProvider\");\n }\n return routeMatch;\n};\n","import { OutletContext } from \"@/context/outlet-context.js\";\n\nexport const OutletProvider = ({\n depth,\n ...props\n}: {\n depth: number;\n children?: React.ReactNode;\n}) => <OutletContext.Provider value={depth} {...props} />;\n","import { useContext } from \"react\";\n\nimport { LocationContext } from \"@/context/location-context.js\";\n\nexport const useLocation = () => {\n const context = useContext(LocationContext);\n if (context === null) {\n throw new Error(\"useLocation must be used within a LocationProvider\");\n }\n return context;\n};\n","import type { ParsedRoute } from \"@/types.js\";\nimport { createContext } from \"react\";\n\nexport interface RouteContextType extends ParsedRoute {\n state: Record<string, any>;\n getState: (key: string) => any;\n setState: (key: string, value: any) => void;\n}\n\nexport const RouteContext = createContext<RouteContextType | null>(null);\n","import { RouteContext } from \"@/context/route-context.js\";\nimport { useContext } from \"react\";\n\nexport const useRoute = () => {\n const route = useContext(RouteContext);\n if (route === null) {\n throw new Error(\"useRoute must be used within a RouteProvider\");\n }\n return route;\n};\n","import { useLocation } from \"@/hooks/useLocation.js\";\nimport { useRoute } from \"@/hooks/useRoute.js\";\nimport { useRouteMatch } from \"@/hooks/useRouteMatch.js\";\nimport { useRouter } from \"@/hooks/useRouter.js\";\nimport { useEffect } from \"react\";\nimport { Outlet } from \"./outlet.js\";\n\nexport const RouteComponent = ({ depth = 0 }: { depth?: number }) => {\n const router = useRouter();\n const location = useLocation();\n const routeMatch = useRouteMatch();\n const route = useRoute();\n\n const pendingStateKey = `_Z.${route.id}.pending`;\n const pending =\n !!route.beforeLoad && route.getState(pendingStateKey) !== false;\n\n useEffect(() => {\n if (!route) {\n return;\n }\n if (route.beforeLoad && route.getState(pendingStateKey) === undefined) {\n route.setState(pendingStateKey, true);\n route\n .beforeLoad?.({ location })\n .then(() => route.setState(pendingStateKey, false))\n .catch(({ cause }: Error) => {\n if (!!cause && \"to\" in (cause as any)) {\n console.log(\"Redirecting to:\", (cause as any).to);\n router.navigate({\n ...(cause as any),\n onFinish: () => {\n route.setState(pendingStateKey, false);\n },\n });\n } else {\n route.setState(pendingStateKey, false);\n }\n });\n }\n }, [route]);\n\n if (!route) {\n return null;\n }\n\n if (pending) {\n const PendingComponent = route.pendingComponent!;\n return <PendingComponent />;\n }\n\n if (depth >= routeMatch.matches.length) {\n const NotFoundComponent = route.notFoundComponent!;\n return <NotFoundComponent />;\n }\n\n const Component = route.component;\n return Component ? <Component /> : <Outlet />;\n};\n","import { createContext } from \"react\";\n\nimport type { ParsedRoute } from \"@/types.js\";\n\nexport interface RootRouteContextType extends ParsedRoute {\n state: Record<string, Record<string, any>>;\n getRouteState: (id: string, key: string) => any;\n setRouteState: (id: string, key: string, value: any) => void;\n}\n\nexport const RootRouteContext = createContext<RootRouteContextType | null>(\n null\n);\n","import { useContext } from \"react\";\n\nimport { RootRouteContext } from \"@/context/root-route-context.js\";\n\nexport const useRootRoute = () => {\n const route = useContext(RootRouteContext);\n if (route === null) {\n throw new Error(\"useRootRoute must be used within a RootRouteProvider\");\n }\n return route;\n};\n","import { RouteContext } from \"@/context/route-context.js\";\nimport { useRootRoute } from \"@/hooks/useRootRoute.js\";\nimport type { ParsedRoute } from \"@/types.js\";\nimport { useCallback } from \"react\";\n\nexport const RouteProvider = ({\n route,\n ...props\n}: {\n route?: ParsedRoute;\n children?: React.ReactNode;\n}) => {\n if (!route) {\n return <RouteContext.Provider value={null} {...props} />;\n }\n\n const { state, getRouteState, setRouteState } = useRootRoute();\n\n const getState = useCallback(\n (key: string) => getRouteState(route.id, key),\n [getRouteState, route.id]\n );\n\n const setState = useCallback(\n (key: string, value: any) => {\n setRouteState(route.id, key, value);\n },\n [setRouteState, route.id]\n );\n\n return (\n <RouteContext.Provider\n value={{ ...route, state: state[route.id], getState, setState }}\n {...props}\n />\n );\n};\n","import { useOutlet } from \"@/hooks/useOutlet.js\";\nimport { useRouteMatch } from \"@/hooks/useRouteMatch.js\";\nimport { OutletProvider } from \"./outlet-provider.js\";\nimport { RouteComponent } from \"./route-component.js\";\nimport { RouteProvider } from \"./route-provider.js\";\n\nexport const Outlet = () => {\n const routeMatch = useRouteMatch();\n const depth = useOutlet() + 1;\n return (\n <OutletProvider depth={depth}>\n <RouteProvider route={routeMatch.matches.at(depth)}>\n <RouteComponent depth={depth} />\n </RouteProvider>\n </OutletProvider>\n );\n};\n","import type { RouterOptions } from \"./types.js\";\n\nexport const DefaultRouterOptions: RouterOptions = {\n defaultTransitionDuration: 300,\n};\n","import { DefaultRouterOptions } from \"./constants.js\";\nimport type {\n Location,\n NavigateActionOptions,\n ParsedRoute,\n Route,\n RouteMatch,\n RouterOptions,\n} from \"./types.js\";\n\nexport const DefaultTransitionDuration = 300;\n\nexport const redirect = (options: NavigateActionOptions) => {\n return new Error(\"\", { cause: options });\n};\n\n/**\n * @param pattern pathname pattern like `/users/:id`. Leading and trailing slashes are optional.\n * @param url URL to match against the pattern. Can be href or pathname with query string.\n * @returns extracted params and query if matched, otherwise null\n */\nexport const matchPattern = (\n pattern: string,\n url: string\n): { params: Record<string, string>; query: Record<string, string> } | null => {\n try {\n // 解析 URL\n let pathname, searchParams;\n\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) {\n const urlObj = new URL(url);\n pathname = urlObj.pathname;\n searchParams = urlObj.searchParams;\n } else {\n // 處理相對路徑\n const [path, queryString] = url.split(\"?\");\n if (!path) {\n return null;\n }\n pathname = path;\n searchParams = new URLSearchParams(queryString || \"\");\n }\n\n // 移除路徑首尾的斜線以便比較\n const cleanPath = pathname.replaceAll(/^\\/|\\/$/g, \"\");\n const cleanPattern = pattern.replaceAll(/^\\/|\\/$/g, \"\");\n\n // 分割路徑段\n const pathSegments = cleanPath.split(\"/\");\n const patternSegments = cleanPattern.split(\"/\");\n\n // 路徑段數量不同則不匹配\n if (pathSegments.length !== patternSegments.length) {\n return null;\n }\n\n // 提取路徑參數\n const params: Record<string, string> = {};\n for (let i = 0; i < patternSegments.length; i++) {\n const patternSegment = patternSegments[i];\n const pathSegment = pathSegments[i];\n\n if (patternSegment.startsWith(\":\")) {\n // 動態參數\n const paramName = patternSegment.slice(1);\n params[paramName] = decodeURIComponent(pathSegment);\n } else if (patternSegment !== pathSegment) {\n // 靜態段不匹配\n return null;\n }\n }\n\n // 提取查詢參數\n const query = Object.fromEntries(searchParams.entries());\n\n return { params, query };\n } catch {\n return null;\n }\n};\n\nexport const matchRoute = (route: ParsedRoute, url: string): RouteMatch => {\n const _matchRoute = (\n matches: ParsedRoute[],\n { children }: ParsedRoute\n ): RouteMatch | null => {\n if (children && children.length > 0) {\n for (const childRoute of children) {\n const matchesResult = _matchRoute([...matches, childRoute], childRoute);\n if (matchesResult) {\n return matchesResult;\n }\n }\n return null;\n }\n\n const result = matchPattern(buildPathnameFromMatches(matches), url);\n return result ? { matches, ...result } : null;\n };\n\n return (\n _matchRoute([route], route) || {\n matches: [],\n params: {},\n query: {},\n }\n );\n};\n\nexport const buildPathnameFromMatches = (matches: Route[]): string => {\n let cleanedPathnames: string[] = []; // pathnames without leading/trailing slashes\n for (const match of matches) {\n if (match.pathname === undefined) continue;\n cleanedPathnames.push(match.pathname.replaceAll(/^\\/|\\/$/g, \"\"));\n }\n return \"/\" + cleanedPathnames.join(\"/\");\n};\n\nexport const parseLocation = ({\n href,\n pathname,\n search,\n}: globalThis.Location): Location => ({\n index: 0,\n href,\n state: {\n index: 0,\n },\n pathname,\n search: Object.fromEntries(new URLSearchParams(search)),\n});\n\nexport const createRouterOptions = (\n options?: Partial<RouterOptions>\n): RouterOptions => ({\n ...DefaultRouterOptions,\n ...options,\n});\n\nexport const parseRoute = (route: Route): ParsedRoute => {\n const parseRouteRecursive = (route: Route, parentId: string): ParsedRoute => {\n const id =\n route.name ??\n (route.pathname\n ? `${parentId}/${route.pathname.replaceAll(/^\\/|\\/$/g, \"\")}`\n : parentId);\n\n const parsedRoute: ParsedRoute = {\n ...route,\n id,\n children: route.children?.map((child) => parseRouteRecursive(child, id)),\n };\n\n return parsedRoute;\n };\n return parseRouteRecursive(route, \"\");\n};\n\nconst isPathSegmentValid = (segment: string): boolean => segment.length > 0;\n\n/**\n * Resolves a relative path against a base url.\n * @param url The base url.\n * @param to The relative path to resolve.\n * @returns The resolved absolute url.\n */\nexport const resolveRelativeUrl = (url: string, to: string): string => {\n const currentPathSegments = url.split(\"/\").filter(isPathSegmentValid);\n const toPathSegments = to.split(\"/\").filter(isPathSegmentValid);\n for (const segment of toPathSegments) {\n if (segment === \".\") {\n continue;\n } else if (segment === \"..\") {\n currentPathSegments.pop();\n } else {\n currentPathSegments.push(segment);\n }\n }\n return \"/\" + currentPathSegments.join(\"/\");\n};\n\nexport const buildUrlFromLocation = (location: Location): string => {\n const searchParams = new URLSearchParams(location.search).toString();\n return searchParams\n ? `${location.pathname}?${searchParams}`\n : location.pathname;\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { RouterContext } from \"@/context/router-context.js\";\nimport type {\n BackActionOptions,\n ForwardActionOptions,\n Location,\n NavigateActionOptions,\n NavigationOptions,\n RouterOptions,\n TransitionType,\n} from \"@/types.js\";\nimport {\n buildUrlFromLocation,\n parseLocation,\n resolveRelativeUrl,\n} from \"@/utils.js\";\nimport { LocationProvider } from \"./location-provider.js\";\n\nexport const RouterProvider = ({\n options,\n ...props\n}: {\n options: RouterOptions;\n children: React.ReactNode;\n}) => {\n const [history, setHistory] = useState<Location[]>([\n parseLocation(window.location),\n ]);\n const [currentLocationIndex, setCurrentLocationIndex] = useState<number>(0);\n const location = useMemo(\n () => history.at(currentLocationIndex)!,\n [history, currentLocationIndex]\n );\n const [isTransitioning, setIsTransitioning] = useState<boolean>(false);\n const [transitioningToLocation, setTransitioningToLocation] =\n useState<Location>();\n const [transitionType, setTransitionType] = useState<TransitionType>();\n const [transitionDuration, setTransitionDuration] = useState<number>(0);\n\n const canGoBack = !isTransitioning && currentLocationIndex > 0;\n const canGoForward =\n !isTransitioning && currentLocationIndex + 1 < history.length;\n\n useEffect(() => {\n window.history.replaceState(\n location.state,\n \"\",\n buildUrlFromLocation(location)\n );\n }, []);\n\n useEffect(() => {\n const handlePopState = ({ state }: PopStateEvent) => {\n setCurrentLocationIndex(state?.index);\n };\n\n addEventListener(\"popstate\", handlePopState);\n return () => {\n removeEventListener(\"popstate\", handlePopState);\n };\n }, [currentLocationIndex]);\n\n // Utilities\n const buildLocation = useCallback(\n ({ to, replace }: NavigationOptions): Location => {\n if (!to) return location;\n const index = replace ? currentLocationIndex : currentLocationIndex + 1;\n\n // Resolve to with absolute or relative paths like \"..\" or \".\"\n const url = to.startsWith(\"/\")\n ? to\n : resolveRelativeUrl(location.pathname, to);\n const [pathname, search] = url.split(\"?\");\n const searchParams = new URLSearchParams(search ?? \"\");\n const state = {\n index,\n };\n return {\n index,\n href: origin + pathname + (search ? `?${searchParams.toString()}` : \"\"),\n search: Object.fromEntries(searchParams.entries()),\n state,\n pathname,\n };\n },\n [currentLocationIndex, location]\n );\n\n // Transition helper\n const transitionTo = (\n location: Location,\n transitionType: TransitionType,\n duration: number = options.defaultTransitionDuration,\n callback?: () => void\n ) => {\n setIsTransitioning(true);\n setTransitionType(transitionType);\n setTransitionDuration(duration);\n setTransitioningToLocation(location);\n setTimeout(() => {\n setIsTransitioning(false);\n setTransitionType(undefined);\n setTransitioningToLocation(undefined);\n callback?.();\n }, duration);\n };\n\n // Navigation actions\n const navigate = useCallback(\n ({\n to,\n replace,\n transitionType,\n duration,\n onFinish,\n }: NavigateActionOptions) => {\n if (isTransitioning) return;\n\n const index = replace ? currentLocationIndex : currentLocationIndex + 1;\n const newLocation = buildLocation({ to, replace });\n\n const updateHistory = () => {\n if (replace) {\n setHistory((prevHistory) => [\n ...prevHistory.slice(0, index),\n newLocation,\n ...prevHistory.slice(index + 1),\n ]);\n window.history.replaceState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n } else {\n setHistory((prevHistory) => [\n ...prevHistory.slice(0, index),\n newLocation,\n ]);\n setCurrentLocationIndex(index);\n window.history.pushState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n onFinish?.();\n };\n\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-left\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const back = useCallback(\n ({ transitionType, duration, onFinish, depth }: BackActionOptions = {}) => {\n if (!canGoBack) return;\n const backDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex - backDepth);\n if (!newLocation) return;\n\n const updateHistory = () => {\n window.history.go(-backDepth);\n onFinish?.();\n };\n\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-right\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const forward = useCallback(\n ({\n transitionType,\n duration,\n depth,\n onFinish,\n }: ForwardActionOptions = {}) => {\n if (!canGoForward) return;\n const forwardDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex + forwardDepth);\n if (!newLocation) return;\n\n const updateHistory = () => {\n window.history.go(forwardDepth);\n onFinish?.();\n };\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-left\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n // Low-level state action\n const setLocationState = useCallback(\n (\n index: number,\n state:\n | Record<string, any>\n | ((prev: Record<string, any>) => Record<string, any>)\n ) => {\n setHistory((prevHistory) =>\n prevHistory.map((location) => {\n if (location.index !== index) {\n return location;\n }\n const newState =\n typeof state === \"function\" ? state(location.state) : state;\n const newLocation = { ...location, state: newState };\n if (index === currentLocationIndex) {\n window.history.replaceState(\n newState,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n return newLocation;\n })\n );\n },\n [currentLocationIndex]\n );\n\n const setLocationSearch = useCallback(\n (locationIndex: number, search: Record<string, string>) => {\n setHistory((prev) =>\n prev.map((location) => {\n if (location.index !== locationIndex) return location;\n const newLocation = {\n ...location,\n search: {\n ...location.search,\n ...search,\n },\n };\n if (locationIndex === currentLocationIndex) {\n window.history.replaceState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n return newLocation;\n })\n );\n },\n []\n );\n\n return (\n <RouterContext.Provider\n // oxlint-disable-next-line jsx-no-new-object-as-prop\n value={{\n options,\n\n history,\n location,\n canGoBack,\n canGoForward,\n\n isTransitioning,\n transitioningToLocation,\n transitionType,\n transitionDuration,\n\n buildLocation,\n\n navigate,\n back,\n forward,\n\n setLocationState,\n setLocationSearch,\n }}\n >\n <LocationProvider location={location} {...props} />\n </RouterContext.Provider>\n );\n};\n","import { RouteMatchContext } from \"@/context/route-match-context.js\";\nimport { useLocation } from \"@/hooks/useLocation.js\";\nimport { useRootRoute } from \"@/hooks/useRootRoute.js\";\nimport { matchRoute } from \"@/utils.js\";\nimport { memo, useMemo } from \"react\";\nimport { RouteComponent } from \"./route-component.js\";\nimport { RouteProvider } from \"./route-provider.js\";\n\nexport const PageRenderer = memo(() => {\n const rootRoute = useRootRoute();\n const location = useLocation();\n const routeMatch = useMemo(\n () => matchRoute(rootRoute, location.pathname),\n [rootRoute, location.pathname]\n );\n return (\n <RouteMatchContext.Provider value={routeMatch}>\n <RouteProvider route={rootRoute}>\n <RouteComponent />\n </RouteProvider>\n </RouteMatchContext.Provider>\n );\n});\n","import { RootRouteContext } from \"@/context/root-route-context.js\";\nimport type { Route } from \"@/types.js\";\nimport { parseRoute } from \"@/utils.js\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport const RootRouteProvider = ({\n route,\n ...props\n}: {\n route: Route;\n children: React.ReactNode;\n}) => {\n const parsedRoute = useMemo(() => parseRoute(route), [route]);\n const [state, setState] = useState<Record<string, Record<string, any>>>({});\n\n const getRouteState = useCallback(\n (id: string, key: string) => {\n return state[id]?.[key];\n },\n [state]\n );\n\n const setRouteState = useCallback((id: string, key: string, value: any) => {\n setState((prevState) => ({\n ...prevState,\n [id]: {\n ...prevState[id],\n [key]: value,\n },\n }));\n }, []);\n\n return (\n <RootRouteContext.Provider\n value={{ ...parsedRoute, state, getRouteState, setRouteState }}\n {...props}\n />\n );\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useRouter } from \"@/hooks/useRouter.js\";\nimport type { Route } from \"@/types.js\";\n\nimport { LocationProvider } from \"./location-provider.js\";\nimport { PageRenderer } from \"./page-renderer.js\";\nimport { RootRouteProvider } from \"./root-route-provider.js\";\n\nconst PreviousComponentStyle = {\n position: \"absolute\",\n inset: 0,\n zIndex: -1,\n} as const;\n\nexport interface StackComponentProps\n extends React.ComponentPropsWithoutRef<\"div\"> {\n allowSwipeForward?: boolean;\n allowSwipeBack?: boolean;\n}\n\nconst StackComponent: React.FC<StackComponentProps> = ({\n allowSwipeBack = true,\n allowSwipeForward = true,\n style,\n ...props\n}) => {\n const {\n history,\n location,\n canGoBack,\n canGoForward,\n isTransitioning,\n transitioningToLocation,\n transitionType,\n transitionDuration,\n back,\n forward,\n } = useRouter();\n const currentLocationIndex = location.index;\n\n const isTouching = useRef(false);\n const startX = useRef(0);\n const startY = useRef(0);\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState(0);\n const [showPreviousComponent, setShowPreviousComponent] = useState(false);\n const [showNextComponent, setShowNextComponent] = useState(false);\n const [isCanceling, setIsCanceling] = useState(false);\n const [isTransitionStarted, setIsTransitionStarted] = useState(false);\n\n useEffect(() => {\n if (!isTransitioning || !transitioningToLocation) return;\n setIsTransitionStarted(true);\n setTimeout(() => {\n setIsTransitionStarted(false);\n }, transitionDuration);\n }, [isTransitioning, transitioningToLocation, transitionDuration]);\n\n if (currentLocationIndex === undefined) return;\n\n const reset = () => {\n setIsDragging(false);\n setDragOffset(0);\n setShowPreviousComponent(false);\n setShowNextComponent(false);\n setIsCanceling(false);\n };\n\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n if (isTransitioning || (!canGoForward && !canGoBack)) return;\n isTouching.current = true;\n startX.current = e.touches[0].clientX;\n startY.current = e.touches[0].clientY;\n },\n [isTransitioning, canGoBack, canGoForward]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n if (!isTouching.current) return;\n // Skip vertical drag\n const { clientX, clientY } = e.touches[0];\n if (!isDragging && Math.abs(clientY - startY.current) > 30) {\n isTouching.current = false;\n return;\n }\n const offset = clientX - startX.current;\n if (Math.abs(offset) < 10) return;\n if (!isDragging) {\n setIsDragging(true);\n }\n if (\n (offset > 0 && currentLocationIndex === 0) ||\n (offset < 0 && currentLocationIndex + 1 === history.length)\n ) {\n setDragOffset(0);\n return;\n }\n if (!showPreviousComponent && offset < 0 && allowSwipeForward)\n setShowPreviousComponent(true);\n if (!showNextComponent && offset > 0 && allowSwipeBack)\n setShowNextComponent(true);\n setDragOffset(\n Math.max(Math.min(offset, window.innerWidth), -window.innerWidth)\n );\n },\n [\n isDragging,\n currentLocationIndex,\n history.length,\n showPreviousComponent,\n showNextComponent,\n allowSwipeBack,\n allowSwipeForward,\n ]\n );\n\n const handleTouchEnd = useCallback(() => {\n isTouching.current = false;\n if (!isDragging) return;\n\n const options = {\n onFinish: reset,\n };\n if (dragOffset > innerWidth * 0.3 && canGoBack && allowSwipeBack) {\n back(options);\n } else if (\n dragOffset < -innerWidth * 0.3 &&\n canGoForward &&\n allowSwipeForward\n ) {\n forward(options);\n } else {\n setIsCanceling(true);\n setTimeout(reset, transitionDuration);\n }\n }, [\n back,\n forward,\n isDragging,\n dragOffset,\n canGoBack,\n canGoForward,\n transitionDuration,\n ]);\n\n return (\n <div\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n ...style,\n }}\n {...props}\n >\n {((isTransitioning && transitionType === \"slide-right\") ||\n (isDragging && showNextComponent)) && (\n <div style={PreviousComponentStyle}>\n <LocationProvider\n location={\n isTransitioning\n ? transitioningToLocation!\n : history.at(currentLocationIndex - 1)!\n }\n >\n <PageRenderer key={currentLocationIndex - 1} />\n </LocationProvider>\n </div>\n )}\n <div\n key={currentLocationIndex}\n style={{\n position: \"absolute\",\n inset: 0,\n transform:\n isTransitioning && transitionType === \"slide-right\"\n ? `translateX(100%)`\n : isDragging && dragOffset > 0 && !isCanceling\n ? `translateX(${dragOffset}px)`\n : \"translateX(0px)\",\n transition:\n isCanceling || (isTransitioning && transitionType === \"slide-right\")\n ? `transform ${transitionDuration}ms ease-out`\n : \"\",\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n <PageRenderer />\n </div>\n {((isTransitioning && transitionType === \"slide-left\") ||\n (isDragging && showPreviousComponent)) && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n zIndex: 1,\n transform: `translateX(${\n isTransitionStarted\n ? \"0px\"\n : isTransitioning || isCanceling\n ? \"100%\"\n : `${innerWidth + dragOffset}px`\n })`,\n transition: `transform ${\n isTransitioning || isCanceling ? transitionDuration : 0\n }ms ease-in`,\n }}\n >\n <LocationProvider\n location={\n isTransitioning\n ? transitioningToLocation!\n : history.at(currentLocationIndex + 1)!\n }\n >\n <PageRenderer key={transitioningToLocation?.index} />\n </LocationProvider>\n </div>\n )}\n </div>\n );\n};\n\nexport interface StackProps extends StackComponentProps {\n route: Route;\n}\n\nexport const Stack: React.FC<StackProps> = ({ route, ...props }) => (\n <RootRouteProvider route={route}>\n <StackComponent {...props} />\n </RootRouteProvider>\n);\n"]}
|
package/package.json
CHANGED
package/.oxlintrc.json
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"plugins": [
|
|
3
|
-
"import",
|
|
4
|
-
"typescript",
|
|
5
|
-
"unicorn",
|
|
6
|
-
"vitest",
|
|
7
|
-
"oxc",
|
|
8
|
-
"eslint",
|
|
9
|
-
"react",
|
|
10
|
-
"react-perf"
|
|
11
|
-
],
|
|
12
|
-
"categories": {
|
|
13
|
-
"correctness": "error",
|
|
14
|
-
"suspicious": "warn",
|
|
15
|
-
"perf": "warn"
|
|
16
|
-
},
|
|
17
|
-
"env": {
|
|
18
|
-
"browser": true
|
|
19
|
-
},
|
|
20
|
-
"rules": {
|
|
21
|
-
"react/react-in-jsx-scope": "off",
|
|
22
|
-
"react/exhaustive-deps": "off"
|
|
23
|
-
}
|
|
24
|
-
}
|
package/.vscode/settings.json
DELETED