111 lines
2.7 KiB
JavaScript
111 lines
2.7 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
||
|
|
||
|
exports.__esModule = true;
|
||
|
exports.cleanPath = exports.findPath = exports.findMatchPath = exports.setMatchPaths = void 0;
|
||
|
|
||
|
var _utils = require("@reach/router/lib/utils");
|
||
|
|
||
|
var _stripPrefix = _interopRequireDefault(require("./strip-prefix"));
|
||
|
|
||
|
var _normalizePagePath = _interopRequireDefault(require("./normalize-page-path"));
|
||
|
|
||
|
const pathCache = new Map();
|
||
|
let matchPaths = [];
|
||
|
|
||
|
const trimPathname = rawPathname => {
|
||
|
const pathname = decodeURIComponent(rawPathname); // Remove the pathPrefix from the pathname.
|
||
|
|
||
|
const trimmedPathname = (0, _stripPrefix.default)(pathname, __BASE_PATH__) // Remove any hashfragment
|
||
|
.split(`#`)[0] // Remove search query
|
||
|
.split(`?`)[0];
|
||
|
return trimmedPathname;
|
||
|
};
|
||
|
/**
|
||
|
* Set list of matchPaths
|
||
|
*
|
||
|
* @param {Array<{path: string, matchPath: string}>} value collection of matchPaths
|
||
|
*/
|
||
|
|
||
|
|
||
|
const setMatchPaths = value => {
|
||
|
matchPaths = value;
|
||
|
};
|
||
|
/**
|
||
|
* Return a matchpath url
|
||
|
* if `match-paths.json` contains `{ "/foo*": "/page1", ...}`, then
|
||
|
* `/foo?bar=far` => `/page1`
|
||
|
*
|
||
|
* @param {string} rawPathname A raw pathname
|
||
|
* @return {string|null}
|
||
|
*/
|
||
|
|
||
|
|
||
|
exports.setMatchPaths = setMatchPaths;
|
||
|
|
||
|
const findMatchPath = rawPathname => {
|
||
|
const trimmedPathname = cleanPath(rawPathname);
|
||
|
|
||
|
for (const {
|
||
|
matchPath,
|
||
|
path
|
||
|
} of matchPaths) {
|
||
|
if ((0, _utils.match)(matchPath, trimmedPathname)) {
|
||
|
return (0, _normalizePagePath.default)(path);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}; // Given a raw URL path, returns the cleaned version of it (trim off
|
||
|
// `#` and query params), or if it matches an entry in
|
||
|
// `match-paths.json`, its matched path is returned
|
||
|
//
|
||
|
// E.g. `/foo?bar=far` => `/foo`
|
||
|
//
|
||
|
// Or if `match-paths.json` contains `{ "/foo*": "/page1", ...}`, then
|
||
|
// `/foo?bar=far` => `/page1`
|
||
|
|
||
|
|
||
|
exports.findMatchPath = findMatchPath;
|
||
|
|
||
|
const findPath = rawPathname => {
|
||
|
const trimmedPathname = trimPathname(rawPathname);
|
||
|
|
||
|
if (pathCache.has(trimmedPathname)) {
|
||
|
return pathCache.get(trimmedPathname);
|
||
|
}
|
||
|
|
||
|
let foundPath = findMatchPath(trimmedPathname);
|
||
|
|
||
|
if (!foundPath) {
|
||
|
foundPath = cleanPath(rawPathname);
|
||
|
}
|
||
|
|
||
|
pathCache.set(trimmedPathname, foundPath);
|
||
|
return foundPath;
|
||
|
};
|
||
|
/**
|
||
|
* Clean a url and converts /index.html => /
|
||
|
* E.g. `/foo?bar=far` => `/foo`
|
||
|
*
|
||
|
* @param {string} rawPathname A raw pathname
|
||
|
* @return {string}
|
||
|
*/
|
||
|
|
||
|
|
||
|
exports.findPath = findPath;
|
||
|
|
||
|
const cleanPath = rawPathname => {
|
||
|
const trimmedPathname = trimPathname(rawPathname);
|
||
|
let foundPath = trimmedPathname;
|
||
|
|
||
|
if (foundPath === `/index.html`) {
|
||
|
foundPath = `/`;
|
||
|
}
|
||
|
|
||
|
foundPath = (0, _normalizePagePath.default)(foundPath);
|
||
|
return foundPath;
|
||
|
};
|
||
|
|
||
|
exports.cleanPath = cleanPath;
|