diff --git a/CHANGELOG.md b/CHANGELOG.md index 3607c70..cb9dde5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. ## [Unreleased][unreleased] +- Fix `context.next()` for multiple nested routes + ([#91](https://github.com/kriasoft/universal-router/pull/91)) - Add `pretty` option for `generateUrls(router, options)` to prettier encoding of URI path segments ([#88](https://github.com/kriasoft/universal-router/pull/88)) - Add source maps for minified builds ([#87](https://github.com/kriasoft/universal-router/pull/87)) diff --git a/dist/universal-router.js b/dist/universal-router.js index c37ab76..19c43d1 100644 --- a/dist/universal-router.js +++ b/dist/universal-router.js @@ -452,10 +452,6 @@ index.tokensToRegExp = tokensToRegExp_1; var cache = new Map(); function decodeParam(val) { - if (!val) { - return val; - } - try { return decodeURIComponent(val); } catch (err) { @@ -486,7 +482,7 @@ function matchPath(routePath, urlPath, end, parentParams) { } for (var i = 1; i < m.length; i += 1) { - params[regexp.keys[i - 1].name] = decodeParam(m[i]); + params[regexp.keys[i - 1].name] = m[i] && decodeParam(m[i]); } return { path: path === '' ? '/' : path, keys: regexp.keys.slice(), params: params }; @@ -583,6 +579,17 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons * LICENSE.txt file in the root directory of this source tree. */ +function isChildRoute(parentRoute, childRoute) { + var route = childRoute; + while (route) { + route = route.parent; + if (route === parentRoute) { + return true; + } + } + return false; +} + var Router = function () { function Router(routes) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; @@ -606,12 +613,21 @@ var Router = function () { var context = Object.assign({}, this.context, typeof pathOrContext === 'string' ? { path: pathOrContext } : pathOrContext); var match = matchRoute(this.root, this.baseUrl, context.path.substr(this.baseUrl.length)); var resolve = this.resolveRoute; - var matches = void 0; - var parent = void 0; + var matches = null; + var nextMatches = null; function next(resume) { - parent = matches ? matches.value.route.parent : null; - matches = match.next(); + var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : matches.value.route; + + matches = nextMatches || match.next(); + nextMatches = null; + + if (!resume) { + if (matches.done || !isChildRoute(parent, matches.value.route)) { + nextMatches = matches; + return Promise.resolve(null); + } + } if (matches.done) { return Promise.reject(Object.assign(new Error('Page not found'), { context: context, status: 404, statusCode: 404 })); @@ -622,18 +638,14 @@ var Router = function () { return result; } - if (resume || parent === matches.value.route.parent) { - return next(resume); - } - - return result; + return next(resume, parent); }); } context.url = context.path; context.next = next; - return next(true); + return next(true, this.root); } }]); diff --git a/dist/universal-router.js.map b/dist/universal-router.js.map index 6a53d50..0420f0d 100644 --- a/dist/universal-router.js.map +++ b/dist/universal-router.js.map @@ -1 +1 @@ -{"version":3,"file":"universal-router.js","sources":["../node_modules/path-to-regexp/node_modules/isarray/index.js","../node_modules/path-to-regexp/index.js","../src/matchPath.js","../src/matchRoute.js","../src/resolveRoute.js","../src/Router.js"],"sourcesContent":["module.exports = Array.isArray || function (arr) {\n return Object.prototype.toString.call(arr) == '[object Array]';\n};\n","var isarray = require('isarray')\n\n/**\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 * 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, \"?\", undefined]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n // \"/*\" => [\"/\", undefined, undefined, undefined, 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 || '/'\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 continue\n }\n\n var next = str[index]\n var prefix = res[2]\n var name = res[3]\n var capture = res[4]\n var group = res[5]\n var modifier = res[6]\n var asterisk = res[7]\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path)\n path = ''\n }\n\n var partial = prefix != null && next != null && next !== prefix\n var repeat = modifier === '+' || modifier === '*'\n var optional = modifier === '?' || modifier === '*'\n var delimiter = res[2] || defaultDelimiter\n var pattern = capture || group\n\n tokens.push({\n name: name || key++,\n prefix: prefix || '',\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n asterisk: !!asterisk,\n pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n })\n }\n\n // Match any characters still remaining.\n if (index < str.length) {\n path += str.substr(index)\n }\n\n // If the path exists, push it onto the end.\n if (path) {\n tokens.push(path)\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 * Prettier encoding of URI path segments.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n return encodeURI(str).replace(/[?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\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 (obj, opts) {\n var path = ''\n var data = obj || {}\n var options = opts || {}\n var encode = options.pretty ? encodeURIComponentPretty : 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\n continue\n }\n\n var value = data[token.name]\n var segment\n\n if (value == null) {\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) {\n path += token.prefix\n }\n\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to be defined')\n }\n }\n\n if (isarray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n }\n\n if (value.length === 0) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\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 + '\", but received `' + JSON.stringify(segment) + '`')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment\n }\n\n continue\n }\n\n segment = token.asterisk ? encodeAsterisk(value) : encode(value)\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += token.prefix + segment\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 * Attach the keys as a property of the regexp.\n *\n * @param {!RegExp} re\n * @param {Array} keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n re.keys = keys\n return re\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.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 // 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 asterisk: false,\n pattern: null\n })\n }\n }\n\n return attachKeys(path, keys)\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 var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))\n\n return attachKeys(regexp, keys)\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|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options)\n keys = []\n }\n\n options = options || {}\n\n var strict = options.strict\n var end = options.end !== false\n var route = ''\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 } else {\n var prefix = escapeString(token.prefix)\n var capture = '(?:' + token.pattern + ')'\n\n keys.push(token)\n\n if (token.repeat) {\n capture += '(?:' + prefix + capture + ')*'\n }\n\n if (token.optional) {\n if (!token.partial) {\n capture = '(?:' + prefix + '(' + capture + '))?'\n } else {\n capture = prefix + '(' + capture + ')?'\n }\n } else {\n capture = prefix + '(' + capture + ')'\n }\n\n route += capture\n }\n }\n\n var delimiter = escapeString(options.delimiter || '/')\n var endsWithDelimiter = route.slice(-delimiter.length) === delimiter\n\n // In non-strict mode we allow a slash at the end of match. If the path to\n // match already ends with a slash, we remove it for consistency. The slash\n // is valid at the end of a path match, not in the middle. This is important\n // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n if (!strict) {\n route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'\n }\n\n if (end) {\n route += '$'\n } else {\n // In non-ending mode, we need the capturing groups to match as much as\n // possible by using a positive lookahead to the end or next path segment.\n route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'\n }\n\n return attachKeys(new RegExp('^' + route, flags(options)), keys)\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|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options)\n keys = []\n }\n\n options = options || {}\n\n if (path instanceof RegExp) {\n return regexpToRegexp(path, /** @type {!Array} */ (keys))\n }\n\n if (isarray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (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 cache = new Map();\n\nfunction decodeParam(val) {\n if (!val) {\n return val;\n }\n\n try {\n return decodeURIComponent(val);\n } catch (err) {\n return val;\n }\n}\n\nfunction matchPath(routePath, urlPath, end, parentParams) {\n const key = `${routePath}|${end}`;\n let regexp = cache.get(key);\n\n if (!regexp) {\n const keys = [];\n regexp = { pattern: pathToRegexp(routePath, keys, { end }), keys };\n cache.set(key, regexp);\n }\n\n const m = regexp.pattern.exec(urlPath);\n if (!m) {\n return null;\n }\n\n const path = m[0];\n const params = Object.create(null);\n\n if (parentParams) {\n Object.assign(params, parentParams);\n }\n\n for (let i = 1; i < m.length; i += 1) {\n params[regexp.keys[i - 1].name] = decodeParam(m[i]);\n }\n\n return { path: path === '' ? '/' : path, keys: regexp.keys.slice(), params };\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, path, parentParams) {\n let match;\n let childMatches;\n let childIndex = 0;\n\n return {\n next() {\n if (!match) {\n match = matchPath(route.path, path, !route.children, 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 newPath = path.substr(match.path.length);\n const childRoute = route.children[childIndex];\n childRoute.parent = route;\n\n childMatches = matchRoute(\n childRoute,\n baseUrl + (match.path === '/' ? '' : match.path),\n newPath.charAt(0) === '/' ? newPath : `/${newPath}`,\n match.params,\n );\n }\n\n const childMatch = childMatches.next();\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 null;\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\nclass Router {\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(pathOrContext) {\n const context = Object.assign({}, this.context,\n typeof pathOrContext === 'string' ? { path: pathOrContext } : pathOrContext);\n const match = matchRoute(this.root, this.baseUrl, context.path.substr(this.baseUrl.length));\n const resolve = this.resolveRoute;\n let matches;\n let parent;\n\n function next(resume) {\n parent = matches ? matches.value.route.parent : null;\n matches = match.next();\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 if (resume || parent === matches.value.route.parent) {\n return next(resume);\n }\n\n return result;\n });\n }\n\n context.url = context.path;\n context.next = next;\n\n return next(true);\n }\n}\n\nRouter.pathToRegexp = pathToRegexp;\nRouter.matchPath = matchPath;\nRouter.matchRoute = matchRoute;\nRouter.resolveRoute = resolveRoute;\n\nexport default Router;\n"],"names":["isarray","cache","Map","decodeParam","val","decodeURIComponent","err","matchPath","routePath","urlPath","end","parentParams","key","regexp","get","keys","pattern","pathToRegexp","set","m","exec","path","params","Object","create","assign","i","length","name","slice","matchRoute","route","baseUrl","match","childMatches","childIndex","children","newPath","substr","childRoute","parent","charAt","childMatch","next","done","value","resolveRoute","context","action","Router","routes","options","TypeError","router","root","Array","isArray","pathOrContext","resolve","matches","resume","Promise","reject","Error","status","statusCode","then","result","undefined","url"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"universal-router.js","sources":["../node_modules/path-to-regexp/node_modules/isarray/index.js","../node_modules/path-to-regexp/index.js","../src/matchPath.js","../src/matchRoute.js","../src/resolveRoute.js","../src/Router.js"],"sourcesContent":["module.exports = Array.isArray || function (arr) {\n return Object.prototype.toString.call(arr) == '[object Array]';\n};\n","var isarray = require('isarray')\n\n/**\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 * 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, \"?\", undefined]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n // \"/*\" => [\"/\", undefined, undefined, undefined, 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 || '/'\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 continue\n }\n\n var next = str[index]\n var prefix = res[2]\n var name = res[3]\n var capture = res[4]\n var group = res[5]\n var modifier = res[6]\n var asterisk = res[7]\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path)\n path = ''\n }\n\n var partial = prefix != null && next != null && next !== prefix\n var repeat = modifier === '+' || modifier === '*'\n var optional = modifier === '?' || modifier === '*'\n var delimiter = res[2] || defaultDelimiter\n var pattern = capture || group\n\n tokens.push({\n name: name || key++,\n prefix: prefix || '',\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n asterisk: !!asterisk,\n pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n })\n }\n\n // Match any characters still remaining.\n if (index < str.length) {\n path += str.substr(index)\n }\n\n // If the path exists, push it onto the end.\n if (path) {\n tokens.push(path)\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 * Prettier encoding of URI path segments.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n return encodeURI(str).replace(/[?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\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 (obj, opts) {\n var path = ''\n var data = obj || {}\n var options = opts || {}\n var encode = options.pretty ? encodeURIComponentPretty : 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\n continue\n }\n\n var value = data[token.name]\n var segment\n\n if (value == null) {\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) {\n path += token.prefix\n }\n\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to be defined')\n }\n }\n\n if (isarray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n }\n\n if (value.length === 0) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\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 + '\", but received `' + JSON.stringify(segment) + '`')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment\n }\n\n continue\n }\n\n segment = token.asterisk ? encodeAsterisk(value) : encode(value)\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += token.prefix + segment\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 * Attach the keys as a property of the regexp.\n *\n * @param {!RegExp} re\n * @param {Array} keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n re.keys = keys\n return re\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.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 // 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 asterisk: false,\n pattern: null\n })\n }\n }\n\n return attachKeys(path, keys)\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 var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))\n\n return attachKeys(regexp, keys)\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|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options)\n keys = []\n }\n\n options = options || {}\n\n var strict = options.strict\n var end = options.end !== false\n var route = ''\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 } else {\n var prefix = escapeString(token.prefix)\n var capture = '(?:' + token.pattern + ')'\n\n keys.push(token)\n\n if (token.repeat) {\n capture += '(?:' + prefix + capture + ')*'\n }\n\n if (token.optional) {\n if (!token.partial) {\n capture = '(?:' + prefix + '(' + capture + '))?'\n } else {\n capture = prefix + '(' + capture + ')?'\n }\n } else {\n capture = prefix + '(' + capture + ')'\n }\n\n route += capture\n }\n }\n\n var delimiter = escapeString(options.delimiter || '/')\n var endsWithDelimiter = route.slice(-delimiter.length) === delimiter\n\n // In non-strict mode we allow a slash at the end of match. If the path to\n // match already ends with a slash, we remove it for consistency. The slash\n // is valid at the end of a path match, not in the middle. This is important\n // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n if (!strict) {\n route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'\n }\n\n if (end) {\n route += '$'\n } else {\n // In non-ending mode, we need the capturing groups to match as much as\n // possible by using a positive lookahead to the end or next path segment.\n route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'\n }\n\n return attachKeys(new RegExp('^' + route, flags(options)), keys)\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|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options)\n keys = []\n }\n\n options = options || {}\n\n if (path instanceof RegExp) {\n return regexpToRegexp(path, /** @type {!Array} */ (keys))\n }\n\n if (isarray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (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 cache = new Map();\n\nfunction decodeParam(val) {\n try {\n return decodeURIComponent(val);\n } catch (err) {\n return val;\n }\n}\n\nfunction matchPath(routePath, urlPath, end, parentParams) {\n const key = `${routePath}|${end}`;\n let regexp = cache.get(key);\n\n if (!regexp) {\n const keys = [];\n regexp = { pattern: pathToRegexp(routePath, keys, { end }), keys };\n cache.set(key, regexp);\n }\n\n const m = regexp.pattern.exec(urlPath);\n if (!m) {\n return null;\n }\n\n const path = m[0];\n const params = Object.create(null);\n\n if (parentParams) {\n Object.assign(params, parentParams);\n }\n\n for (let i = 1; i < m.length; i += 1) {\n params[regexp.keys[i - 1].name] = m[i] && decodeParam(m[i]);\n }\n\n return { path: path === '' ? '/' : path, keys: regexp.keys.slice(), params };\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, path, parentParams) {\n let match;\n let childMatches;\n let childIndex = 0;\n\n return {\n next() {\n if (!match) {\n match = matchPath(route.path, path, !route.children, 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 newPath = path.substr(match.path.length);\n const childRoute = route.children[childIndex];\n childRoute.parent = route;\n\n childMatches = matchRoute(\n childRoute,\n baseUrl + (match.path === '/' ? '' : match.path),\n newPath.charAt(0) === '/' ? newPath : `/${newPath}`,\n match.params,\n );\n }\n\n const childMatch = childMatches.next();\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 null;\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 Router {\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(pathOrContext) {\n const context = Object.assign({}, this.context,\n typeof pathOrContext === 'string' ? { path: pathOrContext } : pathOrContext);\n const match = matchRoute(this.root, this.baseUrl, context.path.substr(this.baseUrl.length));\n const resolve = this.resolveRoute;\n let matches = null;\n let nextMatches = null;\n\n function next(resume, parent = matches.value.route) {\n matches = nextMatches || match.next();\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);\n });\n }\n\n context.url = context.path;\n context.next = next;\n\n return next(true, this.root);\n }\n}\n\nRouter.pathToRegexp = pathToRegexp;\nRouter.matchPath = matchPath;\nRouter.matchRoute = matchRoute;\nRouter.resolveRoute = resolveRoute;\n\nexport default Router;\n"],"names":["isarray","cache","Map","decodeParam","val","decodeURIComponent","err","matchPath","routePath","urlPath","end","parentParams","key","regexp","get","keys","pattern","pathToRegexp","set","m","exec","path","params","Object","create","assign","i","length","name","slice","matchRoute","route","baseUrl","match","childMatches","childIndex","children","newPath","substr","childRoute","parent","charAt","childMatch","next","done","value","resolveRoute","context","action","isChildRoute","parentRoute","Router","routes","options","TypeError","router","root","Array","isArray","pathOrContext","resolve","matches","nextMatches","resume","Promise","reject","Error","status","statusCode","then","result","undefined","url"],"mappings":"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"} \ No newline at end of file diff --git a/dist/universal-router.min.js b/dist/universal-router.min.js index af2d954..e697635 100644 --- a/dist/universal-router.min.js +++ b/dist/universal-router.min.js @@ -1,3 +1,3 @@ /*! 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 r,n=[],o=0,u=0,l="",s=t&&t.delimiter||"/";null!=(r=k.exec(e));){var c=r[0],p=r[1],f=r.index;if(l+=e.slice(u,f),u=f+c.length,p)l+=p[1];else{var h=e[u],v=r[2],d=r[3],g=r[4],y=r[5],m=r[6],x=r[7];l&&(n.push(l),l="");var b=null!=v&&null!=h&&h!==v,w="+"===m||"*"===m,E="?"===m||"*"===m,R=r[2]||s,j=g||y;n.push({name:d||o++,prefix:v||"",delimiter:R,optional:E,repeat:w,partial:b,asterisk:!!x,pattern:j?a(j):x?".*":"[^"+i(R)+"]+?"})}}return u1&&void 0!==arguments[1]?arguments[1]:{};if(m(this,e),Object(t)!==t)throw new TypeError("Invalid routes");this.baseUrl=r.baseUrl||"",this.resolveRoute=r.resolveRoute||y,this.context=Object.assign({router:this},r.context),this.root=Array.isArray(t)?{path:"/",children:t,parent:null}:t,this.root.parent=null}return O(e,[{key:"resolve",value:function(e){function t(e){return a=i?i.value.route.parent:null,i=n.next(),i.done?Promise.reject(Object.assign(new Error("Page not found"),{context:r,status:404,statusCode:404})):Promise.resolve(o(Object.assign({},r,i.value),i.value.params)).then(function(r){return null!==r&&void 0!==r?r:e||a===i.value.route.parent?t(e):r})}var r=Object.assign({},this.context,"string"==typeof e?{path:e}:e),n=g(this.root,this.baseUrl,r.path.substr(this.baseUrl.length)),o=this.resolveRoute,i=void 0,a=void 0;return r.url=r.path,r.next=t,t(!0)}}]),e}();return T.pathToRegexp=b,T.matchPath=d,T.matchRoute=g,T.resolveRoute=y,T}); +!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 r,n=[],o=0,u=0,l="",s=t&&t.delimiter||"/";null!=(r=U.exec(e));){var c=r[0],p=r[1],f=r.index;if(l+=e.slice(u,f),u=f+c.length,p)l+=p[1];else{var h=e[u],v=r[2],d=r[3],g=r[4],y=r[5],m=r[6],x=r[7];l&&(n.push(l),l="");var b=null!=v&&null!=h&&h!==v,w="+"===m||"*"===m,E="?"===m||"*"===m,R=r[2]||s,j=g||y;n.push({name:d||o++,prefix:v||"",delimiter:R,optional:E,repeat:w,partial:b,asterisk:!!x,pattern:j?a(j):x?".*":"[^"+i(R)+"]+?"})}}return u1&&void 0!==arguments[1]?arguments[1]:{};if(m(this,e),Object(t)!==t)throw new TypeError("Invalid routes");this.baseUrl=r.baseUrl||"",this.resolveRoute=r.resolveRoute||y,this.context=Object.assign({router:this},r.context),this.root=Array.isArray(t)?{path:"/",children:t,parent:null}:t,this.root.parent=null}return T(e,[{key:"resolve",value:function(e){function t(e){var u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i.value.route;return i=a||n.next(),a=null,e||!i.done&&x(u,i.value.route)?i.done?Promise.reject(Object.assign(new Error("Page not found"),{context:r,status:404,statusCode:404})):Promise.resolve(o(Object.assign({},r,i.value),i.value.params)).then(function(r){return null!==r&&void 0!==r?r:t(e,u)}):(a=i,Promise.resolve(null))}var r=Object.assign({},this.context,"string"==typeof e?{path:e}:e),n=g(this.root,this.baseUrl,r.path.substr(this.baseUrl.length)),o=this.resolveRoute,i=null,a=null;return r.url=r.path,r.next=t,t(!0,this.root)}}]),e}();return A.pathToRegexp=w,A.matchPath=d,A.matchRoute=g,A.resolveRoute=y,A}); //# sourceMappingURL=universal-router.min.js.map diff --git a/dist/universal-router.min.js.map b/dist/universal-router.min.js.map index baeb150..043a273 100644 --- a/dist/universal-router.min.js.map +++ b/dist/universal-router.min.js.map @@ -1 +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","../node_modules/path-to-regexp/node_modules/isarray/index.js","../src/Router.js"],"sourcesContent":["var isarray = require('isarray')\n\n/**\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 * 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, \"?\", undefined]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n // \"/*\" => [\"/\", undefined, undefined, undefined, 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 || '/'\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 continue\n }\n\n var next = str[index]\n var prefix = res[2]\n var name = res[3]\n var capture = res[4]\n var group = res[5]\n var modifier = res[6]\n var asterisk = res[7]\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path)\n path = ''\n }\n\n var partial = prefix != null && next != null && next !== prefix\n var repeat = modifier === '+' || modifier === '*'\n var optional = modifier === '?' || modifier === '*'\n var delimiter = res[2] || defaultDelimiter\n var pattern = capture || group\n\n tokens.push({\n name: name || key++,\n prefix: prefix || '',\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n asterisk: !!asterisk,\n pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n })\n }\n\n // Match any characters still remaining.\n if (index < str.length) {\n path += str.substr(index)\n }\n\n // If the path exists, push it onto the end.\n if (path) {\n tokens.push(path)\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 * Prettier encoding of URI path segments.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n return encodeURI(str).replace(/[?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\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 (obj, opts) {\n var path = ''\n var data = obj || {}\n var options = opts || {}\n var encode = options.pretty ? encodeURIComponentPretty : 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\n continue\n }\n\n var value = data[token.name]\n var segment\n\n if (value == null) {\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) {\n path += token.prefix\n }\n\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to be defined')\n }\n }\n\n if (isarray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n }\n\n if (value.length === 0) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\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 + '\", but received `' + JSON.stringify(segment) + '`')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment\n }\n\n continue\n }\n\n segment = token.asterisk ? encodeAsterisk(value) : encode(value)\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += token.prefix + segment\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 * Attach the keys as a property of the regexp.\n *\n * @param {!RegExp} re\n * @param {Array} keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n re.keys = keys\n return re\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.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 // 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 asterisk: false,\n pattern: null\n })\n }\n }\n\n return attachKeys(path, keys)\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 var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))\n\n return attachKeys(regexp, keys)\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|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options)\n keys = []\n }\n\n options = options || {}\n\n var strict = options.strict\n var end = options.end !== false\n var route = ''\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 } else {\n var prefix = escapeString(token.prefix)\n var capture = '(?:' + token.pattern + ')'\n\n keys.push(token)\n\n if (token.repeat) {\n capture += '(?:' + prefix + capture + ')*'\n }\n\n if (token.optional) {\n if (!token.partial) {\n capture = '(?:' + prefix + '(' + capture + '))?'\n } else {\n capture = prefix + '(' + capture + ')?'\n }\n } else {\n capture = prefix + '(' + capture + ')'\n }\n\n route += capture\n }\n }\n\n var delimiter = escapeString(options.delimiter || '/')\n var endsWithDelimiter = route.slice(-delimiter.length) === delimiter\n\n // In non-strict mode we allow a slash at the end of match. If the path to\n // match already ends with a slash, we remove it for consistency. The slash\n // is valid at the end of a path match, not in the middle. This is important\n // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n if (!strict) {\n route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'\n }\n\n if (end) {\n route += '$'\n } else {\n // In non-ending mode, we need the capturing groups to match as much as\n // possible by using a positive lookahead to the end or next path segment.\n route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'\n }\n\n return attachKeys(new RegExp('^' + route, flags(options)), keys)\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|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options)\n keys = []\n }\n\n options = options || {}\n\n if (path instanceof RegExp) {\n return regexpToRegexp(path, /** @type {!Array} */ (keys))\n }\n\n if (isarray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (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 cache = new Map();\n\nfunction decodeParam(val) {\n if (!val) {\n return val;\n }\n\n try {\n return decodeURIComponent(val);\n } catch (err) {\n return val;\n }\n}\n\nfunction matchPath(routePath, urlPath, end, parentParams) {\n const key = `${routePath}|${end}`;\n let regexp = cache.get(key);\n\n if (!regexp) {\n const keys = [];\n regexp = { pattern: pathToRegexp(routePath, keys, { end }), keys };\n cache.set(key, regexp);\n }\n\n const m = regexp.pattern.exec(urlPath);\n if (!m) {\n return null;\n }\n\n const path = m[0];\n const params = Object.create(null);\n\n if (parentParams) {\n Object.assign(params, parentParams);\n }\n\n for (let i = 1; i < m.length; i += 1) {\n params[regexp.keys[i - 1].name] = decodeParam(m[i]);\n }\n\n return { path: path === '' ? '/' : path, keys: regexp.keys.slice(), params };\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, path, parentParams) {\n let match;\n let childMatches;\n let childIndex = 0;\n\n return {\n next() {\n if (!match) {\n match = matchPath(route.path, path, !route.children, 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 newPath = path.substr(match.path.length);\n const childRoute = route.children[childIndex];\n childRoute.parent = route;\n\n childMatches = matchRoute(\n childRoute,\n baseUrl + (match.path === '/' ? '' : match.path),\n newPath.charAt(0) === '/' ? newPath : `/${newPath}`,\n match.params,\n );\n }\n\n const childMatch = childMatches.next();\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 null;\n}\n\nexport default resolveRoute;\n","module.exports = Array.isArray || function (arr) {\n return Object.prototype.toString.call(arr) == '[object Array]';\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';\nimport matchPath from './matchPath';\nimport matchRoute from './matchRoute';\nimport resolveRoute from './resolveRoute';\n\nclass Router {\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(pathOrContext) {\n const context = Object.assign({}, this.context,\n typeof pathOrContext === 'string' ? { path: pathOrContext } : pathOrContext);\n const match = matchRoute(this.root, this.baseUrl, context.path.substr(this.baseUrl.length));\n const resolve = this.resolveRoute;\n let matches;\n let parent;\n\n function next(resume) {\n parent = matches ? matches.value.route.parent : null;\n matches = match.next();\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 if (resume || parent === matches.value.route.parent) {\n return next(resume);\n }\n\n return result;\n });\n }\n\n context.url = context.path;\n context.next = next;\n\n return next(true);\n }\n}\n\nRouter.pathToRegexp = pathToRegexp;\nRouter.matchPath = matchPath;\nRouter.matchRoute = matchRoute;\nRouter.resolveRoute = resolveRoute;\n\nexport default Router;\n"],"names":["parse","str","options","res","tokens","key","index","path","defaultDelimiter","delimiter","PATH_REGEXP","exec","m","escaped","offset","slice","length","next","prefix","name","capture","group","modifier","asterisk","push","partial","repeat","optional","pattern","escapeGroup","escapeString","substr","compile","tokensToFunction","encodeURIComponentPretty","encodeURI","replace","c","charCodeAt","toString","toUpperCase","encodeAsterisk","matches","Array","i","RegExp","obj","opts","data","encode","pretty","encodeURIComponent","token","segment","value","TypeError","isarray","JSON","stringify","j","test","attachKeys","re","keys","flags","sensitive","regexpToRegexp","groups","source","match","arrayToRegexp","parts","pathToRegexp","join","stringToRegexp","tokensToRegExp","strict","end","route","endsWithDelimiter","decodeParam","val","decodeURIComponent","err","matchPath","routePath","urlPath","parentParams","regexp","cache","get","set","params","Object","create","assign","matchRoute","baseUrl","childMatches","childIndex","children","newPath","childRoute","parent","charAt","childMatch","done","resolveRoute","context","action","isArray","arr","prototype","call","Map","Router","routes","router","this","root","pathOrContext","resume","Promise","reject","Error","status","statusCode","resolve","then","result","undefined","url"],"mappings":"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"} \ No newline at end of file +{"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/Router.js","../node_modules/path-to-regexp/node_modules/isarray/index.js"],"sourcesContent":["var isarray = require('isarray')\n\n/**\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 * 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, \"?\", undefined]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n // \"/*\" => [\"/\", undefined, undefined, undefined, 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 || '/'\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 continue\n }\n\n var next = str[index]\n var prefix = res[2]\n var name = res[3]\n var capture = res[4]\n var group = res[5]\n var modifier = res[6]\n var asterisk = res[7]\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path)\n path = ''\n }\n\n var partial = prefix != null && next != null && next !== prefix\n var repeat = modifier === '+' || modifier === '*'\n var optional = modifier === '?' || modifier === '*'\n var delimiter = res[2] || defaultDelimiter\n var pattern = capture || group\n\n tokens.push({\n name: name || key++,\n prefix: prefix || '',\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n asterisk: !!asterisk,\n pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n })\n }\n\n // Match any characters still remaining.\n if (index < str.length) {\n path += str.substr(index)\n }\n\n // If the path exists, push it onto the end.\n if (path) {\n tokens.push(path)\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 * Prettier encoding of URI path segments.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n return encodeURI(str).replace(/[?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\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 (obj, opts) {\n var path = ''\n var data = obj || {}\n var options = opts || {}\n var encode = options.pretty ? encodeURIComponentPretty : 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\n continue\n }\n\n var value = data[token.name]\n var segment\n\n if (value == null) {\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) {\n path += token.prefix\n }\n\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to be defined')\n }\n }\n\n if (isarray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n }\n\n if (value.length === 0) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\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 + '\", but received `' + JSON.stringify(segment) + '`')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment\n }\n\n continue\n }\n\n segment = token.asterisk ? encodeAsterisk(value) : encode(value)\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += token.prefix + segment\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 * Attach the keys as a property of the regexp.\n *\n * @param {!RegExp} re\n * @param {Array} keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n re.keys = keys\n return re\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.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 // 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 asterisk: false,\n pattern: null\n })\n }\n }\n\n return attachKeys(path, keys)\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 var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))\n\n return attachKeys(regexp, keys)\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|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options)\n keys = []\n }\n\n options = options || {}\n\n var strict = options.strict\n var end = options.end !== false\n var route = ''\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 } else {\n var prefix = escapeString(token.prefix)\n var capture = '(?:' + token.pattern + ')'\n\n keys.push(token)\n\n if (token.repeat) {\n capture += '(?:' + prefix + capture + ')*'\n }\n\n if (token.optional) {\n if (!token.partial) {\n capture = '(?:' + prefix + '(' + capture + '))?'\n } else {\n capture = prefix + '(' + capture + ')?'\n }\n } else {\n capture = prefix + '(' + capture + ')'\n }\n\n route += capture\n }\n }\n\n var delimiter = escapeString(options.delimiter || '/')\n var endsWithDelimiter = route.slice(-delimiter.length) === delimiter\n\n // In non-strict mode we allow a slash at the end of match. If the path to\n // match already ends with a slash, we remove it for consistency. The slash\n // is valid at the end of a path match, not in the middle. This is important\n // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n if (!strict) {\n route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'\n }\n\n if (end) {\n route += '$'\n } else {\n // In non-ending mode, we need the capturing groups to match as much as\n // possible by using a positive lookahead to the end or next path segment.\n route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'\n }\n\n return attachKeys(new RegExp('^' + route, flags(options)), keys)\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|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options)\n keys = []\n }\n\n options = options || {}\n\n if (path instanceof RegExp) {\n return regexpToRegexp(path, /** @type {!Array} */ (keys))\n }\n\n if (isarray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (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 cache = new Map();\n\nfunction decodeParam(val) {\n try {\n return decodeURIComponent(val);\n } catch (err) {\n return val;\n }\n}\n\nfunction matchPath(routePath, urlPath, end, parentParams) {\n const key = `${routePath}|${end}`;\n let regexp = cache.get(key);\n\n if (!regexp) {\n const keys = [];\n regexp = { pattern: pathToRegexp(routePath, keys, { end }), keys };\n cache.set(key, regexp);\n }\n\n const m = regexp.pattern.exec(urlPath);\n if (!m) {\n return null;\n }\n\n const path = m[0];\n const params = Object.create(null);\n\n if (parentParams) {\n Object.assign(params, parentParams);\n }\n\n for (let i = 1; i < m.length; i += 1) {\n params[regexp.keys[i - 1].name] = m[i] && decodeParam(m[i]);\n }\n\n return { path: path === '' ? '/' : path, keys: regexp.keys.slice(), params };\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, path, parentParams) {\n let match;\n let childMatches;\n let childIndex = 0;\n\n return {\n next() {\n if (!match) {\n match = matchPath(route.path, path, !route.children, 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 newPath = path.substr(match.path.length);\n const childRoute = route.children[childIndex];\n childRoute.parent = route;\n\n childMatches = matchRoute(\n childRoute,\n baseUrl + (match.path === '/' ? '' : match.path),\n newPath.charAt(0) === '/' ? newPath : `/${newPath}`,\n match.params,\n );\n }\n\n const childMatch = childMatches.next();\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 null;\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 Router {\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(pathOrContext) {\n const context = Object.assign({}, this.context,\n typeof pathOrContext === 'string' ? { path: pathOrContext } : pathOrContext);\n const match = matchRoute(this.root, this.baseUrl, context.path.substr(this.baseUrl.length));\n const resolve = this.resolveRoute;\n let matches = null;\n let nextMatches = null;\n\n function next(resume, parent = matches.value.route) {\n matches = nextMatches || match.next();\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);\n });\n }\n\n context.url = context.path;\n context.next = next;\n\n return next(true, this.root);\n }\n}\n\nRouter.pathToRegexp = pathToRegexp;\nRouter.matchPath = matchPath;\nRouter.matchRoute = matchRoute;\nRouter.resolveRoute = resolveRoute;\n\nexport default Router;\n","module.exports = Array.isArray || function (arr) {\n return Object.prototype.toString.call(arr) == '[object Array]';\n};\n"],"names":["parse","str","options","res","tokens","key","index","path","defaultDelimiter","delimiter","PATH_REGEXP","exec","m","escaped","offset","slice","length","next","prefix","name","capture","group","modifier","asterisk","push","partial","repeat","optional","pattern","escapeGroup","escapeString","substr","compile","tokensToFunction","encodeURIComponentPretty","encodeURI","replace","c","charCodeAt","toString","toUpperCase","encodeAsterisk","matches","Array","i","RegExp","obj","opts","data","encode","pretty","encodeURIComponent","token","segment","value","TypeError","isarray","JSON","stringify","j","test","attachKeys","re","keys","flags","sensitive","regexpToRegexp","groups","source","match","arrayToRegexp","parts","pathToRegexp","join","stringToRegexp","tokensToRegExp","strict","end","route","endsWithDelimiter","decodeParam","val","decodeURIComponent","err","matchPath","routePath","urlPath","parentParams","regexp","cache","get","set","params","Object","create","assign","matchRoute","baseUrl","childMatches","childIndex","children","newPath","childRoute","parent","charAt","childMatch","done","resolveRoute","context","action","isChildRoute","parentRoute","isArray","arr","prototype","call","Map","Router","routes","router","this","root","pathOrContext","resume","nextMatches","Promise","reject","Error","status","statusCode","resolve","then","result","undefined","url"],"mappings":"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"} \ No newline at end of file diff --git a/src/Router.js b/src/Router.js index 9c0774c..3aa1254 100644 --- a/src/Router.js +++ b/src/Router.js @@ -12,6 +12,17 @@ import matchPath from './matchPath'; import matchRoute from './matchRoute'; import resolveRoute from './resolveRoute'; +function isChildRoute(parentRoute, childRoute) { + let route = childRoute; + while (route) { + route = route.parent; + if (route === parentRoute) { + return true; + } + } + return false; +} + class Router { constructor(routes, options = {}) { if (Object(routes) !== routes) { @@ -30,12 +41,19 @@ class Router { typeof pathOrContext === 'string' ? { path: pathOrContext } : pathOrContext); const match = matchRoute(this.root, this.baseUrl, context.path.substr(this.baseUrl.length)); const resolve = this.resolveRoute; - let matches; - let parent; + let matches = null; + let nextMatches = null; - function next(resume) { - parent = matches ? matches.value.route.parent : null; - matches = match.next(); + function next(resume, parent = matches.value.route) { + matches = nextMatches || match.next(); + nextMatches = null; + + if (!resume) { + if (matches.done || !isChildRoute(parent, matches.value.route)) { + nextMatches = matches; + return Promise.resolve(null); + } + } if (matches.done) { return Promise.reject(Object.assign( @@ -52,18 +70,14 @@ class Router { return result; } - if (resume || parent === matches.value.route.parent) { - return next(resume); - } - - return result; + return next(resume, parent); }); } context.url = context.path; context.next = next; - return next(true); + return next(true, this.root); } } diff --git a/src/matchPath.js b/src/matchPath.js index 629ab4d..06c786f 100644 --- a/src/matchPath.js +++ b/src/matchPath.js @@ -12,10 +12,6 @@ import pathToRegexp from 'path-to-regexp'; const cache = new Map(); function decodeParam(val) { - if (!val) { - return val; - } - try { return decodeURIComponent(val); } catch (err) { @@ -46,7 +42,7 @@ function matchPath(routePath, urlPath, end, parentParams) { } for (let i = 1; i < m.length; i += 1) { - params[regexp.keys[i - 1].name] = decodeParam(m[i]); + params[regexp.keys[i - 1].name] = m[i] && decodeParam(m[i]); } return { path: path === '' ? '/' : path, keys: regexp.keys.slice(), params }; diff --git a/test/Router.spec.js b/test/Router.spec.js index 7612557..c2bd440 100644 --- a/test/Router.spec.js +++ b/test/Router.spec.js @@ -231,23 +231,52 @@ describe('router.resolve({ path, ...context })', () => { { path: '/test', children: [ - { path: '/', action() { log.push(2); } }, + { + path: '/', + action() { log.push(2); }, + children: [ + { + path: '/', + action({ next }) { + log.push(3); + return next().then(() => { log.push(6); }); + }, + children: [ + { + path: '/', + action({ next }) { + log.push(4); + return next().then(() => { log.push(5); }); + }, + }, + ], + }, + ], + }, + { + path: '/', + action() { log.push(7); }, + children: [ + { path: '/', action() { log.push(8); } }, + { path: '*', action() { log.push(9); } }, + ], + }, ], async action({ next }) { log.push(1); const result = await next(); - log.push(3); + log.push(10); return result; }, }, - { path: '/:id', action() { log.push(4); } }, - { path: '/test', action() { return log.push(5); } }, - { path: '/*', action() { log.push(6); } }, + { path: '/:id', action() { log.push(11); } }, + { path: '/test', action() { log.push(12); return 'done'; } }, + { path: '/*', action() { log.push(13); } }, ]); const result = await router.resolve('/test'); - expect(log).to.be.deep.equal([1, 2, 3, 4, 5]); - expect(result).to.be.equal(5); + expect(log).to.be.deep.equal([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); + expect(result).to.be.equal('done'); }); it('should support next(true) across multiple routes', async () => { @@ -256,45 +285,45 @@ describe('router.resolve({ path, ...context })', () => { path: '/', action({ next }) { log.push(1); - return next().then(() => log.push(8)); + return next().then((result) => { log.push(9); return result; }); }, children: [ { path: '/a/b/c', action({ next }) { log.push(2); - return next(true).then(() => log.push(7)); + return next(true).then((result) => { log.push(8); return result; }); }, }, { path: '/a', - action() { - log.push(3); - }, + action() { log.push(3); }, children: [ { path: '/b', action({ next }) { log.push(4); - return next().then(() => log.push(6)); + return next().then((result) => { log.push(6); return result; }); }, children: [ { path: '/c', - action() { - log.push(5); - }, + action() { log.push(5); }, }, ], }, + { + path: '/b/c', + action() { log.push(7); return 'done'; }, + }, ], }, ], }); const result = await router.resolve('/a/b/c'); - expect(log).to.be.deep.equal([1, 2, 3, 4, 5, 6, 7, 8]); - expect(result).to.be.equal(8); + expect(log).to.be.deep.equal([1, 2, 3, 4, 5, 6, 7, 8, 9]); + expect(result).to.be.equal('done'); }); it('should support parametrized routes 1', async () => {