mirror of
https://github.com/facebook/docusaurus.git
synced 2025-06-09 22:32:53 +02:00
fix(v2): broken link checker should not report false positives when using encoded chars (#4407)
In order to create markdown links to URIs containing spaces, an encoded space (%20) must be used. These types of links were not properly resolved to doc files. This fix allows them to be resolved by calling `decodeURI` on the links found in markdown files to unescape characters such as spaces.
This commit is contained in:
parent
2f53b1a895
commit
735b3b3cc0
2 changed files with 53 additions and 1 deletions
|
@ -205,4 +205,54 @@ describe('brokenLinks', () => {
|
||||||
});
|
});
|
||||||
expect(result).toEqual(allCollectedLinksFiltered);
|
expect(result).toEqual(allCollectedLinksFiltered);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Encoded link', () => {
|
||||||
|
test('getAllBrokenLinks', async () => {
|
||||||
|
const routes: RouteConfig[] = [
|
||||||
|
{
|
||||||
|
path: '/docs',
|
||||||
|
component: '',
|
||||||
|
routes: [
|
||||||
|
{path: '/docs/some doc', component: ''},
|
||||||
|
{path: '/docs/some other doc', component: ''},
|
||||||
|
{path: '/docs/weird%20file%20name', component: ''},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '*',
|
||||||
|
component: '',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const allCollectedLinks = {
|
||||||
|
'/docs/some doc': [
|
||||||
|
// good - valid file with spaces in name
|
||||||
|
'./some%20other%20doc',
|
||||||
|
// good - valid file with percent-20 in its name
|
||||||
|
'./weird%20file%20name',
|
||||||
|
// bad - non-existant file with spaces in name
|
||||||
|
'./some%20other%20non-existant%20doc',
|
||||||
|
// evil - trying to use ../../ but '/' won't get decoded
|
||||||
|
'./break%2F..%2F..%2Fout',
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const expectedBrokenLinks = {
|
||||||
|
'/docs/some doc': [
|
||||||
|
{
|
||||||
|
link: './some%20other%20non-existant%20doc',
|
||||||
|
resolvedLink: '/docs/some%20other%20non-existant%20doc',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
link: './break%2F..%2F..%2Fout',
|
||||||
|
resolvedLink: '/docs/break%2F..%2F..%2Fout',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(getAllBrokenLinks({allCollectedLinks, routes})).toEqual(
|
||||||
|
expectedBrokenLinks,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -48,7 +48,9 @@ function getPageBrokenLinks({
|
||||||
}
|
}
|
||||||
|
|
||||||
function isBrokenLink(link: string) {
|
function isBrokenLink(link: string) {
|
||||||
const matchedRoutes = matchRoutes(toReactRouterRoutes(routes), link);
|
const matchedRoutes = [link, decodeURI(link)]
|
||||||
|
.map((l) => matchRoutes(toReactRouterRoutes(routes), l))
|
||||||
|
.reduce((prev, cur) => prev.concat(cur));
|
||||||
return matchedRoutes.length === 0;
|
return matchedRoutes.length === 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue