universal-router
Version:
Isomorphic router for JavaScript web applications
1 lines • 12.2 kB
Source Map (JSON)
{"version":3,"file":"browser.mjs","sources":["src/matchPath.js","src/matchRoute.js","src/resolveRoute.js","src/UniversalRouter.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\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":["hasOwnProperty","Object","prototype","cache","Map","decodeParam","val","decodeURIComponent","err","matchPath","route","pathname","parentKeys","parentParams","end","children","cacheKey","path","regexp","get","keys","pathToRegexp","set","m","pattern","exec","params","assign","i","length","key","prop","name","value","undefined","call","repeat","split","delimiter","map","charAt","substr","concat","matchRoute","baseUrl","match","childMatches","childIndex","routeToSkip","done","childRoute","parent","childMatch","next","resolveRoute","context","action","isChildRoute","parentRoute","UniversalRouter","routes","options","TypeError","router","root","Array","isArray","pathnameOrContext","resolve","matches","nextMatches","resume","prevResult","Promise","reject","Error","status","statusCode","then","result"],"mappings":"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"}