Big News: Socket Selected for OpenAI's Cybersecurity Grant Program.Details
Socket
Book a DemoSign in
Socket

universal-router

Package Overview
Dependencies
Maintainers
2
Versions
36
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

universal-router - npm Package Compare versions

Comparing version
5.0.0
to
5.1.0
+6
-6
generateUrls/browser.js

@@ -25,3 +25,3 @@ /*! Universal Router | MIT License | https://www.kriasoft.com/universal-router/ */

function cacheRoutes(routesByName, route, routes) {
if (routesByName[route.name]) {
if (routesByName.has(route.name)) {
throw new Error('Route "' + route.name + '" already exists');

@@ -31,3 +31,3 @@ }

if (route.name) {
routesByName[route.name] = route;
routesByName.set(route.name, route);
}

@@ -51,11 +51,11 @@

router.routesByName = router.routesByName || {};
router.routesByName = router.routesByName || new Map();
return function (routeName, params) {
var route = router.routesByName[routeName];
var route = router.routesByName.get(routeName);
if (!route) {
router.routesByName = {}; // clear cache
router.routesByName.clear(); // clear cache
cacheRoutes(router.routesByName, router.root, router.root.children);
route = router.routesByName[routeName];
route = router.routesByName.get(routeName);
if (!route) {

@@ -62,0 +62,0 @@ throw new Error('Route "' + routeName + '" not found');

@@ -1,1 +0,1 @@

{"version":3,"file":"browser.js","sources":["../src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName[route.name]) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName[route.name] = route;\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || {};\n\n return (routeName, params) => {\n let route = router.routesByName[routeName];\n if (!route) {\n router.routesByName = {}; // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName[routeName];\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","name","Error","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","root","regexp","get","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","set","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":"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"}
{"version":3,"file":"browser.js","sources":["../src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName.has(route.name)) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName.set(route.name, route);\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || new Map();\n\n return (routeName, params) => {\n let route = router.routesByName.get(routeName);\n if (!route) {\n router.routesByName.clear(); // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName.get(routeName);\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","has","name","Error","set","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","get","clear","root","regexp","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":"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"}

@@ -21,3 +21,3 @@ /*! Universal Router | MIT License | https://www.kriasoft.com/universal-router/ */

function cacheRoutes(routesByName, route, routes) {
if (routesByName[route.name]) {
if (routesByName.has(route.name)) {
throw new Error('Route "' + route.name + '" already exists');

@@ -27,3 +27,3 @@ }

if (route.name) {
routesByName[route.name] = route;
routesByName.set(route.name, route);
}

@@ -47,11 +47,11 @@

router.routesByName = router.routesByName || {};
router.routesByName = router.routesByName || new Map();
return function (routeName, params) {
var route = router.routesByName[routeName];
var route = router.routesByName.get(routeName);
if (!route) {
router.routesByName = {}; // clear cache
router.routesByName.clear(); // clear cache
cacheRoutes(router.routesByName, router.root, router.root.children);
route = router.routesByName[routeName];
route = router.routesByName.get(routeName);
if (!route) {

@@ -58,0 +58,0 @@ throw new Error('Route "' + routeName + '" not found');

@@ -1,1 +0,1 @@

{"version":3,"file":"browser.mjs","sources":["../src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName[route.name]) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName[route.name] = route;\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || {};\n\n return (routeName, params) => {\n let route = router.routesByName[routeName];\n if (!route) {\n router.routesByName = {}; // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName[routeName];\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","name","Error","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","root","regexp","get","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","set","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":"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"}
{"version":3,"file":"browser.mjs","sources":["../src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName.has(route.name)) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName.set(route.name, route);\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || new Map();\n\n return (routeName, params) => {\n let route = router.routesByName.get(routeName);\n if (!route) {\n router.routesByName.clear(); // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName.get(routeName);\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","has","name","Error","set","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","get","clear","root","regexp","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":"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"}

@@ -25,3 +25,3 @@ /*! Universal Router | MIT License | https://www.kriasoft.com/universal-router/ */

function cacheRoutes(routesByName, route, routes) {
if (routesByName[route.name]) {
if (routesByName.has(route.name)) {
throw new Error('Route "' + route.name + '" already exists');

@@ -31,3 +31,3 @@ }

if (route.name) {
routesByName[route.name] = route;
routesByName.set(route.name, route);
}

@@ -51,11 +51,11 @@

router.routesByName = router.routesByName || {};
router.routesByName = router.routesByName || new Map();
return function (routeName, params) {
var route = router.routesByName[routeName];
var route = router.routesByName.get(routeName);
if (!route) {
router.routesByName = {}; // clear cache
router.routesByName.clear(); // clear cache
cacheRoutes(router.routesByName, router.root, router.root.children);
route = router.routesByName[routeName];
route = router.routesByName.get(routeName);
if (!route) {

@@ -62,0 +62,0 @@ throw new Error('Route "' + routeName + '" not found');

@@ -1,1 +0,1 @@

{"version":3,"file":"legacy.js","sources":["../src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName[route.name]) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName[route.name] = route;\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || {};\n\n return (routeName, params) => {\n let route = router.routesByName[routeName];\n if (!route) {\n router.routesByName = {}; // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName[routeName];\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","name","Error","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","root","regexp","get","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","set","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":"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"}
{"version":3,"file":"legacy.js","sources":["../src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName.has(route.name)) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName.set(route.name, route);\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || new Map();\n\n return (routeName, params) => {\n let route = router.routesByName.get(routeName);\n if (!route) {\n router.routesByName.clear(); // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName.get(routeName);\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","has","name","Error","set","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","get","clear","root","regexp","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":"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"}

@@ -24,3 +24,3 @@ /*! Universal Router | MIT License | https://www.kriasoft.com/universal-router/ */

function cacheRoutes(routesByName, route, routes) {
if (routesByName[route.name]) {
if (routesByName.has(route.name)) {
throw new Error(`Route "${route.name}" already exists`);

@@ -30,3 +30,3 @@ }

if (route.name) {
routesByName[route.name] = route;
routesByName.set(route.name, route);
}

@@ -48,11 +48,11 @@

router.routesByName = router.routesByName || {};
router.routesByName = router.routesByName || new Map();
return (routeName, params) => {
let route = router.routesByName[routeName];
let route = router.routesByName.get(routeName);
if (!route) {
router.routesByName = {}; // clear cache
router.routesByName.clear(); // clear cache
cacheRoutes(router.routesByName, router.root, router.root.children);
route = router.routesByName[routeName];
route = router.routesByName.get(routeName);
if (!route) {

@@ -59,0 +59,0 @@ throw new Error(`Route "${routeName}" not found`);

@@ -1,1 +0,1 @@

{"version":3,"file":"main.js","sources":["../src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName[route.name]) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName[route.name] = route;\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || {};\n\n return (routeName, params) => {\n let route = router.routesByName[routeName];\n if (!route) {\n router.routesByName = {}; // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName[routeName];\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","name","Error","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","root","regexp","get","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","set","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":"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"}
{"version":3,"file":"main.js","sources":["../src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName.has(route.name)) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName.set(route.name, route);\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || new Map();\n\n return (routeName, params) => {\n let route = router.routesByName.get(routeName);\n if (!route) {\n router.routesByName.clear(); // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName.get(routeName);\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","has","name","Error","set","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","get","clear","root","regexp","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":"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"}

@@ -20,3 +20,3 @@ /*! Universal Router | MIT License | https://www.kriasoft.com/universal-router/ */

function cacheRoutes(routesByName, route, routes) {
if (routesByName[route.name]) {
if (routesByName.has(route.name)) {
throw new Error(`Route "${route.name}" already exists`);

@@ -26,3 +26,3 @@ }

if (route.name) {
routesByName[route.name] = route;
routesByName.set(route.name, route);
}

@@ -44,11 +44,11 @@

router.routesByName = router.routesByName || {};
router.routesByName = router.routesByName || new Map();
return (routeName, params) => {
let route = router.routesByName[routeName];
let route = router.routesByName.get(routeName);
if (!route) {
router.routesByName = {}; // clear cache
router.routesByName.clear(); // clear cache
cacheRoutes(router.routesByName, router.root, router.root.children);
route = router.routesByName[routeName];
route = router.routesByName.get(routeName);
if (!route) {

@@ -55,0 +55,0 @@ throw new Error(`Route "${routeName}" not found`);

@@ -1,1 +0,1 @@

{"version":3,"file":"main.mjs","sources":["../src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName[route.name]) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName[route.name] = route;\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || {};\n\n return (routeName, params) => {\n let route = router.routesByName[routeName];\n if (!route) {\n router.routesByName = {}; // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName[routeName];\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","name","Error","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","root","regexp","get","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","set","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":"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"}
{"version":3,"file":"main.mjs","sources":["../src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName.has(route.name)) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName.set(route.name, route);\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || new Map();\n\n return (routeName, params) => {\n let route = router.routesByName.get(routeName);\n if (!route) {\n router.routesByName.clear(); // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName.get(routeName);\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","has","name","Error","set","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","get","clear","root","regexp","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":"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"}
{
"private": true,
"name": "generateUrls",
"version": "5.0.0",
"version": "5.1.0",
"description": "Universal Router Generate URLs Add-on",

@@ -6,0 +6,0 @@ "homepage": "https://www.kriasoft.com/universal-router/",

{
"name": "universal-router",
"version": "5.0.0",
"version": "5.1.0",
"description": "Isomorphic router for JavaScript web applications",

@@ -5,0 +5,0 @@ "homepage": "https://www.kriasoft.com/universal-router/",

+47
-31

@@ -24,3 +24,3 @@ <a href="https://www.kriasoft.com/universal-router/" target="_blank">

✓ It has [simple code](https://github.com/kriasoft/universal-router/blob/v5.0.0/src/UniversalRouter.js)
✓ It has [simple code](https://github.com/kriasoft/universal-router/blob/v5.1.0/src/UniversalRouter.js)
with only single [path-to-regexp](https://github.com/pillarjs/path-to-regexp) dependency<br>

@@ -46,3 +46,3 @@ ✓ It can be used with any JavaScript framework such as React, Vue.js etc<br>

```html
<script src="https://unpkg.com/universal-router@5.0.0/universal-router.min.js"></script>
<script src="https://unpkg.com/universal-router@5.1.0/universal-router.min.js"></script>
```

@@ -120,2 +120,4 @@

by [Michael Sargent](https://twitter.com/michaelksarge)<br>
:page_facing_up: &nbsp; **[Getting Started with Relay “Modern” for Building Isomorphic Web Apps](https://hackernoon.com/ae049e4e23c1)**
by [Konstantin Tarkus](https://twitter.com/koistya)<br>

@@ -125,35 +127,34 @@

Does your company use Universal Router in production? Please consider
[sponsoring this project](https://opencollective.com/universal-router#sponsor).
Your help will allow maintainers to dedicate more time and resources to its development and support.
Become a sponsor and get your logo on our README on Github with a link to your site.
[[Become a sponsor](https://opencollective.com/universal-router#sponsor)]
<a href="https://opencollective.com/universal-router/sponsor/0/website" target="_blank">
<img src="https://opencollective.com/universal-router/sponsor/0/avatar.svg" height="64">
<img src="https://opencollective.com/universal-router/sponsor/0/avatar.svg?2018-01-16" height="64">
</a>
<a href="https://opencollective.com/universal-router/sponsor/1/website" target="_blank">
<img src="https://opencollective.com/universal-router/sponsor/1/avatar.svg">
<img src="https://opencollective.com/universal-router/sponsor/1/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/sponsor/2/website" target="_blank">
<img src="https://opencollective.com/universal-router/sponsor/2/avatar.svg">
<img src="https://opencollective.com/universal-router/sponsor/2/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/sponsor/3/website" target="_blank">
<img src="https://opencollective.com/universal-router/sponsor/3/avatar.svg">
<img src="https://opencollective.com/universal-router/sponsor/3/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/sponsor/4/website" target="_blank">
<img src="https://opencollective.com/universal-router/sponsor/4/avatar.svg">
<img src="https://opencollective.com/universal-router/sponsor/4/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/sponsor/5/website" target="_blank">
<img src="https://opencollective.com/universal-router/sponsor/5/avatar.svg">
<img src="https://opencollective.com/universal-router/sponsor/5/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/sponsor/6/website" target="_blank">
<img src="https://opencollective.com/universal-router/sponsor/6/avatar.svg">
<img src="https://opencollective.com/universal-router/sponsor/6/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/sponsor/7/website" target="_blank">
<img src="https://opencollective.com/universal-router/sponsor/7/avatar.svg">
<img src="https://opencollective.com/universal-router/sponsor/7/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/sponsor/8/website" target="_blank">
<img src="https://opencollective.com/universal-router/sponsor/8/avatar.svg">
<img src="https://opencollective.com/universal-router/sponsor/8/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/sponsor/9/website" target="_blank">
<img src="https://opencollective.com/universal-router/sponsor/9/avatar.svg">
<img src="https://opencollective.com/universal-router/sponsor/9/avatar.svg?2018-01-16">
</a>

@@ -164,38 +165,52 @@

♥ Universal Router? [Become a backer](https://opencollective.com/universal-router#backer)
to show your support and help us maintain and improve this open source project.
Get your image on our README with a link to your site.
Support us with a monthly donation and help us continue our activities.
[[Become a backer](https://opencollective.com/universal-router#backer)]
<a href="https://opencollective.com/universal-router/backer/0/website" target="_blank">
<img src="https://opencollective.com/universal-router/backer/0/avatar.svg" height="64">
<img src="https://opencollective.com/universal-router/backer/0/avatar.svg?2018-01-16" height="64">
</a>
<a href="https://opencollective.com/universal-router/backer/1/website" target="_blank">
<img src="https://opencollective.com/universal-router/backer/1/avatar.svg">
<img src="https://opencollective.com/universal-router/backer/1/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/backer/2/website" target="_blank">
<img src="https://opencollective.com/universal-router/backer/2/avatar.svg">
<img src="https://opencollective.com/universal-router/backer/2/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/backer/3/website" target="_blank">
<img src="https://opencollective.com/universal-router/backer/3/avatar.svg">
<img src="https://opencollective.com/universal-router/backer/3/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/backer/4/website" target="_blank">
<img src="https://opencollective.com/universal-router/backer/4/avatar.svg">
<img src="https://opencollective.com/universal-router/backer/4/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/backer/5/website" target="_blank">
<img src="https://opencollective.com/universal-router/backer/5/avatar.svg">
<img src="https://opencollective.com/universal-router/backer/5/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/backer/6/website" target="_blank">
<img src="https://opencollective.com/universal-router/backer/6/avatar.svg">
<img src="https://opencollective.com/universal-router/backer/6/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/backer/7/website" target="_blank">
<img src="https://opencollective.com/universal-router/backer/7/avatar.svg">
<img src="https://opencollective.com/universal-router/backer/7/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/backer/8/website" target="_blank">
<img src="https://opencollective.com/universal-router/backer/8/avatar.svg">
<img src="https://opencollective.com/universal-router/backer/8/avatar.svg?2018-01-16">
</a>
<a href="https://opencollective.com/universal-router/backer/9/website" target="_blank">
<img src="https://opencollective.com/universal-router/backer/9/avatar.svg">
<img src="https://opencollective.com/universal-router/backer/9/avatar.svg?2018-01-16">
</a>
## What users say about Universal Router
> Just switched a project over to universal-router.
> Love that the whole thing is a few hundred lines of flexible, easy-to-read code.
>
> -- [Tweet](https://twitter.com/wincent/status/862115805378494464) by **Greg Hurrell** from Facebook
> It does a great job at trying to be _universal_ — it's not tied to any framework,
> it can be run on both server and client, and it's not even tied to history.
> It's a great library which does one thing: routing.
>
> -- [Comment on Reddit](https://www.reddit.com/r/reactjs/comments/5xhw3o#form-t1_dejkw4p367)
> by **@everdimension**
## Related Projects

@@ -254,4 +269,5 @@

Made with ♥ by
Konstantin Tarkus ([@koistya](https://twitter.com/koistya), [blog](https://medium.com/@tarkus)),
Vladimir Kutepov ([frenzzy](https://github.com/frenzzy)) and
[contributors](https://github.com/kriasoft/universal-router/graphs/contributors)
[Konstantin Tarkus](https://github.com/koistya)
([@koistya](https://twitter.com/koistya), [blog](https://medium.com/@tarkus)),
[Vladimir Kutepov](https://github.com/frenzzy)
and [contributors](https://github.com/kriasoft/universal-router/graphs/contributors)

@@ -18,3 +18,3 @@ /**

function cacheRoutes(routesByName, route, routes) {
if (routesByName[route.name]) {
if (routesByName.has(route.name)) {
throw new Error(`Route "${route.name}" already exists`);

@@ -24,3 +24,3 @@ }

if (route.name) {
routesByName[route.name] = route;
routesByName.set(route.name, route);
}

@@ -42,11 +42,11 @@

router.routesByName = router.routesByName || {};
router.routesByName = router.routesByName || new Map();
return (routeName, params) => {
let route = router.routesByName[routeName];
let route = router.routesByName.get(routeName);
if (!route) {
router.routesByName = {}; // clear cache
router.routesByName.clear(); // clear cache
cacheRoutes(router.routesByName, router.root, router.root.children);
route = router.routesByName[routeName];
route = router.routesByName.get(routeName);
if (!route) {

@@ -53,0 +53,0 @@ throw new Error(`Route "${routeName}" not found`);

@@ -27,3 +27,3 @@ /*! Universal Router | MIT License | https://www.kriasoft.com/universal-router/ */

function cacheRoutes(routesByName, route, routes) {
if (routesByName[route.name]) {
if (routesByName.has(route.name)) {
throw new Error('Route "' + route.name + '" already exists');

@@ -33,3 +33,3 @@ }

if (route.name) {
routesByName[route.name] = route;
routesByName.set(route.name, route);
}

@@ -53,11 +53,11 @@

router.routesByName = router.routesByName || {};
router.routesByName = router.routesByName || new Map();
return function (routeName, params) {
var route = router.routesByName[routeName];
var route = router.routesByName.get(routeName);
if (!route) {
router.routesByName = {}; // clear cache
router.routesByName.clear(); // clear cache
cacheRoutes(router.routesByName, router.root, router.root.children);
route = router.routesByName[routeName];
route = router.routesByName.get(routeName);
if (!route) {

@@ -64,0 +64,0 @@ throw new Error('Route "' + routeName + '" not found');

@@ -1,1 +0,1 @@

{"version":3,"file":"universal-router-generate-urls.js","sources":["src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName[route.name]) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName[route.name] = route;\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || {};\n\n return (routeName, params) => {\n let route = router.routesByName[routeName];\n if (!route) {\n router.routesByName = {}; // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName[routeName];\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","name","Error","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","root","regexp","get","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","set","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":";;;;;;;;;;AAAA;;;;;;;;;;;AAWA,IAEQA,eAAiBC,gBAAjBD;;AACR,IAAME,QAAQ,IAAIC,GAAJ,EAAd;;AAEA,SAASC,WAAT,CAAqBC,YAArB,EAAmCC,KAAnC,EAA0CC,MAA1C,EAAkD;MAC5CF,aAAaC,MAAME,IAAnB,CAAJ,EAA8B;UACtB,IAAIC,KAAJ,aAAoBH,MAAME,IAA1B,sBAAN;;;MAGEF,MAAME,IAAV,EAAgB;iBACDF,MAAME,IAAnB,IAA2BF,KAA3B;;;MAGEC,MAAJ,EAAY;SACL,IAAIG,IAAI,CAAb,EAAgBA,IAAIH,OAAOI,MAA3B,EAAmCD,KAAK,CAAxC,EAA2C;UACnCE,aAAaL,OAAOG,CAAP,CAAnB;iBACWG,MAAX,GAAoBP,KAApB;kBACYD,YAAZ,EAA0BO,UAA1B,EAAsCA,WAAWE,QAAjD;;;;;AAKN,SAASC,YAAT,CAAsBC,MAAtB,EAA4C;MAAdC,OAAc,uEAAJ,EAAI;;MACtC,EAAED,kBAAkBf,eAApB,CAAJ,EAA0C;UAClC,IAAIiB,SAAJ,CAAc,4CAAd,CAAN;;;SAGKb,YAAP,GAAsBW,OAAOX,YAAP,IAAuB,EAA7C;;SAEO,UAACc,SAAD,EAAYC,MAAZ,EAAuB;QACxBd,QAAQU,OAAOX,YAAP,CAAoBc,SAApB,CAAZ;QACI,CAACb,KAAL,EAAY;aACHD,YAAP,GAAsB,EAAtB,CADU;kBAEEW,OAAOX,YAAnB,EAAiCW,OAAOK,IAAxC,EAA8CL,OAAOK,IAAP,CAAYP,QAA1D;;cAEQE,OAAOX,YAAP,CAAoBc,SAApB,CAAR;UACI,CAACb,KAAL,EAAY;cACJ,IAAIG,KAAJ,aAAoBU,SAApB,iBAAN;;;;QAIAG,SAASpB,MAAMqB,GAAN,CAAUjB,MAAMkB,QAAhB,CAAb;QACI,CAACF,MAAL,EAAa;UACPE,WAAW,EAAf;UACIC,KAAKnB,KAAT;aACOmB,EAAP,EAAW;YACHC,OAAOC,MAAMC,OAAN,CAAcH,GAAGC,IAAjB,IAAyBD,GAAGC,IAAH,CAAQ,CAAR,CAAzB,GAAsCD,GAAGC,IAAtD;YACIA,IAAJ,EAAU;qBACGA,OAAOF,QAAlB;;aAEGC,GAAGZ,MAAR;;UAEIgB,SAAS7B,aAAa8B,KAAb,CAAmBN,QAAnB,CAAf;UACMO,SAAS/B,aAAagC,gBAAb,CAA8BH,MAA9B,CAAf;UACMI,OAAOC,OAAOC,MAAP,CAAc,IAAd,CAAb;WACK,IAAIzB,IAAI,CAAb,EAAgBA,IAAImB,OAAOlB,MAA3B,EAAmCD,KAAK,CAAxC,EAA2C;YACrC,OAAOmB,OAAOnB,CAAP,CAAP,KAAqB,QAAzB,EAAmC;eAC5BmB,OAAOnB,CAAP,EAAUF,IAAf,IAAuB,IAAvB;;;eAGK,EAAEuB,cAAF,EAAUE,UAAV,EAAT;YACMG,GAAN,CAAUZ,QAAV,EAAoBF,MAApB;YACME,QAAN,GAAiBA,QAAjB;;;QAGEa,MAAMrB,OAAOsB,OAAP,GAAiBhB,OAAOS,MAAP,CAAcX,MAAd,EAAsBH,OAAtB,CAAjB,IAAmD,GAA7D;;QAEIA,QAAQsB,oBAAR,IAAgCnB,MAApC,EAA4C;UACpCoB,cAAc,EAApB;UACMP,QAAOC,OAAOD,IAAP,CAAYb,MAAZ,CAAb;WACK,IAAIV,KAAI,CAAb,EAAgBA,KAAIuB,MAAKtB,MAAzB,EAAiCD,MAAK,CAAtC,EAAyC;YACjC+B,MAAMR,MAAKvB,EAAL,CAAZ;YACI,CAACY,OAAOW,IAAP,CAAYQ,GAAZ,CAAL,EAAuB;sBACTA,GAAZ,IAAmBrB,OAAOqB,GAAP,CAAnB;;;UAGEC,QAAQzB,QAAQsB,oBAAR,CAA6BC,WAA7B,CAAd;UACIE,KAAJ,EAAW;eACFA,MAAMC,MAAN,CAAa,CAAb,MAAoB,GAApB,GAA0BD,KAA1B,SAAsCA,KAA7C;;;;WAIGL,GAAP;GArDF;;;AAyDFpC,gBAAgBc,YAAhB,GAA+BA,YAA/B;;;;;;;;"}
{"version":3,"file":"universal-router-generate-urls.js","sources":["src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName.has(route.name)) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName.set(route.name, route);\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || new Map();\n\n return (routeName, params) => {\n let route = router.routesByName.get(routeName);\n if (!route) {\n router.routesByName.clear(); // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName.get(routeName);\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","has","name","Error","set","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","get","clear","root","regexp","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":"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"}
/*! Universal Router | MIT License | https://www.kriasoft.com/universal-router/ */
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r(require("./universal-router.min.js")):"function"==typeof define&&define.amd?define(["./universal-router.min.js"],r):e.generateUrls=r(e.UniversalRouter)}(this,function(e){"use strict";function r(e,t,n){if(e[t.name])throw new Error('Route "'+t.name+'" already exists');if(t.name&&(e[t.name]=t),n)for(var a=0;a<n.length;a+=1){var o=n[a];o.parent=t,r(e,o,o.children)}}function t(t){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(t instanceof e))throw new TypeError("An instance of UniversalRouter is expected");return t.routesByName=t.routesByName||{},function(e,i){var s=t.routesByName[e];if(!(s||(t.routesByName={},r(t.routesByName,t.root,t.root.children),s=t.routesByName[e])))throw new Error('Route "'+e+'" not found');var u=a.get(s.fullPath);if(!u){for(var f="",l=s;l;){var y=Array.isArray(l.path)?l.path[0]:l.path;y&&(f=y+f),l=l.parent}for(var h=n.parse(f),c=n.tokensToFunction(h),m=Object.create(null),p=0;p<h.length;p+=1)"string"!=typeof h[p]&&(m[h[p].name]=!0);u={toPath:c,keys:m},a.set(f,u),s.fullPath=f}var v=t.baseUrl+u.toPath(i,o)||"/";if(o.stringifyQueryParams&&i){for(var d={},g=Object.keys(i),w=0;w<g.length;w+=1){var P=g[w];u.keys[P]||(d[P]=i[P])}var B=o.stringifyQueryParams(d);B&&(v+="?"===B.charAt(0)?B:"?"+B)}return v}}var n=(e=e&&e.hasOwnProperty("default")?e.default:e).pathToRegexp,a=new Map;return e.generateUrls=t,t});
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r(require("./universal-router.min.js")):"function"==typeof define&&define.amd?define(["./universal-router.min.js"],r):e.generateUrls=r(e.UniversalRouter)}(this,function(e){"use strict";var r=(e=e&&e.hasOwnProperty("default")?e.default:e).pathToRegexp,t=new Map;function a(a){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(a instanceof e))throw new TypeError("An instance of UniversalRouter is expected");return a.routesByName=a.routesByName||new Map,function(e,o){var s=a.routesByName.get(e);if(!(s||(a.routesByName.clear(),function e(r,t,a){if(r.has(t.name))throw new Error('Route "'+t.name+'" already exists');if(t.name&&r.set(t.name,t),a)for(var n=0;n<a.length;n+=1){var o=a[n];o.parent=t,e(r,o,o.children)}}(a.routesByName,a.root,a.root.children),s=a.routesByName.get(e))))throw new Error('Route "'+e+'" not found');var i=t.get(s.fullPath);if(!i){for(var u="",f=s;f;){var l=Array.isArray(f.path)?f.path[0]:f.path;l&&(u=l+u),f=f.parent}for(var y=r.parse(u),h=r.tokensToFunction(y),c=Object.create(null),p=0;p<y.length;p+=1)"string"!=typeof y[p]&&(c[y[p].name]=!0);i={toPath:h,keys:c},t.set(u,i),s.fullPath=u}var m=a.baseUrl+i.toPath(o,n)||"/";if(n.stringifyQueryParams&&o){for(var v={},d=Object.keys(o),g=0;g<d.length;g+=1){var w=d[g];i.keys[w]||(v[w]=o[w])}var P=n.stringifyQueryParams(v);P&&(m+="?"===P.charAt(0)?P:"?"+P)}return m}}return e.generateUrls=a,a});
//# sourceMappingURL=universal-router-generate-urls.min.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"universal-router-generate-urls.min.js","sources":["src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName[route.name]) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName[route.name] = route;\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || {};\n\n return (routeName, params) => {\n let route = router.routesByName[routeName];\n if (!route) {\n router.routesByName = {}; // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName[routeName];\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["cacheRoutes","routesByName","route","routes","name","Error","i","length","childRoute","parent","children","generateUrls","router","options","UniversalRouter","TypeError","routeName","params","root","regexp","cache","get","fullPath","rt","path","Array","isArray","tokens","pathToRegexp","parse","toPath","tokensToFunction","keys","Object","create","set","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt","Map"],"mappings":";4QAgBA,SAASA,EAAYC,EAAcC,EAAOC,MACpCF,EAAaC,EAAME,YACf,IAAIC,gBAAgBH,EAAME,4BAG9BF,EAAME,SACKF,EAAME,MAAQF,GAGzBC,MACG,IAAIG,EAAI,EAAGA,EAAIH,EAAOI,OAAQD,GAAK,EAAG,KACnCE,EAAaL,EAAOG,KACfG,OAASP,IACRD,EAAcO,EAAYA,EAAWE,WAKvD,SAASC,EAAaC,OAAQC,iEACtBD,aAAkBE,SAChB,IAAIC,UAAU,uDAGfd,aAAeW,EAAOX,iBAEtB,SAACe,EAAWC,OACbf,EAAQU,EAAOX,aAAae,QAC3Bd,MACID,kBACKW,EAAOX,aAAcW,EAAOM,KAAMN,EAAOM,KAAKR,YAElDE,EAAOX,aAAae,WAEpB,IAAIX,gBAAgBW,qBAI1BG,EAASC,EAAMC,IAAInB,EAAMoB,cACxBH,EAAQ,SACPG,EAAW,GACXC,EAAKrB,EACFqB,GAAI,KACHC,EAAOC,MAAMC,QAAQH,EAAGC,MAAQD,EAAGC,KAAK,GAAKD,EAAGC,KAClDA,MACSA,EAAOF,KAEfC,EAAGd,WAKL,IAHCkB,EAASC,EAAaC,MAAMP,GAC5BQ,EAASF,EAAaG,iBAAiBJ,GACvCK,EAAOC,OAAOC,OAAO,MAClB5B,EAAI,EAAGA,EAAIqB,EAAOpB,OAAQD,GAAK,EACb,iBAAdqB,EAAOrB,OACXqB,EAAOrB,GAAGF,OAAQ,MAGhB0B,SAAQE,UACbG,IAAIb,EAAUH,KACdG,SAAWA,MAGfc,EAAMxB,EAAOyB,QAAUlB,EAAOW,OAAOb,EAAQJ,IAAY,OAEzDA,EAAQyB,sBAAwBrB,EAAQ,KAGrC,IAFCsB,KACAP,EAAOC,OAAOD,KAAKf,GAChBX,EAAI,EAAGA,EAAI0B,EAAKzB,OAAQD,GAAK,EAAG,KACjCkC,EAAMR,EAAK1B,GACZa,EAAOa,KAAKQ,OACHA,GAAOvB,EAAOuB,QAGxBC,EAAQ5B,EAAQyB,qBAAqBC,GACvCE,OACyB,MAApBA,EAAMC,OAAO,GAAaD,MAAYA,UAI1CL,GAnFX,IAEQR,iDAAAA,aACFR,EAAQ,IAAIuB,WAoFlB7B,EAAgBH,aAAeA"}
{"version":3,"file":"universal-router-generate-urls.min.js","sources":["src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\n/* eslint no-param-reassign: ['error', { props: false }] */\n\nimport UniversalRouter from './UniversalRouter';\n\nconst { pathToRegexp } = UniversalRouter;\nconst cache = new Map();\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName.has(route.name)) {\n throw new Error(`Route \"${route.name}\" already exists`);\n }\n\n if (route.name) {\n routesByName.set(route.name, route);\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i += 1) {\n const childRoute = routes[i];\n childRoute.parent = route;\n cacheRoutes(routesByName, childRoute, childRoute.children);\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected');\n }\n\n router.routesByName = router.routesByName || new Map();\n\n return (routeName, params) => {\n let route = router.routesByName.get(routeName);\n if (!route) {\n router.routesByName.clear(); // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children);\n\n route = router.routesByName.get(routeName);\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`);\n }\n }\n\n let regexp = cache.get(route.fullPath);\n if (!regexp) {\n let fullPath = '';\n let rt = route;\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path;\n if (path) {\n fullPath = path + fullPath;\n }\n rt = rt.parent;\n }\n const tokens = pathToRegexp.parse(fullPath);\n const toPath = pathToRegexp.tokensToFunction(tokens);\n const keys = Object.create(null);\n for (let i = 0; i < tokens.length; i += 1) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true;\n }\n }\n regexp = { toPath, keys };\n cache.set(fullPath, regexp);\n route.fullPath = fullPath;\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/';\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {};\n const keys = Object.keys(params);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n if (!regexp.keys[key]) {\n queryParams[key] = params[key];\n }\n }\n const query = options.stringifyQueryParams(queryParams);\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`;\n }\n }\n\n return url;\n };\n}\n\nUniversalRouter.generateUrls = generateUrls;\n\nexport default generateUrls;\n"],"names":["pathToRegexp","cache","Map","generateUrls","router","options","UniversalRouter","TypeError","routesByName","routeName","params","route","get","clear","cacheRoutes","routes","has","name","Error","set","i","length","childRoute","parent","children","root","regexp","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":";4QAWA,IAEQA,iDAAAA,aACFC,EAAQ,IAAIC,IAoBlB,SAASC,EAAaC,OAAQC,iEACtBD,aAAkBE,SAChB,IAAIC,UAAU,uDAGfC,aAAeJ,EAAOI,cAAgB,IAAIN,IAE1C,SAACO,EAAWC,OACbC,EAAQP,EAAOI,aAAaI,IAAIH,QAC/BE,MACIH,aAAaK,QA5B1B,SAASC,EAAYN,EAAcG,EAAOI,MACpCP,EAAaQ,IAAIL,EAAMM,YACnB,IAAIC,gBAAgBP,EAAMM,4BAG9BN,EAAMM,QACKE,IAAIR,EAAMM,KAAMN,GAG3BI,MACG,IAAIK,EAAI,EAAGA,EAAIL,EAAOM,OAAQD,GAAK,EAAG,KACnCE,EAAaP,EAAOK,KACfG,OAASZ,IACRH,EAAcc,EAAYA,EAAWE,YAgBrCpB,EAAOI,aAAcJ,EAAOqB,KAAMrB,EAAOqB,KAAKD,YAElDpB,EAAOI,aAAaI,IAAIH,WAExB,IAAIS,gBAAgBT,qBAI1BiB,EAASzB,EAAMW,IAAID,EAAMgB,cACxBD,EAAQ,SACPC,EAAW,GACXC,EAAKjB,EACFiB,GAAI,KACHC,EAAOC,MAAMC,QAAQH,EAAGC,MAAQD,EAAGC,KAAK,GAAKD,EAAGC,KAClDA,MACSA,EAAOF,KAEfC,EAAGL,eAEJS,EAAShC,EAAaiC,MAAMN,GAC5BO,EAASlC,EAAamC,iBAAiBH,GACvCI,EAAOC,OAAOC,OAAO,MAClBlB,EAAI,EAAGA,EAAIY,EAAOX,OAAQD,GAAK,EACb,iBAAdY,EAAOZ,OACXY,EAAOZ,GAAGH,OAAQ,MAGhBiB,SAAQE,UACbjB,IAAIQ,EAAUD,KACdC,SAAWA,MAGfY,EAAMnC,EAAOoC,QAAUd,EAAOQ,OAAOxB,EAAQL,IAAY,OAEzDA,EAAQoC,sBAAwB/B,EAAQ,SACpCgC,KACAN,EAAOC,OAAOD,KAAK1B,GAChBU,EAAI,EAAGA,EAAIgB,EAAKf,OAAQD,GAAK,EAAG,KACjCuB,EAAMP,EAAKhB,GACZM,EAAOU,KAAKO,OACHA,GAAOjC,EAAOiC,QAGxBC,EAAQvC,EAAQoC,qBAAqBC,GACvCE,OACyB,MAApBA,EAAMC,OAAO,GAAaD,MAAYA,UAI1CL,UAIXjC,EAAgBH,aAAeA"}
/*! Universal Router | MIT License | https://www.kriasoft.com/universal-router/ */
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.UniversalRouter=t()}(this,function(){"use strict";function e(e,t){for(var o,a=[],i=0,u=0,l="",s=t&&t.delimiter||b,p=t&&t.delimiters||w,f=!1;null!==(o=E.exec(e));){var c=o[0],h=o[1],v=o.index;if(l+=e.slice(u,v),u=v+c.length,h)l+=h[1],f=!0;else{var d="",g=e[u],m=o[2],y=o[3],x=o[4],R=o[5];if(!f&&l.length){var j=l.length-1;p.indexOf(l[j])>-1&&(d=l[j],l=l.slice(0,j))}l&&(a.push(l),l="",f=!1);var k=""!==d&&void 0!==g&&g!==d,O="+"===R||"*"===R,T="?"===R||"*"===R,A=d||s,U=y||x;a.push({name:m||i++,prefix:d,delimiter:A,optional:T,repeat:O,partial:k,pattern:U?n(U):"[^"+r(A)+"]+?"})}}return(l||u<e.length)&&a.push(l+e.substr(u)),a}function t(e){for(var t=new Array(e.length),r=0;r<e.length;r++)"object"==typeof e[r]&&(t[r]=new RegExp("^(?:"+e[r].pattern+")$"));return function(r,n){for(var o="",a=n&&n.encode||encodeURIComponent,i=0;i<e.length;i++){var u=e[i];if("string"!=typeof u){var l,s=r?r[u.name]:void 0;if(Array.isArray(s)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but got array');if(0===s.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var p=0;p<s.length;p++){if(l=a(s[p]),!t[i].test(l))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'"');o+=(0===p?u.prefix:u.delimiter)+l}}else if("string"!=typeof s&&"number"!=typeof s&&"boolean"!=typeof s){if(!u.optional)throw new TypeError('Expected "'+u.name+'" to be '+(u.repeat?"an array":"a string"));u.partial&&(o+=u.prefix)}else{if(l=a(String(s)),!t[i].test(l))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but got "'+l+'"');o+=u.prefix+l}}else o+=u}return o}}function r(e){return e.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1")}function n(e){return e.replace(/([=!:$/()])/g,"\\$1")}function o(e){return e&&e.sensitive?"":"i"}function a(e,t){if(!t)return e;var r=e.source.match(/\((?!\?)/g);if(r)for(var n=0;n<r.length;n++)t.push({name:n,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,pattern:null});return e}function i(e,t,r){for(var n=[],a=0;a<e.length;a++)n.push(s(e[a],t,r).source);return new RegExp("(?:"+n.join("|")+")",o(r))}function u(t,r,n){return l(e(t,n),r,n)}function l(e,t,n){for(var a=(n=n||{}).strict,i=!1!==n.end,u=r(n.delimiter||b),l=n.delimiters||w,s=[].concat(n.endsWith||[]).map(r).concat("$").join("|"),p="",f=!1,c=0;c<e.length;c++){var h=e[c];if("string"==typeof h)p+=r(h),f=c===e.length-1&&l.indexOf(h[h.length-1])>-1;else{var v=r(h.prefix),d=h.repeat?"(?:"+h.pattern+")(?:"+v+"(?:"+h.pattern+"))*":h.pattern;t&&t.push(h),h.optional?h.partial?p+=v+"("+d+")?":p+="(?:"+v+"("+d+"))?":p+=v+"("+d+")"}}return i?(a||(p+="(?:"+u+")?"),p+="$"===s?"$":"(?="+s+")"):(a||(p+="(?:"+u+"(?="+s+"))?"),f||(p+="(?="+u+"|"+s+")")),new RegExp("^"+p,o(n))}function s(e,t,r){return e instanceof RegExp?a(e,t):Array.isArray(e)?i(e,t,r):u(e,t,r)}function p(e){try{return decodeURIComponent(e)}catch(t){return e}}function f(e,t,r,n){var o=!e.children,a=(e.path||"")+"|"+o,i=j.get(a);if(!i){var u=[];i={keys:u,pattern:g(e.path||"",u,{end:o})},j.set(a,i)}var l=i.pattern.exec(t);if(!l)return null;for(var s=l[0],f=Object.assign({},n),c=1;c<l.length;c+=1){var h=i.keys[c-1],v=h.name,d=l[c];void 0===d&&R.call(f,v)||(h.repeat?f[v]=d?d.split(h.delimiter).map(p):[]:f[v]=d?p(d):d)}return{path:o||"/"!==s.charAt(s.length-1)?s:s.substr(1),keys:r.concat(i.keys),params:f}}function c(e,t,r,n,o){var a=void 0,i=void 0,u=0;return{next:function(l){if(e===l)return{done:!0};if(!a&&(a=f(e,r,n,o)))return{done:!1,value:{route:e,baseUrl:t,path:a.path,keys:a.keys,params:a.params}};if(a&&e.children)for(;u<e.children.length;){if(!i){var s=e.children[u];s.parent=e,i=c(s,t+a.path,r.substr(a.path.length),a.keys,a.params)}var p=i.next(l);if(!p.done)return{done:!1,value:p.value};i=null,u+=1}return{done:!0}}}}function h(e,t){if("function"==typeof e.route.action)return e.route.action(e,t)}function v(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function d(e,t){for(var r=t;r;)if((r=r.parent)===e)return!0;return!1}var g=s,m=e,y=t,x=l,b="/",w="./",E=new RegExp(["(\\\\.)","(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?"].join("|"),"g");g.parse=m,g.compile=function(r,n){return t(e(r,n))},g.tokensToFunction=y,g.tokensToRegExp=x;var R=Object.prototype.hasOwnProperty,j=new Map,k=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),O=function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(v(this,e),Object(t)!==t)throw new TypeError("Invalid routes");this.baseUrl=r.baseUrl||"",this.resolveRoute=r.resolveRoute||h,this.context=Object.assign({router:this},r.context),this.root=Array.isArray(t)?{path:"",children:t,parent:null}:t,this.root.parent=null}return k(e,[{key:"resolve",value:function(e){function t(e){var u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:a.value.route,l=null===arguments[2]&&a.value.route;return a=i||n.next(l),i=null,e||!a.done&&d(u,a.value.route)?a.done?Promise.reject(Object.assign(new Error("Page not found"),{context:r,status:404,statusCode:404})):Promise.resolve(o(Object.assign({},r,a.value),a.value.params)).then(function(r){return null!==r&&void 0!==r?r:t(e,u,r)}):(i=a,Promise.resolve(null))}var r=Object.assign({},this.context,"string"==typeof e?{pathname:e}:e),n=c(this.root,this.baseUrl,r.pathname.substr(this.baseUrl.length),[],null),o=this.resolveRoute,a=null,i=null;return r.next=t,t(!0,this.root)}}]),e}();return O.pathToRegexp=g,O.matchPath=f,O.matchRoute=c,O.resolveRoute=h,O});
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.UniversalRouter=t()}(this,function(){"use strict";var e=h,t=l,r=function(e,t){return s(l(e,t))},n=s,o=c,a="/",i="./",u=new RegExp(["(\\\\.)","(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?"].join("|"),"g");function l(e,t){for(var r,n,o=[],l=0,s=0,f="",c=t&&t.delimiter||a,h=t&&t.delimiters||i,v=!1;null!==(r=u.exec(e));){var d=r[0],g=r[1],m=r.index;if(f+=e.slice(s,m),s=m+d.length,g)f+=g[1],v=!0;else{var y="",x=e[s],b=r[2],w=r[3],E=r[4],R=r[5];if(!v&&f.length){var j=f.length-1;h.indexOf(f[j])>-1&&(y=f[j],f=f.slice(0,j))}f&&(o.push(f),f="",v=!1);var k=""!==y&&void 0!==x&&x!==y,O="+"===R||"*"===R,T="?"===R||"*"===R,A=y||c,U=w||E;o.push({name:b||l++,prefix:y,delimiter:A,optional:T,repeat:O,partial:k,pattern:U?(n=U,n.replace(/([=!:$/()])/g,"\\$1")):"[^"+p(A)+"]+?"})}}return(f||s<e.length)&&o.push(f+e.substr(s)),o}function s(e){for(var t=new Array(e.length),r=0;r<e.length;r++)"object"==typeof e[r]&&(t[r]=new RegExp("^(?:"+e[r].pattern+")$"));return function(r,n){for(var o="",a=n&&n.encode||encodeURIComponent,i=0;i<e.length;i++){var u=e[i];if("string"!=typeof u){var l,s=r?r[u.name]:void 0;if(Array.isArray(s)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but got array');if(0===s.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var p=0;p<s.length;p++){if(l=a(s[p]),!t[i].test(l))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'"');o+=(0===p?u.prefix:u.delimiter)+l}}else if("string"!=typeof s&&"number"!=typeof s&&"boolean"!=typeof s){if(!u.optional)throw new TypeError('Expected "'+u.name+'" to be '+(u.repeat?"an array":"a string"));u.partial&&(o+=u.prefix)}else{if(l=a(String(s)),!t[i].test(l))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but got "'+l+'"');o+=u.prefix+l}}else o+=u}return o}}function p(e){return e.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1")}function f(e){return e&&e.sensitive?"":"i"}function c(e,t,r){for(var n=(r=r||{}).strict,o=!1!==r.end,u=p(r.delimiter||a),l=r.delimiters||i,s=[].concat(r.endsWith||[]).map(p).concat("$").join("|"),c="",h=!1,v=0;v<e.length;v++){var d=e[v];if("string"==typeof d)c+=p(d),h=v===e.length-1&&l.indexOf(d[d.length-1])>-1;else{var g=p(d.prefix),m=d.repeat?"(?:"+d.pattern+")(?:"+g+"(?:"+d.pattern+"))*":d.pattern;t&&t.push(d),d.optional?d.partial?c+=g+"("+m+")?":c+="(?:"+g+"("+m+"))?":c+=g+"("+m+")"}}return o?(n||(c+="(?:"+u+")?"),c+="$"===s?"$":"(?="+s+")"):(n||(c+="(?:"+u+"(?="+s+"))?"),h||(c+="(?="+u+"|"+s+")")),new RegExp("^"+c,f(r))}function h(e,t,r){return e instanceof RegExp?function(e,t){if(!t)return e;var r=e.source.match(/\((?!\?)/g);if(r)for(var n=0;n<r.length;n++)t.push({name:n,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,pattern:null});return e}(e,t):Array.isArray(e)?function(e,t,r){for(var n=[],o=0;o<e.length;o++)n.push(h(e[o],t,r).source);return new RegExp("(?:"+n.join("|")+")",f(r))}(e,t,r):(n=t,c(l(e,o=r),n,o));var n,o}e.parse=t,e.compile=r,e.tokensToFunction=n,e.tokensToRegExp=o;var v=Object.prototype.hasOwnProperty,d=new Map;function g(e){try{return decodeURIComponent(e)}catch(t){return e}}function m(t,r,n,o){var a=!t.children,i=(t.path||"")+"|"+a,u=d.get(i);if(!u){var l=[];u={keys:l,pattern:e(t.path||"",l,{end:a})},d.set(i,u)}var s=u.pattern.exec(r);if(!s)return null;for(var p=s[0],f=Object.assign({},o),c=1;c<s.length;c+=1){var h=u.keys[c-1],m=h.name,y=s[c];void 0===y&&v.call(f,m)||(h.repeat?f[m]=y?y.split(h.delimiter).map(g):[]:f[m]=y?g(y):y)}return{path:a||"/"!==p.charAt(p.length-1)?p:p.substr(1),keys:n.concat(u.keys),params:f}}function y(e,t,r,n,o){var a=void 0,i=void 0,u=0;return{next:function(l){if(e===l)return{done:!0};if(!a&&(a=m(e,r,n,o)))return{done:!1,value:{route:e,baseUrl:t,path:a.path,keys:a.keys,params:a.params}};if(a&&e.children)for(;u<e.children.length;){if(!i){var s=e.children[u];s.parent=e,i=y(s,t+a.path,r.substr(a.path.length),a.keys,a.params)}var p=i.next(l);if(!p.done)return{done:!1,value:p.value};i=null,u+=1}return{done:!0}}}}function x(e,t){if("function"==typeof e.route.action)return e.route.action(e,t)}var b=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}();var w=function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),Object(t)!==t)throw new TypeError("Invalid routes");this.baseUrl=r.baseUrl||"",this.resolveRoute=r.resolveRoute||x,this.context=Object.assign({router:this},r.context),this.root=Array.isArray(t)?{path:"",children:t,parent:null}:t,this.root.parent=null}return b(e,[{key:"resolve",value:function(e){var t=Object.assign({},this.context,"string"==typeof e?{pathname:e}:e),r=y(this.root,this.baseUrl,t.pathname.substr(this.baseUrl.length),[],null),n=this.resolveRoute,o=null,a=null;function i(e){var u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:o.value.route,l=null===arguments[2]&&o.value.route;return o=a||r.next(l),a=null,e||!o.done&&function(e,t){for(var r=t;r;)if((r=r.parent)===e)return!0;return!1}(u,o.value.route)?o.done?Promise.reject(Object.assign(new Error("Page not found"),{context:t,status:404,statusCode:404})):Promise.resolve(n(Object.assign({},t,o.value),o.value.params)).then(function(t){return null!==t&&void 0!==t?t:i(e,u,t)}):(a=o,Promise.resolve(null))}return t.next=i,i(!0,this.root)}}]),e}();return w.pathToRegexp=e,w.matchPath=m,w.matchRoute=y,w.resolveRoute=x,w});
//# sourceMappingURL=universal-router.min.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"universal-router.min.js","sources":["../node_modules/path-to-regexp/index.js","src/matchPath.js","src/matchRoute.js","src/resolveRoute.js","src/UniversalRouter.js"],"sourcesContent":["/**\n * Expose `pathToRegexp`.\n */\nmodule.exports = pathToRegexp\nmodule.exports.parse = parse\nmodule.exports.compile = compile\nmodule.exports.tokensToFunction = tokensToFunction\nmodule.exports.tokensToRegExp = tokensToRegExp\n\n/**\n * Default configs.\n */\nvar DEFAULT_DELIMITER = '/'\nvar DEFAULT_DELIMITERS = './'\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n // Match escaped characters that would otherwise appear in future matches.\n // This allows the user to escape special characters that won't transform.\n '(\\\\\\\\.)',\n // Match Express-style parameters and un-named parameters with a prefix\n // and optional suffixes. Matches appear as:\n //\n // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\"]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined]\n '(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?'\n].join('|'), 'g')\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n var tokens = []\n var key = 0\n var index = 0\n var path = ''\n var defaultDelimiter = (options && options.delimiter) || DEFAULT_DELIMITER\n var delimiters = (options && options.delimiters) || DEFAULT_DELIMITERS\n var pathEscaped = false\n var res\n\n while ((res = PATH_REGEXP.exec(str)) !== null) {\n var m = res[0]\n var escaped = res[1]\n var offset = res.index\n path += str.slice(index, offset)\n index = offset + m.length\n\n // Ignore already escaped sequences.\n if (escaped) {\n path += escaped[1]\n pathEscaped = true\n continue\n }\n\n var prev = ''\n var next = str[index]\n var name = res[2]\n var capture = res[3]\n var group = res[4]\n var modifier = res[5]\n\n if (!pathEscaped && path.length) {\n var k = path.length - 1\n\n if (delimiters.indexOf(path[k]) > -1) {\n prev = path[k]\n path = path.slice(0, k)\n }\n }\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path)\n path = ''\n pathEscaped = false\n }\n\n var partial = prev !== '' && next !== undefined && next !== prev\n var repeat = modifier === '+' || modifier === '*'\n var optional = modifier === '?' || modifier === '*'\n var delimiter = prev || defaultDelimiter\n var pattern = capture || group\n\n tokens.push({\n name: name || key++,\n prefix: prev,\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n pattern: pattern ? escapeGroup(pattern) : '[^' + escapeString(delimiter) + ']+?'\n })\n }\n\n // Push any remaining characters.\n if (path || index < str.length) {\n tokens.push(path + str.substr(index))\n }\n\n return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n return tokensToFunction(parse(str, options))\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens) {\n // Compile all the tokens into regexps.\n var matches = new Array(tokens.length)\n\n // Compile all the patterns before compilation.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] === 'object') {\n matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$')\n }\n }\n\n return function (data, options) {\n var path = ''\n var encode = (options && options.encode) || encodeURIComponent\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i]\n\n if (typeof token === 'string') {\n path += token\n continue\n }\n\n var value = data ? data[token.name] : undefined\n var segment\n\n if (Array.isArray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but got array')\n }\n\n if (value.length === 0) {\n if (token.optional) continue\n\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\n\n for (var j = 0; j < value.length; j++) {\n segment = encode(value[j])\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\"')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment\n }\n\n continue\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n segment = encode(String(value))\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but got \"' + segment + '\"')\n }\n\n path += token.prefix + segment\n continue\n }\n\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) path += token.prefix\n\n continue\n }\n\n throw new TypeError('Expected \"' + token.name + '\" to be ' + (token.repeat ? 'an array' : 'a string'))\n }\n\n return path\n }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n return str.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n return group.replace(/([=!:$/()])/g, '\\\\$1')\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param {Object} options\n * @return {string}\n */\nfunction flags (options) {\n return options && options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param {!RegExp} path\n * @param {Array=} keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n if (!keys) return path\n\n // Use a negative lookahead to match only capturing groups.\n var groups = path.source.match(/\\((?!\\?)/g)\n\n if (groups) {\n for (var i = 0; i < groups.length; i++) {\n keys.push({\n name: i,\n prefix: null,\n delimiter: null,\n optional: false,\n repeat: false,\n partial: false,\n pattern: null\n })\n }\n }\n\n return path\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param {!Array} path\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n var parts = []\n\n for (var i = 0; i < path.length; i++) {\n parts.push(pathToRegexp(path[i], keys, options).source)\n }\n\n return new RegExp('(?:' + parts.join('|') + ')', flags(options))\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param {string} path\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param {!Array} tokens\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n options = options || {}\n\n var strict = options.strict\n var end = options.end !== false\n var delimiter = escapeString(options.delimiter || DEFAULT_DELIMITER)\n var delimiters = options.delimiters || DEFAULT_DELIMITERS\n var endsWith = [].concat(options.endsWith || []).map(escapeString).concat('$').join('|')\n var route = ''\n var isEndDelimited = false\n\n // Iterate over the tokens and create our regexp string.\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i]\n\n if (typeof token === 'string') {\n route += escapeString(token)\n isEndDelimited = i === tokens.length - 1 && delimiters.indexOf(token[token.length - 1]) > -1\n } else {\n var prefix = escapeString(token.prefix)\n var capture = token.repeat\n ? '(?:' + token.pattern + ')(?:' + prefix + '(?:' + token.pattern + '))*'\n : token.pattern\n\n if (keys) keys.push(token)\n\n if (token.optional) {\n if (token.partial) {\n route += prefix + '(' + capture + ')?'\n } else {\n route += '(?:' + prefix + '(' + capture + '))?'\n }\n } else {\n route += prefix + '(' + capture + ')'\n }\n }\n }\n\n if (end) {\n if (!strict) route += '(?:' + delimiter + ')?'\n\n route += endsWith === '$' ? '$' : '(?=' + endsWith + ')'\n } else {\n if (!strict) route += '(?:' + delimiter + '(?=' + endsWith + '))?'\n if (!isEndDelimited) route += '(?=' + delimiter + '|' + endsWith + ')'\n }\n\n return new RegExp('^' + route, flags(options))\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param {(string|RegExp|Array)} path\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (path instanceof RegExp) {\n return regexpToRegexp(path, keys)\n }\n\n if (Array.isArray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), keys, options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), keys, options)\n}\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport pathToRegexp from 'path-to-regexp';\n\nconst { hasOwnProperty } = Object.prototype;\nconst cache = new Map();\n\nfunction decodeParam(val) {\n try {\n return decodeURIComponent(val);\n } catch (err) {\n return val;\n }\n}\n\nfunction matchPath(route, pathname, parentKeys, parentParams) {\n const end = !route.children;\n const cacheKey = `${route.path || ''}|${end}`;\n let regexp = cache.get(cacheKey);\n\n if (!regexp) {\n const keys = [];\n regexp = {\n keys,\n pattern: pathToRegexp(route.path || '', keys, { end }),\n };\n cache.set(cacheKey, regexp);\n }\n\n const m = regexp.pattern.exec(pathname);\n if (!m) {\n return null;\n }\n\n const path = m[0];\n const params = Object.assign({}, parentParams);\n\n for (let i = 1; i < m.length; i += 1) {\n const key = regexp.keys[i - 1];\n const prop = key.name;\n const value = m[i];\n if (value !== undefined || !hasOwnProperty.call(params, prop)) {\n if (key.repeat) {\n params[prop] = value ? value.split(key.delimiter).map(decodeParam) : [];\n } else {\n params[prop] = value ? decodeParam(value) : value;\n }\n }\n }\n\n return {\n path: !end && path.charAt(path.length - 1) === '/' ? path.substr(1) : path,\n keys: parentKeys.concat(regexp.keys),\n params,\n };\n}\n\nexport default matchPath;\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport matchPath from './matchPath';\n\nfunction matchRoute(route, baseUrl, pathname, parentKeys, parentParams) {\n let match;\n let childMatches;\n let childIndex = 0;\n\n return {\n next(routeToSkip) {\n if (route === routeToSkip) {\n return { done: true };\n }\n\n if (!match) {\n match = matchPath(route, pathname, parentKeys, parentParams);\n\n if (match) {\n return {\n done: false,\n value: {\n route,\n baseUrl,\n path: match.path,\n keys: match.keys,\n params: match.params,\n },\n };\n }\n }\n\n if (match && route.children) {\n while (childIndex < route.children.length) {\n if (!childMatches) {\n const childRoute = route.children[childIndex];\n childRoute.parent = route;\n\n childMatches = matchRoute(\n childRoute,\n baseUrl + match.path,\n pathname.substr(match.path.length),\n match.keys,\n match.params,\n );\n }\n\n const childMatch = childMatches.next(routeToSkip);\n if (!childMatch.done) {\n return {\n done: false,\n value: childMatch.value,\n };\n }\n\n childMatches = null;\n childIndex += 1;\n }\n }\n\n return { done: true };\n },\n };\n}\n\nexport default matchRoute;\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nfunction resolveRoute(context, params) {\n if (typeof context.route.action === 'function') {\n return context.route.action(context, params);\n }\n\n return undefined;\n}\n\nexport default resolveRoute;\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport pathToRegexp from 'path-to-regexp';\nimport matchPath from './matchPath';\nimport matchRoute from './matchRoute';\nimport resolveRoute from './resolveRoute';\n\nfunction isChildRoute(parentRoute, childRoute) {\n let route = childRoute;\n while (route) {\n route = route.parent;\n if (route === parentRoute) {\n return true;\n }\n }\n return false;\n}\n\nclass UniversalRouter {\n constructor(routes, options = {}) {\n if (Object(routes) !== routes) {\n throw new TypeError('Invalid routes');\n }\n\n this.baseUrl = options.baseUrl || '';\n this.resolveRoute = options.resolveRoute || resolveRoute;\n this.context = Object.assign({ router: this }, options.context);\n this.root = Array.isArray(routes) ? { path: '', children: routes, parent: null } : routes;\n this.root.parent = null;\n }\n\n resolve(pathnameOrContext) {\n const context = Object.assign(\n {},\n this.context,\n typeof pathnameOrContext === 'string' ? { pathname: pathnameOrContext } : pathnameOrContext,\n );\n const match = matchRoute(\n this.root,\n this.baseUrl,\n context.pathname.substr(this.baseUrl.length),\n [],\n null,\n );\n const resolve = this.resolveRoute;\n let matches = null;\n let nextMatches = null;\n\n function next(resume, parent = matches.value.route, prevResult) {\n const routeToSkip = prevResult === null && matches.value.route;\n matches = nextMatches || match.next(routeToSkip);\n nextMatches = null;\n\n if (!resume) {\n if (matches.done || !isChildRoute(parent, matches.value.route)) {\n nextMatches = matches;\n return Promise.resolve(null);\n }\n }\n\n if (matches.done) {\n return Promise.reject(Object.assign(\n new Error('Page not found'),\n { context, status: 404, statusCode: 404 },\n ));\n }\n\n return Promise.resolve(resolve(\n Object.assign({}, context, matches.value),\n matches.value.params,\n )).then((result) => {\n if (result !== null && result !== undefined) {\n return result;\n }\n\n return next(resume, parent, result);\n });\n }\n\n context.next = next;\n\n return next(true, this.root);\n }\n}\n\nUniversalRouter.pathToRegexp = pathToRegexp;\nUniversalRouter.matchPath = matchPath;\nUniversalRouter.matchRoute = matchRoute;\nUniversalRouter.resolveRoute = resolveRoute;\n\nexport default UniversalRouter;\n"],"names":["parse","str","options","res","tokens","key","index","path","defaultDelimiter","delimiter","DEFAULT_DELIMITER","delimiters","DEFAULT_DELIMITERS","pathEscaped","PATH_REGEXP","exec","m","escaped","offset","slice","length","prev","next","name","capture","group","modifier","k","indexOf","push","partial","undefined","repeat","optional","pattern","prefix","escapeGroup","escapeString","substr","tokensToFunction","matches","Array","i","RegExp","data","encode","encodeURIComponent","token","segment","value","isArray","TypeError","j","test","String","replace","flags","sensitive","regexpToRegexp","keys","groups","source","match","arrayToRegexp","parts","pathToRegexp","join","stringToRegexp","tokensToRegExp","strict","end","endsWith","concat","map","route","isEndDelimited","decodeParam","val","decodeURIComponent","err","matchPath","pathname","parentKeys","parentParams","children","cacheKey","regexp","cache","get","set","params","Object","assign","prop","hasOwnProperty","call","split","charAt","matchRoute","baseUrl","childMatches","childIndex","routeToSkip","done","childRoute","parent","childMatch","resolveRoute","context","action","isChildRoute","parentRoute","prototype","Map","UniversalRouter","routes","router","this","root","pathnameOrContext","resume","nextMatches","Promise","reject","Error","status","statusCode","resolve","then","result"],"mappings":"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"}
{"version":3,"file":"universal-router.min.js","sources":["../node_modules/path-to-regexp/index.js","src/matchPath.js","src/matchRoute.js","src/resolveRoute.js","src/UniversalRouter.js"],"sourcesContent":["/**\n * Expose `pathToRegexp`.\n */\nmodule.exports = pathToRegexp\nmodule.exports.parse = parse\nmodule.exports.compile = compile\nmodule.exports.tokensToFunction = tokensToFunction\nmodule.exports.tokensToRegExp = tokensToRegExp\n\n/**\n * Default configs.\n */\nvar DEFAULT_DELIMITER = '/'\nvar DEFAULT_DELIMITERS = './'\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n // Match escaped characters that would otherwise appear in future matches.\n // This allows the user to escape special characters that won't transform.\n '(\\\\\\\\.)',\n // Match Express-style parameters and un-named parameters with a prefix\n // and optional suffixes. Matches appear as:\n //\n // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\"]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined]\n '(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?'\n].join('|'), 'g')\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n var tokens = []\n var key = 0\n var index = 0\n var path = ''\n var defaultDelimiter = (options && options.delimiter) || DEFAULT_DELIMITER\n var delimiters = (options && options.delimiters) || DEFAULT_DELIMITERS\n var pathEscaped = false\n var res\n\n while ((res = PATH_REGEXP.exec(str)) !== null) {\n var m = res[0]\n var escaped = res[1]\n var offset = res.index\n path += str.slice(index, offset)\n index = offset + m.length\n\n // Ignore already escaped sequences.\n if (escaped) {\n path += escaped[1]\n pathEscaped = true\n continue\n }\n\n var prev = ''\n var next = str[index]\n var name = res[2]\n var capture = res[3]\n var group = res[4]\n var modifier = res[5]\n\n if (!pathEscaped && path.length) {\n var k = path.length - 1\n\n if (delimiters.indexOf(path[k]) > -1) {\n prev = path[k]\n path = path.slice(0, k)\n }\n }\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path)\n path = ''\n pathEscaped = false\n }\n\n var partial = prev !== '' && next !== undefined && next !== prev\n var repeat = modifier === '+' || modifier === '*'\n var optional = modifier === '?' || modifier === '*'\n var delimiter = prev || defaultDelimiter\n var pattern = capture || group\n\n tokens.push({\n name: name || key++,\n prefix: prev,\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n pattern: pattern ? escapeGroup(pattern) : '[^' + escapeString(delimiter) + ']+?'\n })\n }\n\n // Push any remaining characters.\n if (path || index < str.length) {\n tokens.push(path + str.substr(index))\n }\n\n return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n return tokensToFunction(parse(str, options))\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens) {\n // Compile all the tokens into regexps.\n var matches = new Array(tokens.length)\n\n // Compile all the patterns before compilation.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] === 'object') {\n matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$')\n }\n }\n\n return function (data, options) {\n var path = ''\n var encode = (options && options.encode) || encodeURIComponent\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i]\n\n if (typeof token === 'string') {\n path += token\n continue\n }\n\n var value = data ? data[token.name] : undefined\n var segment\n\n if (Array.isArray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but got array')\n }\n\n if (value.length === 0) {\n if (token.optional) continue\n\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\n\n for (var j = 0; j < value.length; j++) {\n segment = encode(value[j])\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\"')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment\n }\n\n continue\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n segment = encode(String(value))\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but got \"' + segment + '\"')\n }\n\n path += token.prefix + segment\n continue\n }\n\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) path += token.prefix\n\n continue\n }\n\n throw new TypeError('Expected \"' + token.name + '\" to be ' + (token.repeat ? 'an array' : 'a string'))\n }\n\n return path\n }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n return str.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n return group.replace(/([=!:$/()])/g, '\\\\$1')\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param {Object} options\n * @return {string}\n */\nfunction flags (options) {\n return options && options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param {!RegExp} path\n * @param {Array=} keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n if (!keys) return path\n\n // Use a negative lookahead to match only capturing groups.\n var groups = path.source.match(/\\((?!\\?)/g)\n\n if (groups) {\n for (var i = 0; i < groups.length; i++) {\n keys.push({\n name: i,\n prefix: null,\n delimiter: null,\n optional: false,\n repeat: false,\n partial: false,\n pattern: null\n })\n }\n }\n\n return path\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param {!Array} path\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n var parts = []\n\n for (var i = 0; i < path.length; i++) {\n parts.push(pathToRegexp(path[i], keys, options).source)\n }\n\n return new RegExp('(?:' + parts.join('|') + ')', flags(options))\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param {string} path\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param {!Array} tokens\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n options = options || {}\n\n var strict = options.strict\n var end = options.end !== false\n var delimiter = escapeString(options.delimiter || DEFAULT_DELIMITER)\n var delimiters = options.delimiters || DEFAULT_DELIMITERS\n var endsWith = [].concat(options.endsWith || []).map(escapeString).concat('$').join('|')\n var route = ''\n var isEndDelimited = false\n\n // Iterate over the tokens and create our regexp string.\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i]\n\n if (typeof token === 'string') {\n route += escapeString(token)\n isEndDelimited = i === tokens.length - 1 && delimiters.indexOf(token[token.length - 1]) > -1\n } else {\n var prefix = escapeString(token.prefix)\n var capture = token.repeat\n ? '(?:' + token.pattern + ')(?:' + prefix + '(?:' + token.pattern + '))*'\n : token.pattern\n\n if (keys) keys.push(token)\n\n if (token.optional) {\n if (token.partial) {\n route += prefix + '(' + capture + ')?'\n } else {\n route += '(?:' + prefix + '(' + capture + '))?'\n }\n } else {\n route += prefix + '(' + capture + ')'\n }\n }\n }\n\n if (end) {\n if (!strict) route += '(?:' + delimiter + ')?'\n\n route += endsWith === '$' ? '$' : '(?=' + endsWith + ')'\n } else {\n if (!strict) route += '(?:' + delimiter + '(?=' + endsWith + '))?'\n if (!isEndDelimited) route += '(?=' + delimiter + '|' + endsWith + ')'\n }\n\n return new RegExp('^' + route, flags(options))\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param {(string|RegExp|Array)} path\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (path instanceof RegExp) {\n return regexpToRegexp(path, keys)\n }\n\n if (Array.isArray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), keys, options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), keys, options)\n}\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport pathToRegexp from 'path-to-regexp';\n\nconst { hasOwnProperty } = Object.prototype;\nconst cache = new Map();\n\nfunction decodeParam(val) {\n try {\n return decodeURIComponent(val);\n } catch (err) {\n return val;\n }\n}\n\nfunction matchPath(route, pathname, parentKeys, parentParams) {\n const end = !route.children;\n const cacheKey = `${route.path || ''}|${end}`;\n let regexp = cache.get(cacheKey);\n\n if (!regexp) {\n const keys = [];\n regexp = {\n keys,\n pattern: pathToRegexp(route.path || '', keys, { end }),\n };\n cache.set(cacheKey, regexp);\n }\n\n const m = regexp.pattern.exec(pathname);\n if (!m) {\n return null;\n }\n\n const path = m[0];\n const params = Object.assign({}, parentParams);\n\n for (let i = 1; i < m.length; i += 1) {\n const key = regexp.keys[i - 1];\n const prop = key.name;\n const value = m[i];\n if (value !== undefined || !hasOwnProperty.call(params, prop)) {\n if (key.repeat) {\n params[prop] = value ? value.split(key.delimiter).map(decodeParam) : [];\n } else {\n params[prop] = value ? decodeParam(value) : value;\n }\n }\n }\n\n return {\n path: !end && path.charAt(path.length - 1) === '/' ? path.substr(1) : path,\n keys: parentKeys.concat(regexp.keys),\n params,\n };\n}\n\nexport default matchPath;\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport matchPath from './matchPath';\n\nfunction matchRoute(route, baseUrl, pathname, parentKeys, parentParams) {\n let match;\n let childMatches;\n let childIndex = 0;\n\n return {\n next(routeToSkip) {\n if (route === routeToSkip) {\n return { done: true };\n }\n\n if (!match) {\n match = matchPath(route, pathname, parentKeys, parentParams);\n\n if (match) {\n return {\n done: false,\n value: {\n route,\n baseUrl,\n path: match.path,\n keys: match.keys,\n params: match.params,\n },\n };\n }\n }\n\n if (match && route.children) {\n while (childIndex < route.children.length) {\n if (!childMatches) {\n const childRoute = route.children[childIndex];\n childRoute.parent = route;\n\n childMatches = matchRoute(\n childRoute,\n baseUrl + match.path,\n pathname.substr(match.path.length),\n match.keys,\n match.params,\n );\n }\n\n const childMatch = childMatches.next(routeToSkip);\n if (!childMatch.done) {\n return {\n done: false,\n value: childMatch.value,\n };\n }\n\n childMatches = null;\n childIndex += 1;\n }\n }\n\n return { done: true };\n },\n };\n}\n\nexport default matchRoute;\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nfunction resolveRoute(context, params) {\n if (typeof context.route.action === 'function') {\n return context.route.action(context, params);\n }\n\n return undefined;\n}\n\nexport default resolveRoute;\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright © 2015-present Kriasoft, LLC. All rights reserved.\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport pathToRegexp from 'path-to-regexp';\nimport matchPath from './matchPath';\nimport matchRoute from './matchRoute';\nimport resolveRoute from './resolveRoute';\n\nfunction isChildRoute(parentRoute, childRoute) {\n let route = childRoute;\n while (route) {\n route = route.parent;\n if (route === parentRoute) {\n return true;\n }\n }\n return false;\n}\n\nclass UniversalRouter {\n constructor(routes, options = {}) {\n if (Object(routes) !== routes) {\n throw new TypeError('Invalid routes');\n }\n\n this.baseUrl = options.baseUrl || '';\n this.resolveRoute = options.resolveRoute || resolveRoute;\n this.context = Object.assign({ router: this }, options.context);\n this.root = Array.isArray(routes) ? { path: '', children: routes, parent: null } : routes;\n this.root.parent = null;\n }\n\n resolve(pathnameOrContext) {\n const context = Object.assign(\n {},\n this.context,\n typeof pathnameOrContext === 'string' ? { pathname: pathnameOrContext } : pathnameOrContext,\n );\n const match = matchRoute(\n this.root,\n this.baseUrl,\n context.pathname.substr(this.baseUrl.length),\n [],\n null,\n );\n const resolve = this.resolveRoute;\n let matches = null;\n let nextMatches = null;\n\n function next(resume, parent = matches.value.route, prevResult) {\n const routeToSkip = prevResult === null && matches.value.route;\n matches = nextMatches || match.next(routeToSkip);\n nextMatches = null;\n\n if (!resume) {\n if (matches.done || !isChildRoute(parent, matches.value.route)) {\n nextMatches = matches;\n return Promise.resolve(null);\n }\n }\n\n if (matches.done) {\n return Promise.reject(Object.assign(\n new Error('Page not found'),\n { context, status: 404, statusCode: 404 },\n ));\n }\n\n return Promise.resolve(resolve(\n Object.assign({}, context, matches.value),\n matches.value.params,\n )).then((result) => {\n if (result !== null && result !== undefined) {\n return result;\n }\n\n return next(resume, parent, result);\n });\n }\n\n context.next = next;\n\n return next(true, this.root);\n }\n}\n\nUniversalRouter.pathToRegexp = pathToRegexp;\nUniversalRouter.matchPath = matchPath;\nUniversalRouter.matchRoute = matchRoute;\nUniversalRouter.resolveRoute = resolveRoute;\n\nexport default UniversalRouter;\n"],"names":["pathToRegexp","parse","str","options","tokensToFunction","tokensToRegExp","DEFAULT_DELIMITER","DEFAULT_DELIMITERS","PATH_REGEXP","RegExp","join","res","group","tokens","key","index","path","defaultDelimiter","delimiter","delimiters","pathEscaped","exec","m","escaped","offset","slice","length","prev","next","name","capture","modifier","k","indexOf","push","partial","undefined","repeat","optional","pattern","prefix","replace","escapeString","substr","matches","Array","i","data","encode","encodeURIComponent","token","segment","value","isArray","TypeError","j","test","String","flags","sensitive","keys","strict","end","endsWith","concat","map","route","isEndDelimited","groups","source","match","regexpToRegexp","parts","arrayToRegexp","hasOwnProperty","Object","prototype","cache","Map","decodeParam","val","decodeURIComponent","err","matchPath","pathname","parentKeys","parentParams","children","cacheKey","regexp","get","set","params","assign","prop","call","split","charAt","matchRoute","baseUrl","childMatches","childIndex","routeToSkip","done","childRoute","parent","childMatch","resolveRoute","context","action","UniversalRouter","routes","router","this","root","pathnameOrContext","resolve","nextMatches","resume","parentRoute","isChildRoute","Promise","reject","Error","status","statusCode","then","result"],"mappings":"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"}