| 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. | |
| for (let frontmatterOldPath of redirectFrom) { | |
| 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/') | |
| for (let index = 0; index < permalinks.length; index++) { | |
| const permalink = permalinks[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 | |
| } | |