44
55from dataclasses import replace
66from logging import getLogger
7- from typing import Any , Iterator , Literal , Sequence , TypeVar
7+ from typing import Any , Iterator , Literal , Sequence
88
99from reactpy import (
1010 component ,
2020from reactpy_router .components import History
2121from reactpy_router .hooks import _route_state_context , _RouteState
2222from reactpy_router .resolvers import StarletteResolver
23- from reactpy_router .types import Route , RouteCompiler , Router , RouteResolver
23+ from reactpy_router .types import CompiledRoute , Resolver , Router , RouteType
2424
2525__all__ = ["browser_router" , "create_router" ]
2626_logger = getLogger (__name__ )
27- R = TypeVar ("R" , bound = Route )
2827
2928
30- def create_router (compiler : RouteCompiler [ R ]) -> Router [R ]:
31- """A decorator that turns a route compiler into a router"""
29+ def create_router (resolver : Resolver [ RouteType ]) -> Router [RouteType ]:
30+ """A decorator that turns a resolver into a router"""
3231
33- def wrapper (* routes : R ) -> ComponentType :
34- return router (* routes , compiler = compiler )
32+ def wrapper (* routes : RouteType ) -> ComponentType :
33+ return router (* routes , resolver = resolver )
3534
3635 return wrapper
3736
3837
3938browser_router = create_router (StarletteResolver )
4039"""This is the recommended router for all ReactPy Router web projects.
41- It uses the DOM History API to update the URL and manage the history stack."""
40+ It uses the JavaScript DOM History API to manage the history stack."""
4241
4342
4443@component
4544def router (
46- * routes : R ,
47- compiler : RouteCompiler [ R ],
45+ * routes : RouteType ,
46+ resolver : Resolver [ RouteType ],
4847) -> VdomDict | None :
49- """A component that renders matching route(s) using the given compiler function .
48+ """A component that renders matching route(s) using the given resolver .
5049
5150 This typically should never be used by a user. Instead, use `create_router` if creating
5251 a custom routing engine."""
@@ -55,8 +54,8 @@ def router(
5554 location , set_location = use_state (old_conn .location )
5655
5756 resolvers = use_memo (
58- lambda : tuple (map (compiler , _iter_routes (routes ))),
59- dependencies = (compiler , hash (routes )),
57+ lambda : tuple (map (resolver , _iter_routes (routes ))),
58+ dependencies = (resolver , hash (routes )),
6059 )
6160
6261 match = use_memo (lambda : _match_route (resolvers , location , select = "first" ))
@@ -80,15 +79,15 @@ def router(
8079 return None
8180
8281
83- def _iter_routes (routes : Sequence [R ]) -> Iterator [R ]:
82+ def _iter_routes (routes : Sequence [RouteType ]) -> Iterator [RouteType ]:
8483 for parent in routes :
8584 for child in _iter_routes (parent .routes ):
8685 yield replace (child , path = parent .path + child .path ) # type: ignore[misc]
8786 yield parent
8887
8988
9089def _match_route (
91- compiled_routes : Sequence [RouteResolver ],
90+ compiled_routes : Sequence [CompiledRoute ],
9291 location : Location ,
9392 select : Literal ["first" , "all" ],
9493) -> list [tuple [Any , dict [str , Any ]]]:
@@ -100,8 +99,9 @@ def _match_route(
10099 if select == "first" :
101100 return [match ]
102101
103- # This is no longer used by `reactpy-router`, since `react-router>=6.0.0` no longer supports
104- # multiple matches. However, it's kept here to support future changes.
102+ # Matching multiple routes is disabled since `react-router` no longer supports multiple
103+ # matches via the `Route` component. However, it's kept here to support future changes
104+ # or third-party routers.
105105 matches .append (match ) # pragma: no cover
106106
107107 if not matches :
0 commit comments