1
0
mirror of synced 2025-12-19 18:10:59 -05:00
Files
docs/src/redirects/lib/permalinks.ts

57 lines
2.5 KiB
TypeScript

import nonEnterpriseDefaultVersion from '@/versions/lib/non-enterprise-default-version'
import { getPathWithoutVersion } from '@/frame/lib/path-utils'
import type { Permalink } from '@/types'
type Redirects = Record<string, string>
export default function permalinkRedirects(
permalinks: Permalink[],
redirectFrom: string[],
): Redirects {
const redirects: Redirects = {}
if (!permalinks.length) return redirects
// The following is handling for versionless redirect fallbacks!
// We put an entry into `redirects` without any version prefix that goes to the first supported
// version in the lib/all-versions.ts order. For example, we want this versionless path:
// /billing/managing-billing-for-your-github-account/managing-invoices-for-your-enterprise
// to redirect to its first supported version, which is GHEC:
// /enterprise-cloud@latest/billing/managing-billing-for-your-github-account/managing-invoices-for-your-enterprise
if (permalinks[0].pageVersion !== nonEnterpriseDefaultVersion) {
redirects[getPathWithoutVersion(permalinks[0].hrefWithoutLanguage)] =
permalinks[0].hrefWithoutLanguage
}
// For every "old" path in a content file's redirect_from frontmatter, also add that path to
// the redirects object as a key, where the value is the content file's permalink.
redirectFrom.forEach((frontmatterOldPath) => {
if (!frontmatterOldPath.startsWith('/')) {
throw new Error(
`'${frontmatterOldPath}' is not a valid redirect_from frontmatter value because it doesn't start with a /`,
)
}
// Exceptions where the `redirect_from` entries are too old
// Only replace /enterprise/ when it's at the start of the path followed by /admin/
// This handles legacy patterns like /enterprise/admin/... → /admin/...
// but preserves paths like /early-access/enterprise/... where enterprise is a directory name
frontmatterOldPath = frontmatterOldPath
.replace('/admin/guides/', '/admin/')
.replace(/^\/enterprise\/admin\//, '/admin/')
permalinks.forEach((permalink, index) => {
// For the first supported permalink (the order is determined by lib/all-versions),
// put an entry into `redirects` without any version prefix.
if (index === 0) {
redirects[frontmatterOldPath] = permalink.hrefWithoutLanguage
}
// For every permalink, put an entry into `redirects` with the version prefix.
redirects[`/${permalink.pageVersion}${frontmatterOldPath}`] = permalink.hrefWithoutLanguage
})
})
return redirects
}