@@ -21,7 +21,27 @@ const ENV =
21
21
: DEV ;
22
22
23
23
export function createRouter ( widget , routes , options ) {
24
- widget . $dependencies . router = new UniversalRouter ( routes , options ) ;
24
+ let wrappedRoutes = routes . reduce ( ( result , route ) => {
25
+ const clonedRoute = { ...route } ;
26
+
27
+ if ( isFunction ( clonedRoute . action ) ) {
28
+ const originAction = clonedRoute . action ;
29
+ clonedRoute . action = ( ...rest ) => {
30
+ // @TODO UniversalRouter don't parse query from url so context.params are only named route parameters
31
+ // For some application can be helpful to have named route parameters and query parameters merged
32
+ // because link method support both named parameters and query parameters
33
+ widget . $in . router . context = rest [ 0 ] ;
34
+
35
+ return originAction ( ...rest ) ;
36
+ } ;
37
+ }
38
+
39
+ result . push ( clonedRoute ) ;
40
+
41
+ return result ;
42
+ } , [ ] ) ;
43
+
44
+ widget . $dependencies . router = new UniversalRouter ( wrappedRoutes , options ) ;
25
45
widget . $dependencies . link = generateUrls ( widget . $dependencies . router , {
26
46
stringifyQueryParams : ( params ) => new URLSearchParams ( params ) . toString ( ) ,
27
47
} ) ;
@@ -35,6 +55,7 @@ export function routerPlugin() {
35
55
36
56
widget . $in . router = {
37
57
route : null ,
58
+ context : null ,
38
59
options : { } ,
39
60
pathname : null ,
40
61
isMounting : false ,
@@ -110,6 +131,9 @@ function routerAPI() {
110
131
getCurrentRoute ( widget ) {
111
132
return widget . $in . router . route ;
112
133
} ,
134
+ getCurrentContext ( widget ) {
135
+ return widget . $in . router . context ;
136
+ } ,
113
137
} ,
114
138
} ;
115
139
}
@@ -143,6 +167,7 @@ async function loadHook(widget, originalLoad, ...rest) {
143
167
: Promise . resolve ( { } ) ;
144
168
const routeStatePromise = plugin . route . load ( widget , {
145
169
route : plugin . route ,
170
+ context : plugin . context ,
146
171
args : rest ,
147
172
globalState : globalStatePromise ,
148
173
} ) ;
@@ -168,7 +193,11 @@ async function mountHook(widget, originalMount, ...rest) {
168
193
const result = await originalMount ( ...rest ) ;
169
194
170
195
if ( plugin . isMounting && isFunction ( plugin . route . init ) ) {
171
- await plugin . route . init ( widget , { route : plugin . route , args : rest } ) ;
196
+ await plugin . route . init ( widget , {
197
+ route : plugin . route ,
198
+ context : plugin . context ,
199
+ args : rest ,
200
+ } ) ;
172
201
}
173
202
174
203
if (
@@ -177,7 +206,11 @@ async function mountHook(widget, originalMount, ...rest) {
177
206
! plugin . isRouteActivated
178
207
) {
179
208
plugin . isRouteActivated = true ;
180
- plugin . route . activate ( widget , { route : plugin . route , args : rest } ) ;
209
+ plugin . route . activate ( widget , {
210
+ route : plugin . route ,
211
+ context : plugin . context ,
212
+ args : rest ,
213
+ } ) ;
181
214
}
182
215
183
216
plugin . isMounting = false ;
@@ -197,7 +230,11 @@ async function updateHook(widget, originalUpdate, ...rest) {
197
230
! plugin . isRouteActivated
198
231
) {
199
232
plugin . isRouteActivated = true ;
200
- plugin . route . activate ( widget , { route : plugin . route , args : rest } ) ;
233
+ plugin . route . activate ( widget , {
234
+ route : plugin . route ,
235
+ context : plugin . context ,
236
+ args : rest ,
237
+ } ) ;
201
238
}
202
239
203
240
return result ;
@@ -238,9 +275,10 @@ async function resolveRoute(widget) {
238
275
239
276
async function setupRouterCycle ( widget , ...rest ) {
240
277
const route = await resolveRoute ( widget ) ;
278
+ const plugin = widget . $in . router ;
241
279
242
280
if ( isFunction ( route . init ) ) {
243
- await route . init ( widget , { route, args : rest } ) ;
281
+ await route . init ( widget , { route, context : plugin . context , args : rest } ) ;
244
282
}
245
283
}
246
284
@@ -251,11 +289,19 @@ async function tearDownRouterCycle(widget, ...rest) {
251
289
252
290
if ( route ) {
253
291
if ( isFunction ( route . deactivate ) && isRouteActivated === true ) {
254
- await route . deactivate ( widget , { route, args : rest } ) ;
292
+ await route . deactivate ( widget , {
293
+ route,
294
+ context : plugin . context ,
295
+ args : rest ,
296
+ } ) ;
255
297
}
256
298
257
299
if ( isFunction ( route . destroy ) ) {
258
- await route . destroy ( widget , { route, args : rest } ) ;
300
+ await route . destroy ( widget , {
301
+ route,
302
+ context : plugin . context ,
303
+ args : rest ,
304
+ } ) ;
259
305
}
260
306
}
261
307
0 commit comments