UNPKG

microsite

Version:
61 lines (60 loc) 2.39 kB
const DYNAMIC_ROUTE = /\[[^/]+?\](?=\/|$)/; function isDynamicRoute(route) { return DYNAMIC_ROUTE.test(route); } const cleanPathSegment = (segment) => { return segment.replace(/[\[\]]/g, "").replace(/\.\.\./, ""); }; const pathToSegments = (path) => path.split("/").map((text) => { const isDynamic = isDynamicRoute(text); const isCatchAll = isDynamic && text.slice(1, -1).startsWith("..."); return { text, isDynamic, isCatchAll }; }); function getParamsFromPath(fileName, path) { path = normalizePathName(path); const segments = pathToSegments(normalizePathName(fileName)); const parts = path.split("/"); return parts.reduce((acc, part, i) => { var _a, _b; const segment = (_a = segments[i]) !== null && _a !== void 0 ? _a : segments[segments.length - 1]; if (segment.isCatchAll) { const key = segment.text.slice(4, -1); return Object.assign(Object.assign({}, acc), { [key]: [...((_b = acc[key]) !== null && _b !== void 0 ? _b : []), part] }); } if (segment.isDynamic) { const key = segment.text.slice(1, -1); return Object.assign(Object.assign({}, acc), { [key]: part }); } return acc; }, {}); } const stripLeadingSlash = (str) => str.replace(/^\//, ""); const stripTrailingExt = (str) => str.replace(/\..*$/, ""); const normalizePathName = (str) => stripTrailingExt(stripLeadingSlash(str)); export function getPathFromParams(fileName, params) { const segments = pathToSegments(normalizePathName(fileName)); return ("/" + segments .reduce((path, segment) => { const key = cleanPathSegment(segment.text); const value = params[key]; if (typeof value === "undefined") return path.concat(key); return path.concat(...(Array.isArray(value) ? value : [value])); }, []) .join("/")); } export function generateStaticPropsContext(fileName, pathOrParams) { if (typeof pathOrParams === "string") { return { path: normalizePathName(pathOrParams), params: getParamsFromPath(fileName, pathOrParams), }; } else if (typeof pathOrParams === "object") { return { path: getPathFromParams(fileName, pathOrParams.params), params: pathOrParams.params, }; } }