1
0
mirror of synced 2025-12-20 10:28:40 -05:00
Files
docs/lib/path-utils.js
Vanessa Yuen 3df90fc9b8 Hello git history spelunker!
Are you looking for something? Here is all of the GitHub Docs history in one single commit. Enjoy! 🎉
2020-09-27 14:10:11 +02:00

182 lines
6.3 KiB
JavaScript

const slash = require('slash')
const path = require('path')
const patterns = require('./patterns')
const { latest, deprecated } = require('./enterprise-server-releases')
const internalProducts = Object.values(require('./all-products'))
.filter(prod => !prod.external)
const allProducts = require('./all-products')
const allVersions = require('./all-versions')
const { getNewVersionedPath } = require('./old-versions-utils')
let pathsThatHaveEnterpriseUserVersions, pathsThatDoNotHaveEnterpriseUserVersions
if (!process.env.FEATURE_NEW_VERSIONS) {
pathsThatHaveEnterpriseUserVersions = internalProducts
.filter(prod => prod.hasEnterpriseUserVersions)
.map(prod => prod.href)
.concat(['/articles', '/categories'])
pathsThatDoNotHaveEnterpriseUserVersions = internalProducts
.filter(prod => !prod.hasEnterpriseUserVersions)
.map(prod => prod.href)
.concat(['/enterprise'])
}
// construct appropriate versioned path for any given HREF
function getVersionedPathWithoutLanguage (href, version) {
// start clean without language code or trailing slash
href = getPathWithoutLanguage(href.replace(patterns.trailingSlash, '$1'))
if (!process.env.FEATURE_NEW_VERSIONS) {
// does href need an enterprise user path?
// e.g., /articles/foo -> /en/enterprise/2.15/user/articles/foo
// also redirects like /common-issues-and-questions
// but NOT /actions, /desktop, /enterprise, etc.
const needsEnterpriseUserPath = (
pathsThatHaveEnterpriseUserVersions.some(path => href.startsWith(path)) ||
!pathsThatDoNotHaveEnterpriseUserVersions.some(path => href.startsWith(path))
)
// construct enterprise user path
if (needsEnterpriseUserPath && version !== 'dotcom') {
href = `/enterprise/${version}/user/${href}`
}
// hack fix for double slash bug
href = href.replace('//', '/')
// does href need an enterprise version added to path?
const needsEnterpriseVersion = (
href.match(patterns.enterprise) &&
href.match(patterns.getEnterpriseVersionNumber) === null
)
// add the enterprise version
if (needsEnterpriseVersion) {
// if current page version is dotcom, use the latest version of enterprise
href = version === 'dotcom'
? href.replace(/(\/enterprise)/, `$1/${latest}`)
: href.replace(/(\/enterprise)/, `$1/${version}`)
}
// is this an enterprise user path on dotcom?
const isEnterpriseUsePath = href.match(patterns.enterprise) && !href.match(patterns.admin)
// if so, replace enterprise user part of path with /github/
if (isEnterpriseUsePath && version === 'dotcom') {
href = href.replace(/\/enterprise\/.+?\/user\//, '')
}
return slash(href.replace(patterns.trailingSlash, '$1'))
}
if (process.env.FEATURE_NEW_VERSIONS) {
// if this is an old versioned path that includes a deprecated version, do not change!
// example: /enterprise/11.10.340/admin/articles/upgrading-to-the-latest-release
const oldEnterpriseVersionNumber = href.match(patterns.getEnterpriseVersionNumber)
if (oldEnterpriseVersionNumber && deprecated.includes(oldEnterpriseVersionNumber[1])) {
return href
}
// try to derive the current version from the path
// example: enterprise-server@2.22 or free-pro-team@latest
let versionFromPath = getVersionStringFromPath(href)
// if this is an old versioned path, convert to new versioned path
// OLD: /enterprise/2.22/admin/installation or /enterprise/admin/installation
// NEW: /enterprise-server@2.22/admin/installation
// OLD: /desktop/installing-and-configuring-github-desktop
// NEW: /free-pro-team@latest/desktop/installing-and-configuring-github-desktop
if (!Object.keys(allVersions).includes(versionFromPath)) {
href = getNewVersionedPath(href)
versionFromPath = getVersionStringFromPath(href)
}
// derive the product from the path (e.g., github or admin) and get corresponding object
const productObjectFromPath = getProductObjectFromPath(href)
// if the product's versions don't include the specified version, nothing to change!
if (productObjectFromPath && !productObjectFromPath.versions.includes(version)) {
return slash(href)
}
// update the version
return slash(href.replace(versionFromPath, version))
}
}
// add language code
function getVersionedPathWithLanguage (href, version, languageCode) {
return getPathWithLanguage(getVersionedPathWithoutLanguage(href, version), languageCode)
}
// add the language to the given HREF
// /en/articles/foo -> /articles/foo
function getPathWithLanguage (href, languageCode) {
return slash(path.posix.join('/', languageCode, getPathWithoutLanguage(href)))
.replace(patterns.trailingSlash, '$1')
}
// remove the language from the given HREF
// /articles/foo -> /en/articles/foo
function getPathWithoutLanguage (href) {
const newHref = href.match(patterns.hasLanguageCode)
? '/' + href.split('/').slice(2).join('/')
: href
return slash(newHref)
}
function getPathWithoutVersion (href) {
if (!process.env.FEATURE_NEW_VERSIONS) {
const number = href.match(patterns.getEnterpriseVersionNumber)
if (!number) return href
return slash(href.replace('/' + number[1], ''))
}
if (process.env.FEATURE_NEW_VERSIONS) {
return href.replace(`/${getVersionStringFromPath(href)}`, '')
}
}
function getVersionStringFromPath (href) {
href = getPathWithoutLanguage(href)
const versionString = href.split('/')[1]
return versionString || 'homepage'
}
function getVersionObjectFromPath (href) {
const versionId = getVersionStringFromPath(href)
const version = allVersions[versionId]
if (!version) throw new Error(`No version found for ${href}`)
return version
}
function getProductStringFromPath (href) {
href = getPathWithoutLanguage(href)
const productString = href.split('/')[2]
return productString || 'homepage'
}
function getProductObjectFromPath (href) {
const productId = getProductStringFromPath(href)
// Return undefined if product id derived from path can't be found in allProducts
return allProducts[productId]
}
module.exports = {
getVersionedPathWithLanguage,
getVersionedPathWithoutLanguage,
getPathWithLanguage,
getPathWithoutLanguage,
getPathWithoutVersion,
getVersionStringFromPath,
getVersionObjectFromPath,
getProductStringFromPath,
getProductObjectFromPath
}