mirror of
https://github.com/Unleash/unleash.git
synced 2024-12-28 00:06:53 +01:00
4bc9908287
This change adds custom edit urls for all the external readmes (sdks, edge, proxy) that we put in the docs. This makes it so that following the "edit this document" link takes you to the correct location, instead of to a file that doesn't exist in the main Unleash repo. Important caveat: this will only work for repos where the readme is called `README.md` (capitalization matters). Currently, this is all our repos, but it's something to be aware of for later. We don't currently record what the readme files are called directly in the docs, so to know that for sure, we'd have to build an extra integration to check and fix that automatically. It may be worth doing in the future, but for now, I think it's fine. We could also just rename the readme files if we find any issues.
152 lines
4.7 KiB
JavaScript
152 lines
4.7 KiB
JavaScript
const path = require('path');
|
|
|
|
module.exports.mapObject = (fn) => (o) =>
|
|
Object.fromEntries(Object.entries(o).map(fn));
|
|
|
|
module.exports.enrichAdditional =
|
|
(additionalProperties) =>
|
|
([repoName, repoData]) => {
|
|
const repoUrl = `https://github.com/Unleash/${repoName}`;
|
|
const slugName = (
|
|
repoData.slugName ?? repoData.sidebarName
|
|
).toLowerCase();
|
|
const branch = repoData.branch ?? 'main';
|
|
|
|
return [
|
|
repoName,
|
|
{ ...repoData, repoUrl, slugName, branch, ...additionalProperties },
|
|
];
|
|
};
|
|
module.exports.enrich = module.exports.enrichAdditional({});
|
|
|
|
module.exports.getRepoData = (documents) => (filename) => {
|
|
const repoName = filename.split('/')[0];
|
|
|
|
const repoData = documents[repoName];
|
|
|
|
return { name: repoName, ...repoData };
|
|
};
|
|
|
|
// Replace links in the incoming readme content.
|
|
//
|
|
// There's one cases we want to handle:
|
|
//
|
|
// 1. Relative links that point to the repo. These must be prefixed with the
|
|
// link to the github repo.
|
|
//
|
|
// Note: You might be tempted to handle absolute links to docs.getunleash.io and
|
|
// make them relative. While absolute links will work, they trigger full page
|
|
// refreshes. Relative links give a slightly smoother user experience.
|
|
//
|
|
// However, if the old link goes to a redirect, then the client-side redirect
|
|
// will not kick in, so you'll end up with a "Page not found".
|
|
const replaceLinks = ({ content, repo }) => {
|
|
const replace = (processRelativeUrl) => (url) => {
|
|
try {
|
|
// This constructor will throw if the URL is relative.
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/URL/URL
|
|
new URL(url);
|
|
|
|
return url;
|
|
} catch {
|
|
const separator = url.startsWith('/') ? '' : '/';
|
|
return processRelativeUrl(url, separator);
|
|
}
|
|
};
|
|
|
|
const replaceMarkdownLink = replace((url, separator) => {
|
|
// case 1
|
|
if (url.startsWith('#')) {
|
|
// ignore links to other doc sections
|
|
return url;
|
|
} else {
|
|
return `${repo.url}/blob/${repo.branch}${separator}${url}`;
|
|
}
|
|
});
|
|
|
|
const replaceImageSrcLink = replace((url, separator) => {
|
|
return `https://raw.githubusercontent.com/Unleash/${repo.name}/${repo.branch}${separator}${url}`;
|
|
});
|
|
|
|
// matches the URL portion of markdown links like [I go here](path/link "comment")
|
|
const markdownLink = /(?<=\[.*\]\(\s?)([^\s\)]+)(?=.*\))/g;
|
|
|
|
// matches the URL portion of src links that contain an image file type
|
|
// extension, e.g. src="./.github/img/get-request.png"
|
|
const imageSrcLink = /(?<=src=")([^")]+\.(png|svg|jpe?g|webp|gif))(?=")/g;
|
|
|
|
return content
|
|
.replaceAll(markdownLink, replaceMarkdownLink)
|
|
.replaceAll(imageSrcLink, replaceImageSrcLink);
|
|
};
|
|
|
|
module.exports.modifyContent =
|
|
({
|
|
getRepoDataFn,
|
|
filePath = () => {},
|
|
urlPath,
|
|
getAdditionalAdmonitions,
|
|
}) =>
|
|
(filename, content) => {
|
|
const data = getRepoDataFn(filename);
|
|
|
|
const generationTime = new Date();
|
|
|
|
const processedFilename = (() => {
|
|
const constructed =
|
|
path.join(filePath(data) ?? '', data.slugName) + '.md';
|
|
|
|
// ensure the file path does *not* start with a leading /
|
|
return constructed.charAt(0) === '/'
|
|
? constructed.slice(1)
|
|
: constructed;
|
|
})();
|
|
|
|
const processedSlug = (() => {
|
|
const constructed = path.join(urlPath ?? '', data.slugName);
|
|
// ensure the slug *does* start with a leading /
|
|
const prefix = constructed.charAt(0) === '/' ? '' : '/';
|
|
|
|
return prefix + constructed;
|
|
})();
|
|
|
|
const additionalAdmonitions = (
|
|
getAdditionalAdmonitions(data) ?? []
|
|
).join('\n\n');
|
|
|
|
return {
|
|
filename: processedFilename,
|
|
content: `---
|
|
title: ${data.sidebarName}
|
|
slug: ${processedSlug}
|
|
custom_edit_url: ${data.repoUrl}/edit/${data.branch}/README.md
|
|
---
|
|
|
|
:::info Generated content
|
|
This document was generated from the README in the [${
|
|
data.sidebarName
|
|
} GitHub repository](${data.repoUrl}).
|
|
:::
|
|
|
|
${additionalAdmonitions}
|
|
|
|
${replaceLinks({
|
|
content,
|
|
repo: { url: data.repoUrl, branch: data.branch, name: data.name },
|
|
})}
|
|
|
|
---
|
|
|
|
This content was generated on <time dateTime="${generationTime.toISOString()}">${generationTime.toLocaleString(
|
|
'en-gb',
|
|
{ dateStyle: 'long', timeStyle: 'full' },
|
|
)}</time>
|
|
`,
|
|
};
|
|
};
|
|
|
|
module.exports.getUrls = (documents) =>
|
|
Object.entries(documents).map(
|
|
([repo, { branch }]) => `${repo}/${branch}/README.md`,
|
|
);
|