1
0
mirror of synced 2025-12-22 03:16:52 -05:00
Files
docs/lib/redirects/permalinks.js
Mike Surowiec 9386571aa4 fix: use named export for all-versions (#20478)
* fix: use named export for all-versions

* run prettier
2021-07-22 19:29:00 +00:00

78 lines
2.8 KiB
JavaScript

import path from 'path'
import patterns from '../patterns.js'
import { allVersions } from '../all-versions.js'
import getOldPathsFromPermalink from './get-old-paths-from-permalink.js'
import { getVersionStringFromPath } from '../path-utils.js'
import { getNewVersionedPath } from '../old-versions-utils.js'
import removeFPTFromPath from '../remove-fpt-from-path.js'
const supportedVersions = new Set(Object.keys(allVersions))
export default function generateRedirectsForPermalinks(permalinks, redirectFrontmatter) {
// account for Array or String frontmatter entries
const redirectFrontmatterOldPaths = redirectFrontmatter
? Array.from([redirectFrontmatter]).flat()
: []
const redirects = {}
// for every permalink...
permalinks.forEach((permalink) => {
// get an array of possible old paths, e.g., /desktop/guides/ from current permalink /desktop/
const possibleOldPaths = getOldPathsFromPermalink(
permalink.href,
permalink.languageCode,
permalink.pageVersion
)
// for each old path, add a redirect to the current permalink
possibleOldPaths.forEach((oldPath) => {
redirects[oldPath] = permalink.href
})
// for every redirect frontmatter old path...
redirectFrontmatterOldPaths.forEach((frontmatterOldPath) => {
// remove trailing slashes (sometimes present in frontmatter)
frontmatterOldPath = frontmatterOldPath.replace(patterns.trailingSlash, '$1')
// support hardcoded versions in redirect frontmatter
if (supportedVersions.has(frontmatterOldPath.split('/')[1])) {
redirects[frontmatterOldPath] = permalink.href
redirects[`/en${frontmatterOldPath}`] = permalink.href
}
// get the old path for the current permalink version
let versionedFrontmatterOldPath = path.posix.join(
'/',
permalink.languageCode,
getNewVersionedPath(frontmatterOldPath)
)
const versionFromPath = getVersionStringFromPath(versionedFrontmatterOldPath)
versionedFrontmatterOldPath = removeFPTFromPath(
versionedFrontmatterOldPath.replace(versionFromPath, permalink.pageVersion)
)
// add it to the redirects object
redirects[versionedFrontmatterOldPath] = permalink.href
// then get an array of possible alternative old paths from the current versioned old path
const possibleOldPathsForVersionedOldPaths = getOldPathsFromPermalink(
versionedFrontmatterOldPath,
permalink.languageCode,
permalink.pageVersion
)
// and add each one to the redirects object
possibleOldPathsForVersionedOldPaths.forEach((oldPath) => {
redirects[oldPath] = permalink.href
})
})
})
// filter for unique entries only
Object.entries(redirects).forEach(([oldPath, newPath]) => {
if (oldPath === newPath) delete redirects[oldPath]
})
return redirects
}