72 lines
2.0 KiB
JavaScript
72 lines
2.0 KiB
JavaScript
|
|
import pathToRegexp from "path-to-regexp";
|
||
|
|
|
||
|
|
var patternCache = {};
|
||
|
|
var cacheLimit = 10000;
|
||
|
|
var cacheCount = 0;
|
||
|
|
|
||
|
|
var compilePath = function compilePath(pattern, options) {
|
||
|
|
var cacheKey = "" + options.end + options.strict + options.sensitive;
|
||
|
|
var cache = patternCache[cacheKey] || (patternCache[cacheKey] = {});
|
||
|
|
|
||
|
|
if (cache[pattern]) return cache[pattern];
|
||
|
|
|
||
|
|
var keys = [];
|
||
|
|
var re = pathToRegexp(pattern, keys, options);
|
||
|
|
var compiledPattern = { re: re, keys: keys };
|
||
|
|
|
||
|
|
if (cacheCount < cacheLimit) {
|
||
|
|
cache[pattern] = compiledPattern;
|
||
|
|
cacheCount++;
|
||
|
|
}
|
||
|
|
|
||
|
|
return compiledPattern;
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Public API for matching a URL pathname to a path pattern.
|
||
|
|
*/
|
||
|
|
var matchPath = function matchPath(pathname) {
|
||
|
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
|
|
var parent = arguments[2];
|
||
|
|
|
||
|
|
if (typeof options === "string") options = { path: options };
|
||
|
|
|
||
|
|
var _options = options,
|
||
|
|
path = _options.path,
|
||
|
|
_options$exact = _options.exact,
|
||
|
|
exact = _options$exact === undefined ? false : _options$exact,
|
||
|
|
_options$strict = _options.strict,
|
||
|
|
strict = _options$strict === undefined ? false : _options$strict,
|
||
|
|
_options$sensitive = _options.sensitive,
|
||
|
|
sensitive = _options$sensitive === undefined ? false : _options$sensitive;
|
||
|
|
|
||
|
|
|
||
|
|
if (path == null) return parent;
|
||
|
|
|
||
|
|
var _compilePath = compilePath(path, { end: exact, strict: strict, sensitive: sensitive }),
|
||
|
|
re = _compilePath.re,
|
||
|
|
keys = _compilePath.keys;
|
||
|
|
|
||
|
|
var match = re.exec(pathname);
|
||
|
|
|
||
|
|
if (!match) return null;
|
||
|
|
|
||
|
|
var url = match[0],
|
||
|
|
values = match.slice(1);
|
||
|
|
|
||
|
|
var isExact = pathname === url;
|
||
|
|
|
||
|
|
if (exact && !isExact) return null;
|
||
|
|
|
||
|
|
return {
|
||
|
|
path: path, // the path pattern used to match
|
||
|
|
url: path === "/" && url === "" ? "/" : url, // the matched portion of the URL
|
||
|
|
isExact: isExact, // whether or not we matched exactly
|
||
|
|
params: keys.reduce(function (memo, key, index) {
|
||
|
|
memo[key.name] = values[index];
|
||
|
|
return memo;
|
||
|
|
}, {})
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
export default matchPath;
|