4
4
5
5
from dataclasses import replace
6
6
from logging import getLogger
7
- from typing import Any , Iterator , Literal , Sequence , TypeVar
7
+ from typing import Any , Iterator , Literal , Sequence
8
8
9
9
from reactpy import (
10
10
component ,
20
20
from reactpy_router .components import History
21
21
from reactpy_router .hooks import _route_state_context , _RouteState
22
22
from 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
24
24
25
25
__all__ = ["browser_router" , "create_router" ]
26
26
_logger = getLogger (__name__ )
27
- R = TypeVar ("R" , bound = Route )
28
27
29
28
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"""
32
31
33
- def wrapper (* routes : R ) -> ComponentType :
34
- return router (* routes , compiler = compiler )
32
+ def wrapper (* routes : RouteType ) -> ComponentType :
33
+ return router (* routes , resolver = resolver )
35
34
36
35
return wrapper
37
36
38
37
39
38
browser_router = create_router (StarletteResolver )
40
39
"""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."""
42
41
43
42
44
43
@component
45
44
def router (
46
- * routes : R ,
47
- compiler : RouteCompiler [ R ],
45
+ * routes : RouteType ,
46
+ resolver : Resolver [ RouteType ],
48
47
) -> 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 .
50
49
51
50
This typically should never be used by a user. Instead, use `create_router` if creating
52
51
a custom routing engine."""
@@ -55,8 +54,8 @@ def router(
55
54
location , set_location = use_state (old_conn .location )
56
55
57
56
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 )),
60
59
)
61
60
62
61
match = use_memo (lambda : _match_route (resolvers , location , select = "first" ))
@@ -80,15 +79,15 @@ def router(
80
79
return None
81
80
82
81
83
- def _iter_routes (routes : Sequence [R ]) -> Iterator [R ]:
82
+ def _iter_routes (routes : Sequence [RouteType ]) -> Iterator [RouteType ]:
84
83
for parent in routes :
85
84
for child in _iter_routes (parent .routes ):
86
85
yield replace (child , path = parent .path + child .path ) # type: ignore[misc]
87
86
yield parent
88
87
89
88
90
89
def _match_route (
91
- compiled_routes : Sequence [RouteResolver ],
90
+ compiled_routes : Sequence [CompiledRoute ],
92
91
location : Location ,
93
92
select : Literal ["first" , "all" ],
94
93
) -> list [tuple [Any , dict [str , Any ]]]:
@@ -100,8 +99,9 @@ def _match_route(
100
99
if select == "first" :
101
100
return [match ]
102
101
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.
105
105
matches .append (match ) # pragma: no cover
106
106
107
107
if not matches :
0 commit comments