const slash = require('slash') const path = require('path') const patterns = require('./patterns') const { latest } = require('./enterprise-server-releases') const allProducts = require('./all-products') const allVersions = require('./all-versions') const supportedVersions = new Set(Object.keys(allVersions)) const nonEnterpriseDefaultVersion = require('./non-enterprise-default-version') // Add the language to the given HREF // /articles/foo -> /en/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 // /en/articles/foo -> /articles/foo function getPathWithoutLanguage (href) { return slash(href.replace(patterns.hasLanguageCode, '/')) } // Remove the version segment from the path function getPathWithoutVersion (href) { const versionFromPath = getVersionStringFromPath(href) // If the derived version is not found in the list of all versions, just return the HREF return allVersions[versionFromPath] ? href.replace(`/${getVersionStringFromPath(href)}`, '') : href } // Return the version segment in a path function getVersionStringFromPath (href) { href = getPathWithoutLanguage(href) // Return immediately if this is a link to the homepage if (href === '/') { return 'homepage' } // Get the first segment const versionFromPath = href.split('/')[1] // If the first segment is a supported product, assume this is FPT if (allProducts[versionFromPath]) { return nonEnterpriseDefaultVersion } // Otherwise, check if it's a supported version if (supportedVersions.has(versionFromPath)) { return versionFromPath } // If the version segment is the latest enterprise-server release, return the latest release if (versionFromPath === 'enterprise-server@latest') { return `enterprise-server@${latest}` } // If it's just a plan with no @release (e.g., `enterprise-server`), return the latest release const planObject = Object.values(allVersions).find(v => v.plan === versionFromPath) if (planObject) { return allVersions[planObject.latestVersion].version } // Otherwise, return the first segment as-is, which may not be a real supported version, // but additional checks are done on this segment in getVersionedPathWithoutLanguage return versionFromPath } // Return the corresponding object for the version segment in a path function getVersionObjectFromPath (href) { const versionFromPath = getVersionStringFromPath(href) return allVersions[versionFromPath] } // Return the product segment from the path function getProductStringFromPath (href) { href = getPathWithoutLanguage(href) if (href === '/') return 'homepage' const pathParts = href.split('/') if (pathParts.includes('early-access')) return 'early-access' return allProducts[pathParts[2]] ? pathParts[2] : pathParts[1] } // Return the corresponding object for the product segment in a path function getProductObjectFromPath (href) { const productFromPath = getProductStringFromPath(href) return allProducts[productFromPath] } module.exports = { getPathWithLanguage, getPathWithoutLanguage, getPathWithoutVersion, getVersionStringFromPath, getVersionObjectFromPath, getProductStringFromPath, getProductObjectFromPath }