1 |
|
2 |
|
3 | (function (global, factory) {
|
4 | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./universal-router.js')) :
|
5 | typeof define === 'function' && define.amd ? define(['./universal-router.js'], factory) :
|
6 | (global.generateUrls = factory(global.UniversalRouter));
|
7 | }(this, (function (Router) { 'use strict';
|
8 |
|
9 | Router = 'default' in Router ? Router['default'] : Router;
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | var cache = new Map();
|
23 |
|
24 | function cacheRoutes(routesByName, route, routes) {
|
25 | if (routesByName[route.name]) {
|
26 | throw new Error('Route "' + route.name + '" already exists');
|
27 | }
|
28 |
|
29 | if (route.name) {
|
30 | routesByName[route.name] = route;
|
31 | }
|
32 |
|
33 | if (routes) {
|
34 | for (var i = 0; i < routes.length; i += 1) {
|
35 | var childRoute = routes[i];
|
36 | childRoute.parent = route;
|
37 | cacheRoutes(routesByName, childRoute, childRoute.children);
|
38 | }
|
39 | }
|
40 | }
|
41 |
|
42 | function generateUrls(router) {
|
43 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
44 |
|
45 | if (!(router instanceof Router)) {
|
46 | throw new TypeError('An instance of Router is expected');
|
47 | }
|
48 |
|
49 | router.routesByName = router.routesByName || {};
|
50 |
|
51 | return function (routeName, params) {
|
52 | var route = router.routesByName[routeName];
|
53 | if (!route) {
|
54 | router.routesByName = {};
|
55 | cacheRoutes(router.routesByName, router.root, router.root.children);
|
56 |
|
57 | route = router.routesByName[routeName];
|
58 | if (!route) {
|
59 | throw new Error('Route "' + routeName + '" not found');
|
60 | }
|
61 | }
|
62 |
|
63 | var regexp = cache.get(route.fullPath);
|
64 | if (!regexp) {
|
65 | var fullPath = '';
|
66 | var rt = route;
|
67 | while (rt) {
|
68 | if (rt.path !== '/') {
|
69 | fullPath = rt.path + fullPath;
|
70 | }
|
71 | rt = rt.parent;
|
72 | }
|
73 | var tokens = Router.pathToRegexp.parse(fullPath);
|
74 | var toPath = Router.pathToRegexp.tokensToFunction(tokens);
|
75 | var keys = Object.create(null);
|
76 | for (var i = 0; i < tokens.length; i += 1) {
|
77 | if (typeof tokens[i] !== 'string') {
|
78 | keys[tokens[i].name] = true;
|
79 | }
|
80 | }
|
81 | regexp = { toPath: toPath, keys: keys };
|
82 | cache.set(fullPath, regexp);
|
83 | route.fullPath = fullPath;
|
84 | }
|
85 |
|
86 | var url = router.baseUrl + regexp.toPath(params, options) || '/';
|
87 |
|
88 | if (options.stringifyQueryParams && params) {
|
89 | var queryParams = Object.create(null);
|
90 | var _keys = Object.keys(params);
|
91 | for (var _i = 0; _i < _keys.length; _i += 1) {
|
92 | var key = _keys[_i];
|
93 | if (!regexp.keys[key]) {
|
94 | queryParams[key] = params[key];
|
95 | }
|
96 | }
|
97 | var query = options.stringifyQueryParams(queryParams);
|
98 | if (query) {
|
99 | url += query.charAt(0) === '?' ? query : '?' + query;
|
100 | }
|
101 | }
|
102 |
|
103 | return url;
|
104 | };
|
105 | }
|
106 |
|
107 | Router.generateUrls = generateUrls;
|
108 |
|
109 | return generateUrls;
|
110 |
|
111 | })));
|
112 |
|