tools/obsoletes.ts (80 lines of code) (raw):
import * as fs from "fs";
import { join, relative } from "upath";
import { getMarkdownFiles, Markdown } from "./file.utils";
function createNginxRule(redirectFrom: string, redirectTo: string) {
return (
"rewrite ^/guide" +
redirectFrom +
"(/?.*)$ /guide/" +
redirectTo +
"$1 permanent;"
);
}
export function getObsoletesFromMarkdown(
markdownDocuments: Markdown[]
): string[] {
let nginxRulesList: string[] = [];
markdownDocuments
.filter(
(doc) => doc.frontmatter.obsoletes && doc.frontmatter.obsoletes.length > 0
)
.forEach((reference) => {
const { path, frontmatter } = reference;
const { obsoletes } = frontmatter;
if (obsoletes && obsoletes.length > 0) {
let [redirectTo] = relative(
join(__dirname, "../site"),
path.replace(/\/+$/, "")
).split("/index.md");
obsoletes.forEach((data) => {
let redirectFrom: string = data.replace(/\/+$/, "");
let nginxRule = createNginxRule(redirectFrom, redirectTo);
nginxRulesList.push(nginxRule);
});
}
});
return nginxRulesList;
}
export function dumpObsoletes(): void {
let finalContent: string = "";
// Generate obsoletes from all Markdown files.
// Note this does not take into account channels and other custom TSX files.
const markdownDocuments = getMarkdownFiles();
const obsoletes = getObsoletesFromMarkdown(markdownDocuments);
// Append other rewrites
obsoletes.push(createNginxRule("/idea", "java"));
obsoletes.push(createNginxRule("/pycharm", "python"));
obsoletes.push(createNginxRule("/webstorm", "javascript"));
// Write file
obsoletes.forEach(function (e) {
finalContent += e + "\n";
});
const target = `${__dirname}/../deployment/helm/redirect.conf`;
fs.writeFileSync(target, finalContent, { flag: "w+" });
}
export async function testObsoletes(file: string, urlPrefix: string) {
let errors: string = "";
const needsRewriteOfObsolete =
urlPrefix.indexOf("localhost") >= 0 || urlPrefix.indexOf("labs.jb.gg") >= 0;
const obsoletes = fs.readFileSync(file, "utf8").split("\n");
for (let i = 0; i < obsoletes.length; i++) {
let obsolete = obsoletes[i];
if (obsolete.startsWith("#")) continue;
if (obsolete.length <= 2) continue;
if (needsRewriteOfObsolete) {
obsolete = obsolete
.replace("/dotnet/guide", "/guide/dotnet")
.replace("/go/guide", "/guide/go")
.replace("/idea/guide", "/guide/idea")
.replace("/pycharm/guide", "/guide/pycharm")
.replace("/webstorm/guide", "/guide/webstorm");
}
const obsoleteUrl = urlPrefix.replace(/\/+$/, "") + obsolete;
try {
const response = await fetch(obsoleteUrl, { redirect: "manual" });
if (response.status >= 400) {
errors += response.status + " - " + obsoleteUrl + "\n";
}
} catch (e) {
console.log(e);
console.log(obsoleteUrl);
}
}
if (errors.length > 0) throw errors;
}