UNPKG

3.3 kBJavaScriptView Raw
1/*! Universal Router | MIT License | https://www.kriasoft.com/universal-router/ */
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
9Router = 'default' in Router ? Router['default'] : Router;
10
11/**
12 * Universal Router (https://www.kriasoft.com/universal-router/)
13 *
14 * Copyright © 2015-present Kriasoft, LLC. All rights reserved.
15 *
16 * This source code is licensed under the Apache 2.0 license found in the
17 * LICENSE.txt file in the root directory of this source tree.
18 */
19
20/* eslint no-param-reassign: ['error', { props: false }] */
21
22var cache = new Map();
23
24function 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
42function 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 = {}; // clear cache
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
107Router.generateUrls = generateUrls;
108
109return generateUrls;
110
111})));
112//# sourceMappingURL=universal-router-generate-urls.js.map