packages/react-router/src/match-path.js
function matchPath(pathname, options = {}) {
  if (typeof options === 'string') options = { path: options };

  const {
    path, exact = false, strict = false, sensitive = false
  } = options;

  const paths = [].concat(path);

  return paths.reduce((matched, p) => {
    if (matched) return matched;
    const { regexp, keys } = compilePath(p, {
      end: exact,
      strict,
      sensitive
    });
    const match = regexp.exec(pathname);

    if (!match) return null;

    const [url, ...values] = match;
    const isExact = pathname === url;

    if (exact && !isExact) return null;

    return {
      path: p, // the p used to match
      url: p === '/' && url === '' ? '/' : url, // the matched portion of the URL
      isExact, // whether or not we matched exactly
      params: keys.reduce((memo, key, index) => {
        memo[key.name] = values[index];
        return memo;
      }, {})
    };
  }, null);
}
function matchPath(pathname, options = {}) {
  if (typeof options === 'string') options = { path: options };

  const {
    path, exact = false, strict = false, sensitive = false
  } = options;

  const paths = [].concat(path);

  return paths.reduce((matched, p) => {
    if (matched) return matched;
    const { regexp, keys } = compilePath(p, {
      end: exact,
      strict,
      sensitive
    });
    const match = regexp.exec(pathname);

    if (!match) return null;

    const [url, ...values] = match;
    const isExact = pathname === url;

    if (exact && !isExact) return null;

    return {
      path: p, // the p used to match
      url: p === '/' && url === '' ? '/' : url, // the matched portion of the URL
      isExact, // whether or not we matched exactly
      params: keys.reduce((memo, key, index) => {
        memo[key.name] = values[index];
        return memo;
      }, {})
    };
  }, null);
}
Public API for matching a URL pathname to a path.