@merkur/plugin-router 0.36.5 → 0.37.0
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/lib/index.cjs +53 -7
- package/lib/index.es9.cjs +30 -1
- package/lib/index.es9.mjs +31 -2
- package/lib/index.js +53 -7
- package/lib/index.mjs +54 -8
- package/package.json +5 -5
package/lib/index.cjs
CHANGED
|
@@ -15,7 +15,27 @@ const ENV =
|
|
|
15
15
|
: DEV;
|
|
16
16
|
|
|
17
17
|
function createRouter(widget, routes, options) {
|
|
18
|
-
|
|
18
|
+
let wrappedRoutes = routes.reduce((result, route) => {
|
|
19
|
+
const clonedRoute = { ...route };
|
|
20
|
+
|
|
21
|
+
if (core.isFunction(clonedRoute.action)) {
|
|
22
|
+
const originAction = clonedRoute.action;
|
|
23
|
+
clonedRoute.action = (...rest) => {
|
|
24
|
+
// @TODO UniversalRouter don't parse query from url so context.params are only named route parameters
|
|
25
|
+
// For some application can be helpful to have named route parameters and query parameters merged
|
|
26
|
+
// because link method support both named parameters and query parameters
|
|
27
|
+
widget.$in.router.context = rest[0];
|
|
28
|
+
|
|
29
|
+
return originAction(...rest);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
result.push(clonedRoute);
|
|
34
|
+
|
|
35
|
+
return result;
|
|
36
|
+
}, []);
|
|
37
|
+
|
|
38
|
+
widget.$dependencies.router = new UniversalRouter(wrappedRoutes, options);
|
|
19
39
|
widget.$dependencies.link = generateUrls(widget.$dependencies.router, {
|
|
20
40
|
stringifyQueryParams: (params) => new URLSearchParams(params).toString(),
|
|
21
41
|
});
|
|
@@ -29,6 +49,7 @@ function routerPlugin() {
|
|
|
29
49
|
|
|
30
50
|
widget.$in.router = {
|
|
31
51
|
route: null,
|
|
52
|
+
context: null,
|
|
32
53
|
options: {},
|
|
33
54
|
pathname: null,
|
|
34
55
|
isMounting: false,
|
|
@@ -104,6 +125,9 @@ function routerAPI() {
|
|
|
104
125
|
getCurrentRoute(widget) {
|
|
105
126
|
return widget.$in.router.route;
|
|
106
127
|
},
|
|
128
|
+
getCurrentContext(widget) {
|
|
129
|
+
return widget.$in.router.context;
|
|
130
|
+
},
|
|
107
131
|
},
|
|
108
132
|
};
|
|
109
133
|
}
|
|
@@ -137,6 +161,7 @@ async function loadHook(widget, originalLoad, ...rest) {
|
|
|
137
161
|
: Promise.resolve({});
|
|
138
162
|
const routeStatePromise = plugin.route.load(widget, {
|
|
139
163
|
route: plugin.route,
|
|
164
|
+
context: plugin.context,
|
|
140
165
|
args: rest,
|
|
141
166
|
globalState: globalStatePromise,
|
|
142
167
|
});
|
|
@@ -162,7 +187,11 @@ async function mountHook(widget, originalMount, ...rest) {
|
|
|
162
187
|
const result = await originalMount(...rest);
|
|
163
188
|
|
|
164
189
|
if (plugin.isMounting && core.isFunction(plugin.route.init)) {
|
|
165
|
-
await plugin.route.init(widget, {
|
|
190
|
+
await plugin.route.init(widget, {
|
|
191
|
+
route: plugin.route,
|
|
192
|
+
context: plugin.context,
|
|
193
|
+
args: rest,
|
|
194
|
+
});
|
|
166
195
|
}
|
|
167
196
|
|
|
168
197
|
if (
|
|
@@ -171,7 +200,11 @@ async function mountHook(widget, originalMount, ...rest) {
|
|
|
171
200
|
!plugin.isRouteActivated
|
|
172
201
|
) {
|
|
173
202
|
plugin.isRouteActivated = true;
|
|
174
|
-
plugin.route.activate(widget, {
|
|
203
|
+
plugin.route.activate(widget, {
|
|
204
|
+
route: plugin.route,
|
|
205
|
+
context: plugin.context,
|
|
206
|
+
args: rest,
|
|
207
|
+
});
|
|
175
208
|
}
|
|
176
209
|
|
|
177
210
|
plugin.isMounting = false;
|
|
@@ -191,7 +224,11 @@ async function updateHook(widget, originalUpdate, ...rest) {
|
|
|
191
224
|
!plugin.isRouteActivated
|
|
192
225
|
) {
|
|
193
226
|
plugin.isRouteActivated = true;
|
|
194
|
-
plugin.route.activate(widget, {
|
|
227
|
+
plugin.route.activate(widget, {
|
|
228
|
+
route: plugin.route,
|
|
229
|
+
context: plugin.context,
|
|
230
|
+
args: rest,
|
|
231
|
+
});
|
|
195
232
|
}
|
|
196
233
|
|
|
197
234
|
return result;
|
|
@@ -232,9 +269,10 @@ async function resolveRoute(widget) {
|
|
|
232
269
|
|
|
233
270
|
async function setupRouterCycle(widget, ...rest) {
|
|
234
271
|
const route = await resolveRoute(widget);
|
|
272
|
+
const plugin = widget.$in.router;
|
|
235
273
|
|
|
236
274
|
if (core.isFunction(route.init)) {
|
|
237
|
-
await route.init(widget, { route, args: rest });
|
|
275
|
+
await route.init(widget, { route, context: plugin.context, args: rest });
|
|
238
276
|
}
|
|
239
277
|
}
|
|
240
278
|
|
|
@@ -245,11 +283,19 @@ async function tearDownRouterCycle(widget, ...rest) {
|
|
|
245
283
|
|
|
246
284
|
if (route) {
|
|
247
285
|
if (core.isFunction(route.deactivate) && isRouteActivated === true) {
|
|
248
|
-
await route.deactivate(widget, {
|
|
286
|
+
await route.deactivate(widget, {
|
|
287
|
+
route,
|
|
288
|
+
context: plugin.context,
|
|
289
|
+
args: rest,
|
|
290
|
+
});
|
|
249
291
|
}
|
|
250
292
|
|
|
251
293
|
if (core.isFunction(route.destroy)) {
|
|
252
|
-
await route.destroy(widget, {
|
|
294
|
+
await route.destroy(widget, {
|
|
295
|
+
route,
|
|
296
|
+
context: plugin.context,
|
|
297
|
+
args: rest,
|
|
298
|
+
});
|
|
253
299
|
}
|
|
254
300
|
}
|
|
255
301
|
|
package/lib/index.es9.cjs
CHANGED
|
@@ -9,7 +9,24 @@ var RouterEvents = Object.freeze({
|
|
|
9
9
|
const DEV = 'development';
|
|
10
10
|
const ENV = typeof process !== 'undefined' && process && process.env ? process.env.NODE_ENV : DEV;
|
|
11
11
|
function createRouter(widget, routes, options) {
|
|
12
|
-
|
|
12
|
+
let wrappedRoutes = routes.reduce((result, route) => {
|
|
13
|
+
const clonedRoute = {
|
|
14
|
+
...route
|
|
15
|
+
};
|
|
16
|
+
if (core.isFunction(clonedRoute.action)) {
|
|
17
|
+
const originAction = clonedRoute.action;
|
|
18
|
+
clonedRoute.action = (...rest) => {
|
|
19
|
+
// @TODO UniversalRouter don't parse query from url so context.params are only named route parameters
|
|
20
|
+
// For some application can be helpful to have named route parameters and query parameters merged
|
|
21
|
+
// because link method support both named parameters and query parameters
|
|
22
|
+
widget.$in.router.context = rest[0];
|
|
23
|
+
return originAction(...rest);
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
result.push(clonedRoute);
|
|
27
|
+
return result;
|
|
28
|
+
}, []);
|
|
29
|
+
widget.$dependencies.router = new UniversalRouter(wrappedRoutes, options);
|
|
13
30
|
widget.$dependencies.link = generateUrls(widget.$dependencies.router, {
|
|
14
31
|
stringifyQueryParams: params => new URLSearchParams(params).toString()
|
|
15
32
|
});
|
|
@@ -21,6 +38,7 @@ function routerPlugin() {
|
|
|
21
38
|
core.assignMissingKeys(widget, routerAPI());
|
|
22
39
|
widget.$in.router = {
|
|
23
40
|
route: null,
|
|
41
|
+
context: null,
|
|
24
42
|
options: {},
|
|
25
43
|
pathname: null,
|
|
26
44
|
isMounting: false,
|
|
@@ -81,6 +99,9 @@ function routerAPI() {
|
|
|
81
99
|
},
|
|
82
100
|
getCurrentRoute(widget) {
|
|
83
101
|
return widget.$in.router.route;
|
|
102
|
+
},
|
|
103
|
+
getCurrentContext(widget) {
|
|
104
|
+
return widget.$in.router.context;
|
|
84
105
|
}
|
|
85
106
|
}
|
|
86
107
|
};
|
|
@@ -106,6 +127,7 @@ async function loadHook(widget, originalLoad, ...rest) {
|
|
|
106
127
|
const globalStatePromise = core.isFunction(originalLoad) ? originalLoad(widget, ...rest) : Promise.resolve({});
|
|
107
128
|
const routeStatePromise = plugin.route.load(widget, {
|
|
108
129
|
route: plugin.route,
|
|
130
|
+
context: plugin.context,
|
|
109
131
|
args: rest,
|
|
110
132
|
globalState: globalStatePromise
|
|
111
133
|
});
|
|
@@ -128,6 +150,7 @@ async function mountHook(widget, originalMount, ...rest) {
|
|
|
128
150
|
if (plugin.isMounting && core.isFunction(plugin.route.init)) {
|
|
129
151
|
await plugin.route.init(widget, {
|
|
130
152
|
route: plugin.route,
|
|
153
|
+
context: plugin.context,
|
|
131
154
|
args: rest
|
|
132
155
|
});
|
|
133
156
|
}
|
|
@@ -135,6 +158,7 @@ async function mountHook(widget, originalMount, ...rest) {
|
|
|
135
158
|
plugin.isRouteActivated = true;
|
|
136
159
|
plugin.route.activate(widget, {
|
|
137
160
|
route: plugin.route,
|
|
161
|
+
context: plugin.context,
|
|
138
162
|
args: rest
|
|
139
163
|
});
|
|
140
164
|
}
|
|
@@ -150,6 +174,7 @@ async function updateHook(widget, originalUpdate, ...rest) {
|
|
|
150
174
|
plugin.isRouteActivated = true;
|
|
151
175
|
plugin.route.activate(widget, {
|
|
152
176
|
route: plugin.route,
|
|
177
|
+
context: plugin.context,
|
|
153
178
|
args: rest
|
|
154
179
|
});
|
|
155
180
|
}
|
|
@@ -181,9 +206,11 @@ async function resolveRoute(widget) {
|
|
|
181
206
|
}
|
|
182
207
|
async function setupRouterCycle(widget, ...rest) {
|
|
183
208
|
const route = await resolveRoute(widget);
|
|
209
|
+
const plugin = widget.$in.router;
|
|
184
210
|
if (core.isFunction(route.init)) {
|
|
185
211
|
await route.init(widget, {
|
|
186
212
|
route,
|
|
213
|
+
context: plugin.context,
|
|
187
214
|
args: rest
|
|
188
215
|
});
|
|
189
216
|
}
|
|
@@ -198,12 +225,14 @@ async function tearDownRouterCycle(widget, ...rest) {
|
|
|
198
225
|
if (core.isFunction(route.deactivate) && isRouteActivated === true) {
|
|
199
226
|
await route.deactivate(widget, {
|
|
200
227
|
route,
|
|
228
|
+
context: plugin.context,
|
|
201
229
|
args: rest
|
|
202
230
|
});
|
|
203
231
|
}
|
|
204
232
|
if (core.isFunction(route.destroy)) {
|
|
205
233
|
await route.destroy(widget, {
|
|
206
234
|
route,
|
|
235
|
+
context: plugin.context,
|
|
207
236
|
args: rest
|
|
208
237
|
});
|
|
209
238
|
}
|
package/lib/index.es9.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { assignMissingKeys, bindWidgetToFunctions, setDefaultValueForUndefined, hookMethod
|
|
1
|
+
import { isFunction, assignMissingKeys, bindWidgetToFunctions, setDefaultValueForUndefined, hookMethod } from '@merkur/core';
|
|
2
2
|
import UniversalRouter from 'universal-router';
|
|
3
3
|
import generateUrls from 'universal-router/generateUrls';
|
|
4
4
|
var RouterEvents = Object.freeze({
|
|
@@ -7,7 +7,24 @@ var RouterEvents = Object.freeze({
|
|
|
7
7
|
const DEV = 'development';
|
|
8
8
|
const ENV = typeof process !== 'undefined' && process && process.env ? process.env.NODE_ENV : DEV;
|
|
9
9
|
function createRouter(widget, routes, options) {
|
|
10
|
-
|
|
10
|
+
let wrappedRoutes = routes.reduce((result, route) => {
|
|
11
|
+
const clonedRoute = {
|
|
12
|
+
...route
|
|
13
|
+
};
|
|
14
|
+
if (isFunction(clonedRoute.action)) {
|
|
15
|
+
const originAction = clonedRoute.action;
|
|
16
|
+
clonedRoute.action = (...rest) => {
|
|
17
|
+
// @TODO UniversalRouter don't parse query from url so context.params are only named route parameters
|
|
18
|
+
// For some application can be helpful to have named route parameters and query parameters merged
|
|
19
|
+
// because link method support both named parameters and query parameters
|
|
20
|
+
widget.$in.router.context = rest[0];
|
|
21
|
+
return originAction(...rest);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
result.push(clonedRoute);
|
|
25
|
+
return result;
|
|
26
|
+
}, []);
|
|
27
|
+
widget.$dependencies.router = new UniversalRouter(wrappedRoutes, options);
|
|
11
28
|
widget.$dependencies.link = generateUrls(widget.$dependencies.router, {
|
|
12
29
|
stringifyQueryParams: params => new URLSearchParams(params).toString()
|
|
13
30
|
});
|
|
@@ -19,6 +36,7 @@ function routerPlugin() {
|
|
|
19
36
|
assignMissingKeys(widget, routerAPI());
|
|
20
37
|
widget.$in.router = {
|
|
21
38
|
route: null,
|
|
39
|
+
context: null,
|
|
22
40
|
options: {},
|
|
23
41
|
pathname: null,
|
|
24
42
|
isMounting: false,
|
|
@@ -79,6 +97,9 @@ function routerAPI() {
|
|
|
79
97
|
},
|
|
80
98
|
getCurrentRoute(widget) {
|
|
81
99
|
return widget.$in.router.route;
|
|
100
|
+
},
|
|
101
|
+
getCurrentContext(widget) {
|
|
102
|
+
return widget.$in.router.context;
|
|
82
103
|
}
|
|
83
104
|
}
|
|
84
105
|
};
|
|
@@ -104,6 +125,7 @@ async function loadHook(widget, originalLoad, ...rest) {
|
|
|
104
125
|
const globalStatePromise = isFunction(originalLoad) ? originalLoad(widget, ...rest) : Promise.resolve({});
|
|
105
126
|
const routeStatePromise = plugin.route.load(widget, {
|
|
106
127
|
route: plugin.route,
|
|
128
|
+
context: plugin.context,
|
|
107
129
|
args: rest,
|
|
108
130
|
globalState: globalStatePromise
|
|
109
131
|
});
|
|
@@ -126,6 +148,7 @@ async function mountHook(widget, originalMount, ...rest) {
|
|
|
126
148
|
if (plugin.isMounting && isFunction(plugin.route.init)) {
|
|
127
149
|
await plugin.route.init(widget, {
|
|
128
150
|
route: plugin.route,
|
|
151
|
+
context: plugin.context,
|
|
129
152
|
args: rest
|
|
130
153
|
});
|
|
131
154
|
}
|
|
@@ -133,6 +156,7 @@ async function mountHook(widget, originalMount, ...rest) {
|
|
|
133
156
|
plugin.isRouteActivated = true;
|
|
134
157
|
plugin.route.activate(widget, {
|
|
135
158
|
route: plugin.route,
|
|
159
|
+
context: plugin.context,
|
|
136
160
|
args: rest
|
|
137
161
|
});
|
|
138
162
|
}
|
|
@@ -148,6 +172,7 @@ async function updateHook(widget, originalUpdate, ...rest) {
|
|
|
148
172
|
plugin.isRouteActivated = true;
|
|
149
173
|
plugin.route.activate(widget, {
|
|
150
174
|
route: plugin.route,
|
|
175
|
+
context: plugin.context,
|
|
151
176
|
args: rest
|
|
152
177
|
});
|
|
153
178
|
}
|
|
@@ -179,9 +204,11 @@ async function resolveRoute(widget) {
|
|
|
179
204
|
}
|
|
180
205
|
async function setupRouterCycle(widget, ...rest) {
|
|
181
206
|
const route = await resolveRoute(widget);
|
|
207
|
+
const plugin = widget.$in.router;
|
|
182
208
|
if (isFunction(route.init)) {
|
|
183
209
|
await route.init(widget, {
|
|
184
210
|
route,
|
|
211
|
+
context: plugin.context,
|
|
185
212
|
args: rest
|
|
186
213
|
});
|
|
187
214
|
}
|
|
@@ -196,12 +223,14 @@ async function tearDownRouterCycle(widget, ...rest) {
|
|
|
196
223
|
if (isFunction(route.deactivate) && isRouteActivated === true) {
|
|
197
224
|
await route.deactivate(widget, {
|
|
198
225
|
route,
|
|
226
|
+
context: plugin.context,
|
|
199
227
|
args: rest
|
|
200
228
|
});
|
|
201
229
|
}
|
|
202
230
|
if (isFunction(route.destroy)) {
|
|
203
231
|
await route.destroy(widget, {
|
|
204
232
|
route,
|
|
233
|
+
context: plugin.context,
|
|
205
234
|
args: rest
|
|
206
235
|
});
|
|
207
236
|
}
|
package/lib/index.js
CHANGED
|
@@ -15,7 +15,27 @@ const ENV =
|
|
|
15
15
|
: DEV;
|
|
16
16
|
|
|
17
17
|
function createRouter(widget, routes, options) {
|
|
18
|
-
|
|
18
|
+
let wrappedRoutes = routes.reduce((result, route) => {
|
|
19
|
+
const clonedRoute = { ...route };
|
|
20
|
+
|
|
21
|
+
if (core.isFunction(clonedRoute.action)) {
|
|
22
|
+
const originAction = clonedRoute.action;
|
|
23
|
+
clonedRoute.action = (...rest) => {
|
|
24
|
+
// @TODO UniversalRouter don't parse query from url so context.params are only named route parameters
|
|
25
|
+
// For some application can be helpful to have named route parameters and query parameters merged
|
|
26
|
+
// because link method support both named parameters and query parameters
|
|
27
|
+
widget.$in.router.context = rest[0];
|
|
28
|
+
|
|
29
|
+
return originAction(...rest);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
result.push(clonedRoute);
|
|
34
|
+
|
|
35
|
+
return result;
|
|
36
|
+
}, []);
|
|
37
|
+
|
|
38
|
+
widget.$dependencies.router = new UniversalRouter(wrappedRoutes, options);
|
|
19
39
|
widget.$dependencies.link = generateUrls(widget.$dependencies.router, {
|
|
20
40
|
stringifyQueryParams: (params) => new URLSearchParams(params).toString(),
|
|
21
41
|
});
|
|
@@ -29,6 +49,7 @@ function routerPlugin() {
|
|
|
29
49
|
|
|
30
50
|
widget.$in.router = {
|
|
31
51
|
route: null,
|
|
52
|
+
context: null,
|
|
32
53
|
options: {},
|
|
33
54
|
pathname: null,
|
|
34
55
|
isMounting: false,
|
|
@@ -104,6 +125,9 @@ function routerAPI() {
|
|
|
104
125
|
getCurrentRoute(widget) {
|
|
105
126
|
return widget.$in.router.route;
|
|
106
127
|
},
|
|
128
|
+
getCurrentContext(widget) {
|
|
129
|
+
return widget.$in.router.context;
|
|
130
|
+
},
|
|
107
131
|
},
|
|
108
132
|
};
|
|
109
133
|
}
|
|
@@ -137,6 +161,7 @@ async function loadHook(widget, originalLoad, ...rest) {
|
|
|
137
161
|
: Promise.resolve({});
|
|
138
162
|
const routeStatePromise = plugin.route.load(widget, {
|
|
139
163
|
route: plugin.route,
|
|
164
|
+
context: plugin.context,
|
|
140
165
|
args: rest,
|
|
141
166
|
globalState: globalStatePromise,
|
|
142
167
|
});
|
|
@@ -162,7 +187,11 @@ async function mountHook(widget, originalMount, ...rest) {
|
|
|
162
187
|
const result = await originalMount(...rest);
|
|
163
188
|
|
|
164
189
|
if (plugin.isMounting && core.isFunction(plugin.route.init)) {
|
|
165
|
-
await plugin.route.init(widget, {
|
|
190
|
+
await plugin.route.init(widget, {
|
|
191
|
+
route: plugin.route,
|
|
192
|
+
context: plugin.context,
|
|
193
|
+
args: rest,
|
|
194
|
+
});
|
|
166
195
|
}
|
|
167
196
|
|
|
168
197
|
if (
|
|
@@ -171,7 +200,11 @@ async function mountHook(widget, originalMount, ...rest) {
|
|
|
171
200
|
!plugin.isRouteActivated
|
|
172
201
|
) {
|
|
173
202
|
plugin.isRouteActivated = true;
|
|
174
|
-
plugin.route.activate(widget, {
|
|
203
|
+
plugin.route.activate(widget, {
|
|
204
|
+
route: plugin.route,
|
|
205
|
+
context: plugin.context,
|
|
206
|
+
args: rest,
|
|
207
|
+
});
|
|
175
208
|
}
|
|
176
209
|
|
|
177
210
|
plugin.isMounting = false;
|
|
@@ -191,7 +224,11 @@ async function updateHook(widget, originalUpdate, ...rest) {
|
|
|
191
224
|
!plugin.isRouteActivated
|
|
192
225
|
) {
|
|
193
226
|
plugin.isRouteActivated = true;
|
|
194
|
-
plugin.route.activate(widget, {
|
|
227
|
+
plugin.route.activate(widget, {
|
|
228
|
+
route: plugin.route,
|
|
229
|
+
context: plugin.context,
|
|
230
|
+
args: rest,
|
|
231
|
+
});
|
|
195
232
|
}
|
|
196
233
|
|
|
197
234
|
return result;
|
|
@@ -232,9 +269,10 @@ async function resolveRoute(widget) {
|
|
|
232
269
|
|
|
233
270
|
async function setupRouterCycle(widget, ...rest) {
|
|
234
271
|
const route = await resolveRoute(widget);
|
|
272
|
+
const plugin = widget.$in.router;
|
|
235
273
|
|
|
236
274
|
if (core.isFunction(route.init)) {
|
|
237
|
-
await route.init(widget, { route, args: rest });
|
|
275
|
+
await route.init(widget, { route, context: plugin.context, args: rest });
|
|
238
276
|
}
|
|
239
277
|
}
|
|
240
278
|
|
|
@@ -245,11 +283,19 @@ async function tearDownRouterCycle(widget, ...rest) {
|
|
|
245
283
|
|
|
246
284
|
if (route) {
|
|
247
285
|
if (core.isFunction(route.deactivate) && isRouteActivated === true) {
|
|
248
|
-
await route.deactivate(widget, {
|
|
286
|
+
await route.deactivate(widget, {
|
|
287
|
+
route,
|
|
288
|
+
context: plugin.context,
|
|
289
|
+
args: rest,
|
|
290
|
+
});
|
|
249
291
|
}
|
|
250
292
|
|
|
251
293
|
if (core.isFunction(route.destroy)) {
|
|
252
|
-
await route.destroy(widget, {
|
|
294
|
+
await route.destroy(widget, {
|
|
295
|
+
route,
|
|
296
|
+
context: plugin.context,
|
|
297
|
+
args: rest,
|
|
298
|
+
});
|
|
253
299
|
}
|
|
254
300
|
}
|
|
255
301
|
|
package/lib/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { assignMissingKeys, bindWidgetToFunctions, setDefaultValueForUndefined, hookMethod
|
|
1
|
+
import { isFunction, assignMissingKeys, bindWidgetToFunctions, setDefaultValueForUndefined, hookMethod } from '@merkur/core';
|
|
2
2
|
import UniversalRouter from 'universal-router';
|
|
3
3
|
import generateUrls from 'universal-router/generateUrls';
|
|
4
4
|
|
|
@@ -13,7 +13,27 @@ const ENV =
|
|
|
13
13
|
: DEV;
|
|
14
14
|
|
|
15
15
|
function createRouter(widget, routes, options) {
|
|
16
|
-
|
|
16
|
+
let wrappedRoutes = routes.reduce((result, route) => {
|
|
17
|
+
const clonedRoute = { ...route };
|
|
18
|
+
|
|
19
|
+
if (isFunction(clonedRoute.action)) {
|
|
20
|
+
const originAction = clonedRoute.action;
|
|
21
|
+
clonedRoute.action = (...rest) => {
|
|
22
|
+
// @TODO UniversalRouter don't parse query from url so context.params are only named route parameters
|
|
23
|
+
// For some application can be helpful to have named route parameters and query parameters merged
|
|
24
|
+
// because link method support both named parameters and query parameters
|
|
25
|
+
widget.$in.router.context = rest[0];
|
|
26
|
+
|
|
27
|
+
return originAction(...rest);
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
result.push(clonedRoute);
|
|
32
|
+
|
|
33
|
+
return result;
|
|
34
|
+
}, []);
|
|
35
|
+
|
|
36
|
+
widget.$dependencies.router = new UniversalRouter(wrappedRoutes, options);
|
|
17
37
|
widget.$dependencies.link = generateUrls(widget.$dependencies.router, {
|
|
18
38
|
stringifyQueryParams: (params) => new URLSearchParams(params).toString(),
|
|
19
39
|
});
|
|
@@ -27,6 +47,7 @@ function routerPlugin() {
|
|
|
27
47
|
|
|
28
48
|
widget.$in.router = {
|
|
29
49
|
route: null,
|
|
50
|
+
context: null,
|
|
30
51
|
options: {},
|
|
31
52
|
pathname: null,
|
|
32
53
|
isMounting: false,
|
|
@@ -102,6 +123,9 @@ function routerAPI() {
|
|
|
102
123
|
getCurrentRoute(widget) {
|
|
103
124
|
return widget.$in.router.route;
|
|
104
125
|
},
|
|
126
|
+
getCurrentContext(widget) {
|
|
127
|
+
return widget.$in.router.context;
|
|
128
|
+
},
|
|
105
129
|
},
|
|
106
130
|
};
|
|
107
131
|
}
|
|
@@ -135,6 +159,7 @@ async function loadHook(widget, originalLoad, ...rest) {
|
|
|
135
159
|
: Promise.resolve({});
|
|
136
160
|
const routeStatePromise = plugin.route.load(widget, {
|
|
137
161
|
route: plugin.route,
|
|
162
|
+
context: plugin.context,
|
|
138
163
|
args: rest,
|
|
139
164
|
globalState: globalStatePromise,
|
|
140
165
|
});
|
|
@@ -160,7 +185,11 @@ async function mountHook(widget, originalMount, ...rest) {
|
|
|
160
185
|
const result = await originalMount(...rest);
|
|
161
186
|
|
|
162
187
|
if (plugin.isMounting && isFunction(plugin.route.init)) {
|
|
163
|
-
await plugin.route.init(widget, {
|
|
188
|
+
await plugin.route.init(widget, {
|
|
189
|
+
route: plugin.route,
|
|
190
|
+
context: plugin.context,
|
|
191
|
+
args: rest,
|
|
192
|
+
});
|
|
164
193
|
}
|
|
165
194
|
|
|
166
195
|
if (
|
|
@@ -169,7 +198,11 @@ async function mountHook(widget, originalMount, ...rest) {
|
|
|
169
198
|
!plugin.isRouteActivated
|
|
170
199
|
) {
|
|
171
200
|
plugin.isRouteActivated = true;
|
|
172
|
-
plugin.route.activate(widget, {
|
|
201
|
+
plugin.route.activate(widget, {
|
|
202
|
+
route: plugin.route,
|
|
203
|
+
context: plugin.context,
|
|
204
|
+
args: rest,
|
|
205
|
+
});
|
|
173
206
|
}
|
|
174
207
|
|
|
175
208
|
plugin.isMounting = false;
|
|
@@ -189,7 +222,11 @@ async function updateHook(widget, originalUpdate, ...rest) {
|
|
|
189
222
|
!plugin.isRouteActivated
|
|
190
223
|
) {
|
|
191
224
|
plugin.isRouteActivated = true;
|
|
192
|
-
plugin.route.activate(widget, {
|
|
225
|
+
plugin.route.activate(widget, {
|
|
226
|
+
route: plugin.route,
|
|
227
|
+
context: plugin.context,
|
|
228
|
+
args: rest,
|
|
229
|
+
});
|
|
193
230
|
}
|
|
194
231
|
|
|
195
232
|
return result;
|
|
@@ -230,9 +267,10 @@ async function resolveRoute(widget) {
|
|
|
230
267
|
|
|
231
268
|
async function setupRouterCycle(widget, ...rest) {
|
|
232
269
|
const route = await resolveRoute(widget);
|
|
270
|
+
const plugin = widget.$in.router;
|
|
233
271
|
|
|
234
272
|
if (isFunction(route.init)) {
|
|
235
|
-
await route.init(widget, { route, args: rest });
|
|
273
|
+
await route.init(widget, { route, context: plugin.context, args: rest });
|
|
236
274
|
}
|
|
237
275
|
}
|
|
238
276
|
|
|
@@ -243,11 +281,19 @@ async function tearDownRouterCycle(widget, ...rest) {
|
|
|
243
281
|
|
|
244
282
|
if (route) {
|
|
245
283
|
if (isFunction(route.deactivate) && isRouteActivated === true) {
|
|
246
|
-
await route.deactivate(widget, {
|
|
284
|
+
await route.deactivate(widget, {
|
|
285
|
+
route,
|
|
286
|
+
context: plugin.context,
|
|
287
|
+
args: rest,
|
|
288
|
+
});
|
|
247
289
|
}
|
|
248
290
|
|
|
249
291
|
if (isFunction(route.destroy)) {
|
|
250
|
-
await route.destroy(widget, {
|
|
292
|
+
await route.destroy(widget, {
|
|
293
|
+
route,
|
|
294
|
+
context: plugin.context,
|
|
295
|
+
args: rest,
|
|
296
|
+
});
|
|
251
297
|
}
|
|
252
298
|
}
|
|
253
299
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@merkur/plugin-router",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.37.0",
|
|
4
4
|
"description": "Merkur router plugin.",
|
|
5
5
|
"main": "lib/index",
|
|
6
6
|
"module": "lib/index",
|
|
@@ -56,9 +56,9 @@
|
|
|
56
56
|
},
|
|
57
57
|
"homepage": "https://merkur.js.org/",
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@merkur/core": "^0.
|
|
60
|
-
"@merkur/plugin-component": "^0.
|
|
61
|
-
"@merkur/plugin-event-emitter": "^0.
|
|
59
|
+
"@merkur/core": "^0.37.0",
|
|
60
|
+
"@merkur/plugin-component": "^0.37.0",
|
|
61
|
+
"@merkur/plugin-event-emitter": "^0.37.0"
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
|
64
64
|
"@merkur/core": "*",
|
|
@@ -68,5 +68,5 @@
|
|
|
68
68
|
"dependencies": {
|
|
69
69
|
"universal-router": "^9.1.0"
|
|
70
70
|
},
|
|
71
|
-
"gitHead": "
|
|
71
|
+
"gitHead": "af826493e5ed4b37602dd43ce89a59baeeb1bada"
|
|
72
72
|
}
|