next
Version:
The React Framework
83 lines (82 loc) • 3.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "createClientRouterFilter", {
enumerable: true,
get: function() {
return createClientRouterFilter;
}
});
const _bloomfilter = require("../shared/lib/bloom-filter");
const _utils = require("../shared/lib/router/utils");
const _removetrailingslash = require("../shared/lib/router/utils/remove-trailing-slash");
const _trytoparsepath = require("./try-to-parse-path");
const _interceptionroutes = require("../shared/lib/router/utils/interception-routes");
const _dynamicfilterpattern = require("../shared/lib/router/utils/dynamic-filter-pattern");
function createClientRouterFilter(paths, redirects, allowedErrorRate) {
const staticPaths = new Set();
const dynamicPaths = new Set();
for (let path of paths){
if ((0, _utils.isDynamicRoute)(path)) {
if ((0, _interceptionroutes.isInterceptionRouteAppPath)(path)) {
path = (0, _interceptionroutes.extractInterceptionRouteInformation)(path).interceptedRoute;
}
let subPath = '';
const pathParts = path.split('/');
// start at 1 since we split on '/' and the path starts
// with this so the first entry is an empty string
for(let i = 1; i < pathParts.length; i++){
const curPart = pathParts[i];
if (curPart.startsWith('[')) {
break;
}
subPath = `${subPath}/${curPart}`;
}
if (subPath) {
dynamicPaths.add(subPath);
} else {
// The route begins with a dynamic segment, so it has no static
// prefix to anchor the prefix-based dynamic filter on (e.g.
// `/[locale]/about`). Store its normalized pattern instead so the
// client can still detect it when a pages dynamic route would
// otherwise shadow it.
dynamicPaths.add(normalizeRouteToFilterPattern(path));
}
} else {
staticPaths.add(path);
}
}
for (const redirect of redirects){
const { source } = redirect;
const path = (0, _removetrailingslash.removeTrailingSlash)(source);
let tokens = [];
try {
tokens = (0, _trytoparsepath.tryToParsePath)(source).tokens || [];
} catch {}
if (tokens.every((token)=>typeof token === 'string')) {
// only include static redirects initially
staticPaths.add(path);
}
}
const staticFilter = _bloomfilter.BloomFilter.from([
...staticPaths
], allowedErrorRate);
const dynamicFilter = _bloomfilter.BloomFilter.from([
...dynamicPaths
], allowedErrorRate);
const data = {
staticFilter: staticFilter.export(),
dynamicFilter: dynamicFilter.export()
};
return data;
}
/**
* Replace every dynamic segment of a route with the placeholder token, e.g.
* `/[locale]/about` -> `/[]/about`, `/[lang]` -> `/[]`. This is the encode half
* of the dynamic filter; the pages router decodes it with
* `hasDynamicFilterCandidate`, and both rely on `DYNAMIC_FILTER_PLACEHOLDER`.
*/ function normalizeRouteToFilterPattern(route) {
return route.split('/').map((segment)=>segment.startsWith('[') ? _dynamicfilterpattern.DYNAMIC_FILTER_PLACEHOLDER : segment).join('/');
}
//# sourceMappingURL=create-client-router-filter.js.map