1
0
mirror of synced 2025-12-22 03:16:52 -05:00

Remove versions feature flag code (#15793)

* remove FEATURE_NEW_VERSIONS from feature-flags.json

* remove process.env.FEATURE_NEW_VERSIONS from include files

* remove process.env.FEATURE_NEW_VERSIONS from lib files

* remove process.env.FEATURE_NEW_VERSIONS from middleware files

* remove process.env.FEATURE_NEW_VERSIONS from script files

* remove process.env.FEATURE_NEW_VERSIONS from test files

* update test fixtures to use new versions as canonical fixtures
This commit is contained in:
Sarah Schneider
2020-09-29 13:36:07 -04:00
committed by GitHub
parent 6762f8c1b7
commit aa5a62d49d
95 changed files with 1333 additions and 3965 deletions

View File

@@ -1,5 +1,4 @@
{ {
"FEATURE_TEST_TRUE": true, "FEATURE_TEST_TRUE": true,
"FEATURE_TEST_FALSE": false, "FEATURE_TEST_FALSE": false
"FEATURE_NEW_VERSIONS": true
} }

View File

@@ -2,11 +2,7 @@
<details class="dropdown-withArrow d-inline-block details details-reset mb-4 position-relative close-when-clicked-outside article-versions"> <details class="dropdown-withArrow d-inline-block details details-reset mb-4 position-relative close-when-clicked-outside article-versions">
<summary class="d-flex flex-items-center flex-justify-between f4 h5-mktg btn-outline-mktg btn-mktg p-2"> <summary class="d-flex flex-items-center flex-justify-between f4 h5-mktg btn-outline-mktg btn-mktg p-2">
<!-- GitHub.com, Enterprise Server 2.16, etc --> <!-- GitHub.com, Enterprise Server 2.16, etc -->
{% if process.env.FEATURE_NEW_VERSIONS %}
<span class="d-md-none d-xl-inline-block mr-1">{{ site.data.ui.pages.article_version }}</span> {{ allVersions[currentVersion].versionTitle }} <span class="d-md-none d-xl-inline-block mr-1">{{ site.data.ui.pages.article_version }}</span> {{ allVersions[currentVersion].versionTitle }}
{% else %}
<span class="d-md-none d-xl-inline-block mr-1">{{ site.data.ui.pages.article_version }}</span> {{ productNames[currentVersion] }}
{% endif %}
<svg class="arrow ml-1" width="14px" height="8px" viewBox="0 0 14 8" xml:space="preserve" fill="none" stroke="#1277eb"><path d="M1,1l6.2,6L13,1"></path></svg> <svg class="arrow ml-1" width="14px" height="8px" viewBox="0 0 14 8" xml:space="preserve" fill="none" stroke="#1277eb"><path d="M1,1l6.2,6L13,1"></path></svg>
</summary> </summary>
@@ -16,11 +12,7 @@
href="{{ permalink.href }}" href="{{ permalink.href }}"
class="d-block py-2 {% if currentPath == permalink.href %}link-blue active{% else %}link-gray-dark no-underline{% endif %}" class="d-block py-2 {% if currentPath == permalink.href %}link-blue active{% else %}link-gray-dark no-underline{% endif %}"
> >
{% if process.env.FEATURE_NEW_VERSIONS %}
{{ allVersions[permalink.pageVersion].versionTitle }}</a> {{ allVersions[permalink.pageVersion].versionTitle }}</a>
{% else %}
{{ productNames[permalink.pageVersion] }}</a>
{% endif %}
{% endfor %} {% endfor %}
</div> </div>
</details> </details>

View File

@@ -1,6 +1,3 @@
{% unless process.env.FEATURE_NEW_VERSIONS %}
{% assign enterpriseServerReleases = enterpriseVersions %}
{% endunless %}
{% if currentVersion contains enterpriseServerReleases.oldestSupported %} {% if currentVersion contains enterpriseServerReleases.oldestSupported %}
<div class="deprecation-banner border rounded-1 mb-2 bg-yellow-light p-3 border-yellow f5"> <div class="deprecation-banner border rounded-1 mb-2 bg-yellow-light p-3 border-yellow f5">
<p> <p>

View File

@@ -44,11 +44,7 @@
<div id="current-product" class="d-flex flex-items-center flex-justify-between" style="padding-top: 2px;"> <div id="current-product" class="d-flex flex-items-center flex-justify-between" style="padding-top: 2px;">
<!-- Product switcher - GitHub.com, Enterprise Server, etc --> <!-- Product switcher - GitHub.com, Enterprise Server, etc -->
<!-- 404 and 500 error layouts are not real pages so we need to hardcode the name for those --> <!-- 404 and 500 error layouts are not real pages so we need to hardcode the name for those -->
{% if process.env.FEATURE_NEW_VERSIONS %}
{{ allProducts[currentProduct].name }} {{ allProducts[currentProduct].name }}
{% else %}
{{ currentProduct.name }}
{% endif %}
<svg class="arrow ml-md-1" width="14px" height="8px" viewBox="0 0 14 8" xml:space="preserve" fill="none" stroke="#1277eb"><path d="M1,1l6.2,6L13,1"></path></svg> <svg class="arrow ml-md-1" width="14px" height="8px" viewBox="0 0 14 8" xml:space="preserve" fill="none" stroke="#1277eb"><path d="M1,1l6.2,6L13,1"></path></svg>
</div> </div>
</summary> </summary>
@@ -57,7 +53,7 @@
{% for product in activeProducts %} {% for product in activeProducts %}
<a href="{% unless product.external %}/{{ currentLanguage }}{% endunless %}{{ product.href }}" <a href="{% unless product.external %}/{{ currentLanguage }}{% endunless %}{{ product.href }}"
class="d-block py-2 class="d-block py-2
{% if process.env.FEATURE_NEW_VERSIONS and product.id == currentProduct %}text-blue-mktg text-underline active{% elsif product.id == currentProduct.id %}text-blue-mktg text-underline active{% else %}link-gray-dark no-underline{% endif %}"> {% if product.id == currentProduct %}text-blue-mktg text-underline active{% elsif product.id == currentProduct.id %}text-blue-mktg text-underline active{% else %}link-gray-dark no-underline{% endif %}">
{{ product.name }} {{ product.name }}
{% if product.external %} {% if product.external %}
<span class="ml-1"><svg width="9" height="10" viewBox="0 0 9 10" fill="none" xmlns="http://www.w3.org/2000/svg"><path stroke="#24292e" d="M.646 8.789l8-8M8.5 9V1M1 .643h8"/></svg></span> <span class="ml-1"><svg width="9" height="10" viewBox="0 0 9 10" fill="none" xmlns="http://www.w3.org/2000/svg"><path stroke="#24292e" d="M.646 8.789l8-8M8.5 9V1M1 .643h8"/></svg></span>
@@ -68,10 +64,8 @@
</details> </details>
</div> </div>
{% if process.env.FEATURE_NEW_VERSIONS %}
<!-- Versions picker that only appears in the header on homepage/versioned homepages --> <!-- Versions picker that only appears in the header on homepage/versioned homepages -->
{% include homepage-version-switcher %} {% include homepage-version-switcher %}
{% endif %}
<div class="d-md-inline-block"> <div class="d-md-inline-block">

View File

@@ -20,12 +20,7 @@
<h3 class="text-mono f5 text-normal text-gray text-md-center mb-4">{{ site.data.ui.homepage.explore_by_product }}</h3> <h3 class="text-mono f5 text-normal text-gray text-md-center mb-4">{{ site.data.ui.homepage.explore_by_product }}</h3>
<div class="d-flex flex-wrap gutter gutter-xl-spacious"> <div class="d-flex flex-wrap gutter gutter-xl-spacious">
{% for product in activeProducts %} {% for product in activeProducts %}
{% if process.env.FEATURE_NEW_VERSIONS %} {% if product.versions contains currentVersion or currentVersion == 'homepage' %}
{% assign productVersions = product.versions %}
{% else %}
{% assign productVersions = currentVersion %}
{% endif %}
{% if productVersions contains currentVersion or currentVersion == 'homepage' %}
<div class="d-flex flex-column col-12 col-sm-6 col-lg-3 pb-4"> <div class="d-flex flex-column col-12 col-sm-6 col-lg-3 pb-4">
<a class="btn-mktg flex-auto d-flex flex-items-center btn-outline-mktg btn-large-mktg ws-normal " href="{% unless product.external %}/{{ currentLanguage }}{% endunless %}{% if product.versions contains currentVersion %}/{{currentVersion}}/{{product.id}}{% else %}{{product.href}}{% endif %}">{{ product.name }} <a class="btn-mktg flex-auto d-flex flex-items-center btn-outline-mktg btn-large-mktg ws-normal " href="{% unless product.external %}/{{ currentLanguage }}{% endunless %}{% if product.versions contains currentVersion %}/{{currentVersion}}/{{product.id}}{% else %}{{product.href}}{% endif %}">{{ product.name }}
{% if product.external %} {% if product.external %}

View File

@@ -1,25 +1,12 @@
{% if process.env.FEATURE_NEW_VERSIONS %}
{% include all-products-link %} {% include all-products-link %}
{% endif %}
{% for product in activeProducts %} {% for product in activeProducts %}
{% if product.versions contains currentVersion or currentVersion == 'homepage' %}
{% if process.env.FEATURE_NEW_VERSIONS %}
{% assign productVersions = product.versions %}
{% else %}
{% assign productVersions = currentVersion %}
{% endif %}
{% if productVersions contains currentVersion or currentVersion == 'homepage' %}
<li <li
title="{{product.name}}{% if product.external %} (External Site){% endif %}" title="{{product.name}}{% if product.external %} (External Site){% endif %}"
class="sidebar-product" class="sidebar-product"
> >
{% if process.env.FEATURE_NEW_VERSIONS %}
<a href="{% unless product.external %}/{{currentLanguage}}{% endunless %}{% if product.versions contains currentVersion %}/{{currentVersion}}/{{product.id}}{% else %}{{product.href}}{% endif %}" class="f4 pl-4 pr-5 py-2"> <a href="{% unless product.external %}/{{currentLanguage}}{% endunless %}{% if product.versions contains currentVersion %}/{{currentVersion}}/{{product.id}}{% else %}{{product.href}}{% endif %}" class="f4 pl-4 pr-5 py-2">
{% else %}
<a href="{% unless product.external %}/{{currentLanguage}}{% endunless %}{{product.href}}" class="f4 pl-4 pr-5 py-2">
{% endif %}
{{ product.name }} {{ product.name }}
{% if product.external %} {% if product.external %}
<span class="ml-1"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="octicon" width="16" height="16"> <path fill-rule="evenodd" clip-rule="evenodd" d="M14.75 1C14.8163 1 14.8799 1.02634 14.9268 1.07322C14.9737 1.12011 15 1.1837 15 1.25V5.396C15.0001 5.44551 14.9855 5.49393 14.958 5.53513C14.9305 5.57632 14.8915 5.60843 14.8457 5.62739C14.8 5.64635 14.7497 5.6513 14.7011 5.64162C14.6525 5.63194 14.608 5.60805 14.573 5.573L13.03 4.03L8.53 8.53C8.38783 8.66248 8.19978 8.7346 8.00548 8.73118C7.81118 8.72775 7.62579 8.64903 7.48838 8.51162C7.35097 8.37421 7.27225 8.18882 7.26883 7.99452C7.2654 7.80022 7.33752 7.61217 7.47 7.47L11.97 2.97L10.427 1.427C10.3919 1.39204 10.3681 1.34745 10.3584 1.2989C10.3487 1.25034 10.3536 1.20001 10.3726 1.15427C10.3916 1.10853 10.4237 1.06945 10.4649 1.04199C10.5061 1.01453 10.5545 0.999912 10.604 1H14.75ZM2.75 2C2.28587 2 1.84075 2.18437 1.51256 2.51256C1.18437 2.84075 1 3.28587 1 3.75V13.25C1 14.216 1.784 15 2.75 15H12.25C12.7141 15 13.1592 14.8156 13.4874 14.4874C13.8156 14.1592 14 13.7141 14 13.25V9.75C14 9.55109 13.921 9.36032 13.7803 9.21967C13.6397 9.07902 13.4489 9 13.25 9C13.0511 9 12.8603 9.07902 12.7197 9.21967C12.579 9.36032 12.5 9.55109 12.5 9.75V13.25C12.5 13.3163 12.4737 13.3799 12.4268 13.4268C12.3799 13.4737 12.3163 13.5 12.25 13.5H2.75C2.6837 13.5 2.62011 13.4737 2.57322 13.4268C2.52634 13.3799 2.5 13.3163 2.5 13.25V3.75C2.5 3.6837 2.52634 3.62011 2.57322 3.57322C2.62011 3.52634 2.6837 3.5 2.75 3.5H6.25C6.44891 3.5 6.63968 3.42098 6.78033 3.28033C6.92098 3.13968 7 2.94891 7 2.75C7 2.55109 6.92098 2.36032 6.78033 2.21967C6.63968 2.07902 6.44891 2 6.25 2H2.75Z"></path></svg></span> <span class="ml-1"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="octicon" width="16" height="16"> <path fill-rule="evenodd" clip-rule="evenodd" d="M14.75 1C14.8163 1 14.8799 1.02634 14.9268 1.07322C14.9737 1.12011 15 1.1837 15 1.25V5.396C15.0001 5.44551 14.9855 5.49393 14.958 5.53513C14.9305 5.57632 14.8915 5.60843 14.8457 5.62739C14.8 5.64635 14.7497 5.6513 14.7011 5.64162C14.6525 5.63194 14.608 5.60805 14.573 5.573L13.03 4.03L8.53 8.53C8.38783 8.66248 8.19978 8.7346 8.00548 8.73118C7.81118 8.72775 7.62579 8.64903 7.48838 8.51162C7.35097 8.37421 7.27225 8.18882 7.26883 7.99452C7.2654 7.80022 7.33752 7.61217 7.47 7.47L11.97 2.97L10.427 1.427C10.3919 1.39204 10.3681 1.34745 10.3584 1.2989C10.3487 1.25034 10.3536 1.20001 10.3726 1.15427C10.3916 1.10853 10.4237 1.06945 10.4649 1.04199C10.5061 1.01453 10.5545 0.999912 10.604 1H14.75ZM2.75 2C2.28587 2 1.84075 2.18437 1.51256 2.51256C1.18437 2.84075 1 3.28587 1 3.75V13.25C1 14.216 1.784 15 2.75 15H12.25C12.7141 15 13.1592 14.8156 13.4874 14.4874C13.8156 14.1592 14 13.7141 14 13.25V9.75C14 9.55109 13.921 9.36032 13.7803 9.21967C13.6397 9.07902 13.4489 9 13.25 9C13.0511 9 12.8603 9.07902 12.7197 9.21967C12.579 9.36032 12.5 9.55109 12.5 9.75V13.25C12.5 13.3163 12.4737 13.3799 12.4268 13.4268C12.3799 13.4737 12.3163 13.5 12.25 13.5H2.75C2.6837 13.5 2.62011 13.4737 2.57322 13.4268C2.52634 13.3799 2.5 13.3163 2.5 13.25V3.75C2.5 3.6837 2.52634 3.62011 2.57322 3.57322C2.62011 3.52634 2.6837 3.5 2.75 3.5H6.25C6.44891 3.5 6.63968 3.42098 6.78033 3.28033C6.92098 3.13968 7 2.94891 7 2.75C7 2.55109 6.92098 2.36032 6.78033 2.21967C6.63968 2.07902 6.44891 2 6.25 2H2.75Z"></path></svg></span>

View File

@@ -6,11 +6,7 @@
also gets an `is-current-page` class. also gets an `is-current-page` class.
--> -->
{% if process.env.FEATURE_NEW_VERSIONS %}
{% assign product = siteTree[currentLanguage][currentVersion].products[currentProduct] %} {% assign product = siteTree[currentLanguage][currentVersion].products[currentProduct] %}
{% else %}
{% assign product = siteTree[currentLanguage][currentVersion].products[currentProduct.id] %}
{% endif %}
{% include all-products-link %} {% include all-products-link %}
<li title="{{product.title}}" class="sidebar-product mb-2"> <li title="{{product.title}}" class="sidebar-product mb-2">
<a href="/{{currentLanguage}}{{product.href}}" class="pl-4 pr-5 pb-1 f4">{{ product.title }}</a> <a href="/{{currentLanguage}}{{product.href}}" class="pl-4 pr-5 pb-1 f4">{{ product.title }}</a>

View File

@@ -4,11 +4,7 @@
<h4 class="mb-3"> <h4 class="mb-3">
{{ site.data.ui.support.still_need_help }} {{ site.data.ui.support.still_need_help }}
</h4> </h4>
{% if process.env.FEATURE_NEW_VERSIONS %}
{% if currentVersion contains 'enterprise' %}{% assign isEnterprise = true %}{% else %}{% assign isEnterprise = false %}{% endif %} {% if currentVersion contains 'enterprise' %}{% assign isEnterprise = true %}{% else %}{% assign isEnterprise = false %}{% endif %}
{% else %}
{% if currentVersion != 'dotcom' %}{% assign isEnterprise = true %}{% else %}{% assign isEnterprise = false %}{% endif %}
{% endif %}
<a id="ask-community" href="https://github.community" class="btn btn-outline"> <a id="ask-community" href="https://github.community" class="btn btn-outline">
{% octicon "people" width="16" %} {% octicon "people" width="16" %}
{{ site.data.ui.support.ask_community }} {{ site.data.ui.support.ask_community }}

View File

@@ -5,47 +5,29 @@ const { difference } = require('lodash')
const yaml = require('js-yaml') const yaml = require('js-yaml')
const contentDir = path.join(process.cwd(), 'content') const contentDir = path.join(process.cwd(), 'content')
const frontmatter = require('@github-docs/frontmatter') const frontmatter = require('@github-docs/frontmatter')
const getApplicableVersions = require('./get-applicable-versions')
let getApplicableVersions // the product order is determined by data/products.yml
if (process.env.FEATURE_NEW_VERSIONS) {
getApplicableVersions = require('./get-applicable-versions')
}
// the product order is determined by a yml file
const productsFile = path.join(process.cwd(), 'data/products.yml') const productsFile = path.join(process.cwd(), 'data/products.yml')
const productsYml = yaml.load(fs.readFileSync(productsFile, 'utf8')) const productsYml = yaml.load(fs.readFileSync(productsFile, 'utf8'))
const sortedProductIds = productsYml.productsInOrder const sortedProductIds = productsYml.productsInOrder
let contentProductIds = fs.readdirSync(contentDir, { withFileTypes: true }) const contentProductIds = fs.readdirSync(contentDir, { withFileTypes: true })
.filter(entry => entry.isDirectory()) .filter(entry => entry.isDirectory())
.map(entry => entry.name) .map(entry => entry.name)
// TODO this can be removed when we replace content/enterprise/admin with content/admin
if (!process.env.FEATURE_NEW_VERSIONS) {
contentProductIds = contentProductIds.map(id => id.replace('enterprise', 'enterpriseServer'))
}
assert(difference(sortedProductIds, contentProductIds).length === 0) assert(difference(sortedProductIds, contentProductIds).length === 0)
assert(difference(contentProductIds, sortedProductIds).length === 0) assert(difference(contentProductIds, sortedProductIds).length === 0)
const internalProducts = {} const internalProducts = {}
sortedProductIds.forEach(productId => { sortedProductIds.forEach(productId => {
const relPath = process.env.FEATURE_NEW_VERSIONS const relPath = productId
? productId
: productId === 'enterpriseServer' ? 'enterprise/admin' : productId
const dir = path.join('content', relPath) const dir = path.join('content', relPath)
const toc = path.join(dir, 'index.md') const toc = path.join(dir, 'index.md')
const { data } = frontmatter(fs.readFileSync(toc, 'utf8')) const { data } = frontmatter(fs.readFileSync(toc, 'utf8'))
const applicableVersions = getApplicableVersions(data.versions, toc)
let applicableVersions, href const href = path.join('/', applicableVersions[0], productId)
if (process.env.FEATURE_NEW_VERSIONS) {
applicableVersions = getApplicableVersions(data.versions, toc)
href = path.join('/', applicableVersions[0], productId)
} else {
href = path.join('/', relPath)
}
internalProducts[productId] = { internalProducts[productId] = {
id: productId, id: productId,
@@ -56,11 +38,7 @@ sortedProductIds.forEach(productId => {
wip: data.wip || false wip: data.wip || false
} }
if (process.env.FEATURE_NEW_VERSIONS) { internalProducts[productId].versions = applicableVersions
internalProducts[productId].versions = applicableVersions
} else {
internalProducts[productId].hasEnterpriseUserVersions = productsYml.hasEnterpriseUserVersions.some(id => id === productId)
}
}) })
const externalProducts = { const externalProducts = {
@@ -78,10 +56,6 @@ const externalProducts = {
} }
} }
if (!process.env.FEATURE_NEW_VERSIONS) {
Object.keys(externalProducts).forEach(id => { externalProducts[id].hasEnterpriseUserVersions = false })
}
const allProducts = Object.assign({}, internalProducts, externalProducts) const allProducts = Object.assign({}, internalProducts, externalProducts)
module.exports = allProducts module.exports = allProducts

View File

@@ -1,51 +1,45 @@
const enterpriseServerReleases = require('./enterprise-server-releases') const enterpriseServerReleases = require('./enterprise-server-releases')
if (!process.env.FEATURE_NEW_VERSIONS) { // version = "plan"@"release"
module.exports = ['dotcom'].concat(enterpriseServerReleases.supported) // example: enterprise-server@2.21
} // where "enterprise-server" is the plan and "2.21" is the release
const versionDelimiter = '@'
const latestNonNumberedRelease = 'latest'
if (process.env.FEATURE_NEW_VERSIONS) { const plans = [
// version = "plan"@"release" {
// example: enterprise-server@2.21 plan: 'free-pro-team',
// where "enterprise-server" is the plan and "2.21" is the release planTitle: 'Free, Pro, and Team',
const versionDelimiter = '@' releases: [latestNonNumberedRelease],
const latestNonNumberedRelease = 'latest' latestRelease: latestNonNumberedRelease,
nonEnterpriseDefault: true // permanent way to refer to this plan if the name changes
},
{
plan: 'enterprise-server',
planTitle: 'Enterprise Server',
releases: enterpriseServerReleases.supported,
latestRelease: enterpriseServerReleases.latest,
hasNumberedReleases: true
}
]
const plans = [ const allVersions = {}
{
plan: 'free-pro-team', // combine the plans and releases to get allVersions object
planTitle: 'Free, Pro, and Team', // e.g. free-pro-team@latest, enterprise-server@2.21, enterprise-server@2.20, etc.
releases: [latestNonNumberedRelease], plans.forEach(planObj => {
latestRelease: latestNonNumberedRelease, planObj.releases.forEach(release => {
nonEnterpriseDefault: true // permanent way to refer to this plan if the name changes const version = `${planObj.plan}${versionDelimiter}${release}`
},
{ const versionObj = {
plan: 'enterprise-server', version,
planTitle: 'Enterprise Server', versionTitle: planObj.hasNumberedReleases ? `${planObj.planTitle} ${release}` : planObj.planTitle,
releases: enterpriseServerReleases.supported, latestVersion: `${planObj.plan}${versionDelimiter}${planObj.latestRelease}`,
latestRelease: enterpriseServerReleases.latest, currentRelease: release
hasNumberedReleases: true
} }
]
const allVersions = {} allVersions[version] = Object.assign(versionObj, planObj)
// combine the plans and releases to get allVersions object
// e.g. free-pro-team@latest, enterprise-server@2.21, enterprise-server@2.20, etc.
plans.forEach(planObj => {
planObj.releases.forEach(release => {
const version = `${planObj.plan}${versionDelimiter}${release}`
const versionObj = {
version,
versionTitle: planObj.hasNumberedReleases ? `${planObj.planTitle} ${release}` : planObj.planTitle,
latestVersion: `${planObj.plan}${versionDelimiter}${planObj.latestRelease}`,
currentRelease: release
}
allVersions[version] = Object.assign(versionObj, planObj)
})
}) })
})
module.exports = allVersions module.exports = allVersions
}

View File

@@ -79,9 +79,7 @@ module.exports = async function checkLinks ($, page, context, version, checkedLi
// finding the linked page isn't enough if it's a github.com page; also need to check versions // finding the linked page isn't enough if it's a github.com page; also need to check versions
if (linkedPage.relativePath.startsWith('github')) { if (linkedPage.relativePath.startsWith('github')) {
const linkedPageVersions = process.env.FEATURE_NEW_VERSIONS const linkedPageVersions = getApplicableVersions(linkedPage.versions, linkedPage.relativePath)
? getApplicableVersions(linkedPage.versions, linkedPage.relativePath)
: getApplicableVersions(linkedPage.productVersions, linkedPage.relativePath)
if (!linkedPageVersions.includes(version) && $(internalLink).attr('class') !== 'dotcom-only') { if (!linkedPageVersions.includes(version) && $(internalLink).attr('class') !== 'dotcom-only') {
brokenLinks.links.push({ 'broken link': link, reason: `${version} not found in linked page versions`, 'linked page': linkedPage.fullPath }) brokenLinks.links.push({ 'broken link': link, reason: `${version} not found in linked page versions`, 'linked page': linkedPage.fullPath })

View File

@@ -68,9 +68,7 @@ module.exports = async function checkLinks ($, page, context, version, checkedLi
// finding the linked page isn't enough if it's a github.com page; also need to check versions // finding the linked page isn't enough if it's a github.com page; also need to check versions
if (linkedPage.relativePath.startsWith('github')) { if (linkedPage.relativePath.startsWith('github')) {
const linkedPageVersions = process.env.FEATURE_NEW_VERSIONS const linkedPageVersions = getApplicableVersions(linkedPage.versions, linkedPage.relativePath)
? getApplicableVersions(linkedPage.versions, linkedPage.relativePath)
: getApplicableVersions(linkedPage.productVersions, linkedPage.relativePath)
if (!linkedPageVersions.includes(version) && $(internalLink).attr('class') !== 'dotcom-only') { if (!linkedPageVersions.includes(version) && $(internalLink).attr('class') !== 'dotcom-only') {
brokenLinks.links.push({ 'broken link': link, reason: `${version} not found in linked page versions`, 'linked page': linkedPage.fullPath }) brokenLinks.links.push({ 'broken link': link, reason: `${version} not found in linked page versions`, 'linked page': linkedPage.fullPath })

View File

@@ -1,8 +1,6 @@
const slash = require('slash') const slash = require('slash')
const patterns = require('./patterns') const patterns = require('./patterns')
const allVersions = process.env.FEATURE_NEW_VERSIONS const allVersions = Object.keys(require('./all-versions'))
? Object.keys(require('./all-versions'))
: require('./all-versions')
const { getVersionedPathWithLanguage } = require('./path-utils') const { getVersionedPathWithLanguage } = require('./path-utils')
module.exports = function findPage (href, pages, redirects = {}, languageCode = 'en', sourceLanguage = null) { module.exports = function findPage (href, pages, redirects = {}, languageCode = 'en', sourceLanguage = null) {

View File

@@ -5,7 +5,6 @@ const semverRange = {
conform: require('semver').validRange, conform: require('semver').validRange,
message: 'Must be a valid SemVer range' message: 'Must be a valid SemVer range'
} }
const productIds = Object.keys(require('./all-products'))
const versionIds = Object.keys(require('./all-versions')) const versionIds = Object.keys(require('./all-versions'))
const schema = { const schema = {
@@ -68,30 +67,13 @@ const schema = {
} }
} }
if (process.env.FEATURE_NEW_VERSIONS) { schema.properties.versions = {
schema.properties.versions = { type: ['object', 'string'], // allow a '*' string to indicate all versions
type: ['object', 'string'], // allow a '*' string to indicate all versions required: true,
required: true, properties: versionIds.reduce((acc, versionId) => {
properties: versionIds.reduce((acc, versionId) => { acc[versionId] = semverRange
acc[versionId] = semverRange return acc
return acc }, {})
}, {})
}
}
if (!process.env.FEATURE_NEW_VERSIONS) {
schema.properties.productVersions = {
type: 'object',
required: true,
properties: productIds.reduce((acc, productId) => {
// github used to be called dotcom
// TODO: rename `dotcom` to `github` in all the markdown files' frontmatter
if (productId === 'github') productId = 'dotcom'
acc[productId] = semverRange
return acc
}, {})
}
} }
function frontmatter (markdown, opts = {}) { function frontmatter (markdown, opts = {}) {

View File

@@ -1,77 +1,52 @@
const allVersions = require('./all-versions') const allVersions = require('./all-versions')
const versionSatisifiesRange = require('./version-satisfies-range') const versionSatisifiesRange = require('./version-satisfies-range')
let nonEnterpriseProductVersions
if (!process.env.FEATURE_NEW_VERSIONS) {
nonEnterpriseProductVersions = Object.keys(require('./frontmatter').schema.properties.productVersions.properties)
.filter(prop => prop !== 'enterprise')
}
// return an array of versions that an article's product versions encompasses // return an array of versions that an article's product versions encompasses
function getApplicableVersions (frontmatterVersions, filepath) { function getApplicableVersions (frontmatterVersions, filepath) {
if (typeof frontmatterVersions === 'undefined') { if (typeof frontmatterVersions === 'undefined') {
throw new Error(`No \`versions\` frontmatter found in ${filepath}`) throw new Error(`No \`versions\` frontmatter found in ${filepath}`)
} }
if (!process.env.FEATURE_NEW_VERSIONS) { // all versions are applicable!
const applicableVersions = allVersions.filter(version => { if (frontmatterVersions === '*') {
if (version === 'dotcom') { return Object.keys(allVersions)
// find any non-Enterprise product versions that apply
return nonEnterpriseProductVersions.some(version => version in frontmatterVersions)
} else {
return versionSatisifiesRange(version, frontmatterVersions.enterprise)
}
})
if (!applicableVersions.length) {
throw new Error(`No applicable product versions found for file ${filepath}. Please double-check the page's \`productVersions\` frontmatter.`)
}
return applicableVersions
} }
if (process.env.FEATURE_NEW_VERSIONS) { // get an array like: [ 'free-pro-team@latest', 'enterprise-server@2.21', 'enterprise-cloud@latest' ]
// all versions are applicable! const applicableVersions = []
if (frontmatterVersions === '*') {
return Object.keys(allVersions)
}
// get an array like: [ 'free-pro-team@latest', 'enterprise-server@2.21', 'enterprise-cloud@latest' ] // where frontmatter is something like:
const applicableVersions = [] // free-pro-team: '*'
// enterprise-server: '>=2.19'
// enterprise-cloud: '*'
// private-instances: '*'
// ^ where each key correponds to a plan
Object.entries(frontmatterVersions)
.forEach(([plan, planValue]) => {
// for each plan (e.g., enterprise-server), get matching versions from allVersions object
const relevantVersions = Object.values(allVersions).filter(v => v.plan === plan)
// where frontmatter is something like: if (!relevantVersions.length) {
// free-pro-team: '*' throw new Error(`No applicable versions found for ${filepath}. Please double-check the page's \`versions\` frontmatter.`)
// enterprise-server: '>=2.19' }
// enterprise-cloud: '*'
// private-instances: '*'
// ^ where each key correponds to a plan
Object.entries(frontmatterVersions)
.forEach(([plan, planValue]) => {
// for each plan (e.g., enterprise-server), get matching versions from allVersions object
const relevantVersions = Object.values(allVersions).filter(v => v.plan === plan)
if (!relevantVersions.length) { relevantVersions.forEach(relevantVersion => {
throw new Error(`No applicable versions found for ${filepath}. Please double-check the page's \`versions\` frontmatter.`) // special handling for versions with numbered releases
} if (relevantVersion.hasNumberedReleases) {
if (versionSatisifiesRange(relevantVersion.currentRelease, planValue)) {
relevantVersions.forEach(relevantVersion => {
// special handling for versions with numbered releases
if (relevantVersion.hasNumberedReleases) {
if (versionSatisifiesRange(relevantVersion.currentRelease, planValue)) {
applicableVersions.push(relevantVersion.version)
}
} else {
applicableVersions.push(relevantVersion.version) applicableVersions.push(relevantVersion.version)
} }
}) } else {
applicableVersions.push(relevantVersion.version)
}
}) })
})
if (!applicableVersions.length) { if (!applicableVersions.length) {
throw new Error(`No applicable versions found for ${filepath}. Please double-check the page's \`versions\` frontmatter.`) throw new Error(`No applicable versions found for ${filepath}. Please double-check the page's \`versions\` frontmatter.`)
}
return applicableVersions
} }
return applicableVersions
} }
module.exports = getApplicableVersions module.exports = getApplicableVersions

View File

@@ -7,8 +7,6 @@ const LiquidTag = require('./liquid-tag')
const findPage = require('../find-page') const findPage = require('../find-page')
const getApplicableVersions = require('../get-applicable-versions') const getApplicableVersions = require('../get-applicable-versions')
const versionsProp = process.env.FEATURE_NEW_VERSIONS ? 'versions' : 'productVersions'
// This class supports a set of link tags. Each tag expects one parameter, a language-agnostic href: // This class supports a set of link tags. Each tag expects one parameter, a language-agnostic href:
// //
// {% link /articles/set-up-git %} // {% link /articles/set-up-git %}
@@ -64,7 +62,7 @@ module.exports = class Link extends LiquidTag {
if (!page) return '' if (!page) return ''
// get versions of the found page // get versions of the found page
const applicableVersions = getApplicableVersions(page[versionsProp], fullPath) const applicableVersions = getApplicableVersions(page.versions, fullPath)
// check whether the page versions include the current version // check whether the page versions include the current version
const shouldLinkRenderInCurrentVersion = applicableVersions.includes(ctx.currentVersion) const shouldLinkRenderInCurrentVersion = applicableVersions.includes(ctx.currentVersion)

View File

@@ -1,6 +1,4 @@
if (process.env.FEATURE_NEW_VERSIONS) { const nonEnterpriseDefaultVersion = Object.values(require('../lib/all-versions'))
const nonEnterpriseDefaultVersion = Object.values(require('../lib/all-versions')) .find(version => version.nonEnterpriseDefault).version
.find(version => version.nonEnterpriseDefault).version
module.exports = nonEnterpriseDefaultVersion module.exports = nonEnterpriseDefaultVersion
}

View File

@@ -19,10 +19,6 @@ const frontmatter = require('./frontmatter')
const products = require('./all-products') const products = require('./all-products')
const slash = require('slash') const slash = require('slash')
const versionsProp = process.env.FEATURE_NEW_VERSIONS
? 'versions'
: 'productVersions'
class Page { class Page {
constructor (opts) { constructor (opts) {
assert(opts.relativePath, 'relativePath is required') assert(opts.relativePath, 'relativePath is required')
@@ -72,7 +68,7 @@ class Page {
delete this.guideLinks delete this.guideLinks
// derive array of Permalink objects // derive array of Permalink objects
this.permalinks = Permalink.derive(this.languageCode, this.relativePath, this.title, this[versionsProp]) this.permalinks = Permalink.derive(this.languageCode, this.relativePath, this.title, this.versions)
// create backwards-compatible old paths for page permalinks and frontmatter redirects // create backwards-compatible old paths for page permalinks and frontmatter redirects
this.redirects = generateRedirectsForPermalinks(this.permalinks, this.redirect_from) this.redirects = generateRedirectsForPermalinks(this.permalinks, this.redirect_from)
@@ -93,16 +89,11 @@ class Page {
// Infer the parent product ID from the page's relative file path // Infer the parent product ID from the page's relative file path
get parentProductId () { get parentProductId () {
// Each page's top-level content directory matches its product ID // Each page's top-level content directory matches its product ID
let id = this.relativePath.split('/')[0] const id = this.relativePath.split('/')[0]
// ignore top-level content/index.md // ignore top-level content/index.md
if (id === 'index.md') return null if (id === 'index.md') return null
if (!process.env.FEATURE_NEW_VERSIONS) {
// make an exception of GitHub Enterprise
if (id === 'enterprise') id = 'enterpriseServer'
}
// make sure the ID is valid // make sure the ID is valid
assert( assert(
Object.keys(products).includes(id), Object.keys(products).includes(id),

View File

@@ -1,107 +1,47 @@
const slash = require('slash') const slash = require('slash')
const path = require('path') const path = require('path')
const patterns = require('./patterns') const patterns = require('./patterns')
const { latest, deprecated } = require('./enterprise-server-releases') const { deprecated } = require('./enterprise-server-releases')
const internalProducts = Object.values(require('./all-products'))
.filter(prod => !prod.external)
const allProducts = require('./all-products') const allProducts = require('./all-products')
const allVersions = require('./all-versions') const allVersions = require('./all-versions')
const { getNewVersionedPath } = require('./old-versions-utils') 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 // construct appropriate versioned path for any given HREF
function getVersionedPathWithoutLanguage (href, version) { function getVersionedPathWithoutLanguage (href, version) {
// start clean without language code or trailing slash // start clean without language code or trailing slash
href = getPathWithoutLanguage(href.replace(patterns.trailingSlash, '$1')) href = getPathWithoutLanguage(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!
// does href need an enterprise user path? // example: /enterprise/11.10.340/admin/articles/upgrading-to-the-latest-release
// e.g., /articles/foo -> /en/enterprise/2.15/user/articles/foo const oldEnterpriseVersionNumber = href.match(patterns.getEnterpriseVersionNumber)
// also redirects like /common-issues-and-questions if (oldEnterpriseVersionNumber && deprecated.includes(oldEnterpriseVersionNumber[1])) {
// but NOT /actions, /desktop, /enterprise, etc. return href
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) { // try to derive the current version from the path
// if this is an old versioned path that includes a deprecated version, do not change! // example: enterprise-server@2.22 or free-pro-team@latest
// example: /enterprise/11.10.340/admin/articles/upgrading-to-the-latest-release let versionFromPath = getVersionStringFromPath(href)
const oldEnterpriseVersionNumber = href.match(patterns.getEnterpriseVersionNumber)
if (oldEnterpriseVersionNumber && deprecated.includes(oldEnterpriseVersionNumber[1])) {
return href
}
// try to derive the current version from the path // if this is an old versioned path, convert to new versioned path
// example: enterprise-server@2.22 or free-pro-team@latest // OLD: /enterprise/2.22/admin/installation or /enterprise/admin/installation
let versionFromPath = getVersionStringFromPath(href) // NEW: /enterprise-server@2.22/admin/installation
// OLD: /desktop/installing-and-configuring-github-desktop
// if this is an old versioned path, convert to new versioned path // NEW: /free-pro-team@latest/desktop/installing-and-configuring-github-desktop
// OLD: /enterprise/2.22/admin/installation or /enterprise/admin/installation if (!Object.keys(allVersions).includes(versionFromPath)) {
// NEW: /enterprise-server@2.22/admin/installation href = getNewVersionedPath(href)
// OLD: /desktop/installing-and-configuring-github-desktop versionFromPath = getVersionStringFromPath(href)
// 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))
} }
// 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 // add language code
@@ -127,16 +67,7 @@ function getPathWithoutLanguage (href) {
} }
function getPathWithoutVersion (href) { function getPathWithoutVersion (href) {
if (!process.env.FEATURE_NEW_VERSIONS) { return href.replace(`/${getVersionStringFromPath(href)}`, '')
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) { function getVersionStringFromPath (href) {

View File

@@ -16,9 +16,7 @@ class Permalink {
this.href = pathUtils.getVersionedPathWithLanguage(permalinkSuffix, pageVersion, languageCode) this.href = pathUtils.getVersionedPathWithLanguage(permalinkSuffix, pageVersion, languageCode)
this.pageVersionTitle = process.env.FEATURE_NEW_VERSIONS this.pageVersionTitle = allVersions[pageVersion].versionTitle
? allVersions[pageVersion].versionTitle
: pageVersion === 'dotcom' ? 'GitHub.com' : `Enterprise Server ${pageVersion}`
return this return this
} }
@@ -33,17 +31,15 @@ class Permalink {
}) })
// special permalink for homepage // special permalink for homepage
if (process.env.FEATURE_NEW_VERSIONS) { if (relativePath === 'index.md') {
if (relativePath === 'index.md') { const homepagePermalink = {
const homepagePermalink = { ...permalinks[0],
...permalinks[0], href: '/' + languageCode,
href: '/' + languageCode, pageVersion: 'homepage',
pageVersion: 'homepage', pageVersionTitle: permalinks[0].title,
pageVersionTitle: permalinks[0].title, homepage: true
homepage: true
}
permalinks.push(homepagePermalink)
} }
permalinks.push(homepagePermalink)
} }
return permalinks return permalinks

View File

@@ -1,7 +1,6 @@
const patterns = require('../patterns') const patterns = require('../patterns')
const { latest } = require('../enterprise-server-releases') const { latest } = require('../enterprise-server-releases')
const { getVersionedPathWithLanguage } = require('../path-utils') const { getVersionedPathWithLanguage } = require('../path-utils')
const latestEnterpriseRestPath = `/enterprise/${latest}/user/rest/`
// This function takes a known pre-migration path from developer.github.com and // This function takes a known pre-migration path from developer.github.com and
// infers and returns a current, correct docs.github.com path. // infers and returns a current, correct docs.github.com path.
@@ -48,14 +47,8 @@ module.exports = function getDocsPathFromDeveloperPath (oldDeveloperPath, allRed
newPath = allRedirects[newPath] || newPath newPath = allRedirects[newPath] || newPath
// old developer routes that include 'enterprise-admin' should always redirect to enterprise server // old developer routes that include 'enterprise-admin' should always redirect to enterprise server
const enterpriseRegex = process.env.FEATURE_NEW_VERSIONS if (fragment && newPath.includes('/rest/reference/enterprise-admin') && !patterns.enterpriseServer.test(newPath)) {
? patterns.enterpriseServer newPath = getVersionedPathWithLanguage(newPath, `enterprise-server@${latest}`, 'en')
: patterns.enterprise
if (fragment && newPath.includes('/rest/reference/enterprise-admin') && !enterpriseRegex.test(newPath)) {
newPath = process.env.FEATURE_NEW_VERSIONS
? getVersionedPathWithLanguage(newPath, `enterprise-server@${latest}`, 'en')
: newPath.replace('/rest/', latestEnterpriseRestPath)
} }
// show an error if the page to be redirected to doesn't exist // show an error if the page to be redirected to doesn't exist

View File

@@ -55,56 +55,54 @@ module.exports = function getOldPathsFromPath (currentPath, languageCode, curren
// ------ END LEGACY VERSION FORMAT REPLACEMENTS ------// // ------ END LEGACY VERSION FORMAT REPLACEMENTS ------//
// ------ BEGIN MODERN VERSION FORMAT REPLACEMENTS ------// // ------ BEGIN MODERN VERSION FORMAT REPLACEMENTS ------//
if (process.env.FEATURE_NEW_VERSIONS) { if (currentlySupportedVersions.includes(currentVersion) || versionSatisifiesRange(currentVersion, `>${lastReleaseWithLegacyFormat}`)) {
if (currentlySupportedVersions.includes(currentVersion) || versionSatisifiesRange(currentVersion, `>${lastReleaseWithLegacyFormat}`)) { oldPaths.forEach(oldPath => {
oldPaths.forEach(oldPath => { // create old path /github from new path /free-pro-team@latest/github
// create old path /github from new path /free-pro-team@latest/github oldPaths.add(oldPath
oldPaths.add(oldPath .replace(`/${nonEnterpriseDefaultVersion}`, ''))
.replace(`/${nonEnterpriseDefaultVersion}`, ''))
// create old path /free-pro-team/github from new path /free-pro-team@latest/github // create old path /free-pro-team/github from new path /free-pro-team@latest/github
oldPaths.add(oldPath oldPaths.add(oldPath
.replace('@latest', '')) .replace('@latest', ''))
// create old path /enterprise/<version> from new path /enterprise-server@<version> // create old path /enterprise/<version> from new path /enterprise-server@<version>
oldPaths.add(oldPath oldPaths.add(oldPath
.replace(/\/enterprise-server@(\d)/, '/enterprise/$1')) .replace(/\/enterprise-server@(\d)/, '/enterprise/$1'))
// create old path /enterprise/<version>/user from new path /enterprise-server@<version>/github // create old path /enterprise/<version>/user from new path /enterprise-server@<version>/github
oldPaths.add(oldPath oldPaths.add(oldPath
.replace(/\/enterprise-server@(\d.+?)\/github/, '/enterprise/$1/user')) .replace(/\/enterprise-server@(\d.+?)\/github/, '/enterprise/$1/user'))
// create old path /insights from new path /enterprise-server@<latest>/insights // create old path /insights from new path /enterprise-server@<latest>/insights
oldPaths.add(oldPath oldPaths.add(oldPath
.replace(`/enterprise-server@${latest}/insights`, '/insights')) .replace(`/enterprise-server@${latest}/insights`, '/insights'))
// create old path /admin from new path /enterprise-server@<latest>/admin // create old path /admin from new path /enterprise-server@<latest>/admin
oldPaths.add(oldPath oldPaths.add(oldPath
.replace(`/enterprise-server@${latest}/admin`, '/admin')) .replace(`/enterprise-server@${latest}/admin`, '/admin'))
// create old path /enterprise from new path /enterprise-server@<latest> // create old path /enterprise from new path /enterprise-server@<latest>
oldPaths.add(oldPath oldPaths.add(oldPath
.replace(`/enterprise-server@${latest}`, '/enterprise')) .replace(`/enterprise-server@${latest}`, '/enterprise'))
// create old path /enterprise-server from new path /enterprise-server@<latest> // create old path /enterprise-server from new path /enterprise-server@<latest>
oldPaths.add(oldPath oldPaths.add(oldPath
.replace(`/enterprise-server@${latest}`, '/enterprise-server')) .replace(`/enterprise-server@${latest}`, '/enterprise-server'))
// create old path /enterprise-server@latest from new path /enterprise-server@<latest> // create old path /enterprise-server@latest from new path /enterprise-server@<latest>
oldPaths.add(oldPath oldPaths.add(oldPath
.replace(`/enterprise-server@${latest}`, '/enterprise-server@latest')) .replace(`/enterprise-server@${latest}`, '/enterprise-server@latest'))
if (!patterns.adminProduct.test(oldPath)) { if (!patterns.adminProduct.test(oldPath)) {
// create old path /enterprise/<version>/user/foo from new path /enterprise-server@<version>/foo // create old path /enterprise/<version>/user/foo from new path /enterprise-server@<version>/foo
oldPaths.add(currentPath oldPaths.add(currentPath
.replace(/\/enterprise-server@(\d.+?)\//, '/enterprise/$1/user/')) .replace(/\/enterprise-server@(\d.+?)\//, '/enterprise/$1/user/'))
// create old path /enterprise/user/foo from new path /enterprise-server@<latest>/foo // create old path /enterprise/user/foo from new path /enterprise-server@<latest>/foo
oldPaths.add(currentPath oldPaths.add(currentPath
.replace(`/enterprise-server@${latest}/`, '/enterprise/user/')) .replace(`/enterprise-server@${latest}/`, '/enterprise/user/'))
} }
}) })
}
} }
// ------ END MODERN VERSION FORMAT REPLACEMENTS ------// // ------ END MODERN VERSION FORMAT REPLACEMENTS ------//

View File

@@ -52,9 +52,7 @@ module.exports = async function precompileRedirects (pages) {
// although we only support developer Enterprise paths up to 2.21, we make // although we only support developer Enterprise paths up to 2.21, we make
// an exception to always redirect versionless paths to the latest version // an exception to always redirect versionless paths to the latest version
if (developerRoute.includes('/2.21/')) { if (developerRoute.includes('/2.21/')) {
const newPathOnLatestVersion = process.env.FEATURE_NEW_VERSIONS const newPathOnLatestVersion = newPath.replace('@2.21/', `@${latest}/`)
? newPath.replace('@2.21/', `@${latest}/`)
: newPath.replace('/2.21/', `/${latest}/`)
const developerRouteWithoutVersion = developerRoute.replace('/2.21/', '/') const developerRouteWithoutVersion = developerRoute.replace('/2.21/', '/')
const developerRouteWithLanguageWithoutVersion = `/en${developerRouteWithoutVersion}` const developerRouteWithLanguageWithoutVersion = `/en${developerRouteWithoutVersion}`
allRedirects[developerRouteWithoutVersion] = newPathOnLatestVersion allRedirects[developerRouteWithoutVersion] = newPathOnLatestVersion
@@ -65,9 +63,7 @@ module.exports = async function precompileRedirects (pages) {
// we should eventually yank this block because 2.22 never existed on developer site // we should eventually yank this block because 2.22 never existed on developer site
// the better solution is to change `/v3` and `/v4` links in content to `/rest` and `/graphql` // the better solution is to change `/v3` and `/v4` links in content to `/rest` and `/graphql`
if (developerRoute.includes('/2.21/')) { if (developerRoute.includes('/2.21/')) {
const newPath222 = process.env.FEATURE_NEW_VERSIONS const newPath222 = newPath.replace('@2.21/', '@2.22/')
? newPath.replace('@2.21/', '@2.22/')
: newPath.replace('/2.21/', '/2.22/')
const developerRoute222 = developerRoute.replace('/2.21/', '/2.22/') const developerRoute222 = developerRoute.replace('/2.21/', '/2.22/')
const developerRouteWithLanguage222 = `/en${developerRoute222}` const developerRouteWithLanguage222 = `/en${developerRoute222}`
allRedirects[developerRoute222] = newPath222 allRedirects[developerRoute222] = newPath222
@@ -88,13 +84,11 @@ module.exports = async function precompileRedirects (pages) {
// given a developer route like `/v3/gists/comments`, // given a developer route like `/v3/gists/comments`,
// add a veriation like `/free-pro-team@latest/v3/gists/comments`; // add a veriation like `/free-pro-team@latest/v3/gists/comments`;
// again, we need to do this because all links in content get rewritten // again, we need to do this because all links in content get rewritten
if (process.env.FEATURE_NEW_VERSIONS) { if (!developerRoute.startsWith('/enterprise/')) {
if (!developerRoute.startsWith('/enterprise/')) { const developerRouteWithVersion = path.join(nonEnterpriseDefaultVersion, developerRoute)
const developerRouteWithVersion = path.join(nonEnterpriseDefaultVersion, developerRoute) const developerRouteWithVersionAndLanguage = `/en/${developerRouteWithVersion}`
const developerRouteWithVersionAndLanguage = `/en/${developerRouteWithVersion}` allRedirects[developerRouteWithVersion] = newPath
allRedirects[developerRouteWithVersion] = newPath allRedirects[developerRouteWithVersionAndLanguage] = newPath
allRedirects[developerRouteWithVersionAndLanguage] = newPath
}
} }
}) })

View File

@@ -1,7 +1,3 @@
const versionsProp = process.env.FEATURE_NEW_VERSIONS
? 'versions'
: 'productVersions'
module.exports = function removeDeprecatedFrontmatter (data, devCheckout, versionToDeprecate, nextOldestVersion) { module.exports = function removeDeprecatedFrontmatter (data, devCheckout, versionToDeprecate, nextOldestVersion) {
// there are currently different frontmatter conventions for developer docs vs. help docs // there are currently different frontmatter conventions for developer docs vs. help docs
if (devCheckout) { if (devCheckout) {
@@ -16,12 +12,12 @@ module.exports = function removeDeprecatedFrontmatter (data, devCheckout, versio
} }
} else { } else {
// skip files with no versions or Enterprise versions frontmatter // skip files with no versions or Enterprise versions frontmatter
if (!data[versionsProp]) return data if (!data.versions) return data
if (!data[versionsProp].enterprise) return data if (!data.versions.enterprise) return data
// change frontmatter like enterprise: '>=2.13' to enterprise: '*' // change frontmatter like enterprise: '>=2.13' to enterprise: '*'
if (data[versionsProp].enterprise === `>=${versionToDeprecate}` || data[versionsProp].enterprise === `>=${nextOldestVersion}`) { if (data.versions.enterprise === `>=${versionToDeprecate}` || data.versions.enterprise === `>=${nextOldestVersion}`) {
data[versionsProp].enterprise = '*' data.versions.enterprise = '*'
} }
} }

View File

@@ -1,29 +1,29 @@
const latestEnterpriseVersion = require('./enterprise-server-releases').latest const latestEnterpriseVersion = require('./enterprise-server-releases').latest
const nonEnterpriseDefaultVersion = require('./non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('./non-enterprise-default-version')
const { getOldVersionFromNewVersion } = require('./old-versions-utils') const { getOldVersionFromNewVersion } = require('./old-versions-utils')
const s3BasePath = 'https://github-images.s3.amazonaws.com'
// rewrite asset paths to s3 if it's a dotcom article on any GHE version // This module rewrites asset paths on Enterprise versions to S3 paths.
// or if it's an admin article on any GHE version EXCEPT latest version // Source example: /assets/images/foo.png
// Rewritten: https://github-images.s3.amazonaws.com/enterprise/2.20/assets/images/foo.png
// The one exception is Admin pages on the latest GHES release.
module.exports = function rewriteAssetPathsToS3 ($, version, relativePath) { module.exports = function rewriteAssetPathsToS3 ($, version, relativePath) {
let oldVersion // if the current version is non-enterprise, do not rewrite
if (process.env.FEATURE_NEW_VERSIONS) { if (version === nonEnterpriseDefaultVersion) return
if (version === nonEnterpriseDefaultVersion) return
// get 2.22 from enterprise-server@2.22 // get 2.22 from enterprise-server@2.22
oldVersion = getOldVersionFromNewVersion(version) const oldVersion = getOldVersionFromNewVersion(version)
// relativePath starts with the product, like /admin/foo or /github/foo
const product = relativePath.split('/')[0] // the relativePath starts with the product, like /admin/foo or /github/foo
if (product === 'admin' && oldVersion === latestEnterpriseVersion) return const product = relativePath.split('/')[0]
} else {
if (version === 'dotcom') return // if this is an Admin page on the latest version, do not rewrite
if (relativePath.includes('enterprise/') && version === latestEnterpriseVersion) return if (product === 'admin' && oldVersion === latestEnterpriseVersion) return
oldVersion = version
}
const s3Path = 'https://github-images.s3.amazonaws.com'
$('img').each((i, el) => { $('img').each((i, el) => {
const src = $(el).attr('src') const src = $(el).attr('src')
if (!src.startsWith('/assets/images')) return if (!src.startsWith('/assets/images')) return
const newSrc = `${s3Path}/enterprise/${oldVersion}${src}` const newSrc = `${s3BasePath}/enterprise/${oldVersion}${src}`
if (src !== newSrc) $(el).attr('src', newSrc) if (src !== newSrc) $(el).attr('src', newSrc)
}) })
} }

View File

@@ -27,9 +27,7 @@ function getNewHref (link, languageCode, version) {
// If link is dotcom-only, just get the language code // If link is dotcom-only, just get the language code
// Otherwise, get the versioned path with language code // Otherwise, get the versioned path with language code
const newHref = link.hasClass('dotcom-only') const newHref = link.hasClass('dotcom-only')
? process.env.FEATURE_NEW_VERSIONS ? pathUtils.getVersionedPathWithLanguage(href, nonEnterpriseDefaultVersion, languageCode)
? pathUtils.getVersionedPathWithLanguage(href, nonEnterpriseDefaultVersion, languageCode)
: pathUtils.getPathWithLanguage(href, languageCode)
: pathUtils.getVersionedPathWithLanguage(href, version, languageCode) : pathUtils.getVersionedPathWithLanguage(href, version, languageCode)
if (href !== newHref) link.attr('href', newHref) if (href !== newHref) link.attr('href', newHref)

View File

@@ -5,14 +5,7 @@ const products = Object.values(require('../lib/all-products'))
const { getVersionedPathWithoutLanguage } = require('./path-utils') const { getVersionedPathWithoutLanguage } = require('./path-utils')
const languageCodes = Object.keys(require('./languages')) const languageCodes = Object.keys(require('./languages'))
const addTitlesToTree = require('./site-tree-titles') const addTitlesToTree = require('./site-tree-titles')
const allVersions = Object.keys(require('./all-versions'))
const allVersions = process.env.FEATURE_NEW_VERSIONS
? Object.keys(require('./all-versions'))
: require('./all-versions')
const versionsProp = process.env.FEATURE_NEW_VERSIONS
? 'versions'
: 'productVersions'
// This module builds a localized tree of every page on the site // This module builds a localized tree of every page on the site
// It includes single-source pages that have different variants // It includes single-source pages that have different variants
@@ -83,7 +76,7 @@ function buildCategoriesTree (tocItems, productHref, pages, redirects, version,
category.title = page.shortTitle || page.title category.title = page.shortTitle || page.title
if (!getApplicableVersions(page[versionsProp], page.fullPath).includes(version)) { if (!getApplicableVersions(page.versions, page.fullPath).includes(version)) {
return return
} }
@@ -135,7 +128,7 @@ function buildMaptopicsTree (tocItems, categoryHref, pages, redirects, version,
// if this is not a maptopic, return early // if this is not a maptopic, return early
if (!page.mapTopic) return if (!page.mapTopic) return
if (!getApplicableVersions(page[versionsProp], page.fullPath).includes(version)) { if (!getApplicableVersions(page.versions, page.fullPath).includes(version)) {
return return
} }
@@ -177,7 +170,7 @@ function buildArticlesTree (tocItems, categoryHref, pages, redirects, version, l
article.title = page.shortTitle || page.title article.title = page.shortTitle || page.title
if (!getApplicableVersions(page[versionsProp], page.fullPath).includes(version)) { if (!getApplicableVersions(page.versions, page.fullPath).includes(version)) {
return return
} }

View File

@@ -1,5 +1,5 @@
const path = require('path') const path = require('path')
const { getPathWithoutLanguage, getVersionedPathWithoutLanguage } = require('../lib/path-utils') const { getPathWithoutLanguage } = require('../lib/path-utils')
module.exports = async (req, res, next) => { module.exports = async (req, res, next) => {
req.context.breadcrumbs = {} req.context.breadcrumbs = {}
@@ -7,87 +7,29 @@ module.exports = async (req, res, next) => {
if (!req.context.page) return next() if (!req.context.page) return next()
if (req.context.page.relativePath === 'index.md') return next() if (req.context.page.relativePath === 'index.md') return next()
let pathParts, product, categoryPath const rawPath = getPathWithoutLanguage(req.path)
if (!process.env.FEATURE_NEW_VERSIONS) { const pathParts = rawPath.split('/')
if (req.context.page.relativePath === 'enterprise/index.md') return next()
pathParts = req.context.currentPathWithoutLanguage.split('/') // drop first '/'
pathParts.shift()
// remove first empty item // drop the version segment so pathParts now starts with /product
pathParts.shift() pathParts.shift()
let productPath const productPath = path.posix.join('/', req.context.currentProduct)
const product = req.context.siteTree[req.language][req.context.currentVersion].products[req.context.currentProduct]
// e.g., /github req.context.breadcrumbs.product = {
if (pathParts[0] !== 'enterprise') { href: path.posix.join('/', req.context.currentVersion, productPath),
productPath = path.posix.join('/', pathParts[0]) title: product.title
}
if (pathParts[0] === 'enterprise') {
// handling for /enterprise/version/admin
if (pathParts.includes('admin')) {
productPath = path.posix.join('/', ...pathParts.slice(0, 3))
// remove /enterprise/version so that path starts with /admin
pathParts.splice(0, 2)
}
// handling for /enterprise/version/user/product
if (pathParts.includes('user')) {
productPath = path.posix.join('/', ...pathParts.slice(0, 4))
// remove /enterprise/version/user so that path starts with /product
pathParts.splice(0, 3)
}
}
// turn /product paths into /enterprise/version/user/product paths and vice versa
productPath = getVersionedPathWithoutLanguage(productPath, req.context.currentVersion)
product = req.context.siteTree[req.language][req.context.currentVersion].products[req.context.currentProduct.id]
// GitHub.com is the only product with a breadcrumbs-specific Enterprise title
// in the sidebar, the product title is `GitHub.com` in all versions
// in the breadcrumbs, the product title is either `GitHub.com` or `GitHub Enterprise Server`
const productTitle = product.title === 'GitHub.com' && req.context.currentVersion !== 'dotcom'
? 'GitHub Enterprise Server'
: product.title
req.context.breadcrumbs.product = {
href: productPath,
title: productTitle
}
if (!pathParts[1]) return next()
// get category path
// e.g., /github/getting-started-with-github
categoryPath = path.posix.join(productPath, pathParts[1])
} }
if (process.env.FEATURE_NEW_VERSIONS) { if (!pathParts[1]) return next()
const rawPath = getPathWithoutLanguage(req.path)
pathParts = rawPath.split('/')
// drop first '/' // get category path
pathParts.shift() // e.g., `getting-started-with-github` in /free-pro-team@latest/github/getting-started-with-github
// or /enterprise-server@2.21/github/getting-started-with-github
// drop the version segment so pathParts now starts with /product const categoryPath = path.posix.join('/', req.context.currentVersion, productPath, pathParts[1])
pathParts.shift()
const productPath = path.posix.join('/', req.context.currentProduct)
product = req.context.siteTree[req.language][req.context.currentVersion].products[req.context.currentProduct]
req.context.breadcrumbs.product = {
href: path.posix.join('/', req.context.currentVersion, productPath),
title: product.title
}
if (!pathParts[1]) return next()
// get category path
// e.g., `getting-started-with-github` in /free-pro-team@latest/github/getting-started-with-github
// or /enterprise-server@2.21/github/getting-started-with-github
categoryPath = path.posix.join('/', req.context.currentVersion, productPath, pathParts[1])
}
const category = product.categories[categoryPath] const category = product.categories[categoryPath]

View File

@@ -5,7 +5,6 @@ const allProducts = require('../lib/all-products')
const activeProducts = Object.values(allProducts).filter(product => !product.wip) const activeProducts = Object.values(allProducts).filter(product => !product.wip)
const { getVersionStringFromPath, getProductStringFromPath, getPathWithoutLanguage } = require('../lib/path-utils') const { getVersionStringFromPath, getProductStringFromPath, getPathWithoutLanguage } = require('../lib/path-utils')
const productNames = require('../lib/product-names') const productNames = require('../lib/product-names')
const patterns = require('../lib/patterns')
const warmServer = require('../lib/warm-server') const warmServer = require('../lib/warm-server')
const featureFlags = Object.keys(require('../feature-flags')) const featureFlags = Object.keys(require('../feature-flags'))
@@ -25,31 +24,19 @@ module.exports = async function contextualize (req, res, next) {
// define each context property explicitly for code-search friendliness // define each context property explicitly for code-search friendliness
// e.g. searches for "req.context.page" will include results from this file // e.g. searches for "req.context.page" will include results from this file
req.context.currentLanguage = req.language req.context.currentLanguage = req.language
if (process.env.FEATURE_NEW_VERSIONS) { req.context.currentVersion = getVersionStringFromPath(req.path)
req.context.currentVersion = getVersionStringFromPath(req.path) req.context.currentProduct = getProductStringFromPath(req.path)
req.context.currentProduct = getProductStringFromPath(req.path) req.context.allProducts = allProducts
req.context.allProducts = allProducts req.context.activeProducts = activeProducts
req.context.activeProducts = activeProducts req.context.allVersions = allVersions
req.context.allVersions = allVersions req.context.currentPathWithoutLanguage = getPathWithoutLanguage(req.path)
req.context.currentPathWithoutLanguage = getPathWithoutLanguage(req.path)
}
if (!process.env.FEATURE_NEW_VERSIONS) {
req.context.currentVersion = getVersion(req.path)
req.context.currentPathWithoutLanguage = getPathWithoutLanguage(req.path).replace(patterns.getEnterpriseVersionlessPath, '$1/')
}
req.context.currentPath = req.path req.context.currentPath = req.path
req.context.query = req.query req.context.query = req.query
req.context.languages = languages req.context.languages = languages
req.context.earlyAccessPaths = earlyAccessPaths req.context.earlyAccessPaths = earlyAccessPaths
req.context.enterpriseVersions = enterpriseServerReleases req.context.enterpriseVersions = enterpriseServerReleases
req.context.productNames = productNames req.context.productNames = productNames
if (process.env.FEATURE_NEW_VERSIONS) { req.context.enterpriseServerReleases = enterpriseServerReleases
req.context.enterpriseServerReleases = enterpriseServerReleases
}
if (!process.env.FEATURE_NEW_VERSIONS) {
req.context.enterpriseVersions = enterpriseServerReleases
req.context.productNames = productNames
}
req.context.redirects = redirects req.context.redirects = redirects
req.context.site = site[req.language].site req.context.site = site[req.language].site
req.context.siteTree = siteTree req.context.siteTree = siteTree
@@ -57,15 +44,3 @@ module.exports = async function contextualize (req, res, next) {
return next() return next()
} }
// infer the version from the request path
// /en/articles/foo -> dotcom
// /en/enterprise/2.14/user/articles/foo -> 2.14
// /en/enterprise/user/articles/foo -> latest GHES version
function getVersion (requestPath) {
const versionNumber = requestPath.match(patterns.getEnterpriseVersionNumber)
return patterns.enterprise.test(requestPath)
? versionNumber ? versionNumber[1] : enterpriseServerReleases.latest
: 'dotcom'
}

View File

@@ -14,9 +14,7 @@ module.exports = async (req, res, next) => {
if (!req.path.includes('/graphql/')) return next() if (!req.path.includes('/graphql/')) return next()
// TODO need to update this to the new versions in coordination with the updater scripts // TODO need to update this to the new versions in coordination with the updater scripts
const currentOldVersion = process.env.FEATURE_NEW_VERSIONS const currentOldVersion = getOldVersionFromNewVersion(req.context.currentVersion)
? getOldVersionFromNewVersion(req.context.currentVersion)
: req.context.currentVersion
req.context.graphql = { req.context.graphql = {
schemaForCurrentVersion: require(`../../lib/graphql/static/schema-${currentOldVersion}`), schemaForCurrentVersion: require(`../../lib/graphql/static/schema-${currentOldVersion}`),

View File

@@ -6,9 +6,7 @@ module.exports = async function (req, res, next) {
req.context.rest = rest req.context.rest = rest
// TODO need to update this to the new versions in coordination with the updater scripts // TODO need to update this to the new versions in coordination with the updater scripts
const currentOldVersion = process.env.FEATURE_NEW_VERSIONS const currentOldVersion = getOldVersionFromNewVersion(req.context.currentVersion)
? getOldVersionFromNewVersion(req.context.currentVersion)
: req.context.currentVersion
// link to include in `Works with GitHub Apps` notes // link to include in `Works with GitHub Apps` notes
// e.g. /ja/rest/reference/apps or /en/enterprise/2.20/user/rest/reference/apps // e.g. /ja/rest/reference/apps or /en/enterprise/2.20/user/rest/reference/apps

View File

@@ -5,9 +5,7 @@ const { getOldVersionFromNewVersion } = require('../../lib/old-versions-utils')
module.exports = async (req, res, next) => { module.exports = async (req, res, next) => {
// TODO need to update this to the new versions in coordination with the updater scripts // TODO need to update this to the new versions in coordination with the updater scripts
const currentOldVersion = process.env.FEATURE_NEW_VERSIONS const currentOldVersion = getOldVersionFromNewVersion(req.context.currentVersion)
? getOldVersionFromNewVersion(req.context.currentVersion)
: req.context.currentVersion
const webhookPayloadsForCurrentVersion = webhookPayloads[currentOldVersion] const webhookPayloadsForCurrentVersion = webhookPayloads[currentOldVersion]

View File

@@ -30,9 +30,7 @@ async function getLinkData (rawLinks, context) {
const linkedPage = findPage(href, context.pages, context.redirects, context.currentLanguage) const linkedPage = findPage(href, context.pages, context.redirects, context.currentLanguage)
if (!linkedPage) continue if (!linkedPage) continue
const applicableVersions = process.env.FEATURE_NEW_VERSIONS const applicableVersions = getApplicableVersions(linkedPage.versions, linkedPage.fullPath)
? getApplicableVersions(linkedPage.versions, linkedPage.fullPath)
: getApplicableVersions(linkedPage.productVersions, linkedPage.fullPath)
// skip link if this is not the homepage and the link's versions do not include the current version // skip link if this is not the homepage and the link's versions do not include the current version
if (context.currentVersion !== 'homepage' && !applicableVersions.includes(context.currentVersion)) continue if (context.currentVersion !== 'homepage' && !applicableVersions.includes(context.currentVersion)) continue

View File

@@ -20,7 +20,6 @@ module.exports = function (app) {
app.use(require('./redirects/help-to-docs')) app.use(require('./redirects/help-to-docs'))
app.use(require('./set-fastly-cache-headers')) app.use(require('./set-fastly-cache-headers'))
app.use(require('./handle-invalid-paths')) app.use(require('./handle-invalid-paths'))
if (!process.env.FEATURE_NEW_VERSIONS) app.use(require('./enterprise-homepage'))
app.use(require('./loaderio-verification')) app.use(require('./loaderio-verification'))
app.use(require('./cors')) app.use(require('./cors'))
app.use(require('./csp')) app.use(require('./csp'))
@@ -41,13 +40,11 @@ module.exports = function (app) {
app.use(require('./early-access-paths')) app.use(require('./early-access-paths'))
app.use(require('./early-access-proxy')) app.use(require('./early-access-proxy'))
app.use(require('./find-page')) app.use(require('./find-page'))
if (!process.env.FEATURE_NEW_VERSIONS) app.use(require('./products'))
app.use(require('./notices')) app.use(require('./notices'))
app.use(require('./archived-enterprise-versions')) app.use(require('./archived-enterprise-versions'))
app.use(require('./archived-enterprise-versions-assets')) app.use(require('./archived-enterprise-versions-assets'))
app.use('/assets', express.static('assets')) app.use('/assets', express.static('assets'))
app.use('/public', express.static('data/graphql')) app.use('/public', express.static('data/graphql'))
if (!process.env.FEATURE_NEW_VERSIONS) app.use(require('./homepages'))
app.use(require('./redirects/language-code-redirects')) app.use(require('./redirects/language-code-redirects'))
// redirects need to be handled before the contextualizers // redirects need to be handled before the contextualizers
app.use(require('./redirects/handle-redirects')) app.use(require('./redirects/handle-redirects'))

View File

@@ -22,9 +22,7 @@ module.exports = (req, res, next) => {
language.wip language.wip
) )
const currentProduct = process.env.FEATURE_NEW_VERSIONS const currentProduct = req.context.allProducts[req.context.currentProduct]
? req.context.allProducts[req.context.currentProduct]
: req.context.currentProduct
// if this is the homepage and no product is chosen yet, return early // if this is the homepage and no product is chosen yet, return early
if (!currentProduct) return next() if (!currentProduct) return next()

View File

@@ -1,6 +1,5 @@
#!/usr/bin/env node #!/usr/bin/env node
require('../lib/feature-flags')
const path = require('path') const path = require('path')
const assert = require('assert') const assert = require('assert')
const patterns = require('../lib/patterns') const patterns = require('../lib/patterns')

View File

@@ -1,6 +1,5 @@
#!/usr/bin/env node #!/usr/bin/env node
require('../../lib/feature-flags')
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const mkdirp = require('mkdirp').sync const mkdirp = require('mkdirp').sync
@@ -12,26 +11,23 @@ const graphqlStaticDir = path.join(process.cwd(), 'lib/graphql/static')
const { getContents } = require('../../lib/git-utils') const { getContents } = require('../../lib/git-utils')
const dataFilenames = require('./utils/data-filenames') const dataFilenames = require('./utils/data-filenames')
const { oldVersions } = require('../../lib/old-versions-utils') const { oldVersions } = require('../../lib/old-versions-utils')
const allVersions = require('../../lib/all-versions')
const processPreviews = require('./utils/process-previews') const processPreviews = require('./utils/process-previews')
const processUpcomingChanges = require('./utils/process-upcoming-changes') const processUpcomingChanges = require('./utils/process-upcoming-changes')
const processSchemas = require('./utils/process-schemas') const processSchemas = require('./utils/process-schemas')
const prerenderObjects = require('./utils/prerender-objects') const prerenderObjects = require('./utils/prerender-objects')
// TODO need to update this to the new versions
// for now, fall back to the old versions for use in schema filenames
const versions = process.env.FEATURE_NEW_VERSIONS ? oldVersions : allVersions
// TODO this step is only required as long as we support GHE versions *OLDER THAN* 2.21 // TODO this step is only required as long as we support GHE versions *OLDER THAN* 2.21
// as soon as 2.20 is deprecated on 2021-02-11, we can remove all graphql-ruby filtering // as soon as 2.20 is deprecated on 2021-02-11, we can remove all graphql-ruby filtering
const removeHiddenMembersScript = path.join(__dirname, './utils/remove-hidden-schema-members.rb') const removeHiddenMembersScript = path.join(__dirname, './utils/remove-hidden-schema-members.rb')
// optionally build only 'dotcom' or any GHE version by passing the number ('2.20') // optionally build only 'dotcom' or any GHE version by passing the number ('2.20')
let versionsToBuild = versions // TODO need to update this to the new versions
// for now, fall back to the old versions for use in schema filenames
let versionsToBuild = oldVersions
if (process.argv.length === 3) { if (process.argv.length === 3) {
const version = process.argv[2] const version = process.argv[2]
assert(versions.includes(version), `'${version}' is not valid! must be one of: ${versions}`) assert(oldVersions.includes(version), `'${version}' is not valid! must be one of: ${oldVersions}`)
versionsToBuild = [version] versionsToBuild = [version]
} }

View File

@@ -7,7 +7,6 @@
// //
// [end-readme] // [end-readme]
require('../lib/feature-flags')
require('make-promises-safe') require('make-promises-safe')
main() main()

View File

@@ -1,20 +1,11 @@
/* global page */ /* global page */
require('../../lib/feature-flags')
const sleep = require('await-sleep') const sleep = require('await-sleep')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
describe('homepage', () => { describe('homepage', () => {
testFeatureNewVersions('should be titled "GitHub Documentation"', async () => { test('should be titled "GitHub Documentation"', async () => {
await page.goto('http://localhost:4001') await page.goto('http://localhost:4001')
await expect(page.title()).resolves.toMatch('GitHub Documentation') await expect(page.title()).resolves.toMatch('GitHub Documentation')
}) })
testFeatureOldVersions('should be titled "GitHub.com Help"', async () => {
await page.goto('http://localhost:4001')
await expect(page.title()).resolves.toMatch('GitHub.com Help')
})
}) })
describe('algolia browser search', () => { describe('algolia browser search', () => {

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const path = require('path') const path = require('path')
const fs = require('fs') const fs = require('fs')
const walk = require('walk-sync') const walk = require('walk-sync')

View File

@@ -1,12 +1,8 @@
require('../../lib/feature-flags')
const { getDOM, getJSON } = require('../helpers') const { getDOM, getJSON } = require('../helpers')
const enterpriseServerReleases = require('../../lib/enterprise-server-releases') const enterpriseServerReleases = require('../../lib/enterprise-server-releases')
const japaneseCharacters = require('japanese-characters') const japaneseCharacters = require('japanese-characters')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
describe('gettingStartedLinks and popularLinks', () => { describe('gettingStartedLinks and popularLinks', () => {
jest.setTimeout(3 * 60 * 1000) jest.setTimeout(3 * 60 * 1000)
@@ -16,7 +12,7 @@ describe('gettingStartedLinks and popularLinks', () => {
expect($('.featured-links')).toHaveLength(0) expect($('.featured-links')).toHaveLength(0)
}) })
testFeatureNewVersions('landing page intro links have expected properties', async () => { test('landing page intro links have expected properties', async () => {
const $ = await getDOM('/en') const $ = await getDOM('/en')
const $featuredLinks = $('.featured-links a') const $featuredLinks = $('.featured-links a')
expect($featuredLinks).toHaveLength(9) expect($featuredLinks).toHaveLength(9)
@@ -29,19 +25,6 @@ describe('gettingStartedLinks and popularLinks', () => {
expect($featuredLinks.eq(8).children('p').text().startsWith('You can create a website')).toBe(true) expect($featuredLinks.eq(8).children('p').text().startsWith('You can create a website')).toBe(true)
}) })
testFeatureOldVersions('landing page intro links have expected properties', async () => {
const $ = await getDOM('/en')
const $featuredLinks = $('.featured-links a')
expect($featuredLinks).toHaveLength(9)
expect($featuredLinks.eq(0).attr('href')).toBe('/en/github/getting-started-with-github/set-up-git')
expect($featuredLinks.eq(0).children('h4').text().startsWith('Set up Git')).toBe(true)
expect($featuredLinks.eq(0).children('p').text().startsWith('At the heart of GitHub')).toBe(true)
expect($featuredLinks.eq(8).attr('href')).toBe('/en/github/working-with-github-pages')
expect($featuredLinks.eq(8).children('h4').text().startsWith('GitHub Pages')).toBe(true)
expect($featuredLinks.eq(8).children('p').text().startsWith('You can create a website')).toBe(true)
})
test('localized intro links link to localized pages', async () => { test('localized intro links link to localized pages', async () => {
const $ = await getDOM('/ja') const $ = await getDOM('/ja')
const $featuredLinks = $('.featured-links a') const $featuredLinks = $('.featured-links a')
@@ -51,7 +34,7 @@ describe('gettingStartedLinks and popularLinks', () => {
expect(japaneseCharacters.presentIn($featuredLinks.eq(0).children('p').text())).toBe(true) expect(japaneseCharacters.presentIn($featuredLinks.eq(0).children('p').text())).toBe(true)
}) })
testFeatureNewVersions('Enterprise user intro links have expected values', async () => { test('Enterprise user intro links have expected values', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/user/insights`) const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/user/insights`)
const $featuredLinks = $('.featured-links a') const $featuredLinks = $('.featured-links a')
expect($featuredLinks).toHaveLength(6) expect($featuredLinks).toHaveLength(6)
@@ -60,15 +43,6 @@ describe('gettingStartedLinks and popularLinks', () => {
expect($featuredLinks.eq(0).children('p').text().startsWith('GitHub Insights provides metrics')).toBe(true) expect($featuredLinks.eq(0).children('p').text().startsWith('GitHub Insights provides metrics')).toBe(true)
}) })
testFeatureOldVersions('Enterprise user intro links have expected values', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/user/insights`)
const $featuredLinks = $('.featured-links a')
expect($featuredLinks).toHaveLength(6)
expect($featuredLinks.eq(0).attr('href')).toBe(`/en/enterprise/${enterpriseServerReleases.latest}/user/insights/installing-and-configuring-github-insights/about-github-insights`)
expect($featuredLinks.eq(0).children('h4').text().startsWith('About GitHub Insights')).toBe(true)
expect($featuredLinks.eq(0).children('p').text().startsWith('GitHub Insights provides metrics')).toBe(true)
})
test('featured links respect versioning', async () => { test('featured links respect versioning', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/user/packages`) const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/user/packages`)
const $featuredLinks = $('.featured-links a') const $featuredLinks = $('.featured-links a')
@@ -80,7 +54,7 @@ describe('gettingStartedLinks and popularLinks', () => {
}) })
describe('context.page object', () => { describe('context.page object', () => {
testFeatureNewVersions('returns modified array of links', async () => { test('returns modified array of links', async () => {
const gettingStartedLinks = await getJSON('/en?json=gettingStartedLinks') const gettingStartedLinks = await getJSON('/en?json=gettingStartedLinks')
const expectedFirstLink = { const expectedFirstLink = {
href: `/en/${nonEnterpriseDefaultVersion}/github/getting-started-with-github/set-up-git`, href: `/en/${nonEnterpriseDefaultVersion}/github/getting-started-with-github/set-up-git`,
@@ -91,17 +65,6 @@ describe('gettingStartedLinks and popularLinks', () => {
expect(gettingStartedLinks[0].intro.startsWith('At the heart of GitHub')).toBe(true) expect(gettingStartedLinks[0].intro.startsWith('At the heart of GitHub')).toBe(true)
}) })
testFeatureOldVersions('returns modified array of links', async () => {
const gettingStartedLinks = await getJSON('/en?json=gettingStartedLinks')
const expectedFirstLink = {
href: '/en/github/getting-started-with-github/set-up-git',
title: 'Set up Git'
}
expect(gettingStartedLinks[0].href).toEqual(expectedFirstLink.href)
expect(gettingStartedLinks[0].title).toEqual(expectedFirstLink.title)
expect(gettingStartedLinks[0].intro.startsWith('At the heart of GitHub')).toBe(true)
})
test('returns raw array of links on the page object', async () => { test('returns raw array of links on the page object', async () => {
const rawGettingStartedLinks = await getJSON('/en?json=page.rawGettingStartedLinks') const rawGettingStartedLinks = await getJSON('/en?json=page.rawGettingStartedLinks')
expect(rawGettingStartedLinks[0]).toEqual('/github/getting-started-with-github/set-up-git') expect(rawGettingStartedLinks[0]).toEqual('/github/getting-started-with-github/set-up-git')

View File

@@ -3,14 +3,14 @@ const upcomingChangesJson = require('../../lib/graphql/static/upcoming-changes')
const prerenderedObjectsJson = require('../../lib/graphql/static/prerendered-objects') const prerenderedObjectsJson = require('../../lib/graphql/static/prerendered-objects')
const { schemaValidator, previewsValidator, upcomingChangesValidator } = require('../../lib/graphql/validator') const { schemaValidator, previewsValidator, upcomingChangesValidator } = require('../../lib/graphql/validator')
const revalidator = require('revalidator') const revalidator = require('revalidator')
const allVersions = require('../../lib/all-versions') const { oldVersions } = require('../../lib/old-versions-utils')
const graphqlTypes = require('../../lib/graphql/types').map(t => t.kind) const graphqlTypes = require('../../lib/graphql/types').map(t => t.kind)
describe('graphql json files', () => { describe('graphql json files', () => {
jest.setTimeout(3 * 60 * 1000) jest.setTimeout(3 * 60 * 1000)
test('static files have versions as top-level keys', () => { test('static files have versions as top-level keys', () => {
allVersions.forEach(version => { oldVersions.forEach(version => {
expect(version in previewsJson).toBe(true) expect(version in previewsJson).toBe(true)
expect(version in upcomingChangesJson).toBe(true) expect(version in upcomingChangesJson).toBe(true)
expect(version in prerenderedObjectsJson).toBe(true) expect(version in prerenderedObjectsJson).toBe(true)
@@ -18,7 +18,7 @@ describe('graphql json files', () => {
}) })
test('schemas object validation', () => { test('schemas object validation', () => {
allVersions.forEach(version => { oldVersions.forEach(version => {
const schemaJsonPerVersion = require(`../../lib/graphql/static/schema-${version}`) const schemaJsonPerVersion = require(`../../lib/graphql/static/schema-${version}`)
// all graphql types are arrays except for queries // all graphql types are arrays except for queries
graphqlTypes graphqlTypes
@@ -48,7 +48,7 @@ describe('graphql json files', () => {
}) })
test('previews object validation', () => { test('previews object validation', () => {
allVersions.forEach(version => { oldVersions.forEach(version => {
previewsJson[version].forEach(previewObj => { previewsJson[version].forEach(previewObj => {
const { valid, errors } = revalidator.validate(previewObj, previewsValidator) const { valid, errors } = revalidator.validate(previewObj, previewsValidator)
const errorMessage = JSON.stringify(errors, null, 2) const errorMessage = JSON.stringify(errors, null, 2)
@@ -58,7 +58,7 @@ describe('graphql json files', () => {
}) })
test('upcoming changes object validation', () => { test('upcoming changes object validation', () => {
allVersions.forEach(version => { oldVersions.forEach(version => {
Object.values(upcomingChangesJson[version]).forEach(changes => { Object.values(upcomingChangesJson[version]).forEach(changes => {
// each object value is an array of changes // each object value is an array of changes
changes.forEach(changeObj => { changes.forEach(changeObj => {
@@ -71,7 +71,7 @@ describe('graphql json files', () => {
}) })
test('prerendered objects validation', () => { test('prerendered objects validation', () => {
allVersions.forEach(version => { oldVersions.forEach(version => {
// shape of prerenderedObject: { // shape of prerenderedObject: {
// html: <div>foo</div>, // html: <div>foo</div>,
// miniToc: {contents: '<a>bar</a>', headingLevel: N, indentationLevel: N} // miniToc: {contents: '<a>bar</a>', headingLevel: N, indentationLevel: N}

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const path = require('path') const path = require('path')
const fs = require('fs') const fs = require('fs')
const walk = require('walk-sync') const walk = require('walk-sync')
@@ -15,9 +14,6 @@ const variablesDir = path.join(rootDir, 'data/variables')
const languageCodes = Object.keys(languages) const languageCodes = Object.keys(languages)
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
// WARNING: Complicated RegExp below! // WARNING: Complicated RegExp below!
// //
// Things matched by this RegExp: // Things matched by this RegExp:
@@ -128,7 +124,7 @@ describe('lint-files', () => {
content = bodyContent content = bodyContent
}) })
testFeatureNewVersions('relative URLs must start with "/"', async () => { test('relative URLs must start with "/"', async () => {
const initialMatches = (content.match(relativeArticleLinkRegex) || []) const initialMatches = (content.match(relativeArticleLinkRegex) || [])
// Filter out some very specific false positive matches // Filter out some very specific false positive matches
@@ -180,65 +176,13 @@ describe('lint-files', () => {
expect(matches.length, errorMessage).toBe(0) expect(matches.length, errorMessage).toBe(0)
}) })
testFeatureOldVersions('relative URLs must start with "/"', async () => {
const initialMatches = (content.match(relativeArticleLinkRegex) || [])
// Filter out some very specific false positive matches
const matches = initialMatches.filter(match => {
if (markdownRelPath === 'content/github/enforcing-best-practices-with-github-policies/overview.md') {
if (match === '[A-Z]([a-z]|-)') {
return false
}
} else if (markdownRelPath === 'content/github/enforcing-best-practices-with-github-policies/constraints.md') {
if (match === '[a-z]([a-z]|-)') {
return false
}
} else if (markdownRelPath === 'content/github/building-a-strong-community/editing-wiki-content.md') {
if (match === '[Link Text](full-URL-of-wiki-page)') {
return false
}
} else if (markdownRelPath === 'content/enterprise/admin/user-management/configuring-email-for-notifications.md') {
if (/^\[\d+\]: (?:connect|disconnect|[0-9A-F]+:)\s*$/.test(match)) {
return false
}
} else if (markdownRelPath === 'content/actions/hosting-your-own-runners/monitoring-and-troubleshooting-self-hosted-runners.md') {
if (/^\[\d+\]: (?:Starting|Started|√|\d{4}-\d{2}-\d{2})\s*$/.test(match)) {
return false
}
} else if (markdownRelPath === 'content/github/finding-security-vulnerabilities-and-errors-in-your-code/sarif-support-for-code-scanning.md') {
if (/^\[(?:here|ruleIndex|ruleID)\]\(\d+\)\s*$/.test(match)) {
return false
}
} else if (markdownRelPath === 'content/github/building-a-strong-community/manually-creating-a-single-issue-template-for-your-repository.md') {
if (match === '[DATE]: [FEATURE ') {
return false
}
} else if (markdownRelPath === 'content/rest/overview/libraries.md') {
if (
match === '[pithub-github] ([CPAN][pithub-cpan])' ||
match === '[net-github-github] ([CPAN][net-github-cpan])'
) {
return false
}
} else if (markdownRelPath === 'data/reusables/repositories/relative-links.md') {
if (match === '[Contribution guidelines for this project](docs/CONTRIBUTING.md)') {
return false
}
}
return true
})
const errorMessage = formatLinkError(relativeArticleLinkErrorText, matches)
expect(matches.length, errorMessage).toBe(0)
})
test('URLs must not contain a hard-coded language code', async () => { test('URLs must not contain a hard-coded language code', async () => {
const matches = (content.match(languageLinkRegex) || []) const matches = (content.match(languageLinkRegex) || [])
const errorMessage = formatLinkError(languageLinkErrorText, matches) const errorMessage = formatLinkError(languageLinkErrorText, matches)
expect(matches.length, errorMessage).toBe(0) expect(matches.length, errorMessage).toBe(0)
}) })
testFeatureNewVersions('URLs must not contain a hard-coded version number', async () => { test('URLs must not contain a hard-coded version number', async () => {
const initialMatches = (content.match(versionLinkRegEx) || []) const initialMatches = (content.match(versionLinkRegEx) || [])
// Filter out some very specific false positive matches // Filter out some very specific false positive matches
@@ -253,21 +197,6 @@ describe('lint-files', () => {
expect(matches.length, errorMessage).toBe(0) expect(matches.length, errorMessage).toBe(0)
}) })
testFeatureOldVersions('URLs must not contain a hard-coded version number', async () => {
const initialMatches = (content.match(versionLinkRegEx) || [])
// Filter out some very specific false positive matches
const matches = initialMatches.filter(match => {
if (markdownRelPath === 'content/enterprise/admin/enterprise-management/migrating-from-github-enterprise-1110x-to-2123.md') {
return false
}
return true
})
const errorMessage = formatLinkError(versionLinkErrorText, matches)
expect(matches.length, errorMessage).toBe(0)
})
test('URLs must not contain a hard-coded domain name', async () => { test('URLs must not contain a hard-coded domain name', async () => {
const matches = (content.match(domainLinkRegex) || []) const matches = (content.match(domainLinkRegex) || [])
const errorMessage = formatLinkError(domainLinkErrorText, matches) const errorMessage = formatLinkError(domainLinkErrorText, matches)

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const { isEqual, get, uniqBy } = require('lodash') const { isEqual, get, uniqBy } = require('lodash')
const loadSiteData = require('../../lib/site-data') const loadSiteData = require('../../lib/site-data')
const loadPages = require('../../lib/pages') const loadPages = require('../../lib/pages')

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const { get, isPlainObject, has } = require('lodash') const { get, isPlainObject, has } = require('lodash')

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const revalidator = require('revalidator') const revalidator = require('revalidator')
const schema = require('../../lib/site-tree-schema') const schema = require('../../lib/site-tree-schema')
const latestEnterpriseRelease = require('../../lib/enterprise-server-releases').latest const latestEnterpriseRelease = require('../../lib/enterprise-server-releases').latest
@@ -7,9 +6,6 @@ const flat = require('flat')
const japaneseCharacters = require('japanese-characters') const japaneseCharacters = require('japanese-characters')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
describe('siteTree', () => { describe('siteTree', () => {
jest.setTimeout(3 * 60 * 1000) jest.setTimeout(3 * 60 * 1000)
@@ -25,34 +21,21 @@ describe('siteTree', () => {
expect('ja' in siteTree).toBe(true) expect('ja' in siteTree).toBe(true)
}) })
testFeatureNewVersions('object order', () => { test('object order', () => {
expect(Object.keys(siteTree)[0]).toBe('en') expect(Object.keys(siteTree)[0]).toBe('en')
expect(Object.keys(siteTree.en)[0]).toBe(nonEnterpriseDefaultVersion) expect(Object.keys(siteTree.en)[0]).toBe(nonEnterpriseDefaultVersion)
expect(Object.keys(siteTree.en[nonEnterpriseDefaultVersion].products.github.categories)[0]).toBe(`/${nonEnterpriseDefaultVersion}/github/getting-started-with-github`) expect(Object.keys(siteTree.en[nonEnterpriseDefaultVersion].products.github.categories)[0]).toBe(`/${nonEnterpriseDefaultVersion}/github/getting-started-with-github`)
}) })
testFeatureOldVersions('object order', () => { test('object structure', () => {
expect(Object.keys(siteTree)[0]).toBe('en')
expect(Object.keys(siteTree.en)[0]).toBe('dotcom')
expect(Object.keys(siteTree.en.dotcom.products.github.categories)[0]).toBe('/github/getting-started-with-github')
})
testFeatureNewVersions('object structure', () => {
expect(nonEnterpriseDefaultVersion in siteTree.en).toBe(true) expect(nonEnterpriseDefaultVersion in siteTree.en).toBe(true)
expect(`enterprise-server@${latestEnterpriseRelease}` in siteTree.en).toBe(true) expect(`enterprise-server@${latestEnterpriseRelease}` in siteTree.en).toBe(true)
expect(flatTree[`en.${nonEnterpriseDefaultVersion}.products.github.href`]).toBe(`/${nonEnterpriseDefaultVersion}/github`) expect(flatTree[`en.${nonEnterpriseDefaultVersion}.products.github.href`]).toBe(`/${nonEnterpriseDefaultVersion}/github`)
expect(flatTree[`en.${nonEnterpriseDefaultVersion}.products.github.categories./${nonEnterpriseDefaultVersion}/github/getting-started-with-github.href`]).toBe(`/${nonEnterpriseDefaultVersion}/github/getting-started-with-github`) expect(flatTree[`en.${nonEnterpriseDefaultVersion}.products.github.categories./${nonEnterpriseDefaultVersion}/github/getting-started-with-github.href`]).toBe(`/${nonEnterpriseDefaultVersion}/github/getting-started-with-github`)
}) })
testFeatureOldVersions('object structure', () => {
expect('dotcom' in siteTree.en).toBe(true)
expect(latestEnterpriseRelease in siteTree.en).toBe(true)
expect(flatTree['en.dotcom.products.github.href']).toBe('/github')
expect(flatTree['en.dotcom.products.github.categories./github/getting-started-with-github.href']).toBe('/github/getting-started-with-github')
})
describe('localized titles', () => { describe('localized titles', () => {
testFeatureNewVersions('titles for categories', () => { test('titles for categories', () => {
const japaneseTitle = flatTree[`ja.${nonEnterpriseDefaultVersion}.products.github.categories./${nonEnterpriseDefaultVersion}/github/getting-started-with-github.title`] const japaneseTitle = flatTree[`ja.${nonEnterpriseDefaultVersion}.products.github.categories./${nonEnterpriseDefaultVersion}/github/getting-started-with-github.title`]
expect(typeof japaneseTitle).toBe('string') expect(typeof japaneseTitle).toBe('string')
expect(japaneseCharacters.presentIn(japaneseTitle)).toBe(true) expect(japaneseCharacters.presentIn(japaneseTitle)).toBe(true)
@@ -62,21 +45,11 @@ describe('siteTree', () => {
expect(japaneseCharacters.presentIn(englishTitle)).toBe(false) expect(japaneseCharacters.presentIn(englishTitle)).toBe(false)
}) })
testFeatureOldVersions('titles for categories', () => {
const japaneseTitle = flatTree['ja.dotcom.products.github.categories./github/getting-started-with-github.title']
expect(typeof japaneseTitle).toBe('string')
expect(japaneseCharacters.presentIn(japaneseTitle)).toBe(true)
const englishTitle = flatTree['en.dotcom.products.github.categories./github/getting-started-with-github.title']
expect(typeof englishTitle).toBe('string')
expect(japaneseCharacters.presentIn(englishTitle)).toBe(false)
})
test.todo('titles for maptopics') test.todo('titles for maptopics')
test.todo('titles for articles') test.todo('titles for articles')
testFeatureNewVersions('articles that include site data in liquid templating', () => { test('articles that include site data in liquid templating', () => {
const pageWithDynamicTitle = siteTree.en[`enterprise-server@${latestEnterpriseRelease}`] const pageWithDynamicTitle = siteTree.en[`enterprise-server@${latestEnterpriseRelease}`]
.products.admin .products.admin
.categories[`/enterprise-server@${latestEnterpriseRelease}/admin/enterprise-support`] .categories[`/enterprise-server@${latestEnterpriseRelease}/admin/enterprise-support`]
@@ -84,18 +57,9 @@ describe('siteTree', () => {
// title: 'Working with {{ site.data.variables.contact.github_support }}' // title: 'Working with {{ site.data.variables.contact.github_support }}'
expect(pageWithDynamicTitle.title).toEqual('Working with GitHub Support') expect(pageWithDynamicTitle.title).toEqual('Working with GitHub Support')
}) })
testFeatureOldVersions('articles that include site data in liquid templating', () => {
const pageWithDynamicTitle = siteTree.en[latestEnterpriseRelease]
.products.enterpriseServer
.categories[`/enterprise/${latestEnterpriseRelease}/admin/enterprise-support`]
// Source frontmatter from article:
// title: 'Working with {{ site.data.variables.contact.github_support }}'
expect(pageWithDynamicTitle.title).toEqual('Working with GitHub Support')
})
}) })
testFeatureNewVersions('object validation', () => { test('object validation', () => {
const products = Object.values(siteTree.en[nonEnterpriseDefaultVersion].products) const products = Object.values(siteTree.en[nonEnterpriseDefaultVersion].products)
expect(products.length).toBeGreaterThan(0) expect(products.length).toBeGreaterThan(0)
@@ -117,27 +81,4 @@ describe('siteTree', () => {
}) })
}) })
}) })
testFeatureOldVersions('object validation', () => {
const products = Object.values(siteTree.en.dotcom.products)
expect(products.length).toBeGreaterThan(0)
products.forEach(product => {
const { valid, errors } = revalidator.validate(product, schema.product)
const expectation = JSON.stringify(errors, null, 2)
expect(valid, expectation).toBe(true)
Object.values(product.categories || {}).forEach(category => {
const { valid, errors } = revalidator.validate(category, schema.category)
const expectation = JSON.stringify(errors, null, 2)
expect(valid, expectation).toBe(true)
Object.values(category.maptopics || {}).forEach(maptopic => {
const { valid, errors } = revalidator.validate(maptopic, schema.maptopic)
const expectation = JSON.stringify(errors, null, 2)
expect(valid, expectation).toBe(true)
})
})
})
})
}) })

View File

@@ -1,45 +1,27 @@
require('../../lib/feature-flags')
const { difference } = require('lodash') const { difference } = require('lodash')
const { getJSON } = require('../helpers') const { getJSON } = require('../helpers')
const { latest } = require('../../lib/enterprise-server-releases') const { latest } = require('../../lib/enterprise-server-releases')
const allVersions = require('../../lib/all-versions')
const { oldVersions } = require('../../lib/old-versions-utils') const { oldVersions } = require('../../lib/old-versions-utils')
const webhookPayloads = require('../../lib/webhooks') const webhookPayloads = require('../../lib/webhooks')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
describe('webhook payloads', () => { describe('webhook payloads', () => {
jest.setTimeout(3 * 60 * 1000) jest.setTimeout(3 * 60 * 1000)
// TODO update this test when we update the webhook payload filepaths // TODO update this test when we update the webhook payload filepaths
testFeatureNewVersions('have old versions as top-level keys', () => { test('have old versions as top-level keys', () => {
oldVersions.forEach(version => { oldVersions.forEach(version => {
expect(version in webhookPayloads).toBe(true) expect(version in webhookPayloads).toBe(true)
}) })
}) })
testFeatureOldVersions('have current versions as top-level keys', () => {
allVersions.forEach(version => {
expect(version in webhookPayloads).toBe(true)
})
})
// TODO update this test when we update the webhook payload filepaths // TODO update this test when we update the webhook payload filepaths
testFeatureNewVersions('have a reasonable number of payloads per version', () => { test('have a reasonable number of payloads per version', () => {
oldVersions.forEach(version => { oldVersions.forEach(version => {
const payloadsPerVersion = Object.keys(webhookPayloads[version]) const payloadsPerVersion = Object.keys(webhookPayloads[version])
expect(payloadsPerVersion.length).toBeGreaterThan(20) expect(payloadsPerVersion.length).toBeGreaterThan(20)
}) })
}) })
testFeatureOldVersions('have a reasonable number of payloads per version', () => {
allVersions.forEach(version => {
const payloadsPerVersion = Object.keys(webhookPayloads[version])
expect(payloadsPerVersion.length).toBeGreaterThan(20)
})
})
test('have payloads that are JSON strings, not objects', () => { test('have payloads that are JSON strings, not objects', () => {
// use the first one found for testing purposes // use the first one found for testing purposes
const firstKey = Object.keys(webhookPayloads.dotcom)[0] const firstKey = Object.keys(webhookPayloads.dotcom)[0]

View File

@@ -2,7 +2,8 @@
title: GitHub 上でプロジェクトを探索する title: GitHub 上でプロジェクトを探索する
intro: '' intro: ''
mapTopic: verdadero mapTopic: verdadero
productVersions: versions:
dotcom: '*' free-pro-team: '*'
enterprise: '*' enterprise-server: '*'
--- ---

View File

@@ -1,26 +1,26 @@
{ {
"/apps": "/en/developers/apps", "/apps": "/en/free-pro-team@latest/developers/apps",
"/apps/building-github-apps": "/en/developers/apps/building-github-apps", "/apps/building-github-apps": "/en/free-pro-team@latest/developers/apps/building-github-apps",
"/apps/building-oauth-apps": "/en/developers/apps/building-oauth-apps", "/apps/building-oauth-apps": "/en/free-pro-team@latest/developers/apps/building-oauth-apps",
"/apps/managing-github-apps": "/en/developers/apps/managing-github-apps", "/apps/managing-github-apps": "/en/free-pro-team@latest/developers/apps/managing-github-apps",
"/apps/managing-oauth-apps": "/en/developers/apps/managing-oauth-apps", "/apps/managing-oauth-apps": "/en/free-pro-team@latest/developers/apps/managing-oauth-apps",
"/apps/quickstart-guides": "/en/developers/apps/guides", "/apps/quickstart-guides": "/en/free-pro-team@latest/developers/apps/guides",
"/marketplace": "/en/developers/github-marketplace", "/marketplace": "/en/free-pro-team@latest/developers/github-marketplace",
"/marketplace/getting-started": "/en/developers/github-marketplace/about-github-marketplace", "/marketplace/getting-started": "/en/free-pro-team@latest/developers/github-marketplace/about-github-marketplace",
"/marketplace/integrating-with-the-github-marketplace-api": "/en/developers/github-marketplace/using-the-github-marketplace-api-in-your-app", "/marketplace/integrating-with-the-github-marketplace-api": "/en/free-pro-team@latest/developers/github-marketplace/using-the-github-marketplace-api-in-your-app",
"/marketplace/listing-on-github-marketplace": "/en/developers/github-marketplace/listing-an-app-on-github-marketplace", "/marketplace/listing-on-github-marketplace": "/en/free-pro-team@latest/developers/github-marketplace/listing-an-app-on-github-marketplace",
"/marketplace/selling-your-app": "/en/developers/github-marketplace/selling-your-app-on-github-marketplace", "/marketplace/selling-your-app": "/en/free-pro-team@latest/developers/github-marketplace/selling-your-app-on-github-marketplace",
"/v3": "/en/rest", "/v3": "/en/free-pro-team@latest/rest",
"/v3/actions/workflow-jobs": "/en/rest/reference/actions#workflow-jobs", "/v3/actions/workflow-jobs": "/en/free-pro-team@latest/rest/reference/actions#workflow-jobs",
"/v3/actions/workflow-runs": "/en/rest/reference/actions#workflow-runs", "/v3/actions/workflow-runs": "/en/free-pro-team@latest/rest/reference/actions#workflow-runs",
"/v3/actions/workflow_jobs": "/en/rest/reference/actions#workflow-jobs", "/v3/actions/workflow_jobs": "/en/free-pro-team@latest/rest/reference/actions#workflow-jobs",
"/v3/actions/workflow_runs": "/en/rest/reference/actions#workflow-runs", "/v3/actions/workflow_runs": "/en/free-pro-team@latest/rest/reference/actions#workflow-runs",
"/v3/guides": "/en/rest/guides", "/v3/guides": "/en/free-pro-team@latest/rest/guides",
"/v3/guides/managing-deploy-keys": "/en/developers/overview/managing-deploy-keys", "/v3/guides/managing-deploy-keys": "/en/free-pro-team@latest/developers/overview/managing-deploy-keys",
"/v3/misc": "/en/rest/reference/emojis", "/v3/misc": "/en/free-pro-team@latest/rest/reference/emojis",
"/v4/public_schema": "/en/graphql/overview/public-schema", "/v4/public_schema": "/en/free-pro-team@latest/graphql/overview/public-schema",
"/v4/object/repository": "/en/graphql/reference/objects#repository", "/v4/object/repository": "/en/free-pro-team@latest/graphql/reference/objects#repository",
"/webhooks": "/en/developers/webhooks-and-events/about-webhooks", "/webhooks": "/en/free-pro-team@latest/developers/webhooks-and-events/about-webhooks",
"/en/enterprise/2.18/apps": "/en/enterprise/2.18/user/developers/apps", "/en/enterprise/2.18/apps": "/en/enterprise/2.18/user/developers/apps",
"/en/enterprise/2.18/apps/building-oauth-apps/authorizing-oauth-apps": "/en/enterprise/2.18/user/developers/apps/authorizing-oauth-apps", "/en/enterprise/2.18/apps/building-oauth-apps/authorizing-oauth-apps": "/en/enterprise/2.18/user/developers/apps/authorizing-oauth-apps",
"/en/enterprise/2.18/apps/building-oauth-apps/understanding-scopes-for-oauth-apps": "/en/enterprise/2.18/user/developers/apps/scopes-for-oauth-apps", "/en/enterprise/2.18/apps/building-oauth-apps/understanding-scopes-for-oauth-apps": "/en/enterprise/2.18/user/developers/apps/scopes-for-oauth-apps",
@@ -32,37 +32,37 @@
"/en/enterprise/2.18/v4/guides/intro-to-graphql": "/en/enterprise/2.18/user/graphql/guides/introduction-to-graphql", "/en/enterprise/2.18/v4/guides/intro-to-graphql": "/en/enterprise/2.18/user/graphql/guides/introduction-to-graphql",
"/en/enterprise/2.18/v4/guides/migrating-from-rest": "/en/enterprise/2.18/user/graphql/guides/migrating-from-rest-to-graphql", "/en/enterprise/2.18/v4/guides/migrating-from-rest": "/en/enterprise/2.18/user/graphql/guides/migrating-from-rest-to-graphql",
"/en/enterprise/2.18/webhooks": "/en/enterprise/2.18/user/developers/webhooks-and-events/about-webhooks", "/en/enterprise/2.18/webhooks": "/en/enterprise/2.18/user/developers/webhooks-and-events/about-webhooks",
"/en/enterprise/2.19/apps": "/en/enterprise/2.19/user/developers/apps", "/en/enterprise/2.19/apps": "/en/enterprise-server@2.19/developers/apps",
"/en/enterprise/2.19/apps/building-oauth-apps/authorizing-oauth-apps": "/en/enterprise/2.19/user/developers/apps/authorizing-oauth-apps", "/en/enterprise/2.19/apps/building-oauth-apps/authorizing-oauth-apps": "/en/enterprise-server@2.19/developers/apps/authorizing-oauth-apps",
"/en/enterprise/2.19/apps/building-oauth-apps/understanding-scopes-for-oauth-apps": "/en/enterprise/2.19/user/developers/apps/scopes-for-oauth-apps", "/en/enterprise/2.19/apps/building-oauth-apps/understanding-scopes-for-oauth-apps": "/en/enterprise-server@2.19/developers/apps/scopes-for-oauth-apps",
"/en/enterprise/2.19/apps/differences-between-apps": "/en/enterprise/2.19/user/developers/apps/differences-between-github-apps-and-oauth-apps", "/en/enterprise/2.19/apps/differences-between-apps": "/en/enterprise-server@2.19/developers/apps/differences-between-github-apps-and-oauth-apps",
"/en/enterprise/2.19/v3/auth": "/en/enterprise/2.19/user/rest/overview/other-authentication-methods", "/en/enterprise/2.19/v3/auth": "/en/enterprise-server@2.19/rest/overview/other-authentication-methods",
"/en/enterprise/2.19/v3/guides/managing-deploy-keys": "/en/enterprise/2.19/user/developers/overview/managing-deploy-keys", "/en/enterprise/2.19/v3/guides/managing-deploy-keys": "/en/enterprise-server@2.19/developers/overview/managing-deploy-keys",
"/en/enterprise/2.19/v4/explorer": "/en/enterprise/2.19/user/graphql/overview/explorer", "/en/enterprise/2.19/v4/explorer": "/en/enterprise-server@2.19/graphql/overview/explorer",
"/en/enterprise/2.19/v4/guides/forming-calls": "/en/enterprise/2.19/user/graphql/guides/forming-calls-with-graphql", "/en/enterprise/2.19/v4/guides/forming-calls": "/en/enterprise-server@2.19/graphql/guides/forming-calls-with-graphql",
"/en/enterprise/2.19/v4/guides/intro-to-graphql": "/en/enterprise/2.19/user/graphql/guides/introduction-to-graphql", "/en/enterprise/2.19/v4/guides/intro-to-graphql": "/en/enterprise-server@2.19/graphql/guides/introduction-to-graphql",
"/en/enterprise/2.19/v4/guides/migrating-from-rest": "/en/enterprise/2.19/user/graphql/guides/migrating-from-rest-to-graphql", "/en/enterprise/2.19/v4/guides/migrating-from-rest": "/en/enterprise-server@2.19/graphql/guides/migrating-from-rest-to-graphql",
"/en/enterprise/2.19/webhooks": "/en/enterprise/2.19/user/developers/webhooks-and-events/about-webhooks", "/en/enterprise/2.19/webhooks": "/en/enterprise-server@2.19/developers/webhooks-and-events/about-webhooks",
"/en/enterprise/2.20/apps": "/en/enterprise/2.20/user/developers/apps", "/en/enterprise/2.20/apps": "/en/enterprise-server@2.20/developers/apps",
"/en/enterprise/2.20/apps/building-oauth-apps/authorizing-oauth-apps": "/en/enterprise/2.20/user/developers/apps/authorizing-oauth-apps", "/en/enterprise/2.20/apps/building-oauth-apps/authorizing-oauth-apps": "/en/enterprise-server@2.20/developers/apps/authorizing-oauth-apps",
"/en/enterprise/2.20/apps/building-oauth-apps/understanding-scopes-for-oauth-apps": "/en/enterprise/2.20/user/developers/apps/scopes-for-oauth-apps", "/en/enterprise/2.20/apps/building-oauth-apps/understanding-scopes-for-oauth-apps": "/en/enterprise-server@2.20/developers/apps/scopes-for-oauth-apps",
"/en/enterprise/2.20/apps/differences-between-apps": "/en/enterprise/2.20/user/developers/apps/differences-between-github-apps-and-oauth-apps", "/en/enterprise/2.20/apps/differences-between-apps": "/en/enterprise-server@2.20/developers/apps/differences-between-github-apps-and-oauth-apps",
"/en/enterprise/2.20/v3/auth": "/en/enterprise/2.20/user/rest/overview/other-authentication-methods", "/en/enterprise/2.20/v3/auth": "/en/enterprise-server@2.20/rest/overview/other-authentication-methods",
"/en/enterprise/2.20/v3/guides/managing-deploy-keys": "/en/enterprise/2.20/user/developers/overview/managing-deploy-keys", "/en/enterprise/2.20/v3/guides/managing-deploy-keys": "/en/enterprise-server@2.20/developers/overview/managing-deploy-keys",
"/en/enterprise/2.20/v4/explorer": "/en/enterprise/2.20/user/graphql/overview/explorer", "/en/enterprise/2.20/v4/explorer": "/en/enterprise-server@2.20/graphql/overview/explorer",
"/en/enterprise/2.20/v4/guides/forming-calls": "/en/enterprise/2.20/user/graphql/guides/forming-calls-with-graphql", "/en/enterprise/2.20/v4/guides/forming-calls": "/en/enterprise-server@2.20/graphql/guides/forming-calls-with-graphql",
"/en/enterprise/2.20/v4/guides/intro-to-graphql": "/en/enterprise/2.20/user/graphql/guides/introduction-to-graphql", "/en/enterprise/2.20/v4/guides/intro-to-graphql": "/en/enterprise-server@2.20/graphql/guides/introduction-to-graphql",
"/en/enterprise/2.20/v4/guides/migrating-from-rest": "/en/enterprise/2.20/user/graphql/guides/migrating-from-rest-to-graphql", "/en/enterprise/2.20/v4/guides/migrating-from-rest": "/en/enterprise-server@2.20/graphql/guides/migrating-from-rest-to-graphql",
"/en/enterprise/2.20/webhooks": "/en/enterprise/2.20/user/developers/webhooks-and-events/about-webhooks", "/en/enterprise/2.20/webhooks": "/en/enterprise-server@2.20/developers/webhooks-and-events/about-webhooks",
"/en/enterprise/2.21/apps": "/en/enterprise/2.21/user/developers/apps", "/en/enterprise/2.21/apps": "/en/enterprise-server@2.21/developers/apps",
"/en/enterprise/2.21/apps/building-oauth-apps/authorizing-oauth-apps": "/en/enterprise/2.21/user/developers/apps/authorizing-oauth-apps", "/en/enterprise/2.21/apps/building-oauth-apps/authorizing-oauth-apps": "/en/enterprise-server@2.21/developers/apps/authorizing-oauth-apps",
"/en/enterprise/2.21/apps/building-oauth-apps/understanding-scopes-for-oauth-apps": "/en/enterprise/2.21/user/developers/apps/scopes-for-oauth-apps", "/en/enterprise/2.21/apps/building-oauth-apps/understanding-scopes-for-oauth-apps": "/en/enterprise-server@2.21/developers/apps/scopes-for-oauth-apps",
"/en/enterprise/2.21/apps/differences-between-apps": "/en/enterprise/2.21/user/developers/apps/differences-between-github-apps-and-oauth-apps", "/en/enterprise/2.21/apps/differences-between-apps": "/en/enterprise-server@2.21/developers/apps/differences-between-github-apps-and-oauth-apps",
"/en/enterprise/2.21/v3/auth": "/en/enterprise/2.21/user/rest/overview/other-authentication-methods", "/en/enterprise/2.21/v3/auth": "/en/enterprise-server@2.21/rest/overview/other-authentication-methods",
"/en/enterprise/2.21/v3/guides/managing-deploy-keys": "/en/enterprise/2.21/user/developers/overview/managing-deploy-keys", "/en/enterprise/2.21/v3/guides/managing-deploy-keys": "/en/enterprise-server@2.21/developers/overview/managing-deploy-keys",
"/en/enterprise/2.21/v4/explorer": "/en/enterprise/2.21/user/graphql/overview/explorer", "/en/enterprise/2.21/v4/explorer": "/en/enterprise-server@2.21/graphql/overview/explorer",
"/en/enterprise/2.21/v4/guides/forming-calls": "/en/enterprise/2.21/user/graphql/guides/forming-calls-with-graphql", "/en/enterprise/2.21/v4/guides/forming-calls": "/en/enterprise-server@2.21/graphql/guides/forming-calls-with-graphql",
"/en/enterprise/2.21/v4/guides/intro-to-graphql": "/en/enterprise/2.21/user/graphql/guides/introduction-to-graphql", "/en/enterprise/2.21/v4/guides/intro-to-graphql": "/en/enterprise-server@2.21/graphql/guides/introduction-to-graphql",
"/en/enterprise/2.21/v4/guides/migrating-from-rest": "/en/enterprise/2.21/user/graphql/guides/migrating-from-rest-to-graphql", "/en/enterprise/2.21/v4/guides/migrating-from-rest": "/en/enterprise-server@2.21/graphql/guides/migrating-from-rest-to-graphql",
"/en/enterprise/2.21/webhooks": "/en/enterprise/2.21/user/developers/webhooks-and-events/about-webhooks" "/en/enterprise/2.21/webhooks": "/en/enterprise-server@2.21/developers/webhooks-and-events/about-webhooks"
} }

View File

@@ -41,186 +41,186 @@
"/en/enterprise/2.18/v4/scalar/date": "/en/enterprise/2.18/user/graphql/reference/scalars#date", "/en/enterprise/2.18/v4/scalar/date": "/en/enterprise/2.18/user/graphql/reference/scalars#date",
"/en/enterprise/2.18/v4/union": "/en/enterprise/2.18/user/graphql/reference/unions", "/en/enterprise/2.18/v4/union": "/en/enterprise/2.18/user/graphql/reference/unions",
"/en/enterprise/2.18/v4/union/auditentryactor": "/en/enterprise/2.18/user/graphql/reference/unions#auditentryactor", "/en/enterprise/2.18/v4/union/auditentryactor": "/en/enterprise/2.18/user/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.19/user/v4/enum": "/en/enterprise/2.19/user/graphql/reference/enums", "/en/enterprise/2.19/user/v4/enum": "/en/enterprise-server@2.19/graphql/reference/enums",
"/en/enterprise/2.19/user/v4/enum/auditlogorderfield": "/en/enterprise/2.19/user/graphql/reference/enums#auditlogorderfield", "/en/enterprise/2.19/user/v4/enum/auditlogorderfield": "/en/enterprise-server@2.19/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.19/user/v4/enum/checkannotationlevel": "/en/enterprise/2.19/user/graphql/reference/enums#checkannotationlevel", "/en/enterprise/2.19/user/v4/enum/checkannotationlevel": "/en/enterprise-server@2.19/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.19/user/v4/guides": "/en/enterprise/2.19/user/graphql/guides", "/en/enterprise/2.19/user/v4/guides": "/en/enterprise-server@2.19/graphql/guides",
"/en/enterprise/2.19/user/v4/input_object": "/en/enterprise/2.19/user/graphql/reference/input-objects", "/en/enterprise/2.19/user/v4/input_object": "/en/enterprise-server@2.19/graphql/reference/input-objects",
"/en/enterprise/2.19/user/v4/interface": "/en/enterprise/2.19/user/graphql/reference/interfaces", "/en/enterprise/2.19/user/v4/interface": "/en/enterprise-server@2.19/graphql/reference/interfaces",
"/en/enterprise/2.19/user/v4/interface/actor": "/en/enterprise/2.19/user/graphql/reference/interfaces#actor", "/en/enterprise/2.19/user/v4/interface/actor": "/en/enterprise-server@2.19/graphql/reference/interfaces#actor",
"/en/enterprise/2.19/user/v4/interface/assignable": "/en/enterprise/2.19/user/graphql/reference/interfaces#assignable", "/en/enterprise/2.19/user/v4/interface/assignable": "/en/enterprise-server@2.19/graphql/reference/interfaces#assignable",
"/en/enterprise/2.19/user/v4/mutation": "/en/enterprise/2.19/user/graphql/reference/mutations", "/en/enterprise/2.19/user/v4/mutation": "/en/enterprise-server@2.19/graphql/reference/mutations",
"/en/enterprise/2.19/user/v4/object": "/en/enterprise/2.19/user/graphql/reference/objects", "/en/enterprise/2.19/user/v4/object": "/en/enterprise-server@2.19/graphql/reference/objects",
"/en/enterprise/2.19/user/v4/object/actorlocation": "/en/enterprise/2.19/user/graphql/reference/objects#actorlocation", "/en/enterprise/2.19/user/v4/object/actorlocation": "/en/enterprise-server@2.19/graphql/reference/objects#actorlocation",
"/en/enterprise/2.19/user/v4/object/addedtoprojectevent": "/en/enterprise/2.19/user/graphql/reference/objects#addedtoprojectevent", "/en/enterprise/2.19/user/v4/object/addedtoprojectevent": "/en/enterprise-server@2.19/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.19/user/v4/previews": "/en/enterprise/2.19/user/graphql/overview/schema-previews", "/en/enterprise/2.19/user/v4/previews": "/en/enterprise-server@2.19/graphql/overview/schema-previews",
"/en/enterprise/2.19/user/v4/public_schema": "/en/enterprise/2.19/user/graphql/overview/public-schema", "/en/enterprise/2.19/user/v4/public_schema": "/en/enterprise-server@2.19/graphql/overview/public-schema",
"/en/enterprise/2.19/user/v4/query": "/en/enterprise/2.19/user/graphql/reference/queries", "/en/enterprise/2.19/user/v4/query": "/en/enterprise-server@2.19/graphql/reference/queries",
"/en/enterprise/2.19/user/v4/reference": "/en/enterprise/2.19/user/graphql/reference", "/en/enterprise/2.19/user/v4/reference": "/en/enterprise-server@2.19/graphql/reference",
"/en/enterprise/2.19/user/v4/scalar": "/en/enterprise/2.19/user/graphql/reference/scalars", "/en/enterprise/2.19/user/v4/scalar": "/en/enterprise-server@2.19/graphql/reference/scalars",
"/en/enterprise/2.19/user/v4/scalar/boolean": "/en/enterprise/2.19/user/graphql/reference/scalars#boolean", "/en/enterprise/2.19/user/v4/scalar/boolean": "/en/enterprise-server@2.19/graphql/reference/scalars#boolean",
"/en/enterprise/2.19/user/v4/scalar/date": "/en/enterprise/2.19/user/graphql/reference/scalars#date", "/en/enterprise/2.19/user/v4/scalar/date": "/en/enterprise-server@2.19/graphql/reference/scalars#date",
"/en/enterprise/2.19/user/v4/union": "/en/enterprise/2.19/user/graphql/reference/unions", "/en/enterprise/2.19/user/v4/union": "/en/enterprise-server@2.19/graphql/reference/unions",
"/en/enterprise/2.19/user/v4/union/assignee": "/en/enterprise/2.19/user/graphql/reference/unions#assignee", "/en/enterprise/2.19/user/v4/union/assignee": "/en/enterprise-server@2.19/graphql/reference/unions#assignee",
"/en/enterprise/2.19/user/v4/union/auditentryactor": "/en/enterprise/2.19/user/graphql/reference/unions#auditentryactor", "/en/enterprise/2.19/user/v4/union/auditentryactor": "/en/enterprise-server@2.19/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.19/v4/enum": "/en/enterprise/2.19/user/graphql/reference/enums", "/en/enterprise/2.19/v4/enum": "/en/enterprise-server@2.19/graphql/reference/enums",
"/en/enterprise/2.19/v4/enum/auditlogorderfield": "/en/enterprise/2.19/user/graphql/reference/enums#auditlogorderfield", "/en/enterprise/2.19/v4/enum/auditlogorderfield": "/en/enterprise-server@2.19/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.19/v4/enum/checkannotationlevel": "/en/enterprise/2.19/user/graphql/reference/enums#checkannotationlevel", "/en/enterprise/2.19/v4/enum/checkannotationlevel": "/en/enterprise-server@2.19/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.19/v4/guides": "/en/enterprise/2.19/user/graphql/guides", "/en/enterprise/2.19/v4/guides": "/en/enterprise-server@2.19/graphql/guides",
"/en/enterprise/2.19/v4/input_object": "/en/enterprise/2.19/user/graphql/reference/input-objects", "/en/enterprise/2.19/v4/input_object": "/en/enterprise-server@2.19/graphql/reference/input-objects",
"/en/enterprise/2.19/v4/interface": "/en/enterprise/2.19/user/graphql/reference/interfaces", "/en/enterprise/2.19/v4/interface": "/en/enterprise-server@2.19/graphql/reference/interfaces",
"/en/enterprise/2.19/v4/interface/actor": "/en/enterprise/2.19/user/graphql/reference/interfaces#actor", "/en/enterprise/2.19/v4/interface/actor": "/en/enterprise-server@2.19/graphql/reference/interfaces#actor",
"/en/enterprise/2.19/v4/interface/assignable": "/en/enterprise/2.19/user/graphql/reference/interfaces#assignable", "/en/enterprise/2.19/v4/interface/assignable": "/en/enterprise-server@2.19/graphql/reference/interfaces#assignable",
"/en/enterprise/2.19/v4/mutation": "/en/enterprise/2.19/user/graphql/reference/mutations", "/en/enterprise/2.19/v4/mutation": "/en/enterprise-server@2.19/graphql/reference/mutations",
"/en/enterprise/2.19/v4/object": "/en/enterprise/2.19/user/graphql/reference/objects", "/en/enterprise/2.19/v4/object": "/en/enterprise-server@2.19/graphql/reference/objects",
"/en/enterprise/2.19/v4/object/actorlocation": "/en/enterprise/2.19/user/graphql/reference/objects#actorlocation", "/en/enterprise/2.19/v4/object/actorlocation": "/en/enterprise-server@2.19/graphql/reference/objects#actorlocation",
"/en/enterprise/2.19/v4/object/addedtoprojectevent": "/en/enterprise/2.19/user/graphql/reference/objects#addedtoprojectevent", "/en/enterprise/2.19/v4/object/addedtoprojectevent": "/en/enterprise-server@2.19/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.19/v4/previews": "/en/enterprise/2.19/user/graphql/overview/schema-previews", "/en/enterprise/2.19/v4/previews": "/en/enterprise-server@2.19/graphql/overview/schema-previews",
"/en/enterprise/2.19/v4/public_schema": "/en/enterprise/2.19/user/graphql/overview/public-schema", "/en/enterprise/2.19/v4/public_schema": "/en/enterprise-server@2.19/graphql/overview/public-schema",
"/en/enterprise/2.19/v4/query": "/en/enterprise/2.19/user/graphql/reference/queries", "/en/enterprise/2.19/v4/query": "/en/enterprise-server@2.19/graphql/reference/queries",
"/en/enterprise/2.19/v4/reference": "/en/enterprise/2.19/user/graphql/reference", "/en/enterprise/2.19/v4/reference": "/en/enterprise-server@2.19/graphql/reference",
"/en/enterprise/2.19/v4/scalar": "/en/enterprise/2.19/user/graphql/reference/scalars", "/en/enterprise/2.19/v4/scalar": "/en/enterprise-server@2.19/graphql/reference/scalars",
"/en/enterprise/2.19/v4/scalar/boolean": "/en/enterprise/2.19/user/graphql/reference/scalars#boolean", "/en/enterprise/2.19/v4/scalar/boolean": "/en/enterprise-server@2.19/graphql/reference/scalars#boolean",
"/en/enterprise/2.19/v4/scalar/date": "/en/enterprise/2.19/user/graphql/reference/scalars#date", "/en/enterprise/2.19/v4/scalar/date": "/en/enterprise-server@2.19/graphql/reference/scalars#date",
"/en/enterprise/2.19/v4/union": "/en/enterprise/2.19/user/graphql/reference/unions", "/en/enterprise/2.19/v4/union": "/en/enterprise-server@2.19/graphql/reference/unions",
"/en/enterprise/2.19/v4/union/assignee": "/en/enterprise/2.19/user/graphql/reference/unions#assignee", "/en/enterprise/2.19/v4/union/assignee": "/en/enterprise-server@2.19/graphql/reference/unions#assignee",
"/en/enterprise/2.19/v4/union/auditentryactor": "/en/enterprise/2.19/user/graphql/reference/unions#auditentryactor", "/en/enterprise/2.19/v4/union/auditentryactor": "/en/enterprise-server@2.19/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.20/user/v4/enum": "/en/enterprise/2.20/user/graphql/reference/enums", "/en/enterprise/2.20/user/v4/enum": "/en/enterprise-server@2.20/graphql/reference/enums",
"/en/enterprise/2.20/user/v4/enum/auditlogorderfield": "/en/enterprise/2.20/user/graphql/reference/enums#auditlogorderfield", "/en/enterprise/2.20/user/v4/enum/auditlogorderfield": "/en/enterprise-server@2.20/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.20/user/v4/enum/checkannotationlevel": "/en/enterprise/2.20/user/graphql/reference/enums#checkannotationlevel", "/en/enterprise/2.20/user/v4/enum/checkannotationlevel": "/en/enterprise-server@2.20/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.20/user/v4/guides": "/en/enterprise/2.20/user/graphql/guides", "/en/enterprise/2.20/user/v4/guides": "/en/enterprise-server@2.20/graphql/guides",
"/en/enterprise/2.20/user/v4/input_object": "/en/enterprise/2.20/user/graphql/reference/input-objects", "/en/enterprise/2.20/user/v4/input_object": "/en/enterprise-server@2.20/graphql/reference/input-objects",
"/en/enterprise/2.20/user/v4/interface": "/en/enterprise/2.20/user/graphql/reference/interfaces", "/en/enterprise/2.20/user/v4/interface": "/en/enterprise-server@2.20/graphql/reference/interfaces",
"/en/enterprise/2.20/user/v4/interface/actor": "/en/enterprise/2.20/user/graphql/reference/interfaces#actor", "/en/enterprise/2.20/user/v4/interface/actor": "/en/enterprise-server@2.20/graphql/reference/interfaces#actor",
"/en/enterprise/2.20/user/v4/interface/assignable": "/en/enterprise/2.20/user/graphql/reference/interfaces#assignable", "/en/enterprise/2.20/user/v4/interface/assignable": "/en/enterprise-server@2.20/graphql/reference/interfaces#assignable",
"/en/enterprise/2.20/user/v4/mutation": "/en/enterprise/2.20/user/graphql/reference/mutations", "/en/enterprise/2.20/user/v4/mutation": "/en/enterprise-server@2.20/graphql/reference/mutations",
"/en/enterprise/2.20/user/v4/object": "/en/enterprise/2.20/user/graphql/reference/objects", "/en/enterprise/2.20/user/v4/object": "/en/enterprise-server@2.20/graphql/reference/objects",
"/en/enterprise/2.20/user/v4/object/actorlocation": "/en/enterprise/2.20/user/graphql/reference/objects#actorlocation", "/en/enterprise/2.20/user/v4/object/actorlocation": "/en/enterprise-server@2.20/graphql/reference/objects#actorlocation",
"/en/enterprise/2.20/user/v4/object/addedtoprojectevent": "/en/enterprise/2.20/user/graphql/reference/objects#addedtoprojectevent", "/en/enterprise/2.20/user/v4/object/addedtoprojectevent": "/en/enterprise-server@2.20/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.20/user/v4/previews": "/en/enterprise/2.20/user/graphql/overview/schema-previews", "/en/enterprise/2.20/user/v4/previews": "/en/enterprise-server@2.20/graphql/overview/schema-previews",
"/en/enterprise/2.20/user/v4/public_schema": "/en/enterprise/2.20/user/graphql/overview/public-schema", "/en/enterprise/2.20/user/v4/public_schema": "/en/enterprise-server@2.20/graphql/overview/public-schema",
"/en/enterprise/2.20/user/v4/query": "/en/enterprise/2.20/user/graphql/reference/queries", "/en/enterprise/2.20/user/v4/query": "/en/enterprise-server@2.20/graphql/reference/queries",
"/en/enterprise/2.20/user/v4/reference": "/en/enterprise/2.20/user/graphql/reference", "/en/enterprise/2.20/user/v4/reference": "/en/enterprise-server@2.20/graphql/reference",
"/en/enterprise/2.20/user/v4/scalar": "/en/enterprise/2.20/user/graphql/reference/scalars", "/en/enterprise/2.20/user/v4/scalar": "/en/enterprise-server@2.20/graphql/reference/scalars",
"/en/enterprise/2.20/user/v4/scalar/boolean": "/en/enterprise/2.20/user/graphql/reference/scalars#boolean", "/en/enterprise/2.20/user/v4/scalar/boolean": "/en/enterprise-server@2.20/graphql/reference/scalars#boolean",
"/en/enterprise/2.20/user/v4/scalar/date": "/en/enterprise/2.20/user/graphql/reference/scalars#date", "/en/enterprise/2.20/user/v4/scalar/date": "/en/enterprise-server@2.20/graphql/reference/scalars#date",
"/en/enterprise/2.20/user/v4/union": "/en/enterprise/2.20/user/graphql/reference/unions", "/en/enterprise/2.20/user/v4/union": "/en/enterprise-server@2.20/graphql/reference/unions",
"/en/enterprise/2.20/user/v4/union/assignee": "/en/enterprise/2.20/user/graphql/reference/unions#assignee", "/en/enterprise/2.20/user/v4/union/assignee": "/en/enterprise-server@2.20/graphql/reference/unions#assignee",
"/en/enterprise/2.20/user/v4/union/auditentryactor": "/en/enterprise/2.20/user/graphql/reference/unions#auditentryactor", "/en/enterprise/2.20/user/v4/union/auditentryactor": "/en/enterprise-server@2.20/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.20/v4/enum": "/en/enterprise/2.20/user/graphql/reference/enums", "/en/enterprise/2.20/v4/enum": "/en/enterprise-server@2.20/graphql/reference/enums",
"/en/enterprise/2.20/v4/enum/auditlogorderfield": "/en/enterprise/2.20/user/graphql/reference/enums#auditlogorderfield", "/en/enterprise/2.20/v4/enum/auditlogorderfield": "/en/enterprise-server@2.20/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.20/v4/enum/checkannotationlevel": "/en/enterprise/2.20/user/graphql/reference/enums#checkannotationlevel", "/en/enterprise/2.20/v4/enum/checkannotationlevel": "/en/enterprise-server@2.20/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.20/v4/guides": "/en/enterprise/2.20/user/graphql/guides", "/en/enterprise/2.20/v4/guides": "/en/enterprise-server@2.20/graphql/guides",
"/en/enterprise/2.20/v4/input_object": "/en/enterprise/2.20/user/graphql/reference/input-objects", "/en/enterprise/2.20/v4/input_object": "/en/enterprise-server@2.20/graphql/reference/input-objects",
"/en/enterprise/2.20/v4/interface": "/en/enterprise/2.20/user/graphql/reference/interfaces", "/en/enterprise/2.20/v4/interface": "/en/enterprise-server@2.20/graphql/reference/interfaces",
"/en/enterprise/2.20/v4/interface/actor": "/en/enterprise/2.20/user/graphql/reference/interfaces#actor", "/en/enterprise/2.20/v4/interface/actor": "/en/enterprise-server@2.20/graphql/reference/interfaces#actor",
"/en/enterprise/2.20/v4/interface/assignable": "/en/enterprise/2.20/user/graphql/reference/interfaces#assignable", "/en/enterprise/2.20/v4/interface/assignable": "/en/enterprise-server@2.20/graphql/reference/interfaces#assignable",
"/en/enterprise/2.20/v4/mutation": "/en/enterprise/2.20/user/graphql/reference/mutations", "/en/enterprise/2.20/v4/mutation": "/en/enterprise-server@2.20/graphql/reference/mutations",
"/en/enterprise/2.20/v4/object": "/en/enterprise/2.20/user/graphql/reference/objects", "/en/enterprise/2.20/v4/object": "/en/enterprise-server@2.20/graphql/reference/objects",
"/en/enterprise/2.20/v4/object/actorlocation": "/en/enterprise/2.20/user/graphql/reference/objects#actorlocation", "/en/enterprise/2.20/v4/object/actorlocation": "/en/enterprise-server@2.20/graphql/reference/objects#actorlocation",
"/en/enterprise/2.20/v4/object/addedtoprojectevent": "/en/enterprise/2.20/user/graphql/reference/objects#addedtoprojectevent", "/en/enterprise/2.20/v4/object/addedtoprojectevent": "/en/enterprise-server@2.20/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.20/v4/previews": "/en/enterprise/2.20/user/graphql/overview/schema-previews", "/en/enterprise/2.20/v4/previews": "/en/enterprise-server@2.20/graphql/overview/schema-previews",
"/en/enterprise/2.20/v4/public_schema": "/en/enterprise/2.20/user/graphql/overview/public-schema", "/en/enterprise/2.20/v4/public_schema": "/en/enterprise-server@2.20/graphql/overview/public-schema",
"/en/enterprise/2.20/v4/query": "/en/enterprise/2.20/user/graphql/reference/queries", "/en/enterprise/2.20/v4/query": "/en/enterprise-server@2.20/graphql/reference/queries",
"/en/enterprise/2.20/v4/reference": "/en/enterprise/2.20/user/graphql/reference", "/en/enterprise/2.20/v4/reference": "/en/enterprise-server@2.20/graphql/reference",
"/en/enterprise/2.20/v4/scalar": "/en/enterprise/2.20/user/graphql/reference/scalars", "/en/enterprise/2.20/v4/scalar": "/en/enterprise-server@2.20/graphql/reference/scalars",
"/en/enterprise/2.20/v4/scalar/boolean": "/en/enterprise/2.20/user/graphql/reference/scalars#boolean", "/en/enterprise/2.20/v4/scalar/boolean": "/en/enterprise-server@2.20/graphql/reference/scalars#boolean",
"/en/enterprise/2.20/v4/scalar/date": "/en/enterprise/2.20/user/graphql/reference/scalars#date", "/en/enterprise/2.20/v4/scalar/date": "/en/enterprise-server@2.20/graphql/reference/scalars#date",
"/en/enterprise/2.20/v4/union": "/en/enterprise/2.20/user/graphql/reference/unions", "/en/enterprise/2.20/v4/union": "/en/enterprise-server@2.20/graphql/reference/unions",
"/en/enterprise/2.20/v4/union/assignee": "/en/enterprise/2.20/user/graphql/reference/unions#assignee", "/en/enterprise/2.20/v4/union/assignee": "/en/enterprise-server@2.20/graphql/reference/unions#assignee",
"/en/enterprise/2.20/v4/union/auditentryactor": "/en/enterprise/2.20/user/graphql/reference/unions#auditentryactor", "/en/enterprise/2.20/v4/union/auditentryactor": "/en/enterprise-server@2.20/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.21/user/v4/enum": "/en/enterprise/2.21/user/graphql/reference/enums", "/en/enterprise/2.21/user/v4/enum": "/en/enterprise-server@2.21/graphql/reference/enums",
"/en/enterprise/2.21/user/v4/enum/auditlogorderfield": "/en/enterprise/2.21/user/graphql/reference/enums#auditlogorderfield", "/en/enterprise/2.21/user/v4/enum/auditlogorderfield": "/en/enterprise-server@2.21/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.21/user/v4/enum/checkannotationlevel": "/en/enterprise/2.21/user/graphql/reference/enums#checkannotationlevel", "/en/enterprise/2.21/user/v4/enum/checkannotationlevel": "/en/enterprise-server@2.21/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.21/user/v4/guides": "/en/enterprise/2.21/user/graphql/guides", "/en/enterprise/2.21/user/v4/guides": "/en/enterprise-server@2.21/graphql/guides",
"/en/enterprise/2.21/user/v4/input_object": "/en/enterprise/2.21/user/graphql/reference/input-objects", "/en/enterprise/2.21/user/v4/input_object": "/en/enterprise-server@2.21/graphql/reference/input-objects",
"/en/enterprise/2.21/user/v4/interface": "/en/enterprise/2.21/user/graphql/reference/interfaces", "/en/enterprise/2.21/user/v4/interface": "/en/enterprise-server@2.21/graphql/reference/interfaces",
"/en/enterprise/2.21/user/v4/interface/actor": "/en/enterprise/2.21/user/graphql/reference/interfaces#actor", "/en/enterprise/2.21/user/v4/interface/actor": "/en/enterprise-server@2.21/graphql/reference/interfaces#actor",
"/en/enterprise/2.21/user/v4/interface/assignable": "/en/enterprise/2.21/user/graphql/reference/interfaces#assignable", "/en/enterprise/2.21/user/v4/interface/assignable": "/en/enterprise-server@2.21/graphql/reference/interfaces#assignable",
"/en/enterprise/2.21/user/v4/mutation": "/en/enterprise/2.21/user/graphql/reference/mutations", "/en/enterprise/2.21/user/v4/mutation": "/en/enterprise-server@2.21/graphql/reference/mutations",
"/en/enterprise/2.21/user/v4/object": "/en/enterprise/2.21/user/graphql/reference/objects", "/en/enterprise/2.21/user/v4/object": "/en/enterprise-server@2.21/graphql/reference/objects",
"/en/enterprise/2.21/user/v4/object/actorlocation": "/en/enterprise/2.21/user/graphql/reference/objects#actorlocation", "/en/enterprise/2.21/user/v4/object/actorlocation": "/en/enterprise-server@2.21/graphql/reference/objects#actorlocation",
"/en/enterprise/2.21/user/v4/object/addedtoprojectevent": "/en/enterprise/2.21/user/graphql/reference/objects#addedtoprojectevent", "/en/enterprise/2.21/user/v4/object/addedtoprojectevent": "/en/enterprise-server@2.21/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.21/user/v4/previews": "/en/enterprise/2.21/user/graphql/overview/schema-previews", "/en/enterprise/2.21/user/v4/previews": "/en/enterprise-server@2.21/graphql/overview/schema-previews",
"/en/enterprise/2.21/user/v4/public_schema": "/en/enterprise/2.21/user/graphql/overview/public-schema", "/en/enterprise/2.21/user/v4/public_schema": "/en/enterprise-server@2.21/graphql/overview/public-schema",
"/en/enterprise/2.21/user/v4/query": "/en/enterprise/2.21/user/graphql/reference/queries", "/en/enterprise/2.21/user/v4/query": "/en/enterprise-server@2.21/graphql/reference/queries",
"/en/enterprise/2.21/user/v4/reference": "/en/enterprise/2.21/user/graphql/reference", "/en/enterprise/2.21/user/v4/reference": "/en/enterprise-server@2.21/graphql/reference",
"/en/enterprise/2.21/user/v4/scalar": "/en/enterprise/2.21/user/graphql/reference/scalars", "/en/enterprise/2.21/user/v4/scalar": "/en/enterprise-server@2.21/graphql/reference/scalars",
"/en/enterprise/2.21/user/v4/scalar/boolean": "/en/enterprise/2.21/user/graphql/reference/scalars#boolean", "/en/enterprise/2.21/user/v4/scalar/boolean": "/en/enterprise-server@2.21/graphql/reference/scalars#boolean",
"/en/enterprise/2.21/user/v4/scalar/date": "/en/enterprise/2.21/user/graphql/reference/scalars#date", "/en/enterprise/2.21/user/v4/scalar/date": "/en/enterprise-server@2.21/graphql/reference/scalars#date",
"/en/enterprise/2.21/user/v4/union": "/en/enterprise/2.21/user/graphql/reference/unions", "/en/enterprise/2.21/user/v4/union": "/en/enterprise-server@2.21/graphql/reference/unions",
"/en/enterprise/2.21/user/v4/union/assignee": "/en/enterprise/2.21/user/graphql/reference/unions#assignee", "/en/enterprise/2.21/user/v4/union/assignee": "/en/enterprise-server@2.21/graphql/reference/unions#assignee",
"/en/enterprise/2.21/user/v4/union/auditentryactor": "/en/enterprise/2.21/user/graphql/reference/unions#auditentryactor", "/en/enterprise/2.21/user/v4/union/auditentryactor": "/en/enterprise-server@2.21/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.21/v4/enum": "/en/enterprise/2.21/user/graphql/reference/enums", "/en/enterprise/2.21/v4/enum": "/en/enterprise-server@2.21/graphql/reference/enums",
"/en/enterprise/2.21/v4/enum/auditlogorderfield": "/en/enterprise/2.21/user/graphql/reference/enums#auditlogorderfield", "/en/enterprise/2.21/v4/enum/auditlogorderfield": "/en/enterprise-server@2.21/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.21/v4/enum/checkannotationlevel": "/en/enterprise/2.21/user/graphql/reference/enums#checkannotationlevel", "/en/enterprise/2.21/v4/enum/checkannotationlevel": "/en/enterprise-server@2.21/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.21/v4/guides": "/en/enterprise/2.21/user/graphql/guides", "/en/enterprise/2.21/v4/guides": "/en/enterprise-server@2.21/graphql/guides",
"/en/enterprise/2.21/v4/input_object": "/en/enterprise/2.21/user/graphql/reference/input-objects", "/en/enterprise/2.21/v4/input_object": "/en/enterprise-server@2.21/graphql/reference/input-objects",
"/en/enterprise/2.21/v4/interface": "/en/enterprise/2.21/user/graphql/reference/interfaces", "/en/enterprise/2.21/v4/interface": "/en/enterprise-server@2.21/graphql/reference/interfaces",
"/en/enterprise/2.21/v4/interface/actor": "/en/enterprise/2.21/user/graphql/reference/interfaces#actor", "/en/enterprise/2.21/v4/interface/actor": "/en/enterprise-server@2.21/graphql/reference/interfaces#actor",
"/en/enterprise/2.21/v4/interface/assignable": "/en/enterprise/2.21/user/graphql/reference/interfaces#assignable", "/en/enterprise/2.21/v4/interface/assignable": "/en/enterprise-server@2.21/graphql/reference/interfaces#assignable",
"/en/enterprise/2.21/v4/mutation": "/en/enterprise/2.21/user/graphql/reference/mutations", "/en/enterprise/2.21/v4/mutation": "/en/enterprise-server@2.21/graphql/reference/mutations",
"/en/enterprise/2.21/v4/object": "/en/enterprise/2.21/user/graphql/reference/objects", "/en/enterprise/2.21/v4/object": "/en/enterprise-server@2.21/graphql/reference/objects",
"/en/enterprise/2.21/v4/object/actorlocation": "/en/enterprise/2.21/user/graphql/reference/objects#actorlocation", "/en/enterprise/2.21/v4/object/actorlocation": "/en/enterprise-server@2.21/graphql/reference/objects#actorlocation",
"/en/enterprise/2.21/v4/object/addedtoprojectevent": "/en/enterprise/2.21/user/graphql/reference/objects#addedtoprojectevent", "/en/enterprise/2.21/v4/object/addedtoprojectevent": "/en/enterprise-server@2.21/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.21/v4/previews": "/en/enterprise/2.21/user/graphql/overview/schema-previews", "/en/enterprise/2.21/v4/previews": "/en/enterprise-server@2.21/graphql/overview/schema-previews",
"/en/enterprise/2.21/v4/public_schema": "/en/enterprise/2.21/user/graphql/overview/public-schema", "/en/enterprise/2.21/v4/public_schema": "/en/enterprise-server@2.21/graphql/overview/public-schema",
"/en/enterprise/2.21/v4/query": "/en/enterprise/2.21/user/graphql/reference/queries", "/en/enterprise/2.21/v4/query": "/en/enterprise-server@2.21/graphql/reference/queries",
"/en/enterprise/2.21/v4/reference": "/en/enterprise/2.21/user/graphql/reference", "/en/enterprise/2.21/v4/reference": "/en/enterprise-server@2.21/graphql/reference",
"/en/enterprise/2.21/v4/scalar": "/en/enterprise/2.21/user/graphql/reference/scalars", "/en/enterprise/2.21/v4/scalar": "/en/enterprise-server@2.21/graphql/reference/scalars",
"/en/enterprise/2.21/v4/scalar/boolean": "/en/enterprise/2.21/user/graphql/reference/scalars#boolean", "/en/enterprise/2.21/v4/scalar/boolean": "/en/enterprise-server@2.21/graphql/reference/scalars#boolean",
"/en/enterprise/2.21/v4/scalar/date": "/en/enterprise/2.21/user/graphql/reference/scalars#date", "/en/enterprise/2.21/v4/scalar/date": "/en/enterprise-server@2.21/graphql/reference/scalars#date",
"/en/enterprise/2.21/v4/union": "/en/enterprise/2.21/user/graphql/reference/unions", "/en/enterprise/2.21/v4/union": "/en/enterprise-server@2.21/graphql/reference/unions",
"/en/enterprise/2.21/v4/union/assignee": "/en/enterprise/2.21/user/graphql/reference/unions#assignee", "/en/enterprise/2.21/v4/union/assignee": "/en/enterprise-server@2.21/graphql/reference/unions#assignee",
"/en/enterprise/2.21/v4/union/auditentryactor": "/en/enterprise/2.21/user/graphql/reference/unions#auditentryactor", "/en/enterprise/2.21/v4/union/auditentryactor": "/en/enterprise-server@2.21/graphql/reference/unions#auditentryactor",
"/en/enterprise/v4/enum": "/en/enterprise/user/graphql/reference/enums", "/en/enterprise/v4/enum": "/en/enterprise-server/graphql/reference/enums",
"/en/enterprise/v4/enum/auditlogorderfield": "/en/enterprise/user/graphql/reference/enums#auditlogorderfield", "/en/enterprise/v4/enum/auditlogorderfield": "/en/enterprise-server/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/v4/enum/checkannotationlevel": "/en/enterprise/user/graphql/reference/enums#checkannotationlevel", "/en/enterprise/v4/enum/checkannotationlevel": "/en/enterprise-server/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/v4/guides": "/en/enterprise/user/graphql/guides", "/en/enterprise/v4/guides": "/en/enterprise-server/graphql/guides",
"/en/enterprise/v4/input_object": "/en/enterprise/user/graphql/reference/input-objects", "/en/enterprise/v4/input_object": "/en/enterprise-server/graphql/reference/input-objects",
"/en/enterprise/v4/interface": "/en/enterprise/user/graphql/reference/interfaces", "/en/enterprise/v4/interface": "/en/enterprise-server/graphql/reference/interfaces",
"/en/enterprise/v4/interface/actor": "/en/enterprise/user/graphql/reference/interfaces#actor", "/en/enterprise/v4/interface/actor": "/en/enterprise-server/graphql/reference/interfaces#actor",
"/en/enterprise/v4/interface/assignable": "/en/enterprise/user/graphql/reference/interfaces#assignable", "/en/enterprise/v4/interface/assignable": "/en/enterprise-server/graphql/reference/interfaces#assignable",
"/en/enterprise/v4/mutation": "/en/enterprise/user/graphql/reference/mutations", "/en/enterprise/v4/mutation": "/en/enterprise-server/graphql/reference/mutations",
"/en/enterprise/v4/object": "/en/enterprise/user/graphql/reference/objects", "/en/enterprise/v4/object": "/en/enterprise-server/graphql/reference/objects",
"/en/enterprise/v4/object/actorlocation": "/en/enterprise/user/graphql/reference/objects#actorlocation", "/en/enterprise/v4/object/actorlocation": "/en/enterprise-server/graphql/reference/objects#actorlocation",
"/en/enterprise/v4/object/addedtoprojectevent": "/en/enterprise/user/graphql/reference/objects#addedtoprojectevent", "/en/enterprise/v4/object/addedtoprojectevent": "/en/enterprise-server/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/v4/previews": "/en/enterprise/user/graphql/overview/schema-previews", "/en/enterprise/v4/previews": "/en/enterprise-server/graphql/overview/schema-previews",
"/en/enterprise/v4/public_schema": "/en/enterprise/user/graphql/overview/public-schema", "/en/enterprise/v4/public_schema": "/en/enterprise-server/graphql/overview/public-schema",
"/en/enterprise/v4/query": "/en/enterprise/user/graphql/reference/queries", "/en/enterprise/v4/query": "/en/enterprise-server/graphql/reference/queries",
"/en/enterprise/v4/reference": "/en/enterprise/user/graphql/reference", "/en/enterprise/v4/reference": "/en/enterprise-server/graphql/reference",
"/en/enterprise/v4/scalar": "/en/enterprise/user/graphql/reference/scalars", "/en/enterprise/v4/scalar": "/en/enterprise-server/graphql/reference/scalars",
"/en/enterprise/v4/scalar/boolean": "/en/enterprise/user/graphql/reference/scalars#boolean", "/en/enterprise/v4/scalar/boolean": "/en/enterprise-server/graphql/reference/scalars#boolean",
"/en/enterprise/v4/scalar/date": "/en/enterprise/user/graphql/reference/scalars#date", "/en/enterprise/v4/scalar/date": "/en/enterprise-server/graphql/reference/scalars#date",
"/en/enterprise/v4/union": "/en/enterprise/user/graphql/reference/unions", "/en/enterprise/v4/union": "/en/enterprise-server/graphql/reference/unions",
"/en/enterprise/v4/union/assignee": "/en/enterprise/user/graphql/reference/unions#assignee", "/en/enterprise/v4/union/assignee": "/en/enterprise-server/graphql/reference/unions#assignee",
"/en/enterprise/v4/union/auditentryactor": "/en/enterprise/user/graphql/reference/unions#auditentryactor", "/en/enterprise/v4/union/auditentryactor": "/en/enterprise-server/graphql/reference/unions#auditentryactor",
"/en/v4/enum": "/en/graphql/reference/enums", "/en/v4/enum": "/en/free-pro-team@latest/graphql/reference/enums",
"/en/v4/enum/auditlogorderfield": "/en/graphql/reference/enums#auditlogorderfield", "/en/v4/enum/auditlogorderfield": "/en/free-pro-team@latest/graphql/reference/enums#auditlogorderfield",
"/en/v4/enum/checkannotationlevel": "/en/graphql/reference/enums#checkannotationlevel", "/en/v4/enum/checkannotationlevel": "/en/free-pro-team@latest/graphql/reference/enums#checkannotationlevel",
"/en/v4/guides": "/en/graphql/guides", "/en/v4/guides": "/en/free-pro-team@latest/graphql/guides",
"/en/v4/input_object": "/en/graphql/reference/input-objects", "/en/v4/input_object": "/en/free-pro-team@latest/graphql/reference/input-objects",
"/en/v4/input_object/acceptenterpriseadministratorinvitationinput": "/en/graphql/reference/input-objects#acceptenterpriseadministratorinvitationinput", "/en/v4/input_object/acceptenterpriseadministratorinvitationinput": "/en/free-pro-team@latest/graphql/reference/input-objects#acceptenterpriseadministratorinvitationinput",
"/en/v4/input_object/accepttopicsuggestioninput": "/en/graphql/reference/input-objects#accepttopicsuggestioninput", "/en/v4/input_object/accepttopicsuggestioninput": "/en/free-pro-team@latest/graphql/reference/input-objects#accepttopicsuggestioninput",
"/en/v4/interface": "/en/graphql/reference/interfaces", "/en/v4/interface": "/en/free-pro-team@latest/graphql/reference/interfaces",
"/en/v4/interface/actor": "/en/graphql/reference/interfaces#actor", "/en/v4/interface/actor": "/en/free-pro-team@latest/graphql/reference/interfaces#actor",
"/en/v4/interface/assignable": "/en/graphql/reference/interfaces#assignable", "/en/v4/interface/assignable": "/en/free-pro-team@latest/graphql/reference/interfaces#assignable",
"/en/v4/mutation": "/en/graphql/reference/mutations", "/en/v4/mutation": "/en/free-pro-team@latest/graphql/reference/mutations",
"/en/v4/mutation/acceptenterpriseadministratorinvitation": "/en/graphql/reference/mutations#acceptenterpriseadministratorinvitation", "/en/v4/mutation/acceptenterpriseadministratorinvitation": "/en/free-pro-team@latest/graphql/reference/mutations#acceptenterpriseadministratorinvitation",
"/en/v4/mutation/accepttopicsuggestion": "/en/graphql/reference/mutations#accepttopicsuggestion", "/en/v4/mutation/accepttopicsuggestion": "/en/free-pro-team@latest/graphql/reference/mutations#accepttopicsuggestion",
"/en/v4/object": "/en/graphql/reference/objects", "/en/v4/object": "/en/free-pro-team@latest/graphql/reference/objects",
"/en/v4/object/actorlocation": "/en/graphql/reference/objects#actorlocation", "/en/v4/object/actorlocation": "/en/free-pro-team@latest/graphql/reference/objects#actorlocation",
"/en/v4/object/addedtoprojectevent": "/en/graphql/reference/objects#addedtoprojectevent", "/en/v4/object/addedtoprojectevent": "/en/free-pro-team@latest/graphql/reference/objects#addedtoprojectevent",
"/en/v4/previews": "/en/graphql/overview/schema-previews", "/en/v4/previews": "/en/free-pro-team@latest/graphql/overview/schema-previews",
"/en/v4/public_schema": "/en/graphql/overview/public-schema", "/en/v4/public_schema": "/en/free-pro-team@latest/graphql/overview/public-schema",
"/en/v4/query": "/en/graphql/reference/queries", "/en/v4/query": "/en/free-pro-team@latest/graphql/reference/queries",
"/en/v4/reference": "/en/graphql/reference", "/en/v4/reference": "/en/free-pro-team@latest/graphql/reference",
"/en/v4/scalar": "/en/graphql/reference/scalars", "/en/v4/scalar": "/en/free-pro-team@latest/graphql/reference/scalars",
"/en/v4/scalar/boolean": "/en/graphql/reference/scalars#boolean", "/en/v4/scalar/boolean": "/en/free-pro-team@latest/graphql/reference/scalars#boolean",
"/en/v4/scalar/date": "/en/graphql/reference/scalars#date", "/en/v4/scalar/date": "/en/free-pro-team@latest/graphql/reference/scalars#date",
"/en/v4/union": "/en/graphql/reference/unions", "/en/v4/union": "/en/free-pro-team@latest/graphql/reference/unions",
"/en/v4/union/assignee": "/en/graphql/reference/unions#assignee", "/en/v4/union/assignee": "/en/free-pro-team@latest/graphql/reference/unions#assignee",
"/en/v4/union/auditentryactor": "/en/graphql/reference/unions#auditentryactor", "/en/v4/union/auditentryactor": "/en/free-pro-team@latest/graphql/reference/unions#auditentryactor",
"/enterprise/2.18/user/v4/enum": "/en/enterprise/2.18/user/graphql/reference/enums", "/enterprise/2.18/user/v4/enum": "/en/enterprise/2.18/user/graphql/reference/enums",
"/enterprise/2.18/user/v4/enum/auditlogorderfield": "/en/enterprise/2.18/user/graphql/reference/enums#auditlogorderfield", "/enterprise/2.18/user/v4/enum/auditlogorderfield": "/en/enterprise/2.18/user/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.18/user/v4/enum/checkannotationlevel": "/en/enterprise/2.18/user/graphql/reference/enums#checkannotationlevel", "/enterprise/2.18/user/v4/enum/checkannotationlevel": "/en/enterprise/2.18/user/graphql/reference/enums#checkannotationlevel",
@@ -263,184 +263,184 @@
"/enterprise/2.18/v4/scalar/date": "/en/enterprise/2.18/user/graphql/reference/scalars#date", "/enterprise/2.18/v4/scalar/date": "/en/enterprise/2.18/user/graphql/reference/scalars#date",
"/enterprise/2.18/v4/union": "/en/enterprise/2.18/user/graphql/reference/unions", "/enterprise/2.18/v4/union": "/en/enterprise/2.18/user/graphql/reference/unions",
"/enterprise/2.18/v4/union/auditentryactor": "/en/enterprise/2.18/user/graphql/reference/unions#auditentryactor", "/enterprise/2.18/v4/union/auditentryactor": "/en/enterprise/2.18/user/graphql/reference/unions#auditentryactor",
"/enterprise/2.19/user/v4/enum": "/en/enterprise/2.19/user/graphql/reference/enums", "/enterprise/2.19/user/v4/enum": "/en/enterprise-server@2.19/graphql/reference/enums",
"/enterprise/2.19/user/v4/enum/auditlogorderfield": "/en/enterprise/2.19/user/graphql/reference/enums#auditlogorderfield", "/enterprise/2.19/user/v4/enum/auditlogorderfield": "/en/enterprise-server@2.19/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.19/user/v4/enum/checkannotationlevel": "/en/enterprise/2.19/user/graphql/reference/enums#checkannotationlevel", "/enterprise/2.19/user/v4/enum/checkannotationlevel": "/en/enterprise-server@2.19/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.19/user/v4/guides": "/en/enterprise/2.19/user/graphql/guides", "/enterprise/2.19/user/v4/guides": "/en/enterprise-server@2.19/graphql/guides",
"/enterprise/2.19/user/v4/input_object": "/en/enterprise/2.19/user/graphql/reference/input-objects", "/enterprise/2.19/user/v4/input_object": "/en/enterprise-server@2.19/graphql/reference/input-objects",
"/enterprise/2.19/user/v4/interface": "/en/enterprise/2.19/user/graphql/reference/interfaces", "/enterprise/2.19/user/v4/interface": "/en/enterprise-server@2.19/graphql/reference/interfaces",
"/enterprise/2.19/user/v4/interface/actor": "/en/enterprise/2.19/user/graphql/reference/interfaces#actor", "/enterprise/2.19/user/v4/interface/actor": "/en/enterprise-server@2.19/graphql/reference/interfaces#actor",
"/enterprise/2.19/user/v4/interface/assignable": "/en/enterprise/2.19/user/graphql/reference/interfaces#assignable", "/enterprise/2.19/user/v4/interface/assignable": "/en/enterprise-server@2.19/graphql/reference/interfaces#assignable",
"/enterprise/2.19/user/v4/mutation": "/en/enterprise/2.19/user/graphql/reference/mutations", "/enterprise/2.19/user/v4/mutation": "/en/enterprise-server@2.19/graphql/reference/mutations",
"/enterprise/2.19/user/v4/object": "/en/enterprise/2.19/user/graphql/reference/objects", "/enterprise/2.19/user/v4/object": "/en/enterprise-server@2.19/graphql/reference/objects",
"/enterprise/2.19/user/v4/object/actorlocation": "/en/enterprise/2.19/user/graphql/reference/objects#actorlocation", "/enterprise/2.19/user/v4/object/actorlocation": "/en/enterprise-server@2.19/graphql/reference/objects#actorlocation",
"/enterprise/2.19/user/v4/object/addedtoprojectevent": "/en/enterprise/2.19/user/graphql/reference/objects#addedtoprojectevent", "/enterprise/2.19/user/v4/object/addedtoprojectevent": "/en/enterprise-server@2.19/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.19/user/v4/previews": "/en/enterprise/2.19/user/graphql/overview/schema-previews", "/enterprise/2.19/user/v4/previews": "/en/enterprise-server@2.19/graphql/overview/schema-previews",
"/enterprise/2.19/user/v4/public_schema": "/en/enterprise/2.19/user/graphql/overview/public-schema", "/enterprise/2.19/user/v4/public_schema": "/en/enterprise-server@2.19/graphql/overview/public-schema",
"/enterprise/2.19/user/v4/query": "/en/enterprise/2.19/user/graphql/reference/queries", "/enterprise/2.19/user/v4/query": "/en/enterprise-server@2.19/graphql/reference/queries",
"/enterprise/2.19/user/v4/reference": "/en/enterprise/2.19/user/graphql/reference", "/enterprise/2.19/user/v4/reference": "/en/enterprise-server@2.19/graphql/reference",
"/enterprise/2.19/user/v4/scalar": "/en/enterprise/2.19/user/graphql/reference/scalars", "/enterprise/2.19/user/v4/scalar": "/en/enterprise-server@2.19/graphql/reference/scalars",
"/enterprise/2.19/user/v4/scalar/boolean": "/en/enterprise/2.19/user/graphql/reference/scalars#boolean", "/enterprise/2.19/user/v4/scalar/boolean": "/en/enterprise-server@2.19/graphql/reference/scalars#boolean",
"/enterprise/2.19/user/v4/scalar/date": "/en/enterprise/2.19/user/graphql/reference/scalars#date", "/enterprise/2.19/user/v4/scalar/date": "/en/enterprise-server@2.19/graphql/reference/scalars#date",
"/enterprise/2.19/user/v4/union": "/en/enterprise/2.19/user/graphql/reference/unions", "/enterprise/2.19/user/v4/union": "/en/enterprise-server@2.19/graphql/reference/unions",
"/enterprise/2.19/user/v4/union/assignee": "/en/enterprise/2.19/user/graphql/reference/unions#assignee", "/enterprise/2.19/user/v4/union/assignee": "/en/enterprise-server@2.19/graphql/reference/unions#assignee",
"/enterprise/2.19/user/v4/union/auditentryactor": "/en/enterprise/2.19/user/graphql/reference/unions#auditentryactor", "/enterprise/2.19/user/v4/union/auditentryactor": "/en/enterprise-server@2.19/graphql/reference/unions#auditentryactor",
"/enterprise/2.19/v4/enum": "/en/enterprise/2.19/user/graphql/reference/enums", "/enterprise/2.19/v4/enum": "/en/enterprise-server@2.19/graphql/reference/enums",
"/enterprise/2.19/v4/enum/auditlogorderfield": "/en/enterprise/2.19/user/graphql/reference/enums#auditlogorderfield", "/enterprise/2.19/v4/enum/auditlogorderfield": "/en/enterprise-server@2.19/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.19/v4/enum/checkannotationlevel": "/en/enterprise/2.19/user/graphql/reference/enums#checkannotationlevel", "/enterprise/2.19/v4/enum/checkannotationlevel": "/en/enterprise-server@2.19/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.19/v4/guides": "/en/enterprise/2.19/user/graphql/guides", "/enterprise/2.19/v4/guides": "/en/enterprise-server@2.19/graphql/guides",
"/enterprise/2.19/v4/input_object": "/en/enterprise/2.19/user/graphql/reference/input-objects", "/enterprise/2.19/v4/input_object": "/en/enterprise-server@2.19/graphql/reference/input-objects",
"/enterprise/2.19/v4/interface": "/en/enterprise/2.19/user/graphql/reference/interfaces", "/enterprise/2.19/v4/interface": "/en/enterprise-server@2.19/graphql/reference/interfaces",
"/enterprise/2.19/v4/interface/actor": "/en/enterprise/2.19/user/graphql/reference/interfaces#actor", "/enterprise/2.19/v4/interface/actor": "/en/enterprise-server@2.19/graphql/reference/interfaces#actor",
"/enterprise/2.19/v4/interface/assignable": "/en/enterprise/2.19/user/graphql/reference/interfaces#assignable", "/enterprise/2.19/v4/interface/assignable": "/en/enterprise-server@2.19/graphql/reference/interfaces#assignable",
"/enterprise/2.19/v4/mutation": "/en/enterprise/2.19/user/graphql/reference/mutations", "/enterprise/2.19/v4/mutation": "/en/enterprise-server@2.19/graphql/reference/mutations",
"/enterprise/2.19/v4/object": "/en/enterprise/2.19/user/graphql/reference/objects", "/enterprise/2.19/v4/object": "/en/enterprise-server@2.19/graphql/reference/objects",
"/enterprise/2.19/v4/object/actorlocation": "/en/enterprise/2.19/user/graphql/reference/objects#actorlocation", "/enterprise/2.19/v4/object/actorlocation": "/en/enterprise-server@2.19/graphql/reference/objects#actorlocation",
"/enterprise/2.19/v4/object/addedtoprojectevent": "/en/enterprise/2.19/user/graphql/reference/objects#addedtoprojectevent", "/enterprise/2.19/v4/object/addedtoprojectevent": "/en/enterprise-server@2.19/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.19/v4/previews": "/en/enterprise/2.19/user/graphql/overview/schema-previews", "/enterprise/2.19/v4/previews": "/en/enterprise-server@2.19/graphql/overview/schema-previews",
"/enterprise/2.19/v4/public_schema": "/en/enterprise/2.19/user/graphql/overview/public-schema", "/enterprise/2.19/v4/public_schema": "/en/enterprise-server@2.19/graphql/overview/public-schema",
"/enterprise/2.19/v4/query": "/en/enterprise/2.19/user/graphql/reference/queries", "/enterprise/2.19/v4/query": "/en/enterprise-server@2.19/graphql/reference/queries",
"/enterprise/2.19/v4/reference": "/en/enterprise/2.19/user/graphql/reference", "/enterprise/2.19/v4/reference": "/en/enterprise-server@2.19/graphql/reference",
"/enterprise/2.19/v4/scalar": "/en/enterprise/2.19/user/graphql/reference/scalars", "/enterprise/2.19/v4/scalar": "/en/enterprise-server@2.19/graphql/reference/scalars",
"/enterprise/2.19/v4/scalar/boolean": "/en/enterprise/2.19/user/graphql/reference/scalars#boolean", "/enterprise/2.19/v4/scalar/boolean": "/en/enterprise-server@2.19/graphql/reference/scalars#boolean",
"/enterprise/2.19/v4/scalar/date": "/en/enterprise/2.19/user/graphql/reference/scalars#date", "/enterprise/2.19/v4/scalar/date": "/en/enterprise-server@2.19/graphql/reference/scalars#date",
"/enterprise/2.19/v4/union": "/en/enterprise/2.19/user/graphql/reference/unions", "/enterprise/2.19/v4/union": "/en/enterprise-server@2.19/graphql/reference/unions",
"/enterprise/2.19/v4/union/assignee": "/en/enterprise/2.19/user/graphql/reference/unions#assignee", "/enterprise/2.19/v4/union/assignee": "/en/enterprise-server@2.19/graphql/reference/unions#assignee",
"/enterprise/2.19/v4/union/auditentryactor": "/en/enterprise/2.19/user/graphql/reference/unions#auditentryactor", "/enterprise/2.19/v4/union/auditentryactor": "/en/enterprise-server@2.19/graphql/reference/unions#auditentryactor",
"/enterprise/2.20/user/v4/enum": "/en/enterprise/2.20/user/graphql/reference/enums", "/enterprise/2.20/user/v4/enum": "/en/enterprise-server@2.20/graphql/reference/enums",
"/enterprise/2.20/user/v4/enum/auditlogorderfield": "/en/enterprise/2.20/user/graphql/reference/enums#auditlogorderfield", "/enterprise/2.20/user/v4/enum/auditlogorderfield": "/en/enterprise-server@2.20/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.20/user/v4/enum/checkannotationlevel": "/en/enterprise/2.20/user/graphql/reference/enums#checkannotationlevel", "/enterprise/2.20/user/v4/enum/checkannotationlevel": "/en/enterprise-server@2.20/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.20/user/v4/guides": "/en/enterprise/2.20/user/graphql/guides", "/enterprise/2.20/user/v4/guides": "/en/enterprise-server@2.20/graphql/guides",
"/enterprise/2.20/user/v4/input_object": "/en/enterprise/2.20/user/graphql/reference/input-objects", "/enterprise/2.20/user/v4/input_object": "/en/enterprise-server@2.20/graphql/reference/input-objects",
"/enterprise/2.20/user/v4/interface": "/en/enterprise/2.20/user/graphql/reference/interfaces", "/enterprise/2.20/user/v4/interface": "/en/enterprise-server@2.20/graphql/reference/interfaces",
"/enterprise/2.20/user/v4/interface/actor": "/en/enterprise/2.20/user/graphql/reference/interfaces#actor", "/enterprise/2.20/user/v4/interface/actor": "/en/enterprise-server@2.20/graphql/reference/interfaces#actor",
"/enterprise/2.20/user/v4/interface/assignable": "/en/enterprise/2.20/user/graphql/reference/interfaces#assignable", "/enterprise/2.20/user/v4/interface/assignable": "/en/enterprise-server@2.20/graphql/reference/interfaces#assignable",
"/enterprise/2.20/user/v4/mutation": "/en/enterprise/2.20/user/graphql/reference/mutations", "/enterprise/2.20/user/v4/mutation": "/en/enterprise-server@2.20/graphql/reference/mutations",
"/enterprise/2.20/user/v4/object": "/en/enterprise/2.20/user/graphql/reference/objects", "/enterprise/2.20/user/v4/object": "/en/enterprise-server@2.20/graphql/reference/objects",
"/enterprise/2.20/user/v4/object/actorlocation": "/en/enterprise/2.20/user/graphql/reference/objects#actorlocation", "/enterprise/2.20/user/v4/object/actorlocation": "/en/enterprise-server@2.20/graphql/reference/objects#actorlocation",
"/enterprise/2.20/user/v4/object/addedtoprojectevent": "/en/enterprise/2.20/user/graphql/reference/objects#addedtoprojectevent", "/enterprise/2.20/user/v4/object/addedtoprojectevent": "/en/enterprise-server@2.20/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.20/user/v4/previews": "/en/enterprise/2.20/user/graphql/overview/schema-previews", "/enterprise/2.20/user/v4/previews": "/en/enterprise-server@2.20/graphql/overview/schema-previews",
"/enterprise/2.20/user/v4/public_schema": "/en/enterprise/2.20/user/graphql/overview/public-schema", "/enterprise/2.20/user/v4/public_schema": "/en/enterprise-server@2.20/graphql/overview/public-schema",
"/enterprise/2.20/user/v4/query": "/en/enterprise/2.20/user/graphql/reference/queries", "/enterprise/2.20/user/v4/query": "/en/enterprise-server@2.20/graphql/reference/queries",
"/enterprise/2.20/user/v4/reference": "/en/enterprise/2.20/user/graphql/reference", "/enterprise/2.20/user/v4/reference": "/en/enterprise-server@2.20/graphql/reference",
"/enterprise/2.20/user/v4/scalar": "/en/enterprise/2.20/user/graphql/reference/scalars", "/enterprise/2.20/user/v4/scalar": "/en/enterprise-server@2.20/graphql/reference/scalars",
"/enterprise/2.20/user/v4/scalar/boolean": "/en/enterprise/2.20/user/graphql/reference/scalars#boolean", "/enterprise/2.20/user/v4/scalar/boolean": "/en/enterprise-server@2.20/graphql/reference/scalars#boolean",
"/enterprise/2.20/user/v4/scalar/date": "/en/enterprise/2.20/user/graphql/reference/scalars#date", "/enterprise/2.20/user/v4/scalar/date": "/en/enterprise-server@2.20/graphql/reference/scalars#date",
"/enterprise/2.20/user/v4/union": "/en/enterprise/2.20/user/graphql/reference/unions", "/enterprise/2.20/user/v4/union": "/en/enterprise-server@2.20/graphql/reference/unions",
"/enterprise/2.20/user/v4/union/assignee": "/en/enterprise/2.20/user/graphql/reference/unions#assignee", "/enterprise/2.20/user/v4/union/assignee": "/en/enterprise-server@2.20/graphql/reference/unions#assignee",
"/enterprise/2.20/user/v4/union/auditentryactor": "/en/enterprise/2.20/user/graphql/reference/unions#auditentryactor", "/enterprise/2.20/user/v4/union/auditentryactor": "/en/enterprise-server@2.20/graphql/reference/unions#auditentryactor",
"/enterprise/2.20/v4/enum": "/en/enterprise/2.20/user/graphql/reference/enums", "/enterprise/2.20/v4/enum": "/en/enterprise-server@2.20/graphql/reference/enums",
"/enterprise/2.20/v4/enum/auditlogorderfield": "/en/enterprise/2.20/user/graphql/reference/enums#auditlogorderfield", "/enterprise/2.20/v4/enum/auditlogorderfield": "/en/enterprise-server@2.20/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.20/v4/enum/checkannotationlevel": "/en/enterprise/2.20/user/graphql/reference/enums#checkannotationlevel", "/enterprise/2.20/v4/enum/checkannotationlevel": "/en/enterprise-server@2.20/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.20/v4/guides": "/en/enterprise/2.20/user/graphql/guides", "/enterprise/2.20/v4/guides": "/en/enterprise-server@2.20/graphql/guides",
"/enterprise/2.20/v4/input_object": "/en/enterprise/2.20/user/graphql/reference/input-objects", "/enterprise/2.20/v4/input_object": "/en/enterprise-server@2.20/graphql/reference/input-objects",
"/enterprise/2.20/v4/interface": "/en/enterprise/2.20/user/graphql/reference/interfaces", "/enterprise/2.20/v4/interface": "/en/enterprise-server@2.20/graphql/reference/interfaces",
"/enterprise/2.20/v4/interface/actor": "/en/enterprise/2.20/user/graphql/reference/interfaces#actor", "/enterprise/2.20/v4/interface/actor": "/en/enterprise-server@2.20/graphql/reference/interfaces#actor",
"/enterprise/2.20/v4/interface/assignable": "/en/enterprise/2.20/user/graphql/reference/interfaces#assignable", "/enterprise/2.20/v4/interface/assignable": "/en/enterprise-server@2.20/graphql/reference/interfaces#assignable",
"/enterprise/2.20/v4/mutation": "/en/enterprise/2.20/user/graphql/reference/mutations", "/enterprise/2.20/v4/mutation": "/en/enterprise-server@2.20/graphql/reference/mutations",
"/enterprise/2.20/v4/object": "/en/enterprise/2.20/user/graphql/reference/objects", "/enterprise/2.20/v4/object": "/en/enterprise-server@2.20/graphql/reference/objects",
"/enterprise/2.20/v4/object/actorlocation": "/en/enterprise/2.20/user/graphql/reference/objects#actorlocation", "/enterprise/2.20/v4/object/actorlocation": "/en/enterprise-server@2.20/graphql/reference/objects#actorlocation",
"/enterprise/2.20/v4/object/addedtoprojectevent": "/en/enterprise/2.20/user/graphql/reference/objects#addedtoprojectevent", "/enterprise/2.20/v4/object/addedtoprojectevent": "/en/enterprise-server@2.20/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.20/v4/previews": "/en/enterprise/2.20/user/graphql/overview/schema-previews", "/enterprise/2.20/v4/previews": "/en/enterprise-server@2.20/graphql/overview/schema-previews",
"/enterprise/2.20/v4/public_schema": "/en/enterprise/2.20/user/graphql/overview/public-schema", "/enterprise/2.20/v4/public_schema": "/en/enterprise-server@2.20/graphql/overview/public-schema",
"/enterprise/2.20/v4/query": "/en/enterprise/2.20/user/graphql/reference/queries", "/enterprise/2.20/v4/query": "/en/enterprise-server@2.20/graphql/reference/queries",
"/enterprise/2.20/v4/reference": "/en/enterprise/2.20/user/graphql/reference", "/enterprise/2.20/v4/reference": "/en/enterprise-server@2.20/graphql/reference",
"/enterprise/2.20/v4/scalar": "/en/enterprise/2.20/user/graphql/reference/scalars", "/enterprise/2.20/v4/scalar": "/en/enterprise-server@2.20/graphql/reference/scalars",
"/enterprise/2.20/v4/scalar/boolean": "/en/enterprise/2.20/user/graphql/reference/scalars#boolean", "/enterprise/2.20/v4/scalar/boolean": "/en/enterprise-server@2.20/graphql/reference/scalars#boolean",
"/enterprise/2.20/v4/scalar/date": "/en/enterprise/2.20/user/graphql/reference/scalars#date", "/enterprise/2.20/v4/scalar/date": "/en/enterprise-server@2.20/graphql/reference/scalars#date",
"/enterprise/2.20/v4/union": "/en/enterprise/2.20/user/graphql/reference/unions", "/enterprise/2.20/v4/union": "/en/enterprise-server@2.20/graphql/reference/unions",
"/enterprise/2.20/v4/union/assignee": "/en/enterprise/2.20/user/graphql/reference/unions#assignee", "/enterprise/2.20/v4/union/assignee": "/en/enterprise-server@2.20/graphql/reference/unions#assignee",
"/enterprise/2.20/v4/union/auditentryactor": "/en/enterprise/2.20/user/graphql/reference/unions#auditentryactor", "/enterprise/2.20/v4/union/auditentryactor": "/en/enterprise-server@2.20/graphql/reference/unions#auditentryactor",
"/enterprise/2.21/user/v4/enum": "/en/enterprise/2.21/user/graphql/reference/enums", "/enterprise/2.21/user/v4/enum": "/en/enterprise-server@2.21/graphql/reference/enums",
"/enterprise/2.21/user/v4/enum/auditlogorderfield": "/en/enterprise/2.21/user/graphql/reference/enums#auditlogorderfield", "/enterprise/2.21/user/v4/enum/auditlogorderfield": "/en/enterprise-server@2.21/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.21/user/v4/enum/checkannotationlevel": "/en/enterprise/2.21/user/graphql/reference/enums#checkannotationlevel", "/enterprise/2.21/user/v4/enum/checkannotationlevel": "/en/enterprise-server@2.21/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.21/user/v4/guides": "/en/enterprise/2.21/user/graphql/guides", "/enterprise/2.21/user/v4/guides": "/en/enterprise-server@2.21/graphql/guides",
"/enterprise/2.21/user/v4/input_object": "/en/enterprise/2.21/user/graphql/reference/input-objects", "/enterprise/2.21/user/v4/input_object": "/en/enterprise-server@2.21/graphql/reference/input-objects",
"/enterprise/2.21/user/v4/interface": "/en/enterprise/2.21/user/graphql/reference/interfaces", "/enterprise/2.21/user/v4/interface": "/en/enterprise-server@2.21/graphql/reference/interfaces",
"/enterprise/2.21/user/v4/interface/actor": "/en/enterprise/2.21/user/graphql/reference/interfaces#actor", "/enterprise/2.21/user/v4/interface/actor": "/en/enterprise-server@2.21/graphql/reference/interfaces#actor",
"/enterprise/2.21/user/v4/interface/assignable": "/en/enterprise/2.21/user/graphql/reference/interfaces#assignable", "/enterprise/2.21/user/v4/interface/assignable": "/en/enterprise-server@2.21/graphql/reference/interfaces#assignable",
"/enterprise/2.21/user/v4/mutation": "/en/enterprise/2.21/user/graphql/reference/mutations", "/enterprise/2.21/user/v4/mutation": "/en/enterprise-server@2.21/graphql/reference/mutations",
"/enterprise/2.21/user/v4/object": "/en/enterprise/2.21/user/graphql/reference/objects", "/enterprise/2.21/user/v4/object": "/en/enterprise-server@2.21/graphql/reference/objects",
"/enterprise/2.21/user/v4/object/actorlocation": "/en/enterprise/2.21/user/graphql/reference/objects#actorlocation", "/enterprise/2.21/user/v4/object/actorlocation": "/en/enterprise-server@2.21/graphql/reference/objects#actorlocation",
"/enterprise/2.21/user/v4/object/addedtoprojectevent": "/en/enterprise/2.21/user/graphql/reference/objects#addedtoprojectevent", "/enterprise/2.21/user/v4/object/addedtoprojectevent": "/en/enterprise-server@2.21/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.21/user/v4/previews": "/en/enterprise/2.21/user/graphql/overview/schema-previews", "/enterprise/2.21/user/v4/previews": "/en/enterprise-server@2.21/graphql/overview/schema-previews",
"/enterprise/2.21/user/v4/public_schema": "/en/enterprise/2.21/user/graphql/overview/public-schema", "/enterprise/2.21/user/v4/public_schema": "/en/enterprise-server@2.21/graphql/overview/public-schema",
"/enterprise/2.21/user/v4/query": "/en/enterprise/2.21/user/graphql/reference/queries", "/enterprise/2.21/user/v4/query": "/en/enterprise-server@2.21/graphql/reference/queries",
"/enterprise/2.21/user/v4/reference": "/en/enterprise/2.21/user/graphql/reference", "/enterprise/2.21/user/v4/reference": "/en/enterprise-server@2.21/graphql/reference",
"/enterprise/2.21/user/v4/scalar": "/en/enterprise/2.21/user/graphql/reference/scalars", "/enterprise/2.21/user/v4/scalar": "/en/enterprise-server@2.21/graphql/reference/scalars",
"/enterprise/2.21/user/v4/scalar/boolean": "/en/enterprise/2.21/user/graphql/reference/scalars#boolean", "/enterprise/2.21/user/v4/scalar/boolean": "/en/enterprise-server@2.21/graphql/reference/scalars#boolean",
"/enterprise/2.21/user/v4/scalar/date": "/en/enterprise/2.21/user/graphql/reference/scalars#date", "/enterprise/2.21/user/v4/scalar/date": "/en/enterprise-server@2.21/graphql/reference/scalars#date",
"/enterprise/2.21/user/v4/union": "/en/enterprise/2.21/user/graphql/reference/unions", "/enterprise/2.21/user/v4/union": "/en/enterprise-server@2.21/graphql/reference/unions",
"/enterprise/2.21/user/v4/union/assignee": "/en/enterprise/2.21/user/graphql/reference/unions#assignee", "/enterprise/2.21/user/v4/union/assignee": "/en/enterprise-server@2.21/graphql/reference/unions#assignee",
"/enterprise/2.21/user/v4/union/auditentryactor": "/en/enterprise/2.21/user/graphql/reference/unions#auditentryactor", "/enterprise/2.21/user/v4/union/auditentryactor": "/en/enterprise-server@2.21/graphql/reference/unions#auditentryactor",
"/enterprise/2.21/v4/enum": "/en/enterprise/2.21/user/graphql/reference/enums", "/enterprise/2.21/v4/enum": "/en/enterprise-server@2.21/graphql/reference/enums",
"/enterprise/2.21/v4/enum/auditlogorderfield": "/en/enterprise/2.21/user/graphql/reference/enums#auditlogorderfield", "/enterprise/2.21/v4/enum/auditlogorderfield": "/en/enterprise-server@2.21/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.21/v4/enum/checkannotationlevel": "/en/enterprise/2.21/user/graphql/reference/enums#checkannotationlevel", "/enterprise/2.21/v4/enum/checkannotationlevel": "/en/enterprise-server@2.21/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.21/v4/guides": "/en/enterprise/2.21/user/graphql/guides", "/enterprise/2.21/v4/guides": "/en/enterprise-server@2.21/graphql/guides",
"/enterprise/2.21/v4/input_object": "/en/enterprise/2.21/user/graphql/reference/input-objects", "/enterprise/2.21/v4/input_object": "/en/enterprise-server@2.21/graphql/reference/input-objects",
"/enterprise/2.21/v4/interface": "/en/enterprise/2.21/user/graphql/reference/interfaces", "/enterprise/2.21/v4/interface": "/en/enterprise-server@2.21/graphql/reference/interfaces",
"/enterprise/2.21/v4/interface/actor": "/en/enterprise/2.21/user/graphql/reference/interfaces#actor", "/enterprise/2.21/v4/interface/actor": "/en/enterprise-server@2.21/graphql/reference/interfaces#actor",
"/enterprise/2.21/v4/interface/assignable": "/en/enterprise/2.21/user/graphql/reference/interfaces#assignable", "/enterprise/2.21/v4/interface/assignable": "/en/enterprise-server@2.21/graphql/reference/interfaces#assignable",
"/enterprise/2.21/v4/mutation": "/en/enterprise/2.21/user/graphql/reference/mutations", "/enterprise/2.21/v4/mutation": "/en/enterprise-server@2.21/graphql/reference/mutations",
"/enterprise/2.21/v4/object": "/en/enterprise/2.21/user/graphql/reference/objects", "/enterprise/2.21/v4/object": "/en/enterprise-server@2.21/graphql/reference/objects",
"/enterprise/2.21/v4/object/actorlocation": "/en/enterprise/2.21/user/graphql/reference/objects#actorlocation", "/enterprise/2.21/v4/object/actorlocation": "/en/enterprise-server@2.21/graphql/reference/objects#actorlocation",
"/enterprise/2.21/v4/object/addedtoprojectevent": "/en/enterprise/2.21/user/graphql/reference/objects#addedtoprojectevent", "/enterprise/2.21/v4/object/addedtoprojectevent": "/en/enterprise-server@2.21/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.21/v4/previews": "/en/enterprise/2.21/user/graphql/overview/schema-previews", "/enterprise/2.21/v4/previews": "/en/enterprise-server@2.21/graphql/overview/schema-previews",
"/enterprise/2.21/v4/public_schema": "/en/enterprise/2.21/user/graphql/overview/public-schema", "/enterprise/2.21/v4/public_schema": "/en/enterprise-server@2.21/graphql/overview/public-schema",
"/enterprise/2.21/v4/query": "/en/enterprise/2.21/user/graphql/reference/queries", "/enterprise/2.21/v4/query": "/en/enterprise-server@2.21/graphql/reference/queries",
"/enterprise/2.21/v4/reference": "/en/enterprise/2.21/user/graphql/reference", "/enterprise/2.21/v4/reference": "/en/enterprise-server@2.21/graphql/reference",
"/enterprise/2.21/v4/scalar": "/en/enterprise/2.21/user/graphql/reference/scalars", "/enterprise/2.21/v4/scalar": "/en/enterprise-server@2.21/graphql/reference/scalars",
"/enterprise/2.21/v4/scalar/boolean": "/en/enterprise/2.21/user/graphql/reference/scalars#boolean", "/enterprise/2.21/v4/scalar/boolean": "/en/enterprise-server@2.21/graphql/reference/scalars#boolean",
"/enterprise/2.21/v4/scalar/date": "/en/enterprise/2.21/user/graphql/reference/scalars#date", "/enterprise/2.21/v4/scalar/date": "/en/enterprise-server@2.21/graphql/reference/scalars#date",
"/enterprise/2.21/v4/union": "/en/enterprise/2.21/user/graphql/reference/unions", "/enterprise/2.21/v4/union": "/en/enterprise-server@2.21/graphql/reference/unions",
"/enterprise/2.21/v4/union/assignee": "/en/enterprise/2.21/user/graphql/reference/unions#assignee", "/enterprise/2.21/v4/union/assignee": "/en/enterprise-server@2.21/graphql/reference/unions#assignee",
"/enterprise/2.21/v4/union/auditentryactor": "/en/enterprise/2.21/user/graphql/reference/unions#auditentryactor", "/enterprise/2.21/v4/union/auditentryactor": "/en/enterprise-server@2.21/graphql/reference/unions#auditentryactor",
"/enterprise/v4/enum": "/en/enterprise/user/graphql/reference/enums", "/enterprise/v4/enum": "/en/enterprise-server/graphql/reference/enums",
"/enterprise/v4/enum/auditlogorderfield": "/en/enterprise/user/graphql/reference/enums#auditlogorderfield", "/enterprise/v4/enum/auditlogorderfield": "/en/enterprise-server/graphql/reference/enums#auditlogorderfield",
"/enterprise/v4/enum/checkannotationlevel": "/en/enterprise/user/graphql/reference/enums#checkannotationlevel", "/enterprise/v4/enum/checkannotationlevel": "/en/enterprise-server/graphql/reference/enums#checkannotationlevel",
"/enterprise/v4/guides": "/en/enterprise/user/graphql/guides", "/enterprise/v4/guides": "/en/enterprise-server/graphql/guides",
"/enterprise/v4/input_object": "/en/enterprise/user/graphql/reference/input-objects", "/enterprise/v4/input_object": "/en/enterprise-server/graphql/reference/input-objects",
"/enterprise/v4/interface": "/en/enterprise/user/graphql/reference/interfaces", "/enterprise/v4/interface": "/en/enterprise-server/graphql/reference/interfaces",
"/enterprise/v4/interface/actor": "/en/enterprise/user/graphql/reference/interfaces#actor", "/enterprise/v4/interface/actor": "/en/enterprise-server/graphql/reference/interfaces#actor",
"/enterprise/v4/interface/assignable": "/en/enterprise/user/graphql/reference/interfaces#assignable", "/enterprise/v4/interface/assignable": "/en/enterprise-server/graphql/reference/interfaces#assignable",
"/enterprise/v4/mutation": "/en/enterprise/user/graphql/reference/mutations", "/enterprise/v4/mutation": "/en/enterprise-server/graphql/reference/mutations",
"/enterprise/v4/object": "/en/enterprise/user/graphql/reference/objects", "/enterprise/v4/object": "/en/enterprise-server/graphql/reference/objects",
"/enterprise/v4/object/actorlocation": "/en/enterprise/user/graphql/reference/objects#actorlocation", "/enterprise/v4/object/actorlocation": "/en/enterprise-server/graphql/reference/objects#actorlocation",
"/enterprise/v4/object/addedtoprojectevent": "/en/enterprise/user/graphql/reference/objects#addedtoprojectevent", "/enterprise/v4/object/addedtoprojectevent": "/en/enterprise-server/graphql/reference/objects#addedtoprojectevent",
"/enterprise/v4/previews": "/en/enterprise/user/graphql/overview/schema-previews", "/enterprise/v4/previews": "/en/enterprise-server/graphql/overview/schema-previews",
"/enterprise/v4/public_schema": "/en/enterprise/user/graphql/overview/public-schema", "/enterprise/v4/public_schema": "/en/enterprise-server/graphql/overview/public-schema",
"/enterprise/v4/query": "/en/enterprise/user/graphql/reference/queries", "/enterprise/v4/query": "/en/enterprise-server/graphql/reference/queries",
"/enterprise/v4/reference": "/en/enterprise/user/graphql/reference", "/enterprise/v4/reference": "/en/enterprise-server/graphql/reference",
"/enterprise/v4/scalar": "/en/enterprise/user/graphql/reference/scalars", "/enterprise/v4/scalar": "/en/enterprise-server/graphql/reference/scalars",
"/enterprise/v4/scalar/boolean": "/en/enterprise/user/graphql/reference/scalars#boolean", "/enterprise/v4/scalar/boolean": "/en/enterprise-server/graphql/reference/scalars#boolean",
"/enterprise/v4/scalar/date": "/en/enterprise/user/graphql/reference/scalars#date", "/enterprise/v4/scalar/date": "/en/enterprise-server/graphql/reference/scalars#date",
"/enterprise/v4/union": "/en/enterprise/user/graphql/reference/unions", "/enterprise/v4/union": "/en/enterprise-server/graphql/reference/unions",
"/enterprise/v4/union/assignee": "/en/enterprise/user/graphql/reference/unions#assignee", "/enterprise/v4/union/assignee": "/en/enterprise-server/graphql/reference/unions#assignee",
"/enterprise/v4/union/auditentryactor": "/en/enterprise/user/graphql/reference/unions#auditentryactor", "/enterprise/v4/union/auditentryactor": "/en/enterprise-server/graphql/reference/unions#auditentryactor",
"/v4/enum": "/en/graphql/reference/enums", "/v4/enum": "/en/free-pro-team@latest/graphql/reference/enums",
"/v4/enum/auditlogorderfield": "/en/graphql/reference/enums#auditlogorderfield", "/v4/enum/auditlogorderfield": "/en/free-pro-team@latest/graphql/reference/enums#auditlogorderfield",
"/v4/enum/checkannotationlevel": "/en/graphql/reference/enums#checkannotationlevel", "/v4/enum/checkannotationlevel": "/en/free-pro-team@latest/graphql/reference/enums#checkannotationlevel",
"/v4/guides": "/en/graphql/guides", "/v4/guides": "/en/free-pro-team@latest/graphql/guides",
"/v4/input_object": "/en/graphql/reference/input-objects", "/v4/input_object": "/en/free-pro-team@latest/graphql/reference/input-objects",
"/v4/input_object/acceptenterpriseadministratorinvitationinput": "/en/graphql/reference/input-objects#acceptenterpriseadministratorinvitationinput", "/v4/input_object/acceptenterpriseadministratorinvitationinput": "/en/free-pro-team@latest/graphql/reference/input-objects#acceptenterpriseadministratorinvitationinput",
"/v4/input_object/accepttopicsuggestioninput": "/en/graphql/reference/input-objects#accepttopicsuggestioninput", "/v4/input_object/accepttopicsuggestioninput": "/en/free-pro-team@latest/graphql/reference/input-objects#accepttopicsuggestioninput",
"/v4/interface": "/en/graphql/reference/interfaces", "/v4/interface": "/en/free-pro-team@latest/graphql/reference/interfaces",
"/v4/interface/actor": "/en/graphql/reference/interfaces#actor", "/v4/interface/actor": "/en/free-pro-team@latest/graphql/reference/interfaces#actor",
"/v4/interface/assignable": "/en/graphql/reference/interfaces#assignable", "/v4/interface/assignable": "/en/free-pro-team@latest/graphql/reference/interfaces#assignable",
"/v4/mutation": "/en/graphql/reference/mutations", "/v4/mutation": "/en/free-pro-team@latest/graphql/reference/mutations",
"/v4/mutation/acceptenterpriseadministratorinvitation": "/en/graphql/reference/mutations#acceptenterpriseadministratorinvitation", "/v4/mutation/acceptenterpriseadministratorinvitation": "/en/free-pro-team@latest/graphql/reference/mutations#acceptenterpriseadministratorinvitation",
"/v4/mutation/accepttopicsuggestion": "/en/graphql/reference/mutations#accepttopicsuggestion", "/v4/mutation/accepttopicsuggestion": "/en/free-pro-team@latest/graphql/reference/mutations#accepttopicsuggestion",
"/v4/object": "/en/graphql/reference/objects", "/v4/object": "/en/free-pro-team@latest/graphql/reference/objects",
"/v4/object/actorlocation": "/en/graphql/reference/objects#actorlocation", "/v4/object/actorlocation": "/en/free-pro-team@latest/graphql/reference/objects#actorlocation",
"/v4/object/addedtoprojectevent": "/en/graphql/reference/objects#addedtoprojectevent", "/v4/object/addedtoprojectevent": "/en/free-pro-team@latest/graphql/reference/objects#addedtoprojectevent",
"/v4/previews": "/en/graphql/overview/schema-previews", "/v4/previews": "/en/free-pro-team@latest/graphql/overview/schema-previews",
"/v4/public_schema": "/en/graphql/overview/public-schema", "/v4/public_schema": "/en/free-pro-team@latest/graphql/overview/public-schema",
"/v4/query": "/en/graphql/reference/queries", "/v4/query": "/en/free-pro-team@latest/graphql/reference/queries",
"/v4/reference": "/en/graphql/reference", "/v4/reference": "/en/free-pro-team@latest/graphql/reference",
"/v4/scalar": "/en/graphql/reference/scalars", "/v4/scalar": "/en/free-pro-team@latest/graphql/reference/scalars",
"/v4/scalar/boolean": "/en/graphql/reference/scalars#boolean", "/v4/scalar/boolean": "/en/free-pro-team@latest/graphql/reference/scalars#boolean",
"/v4/scalar/date": "/en/graphql/reference/scalars#date", "/v4/scalar/date": "/en/free-pro-team@latest/graphql/reference/scalars#date",
"/v4/union": "/en/graphql/reference/unions", "/v4/union": "/en/free-pro-team@latest/graphql/reference/unions",
"/v4/union/assignee": "/en/graphql/reference/unions#assignee", "/v4/union/assignee": "/en/free-pro-team@latest/graphql/reference/unions#assignee",
"/v4/union/auditentryactor": "/en/graphql/reference/unions#auditentryactor" "/v4/union/auditentryactor": "/en/free-pro-team@latest/graphql/reference/unions#auditentryactor"
} }

View File

@@ -1,9 +0,0 @@
---
title: GitHub 上でプロジェクトを探索する
intro: ''
mapTopic: verdadero
versions:
free-pro-team: '*'
enterprise-server: '*'
---

View File

@@ -1,68 +0,0 @@
{
"/apps": "/en/free-pro-team@latest/developers/apps",
"/apps/building-github-apps": "/en/free-pro-team@latest/developers/apps/building-github-apps",
"/apps/building-oauth-apps": "/en/free-pro-team@latest/developers/apps/building-oauth-apps",
"/apps/managing-github-apps": "/en/free-pro-team@latest/developers/apps/managing-github-apps",
"/apps/managing-oauth-apps": "/en/free-pro-team@latest/developers/apps/managing-oauth-apps",
"/apps/quickstart-guides": "/en/free-pro-team@latest/developers/apps/guides",
"/marketplace": "/en/free-pro-team@latest/developers/github-marketplace",
"/marketplace/getting-started": "/en/free-pro-team@latest/developers/github-marketplace/about-github-marketplace",
"/marketplace/integrating-with-the-github-marketplace-api": "/en/free-pro-team@latest/developers/github-marketplace/using-the-github-marketplace-api-in-your-app",
"/marketplace/listing-on-github-marketplace": "/en/free-pro-team@latest/developers/github-marketplace/listing-an-app-on-github-marketplace",
"/marketplace/selling-your-app": "/en/free-pro-team@latest/developers/github-marketplace/selling-your-app-on-github-marketplace",
"/v3": "/en/free-pro-team@latest/rest",
"/v3/actions/workflow-jobs": "/en/free-pro-team@latest/rest/reference/actions#workflow-jobs",
"/v3/actions/workflow-runs": "/en/free-pro-team@latest/rest/reference/actions#workflow-runs",
"/v3/actions/workflow_jobs": "/en/free-pro-team@latest/rest/reference/actions#workflow-jobs",
"/v3/actions/workflow_runs": "/en/free-pro-team@latest/rest/reference/actions#workflow-runs",
"/v3/guides": "/en/free-pro-team@latest/rest/guides",
"/v3/guides/managing-deploy-keys": "/en/free-pro-team@latest/developers/overview/managing-deploy-keys",
"/v3/misc": "/en/free-pro-team@latest/rest/reference/emojis",
"/v4/public_schema": "/en/free-pro-team@latest/graphql/overview/public-schema",
"/v4/object/repository": "/en/free-pro-team@latest/graphql/reference/objects#repository",
"/webhooks": "/en/free-pro-team@latest/developers/webhooks-and-events/about-webhooks",
"/en/enterprise/2.18/apps": "/en/enterprise/2.18/user/developers/apps",
"/en/enterprise/2.18/apps/building-oauth-apps/authorizing-oauth-apps": "/en/enterprise/2.18/user/developers/apps/authorizing-oauth-apps",
"/en/enterprise/2.18/apps/building-oauth-apps/understanding-scopes-for-oauth-apps": "/en/enterprise/2.18/user/developers/apps/scopes-for-oauth-apps",
"/en/enterprise/2.18/apps/differences-between-apps": "/en/enterprise/2.18/user/developers/apps/differences-between-github-apps-and-oauth-apps",
"/en/enterprise/2.18/v3/auth": "/en/enterprise/2.18/user/rest/overview/other-authentication-methods",
"/en/enterprise/2.18/v3/guides/managing-deploy-keys": "/en/enterprise/2.18/user/developers/overview/managing-deploy-keys",
"/en/enterprise/2.18/v4/explorer": "/en/enterprise/2.18/user/graphql/overview/explorer",
"/en/enterprise/2.18/v4/guides/forming-calls": "/en/enterprise/2.18/user/graphql/guides/forming-calls-with-graphql",
"/en/enterprise/2.18/v4/guides/intro-to-graphql": "/en/enterprise/2.18/user/graphql/guides/introduction-to-graphql",
"/en/enterprise/2.18/v4/guides/migrating-from-rest": "/en/enterprise/2.18/user/graphql/guides/migrating-from-rest-to-graphql",
"/en/enterprise/2.18/webhooks": "/en/enterprise/2.18/user/developers/webhooks-and-events/about-webhooks",
"/en/enterprise/2.19/apps": "/en/enterprise-server@2.19/developers/apps",
"/en/enterprise/2.19/apps/building-oauth-apps/authorizing-oauth-apps": "/en/enterprise-server@2.19/developers/apps/authorizing-oauth-apps",
"/en/enterprise/2.19/apps/building-oauth-apps/understanding-scopes-for-oauth-apps": "/en/enterprise-server@2.19/developers/apps/scopes-for-oauth-apps",
"/en/enterprise/2.19/apps/differences-between-apps": "/en/enterprise-server@2.19/developers/apps/differences-between-github-apps-and-oauth-apps",
"/en/enterprise/2.19/v3/auth": "/en/enterprise-server@2.19/rest/overview/other-authentication-methods",
"/en/enterprise/2.19/v3/guides/managing-deploy-keys": "/en/enterprise-server@2.19/developers/overview/managing-deploy-keys",
"/en/enterprise/2.19/v4/explorer": "/en/enterprise-server@2.19/graphql/overview/explorer",
"/en/enterprise/2.19/v4/guides/forming-calls": "/en/enterprise-server@2.19/graphql/guides/forming-calls-with-graphql",
"/en/enterprise/2.19/v4/guides/intro-to-graphql": "/en/enterprise-server@2.19/graphql/guides/introduction-to-graphql",
"/en/enterprise/2.19/v4/guides/migrating-from-rest": "/en/enterprise-server@2.19/graphql/guides/migrating-from-rest-to-graphql",
"/en/enterprise/2.19/webhooks": "/en/enterprise-server@2.19/developers/webhooks-and-events/about-webhooks",
"/en/enterprise/2.20/apps": "/en/enterprise-server@2.20/developers/apps",
"/en/enterprise/2.20/apps/building-oauth-apps/authorizing-oauth-apps": "/en/enterprise-server@2.20/developers/apps/authorizing-oauth-apps",
"/en/enterprise/2.20/apps/building-oauth-apps/understanding-scopes-for-oauth-apps": "/en/enterprise-server@2.20/developers/apps/scopes-for-oauth-apps",
"/en/enterprise/2.20/apps/differences-between-apps": "/en/enterprise-server@2.20/developers/apps/differences-between-github-apps-and-oauth-apps",
"/en/enterprise/2.20/v3/auth": "/en/enterprise-server@2.20/rest/overview/other-authentication-methods",
"/en/enterprise/2.20/v3/guides/managing-deploy-keys": "/en/enterprise-server@2.20/developers/overview/managing-deploy-keys",
"/en/enterprise/2.20/v4/explorer": "/en/enterprise-server@2.20/graphql/overview/explorer",
"/en/enterprise/2.20/v4/guides/forming-calls": "/en/enterprise-server@2.20/graphql/guides/forming-calls-with-graphql",
"/en/enterprise/2.20/v4/guides/intro-to-graphql": "/en/enterprise-server@2.20/graphql/guides/introduction-to-graphql",
"/en/enterprise/2.20/v4/guides/migrating-from-rest": "/en/enterprise-server@2.20/graphql/guides/migrating-from-rest-to-graphql",
"/en/enterprise/2.20/webhooks": "/en/enterprise-server@2.20/developers/webhooks-and-events/about-webhooks",
"/en/enterprise/2.21/apps": "/en/enterprise-server@2.21/developers/apps",
"/en/enterprise/2.21/apps/building-oauth-apps/authorizing-oauth-apps": "/en/enterprise-server@2.21/developers/apps/authorizing-oauth-apps",
"/en/enterprise/2.21/apps/building-oauth-apps/understanding-scopes-for-oauth-apps": "/en/enterprise-server@2.21/developers/apps/scopes-for-oauth-apps",
"/en/enterprise/2.21/apps/differences-between-apps": "/en/enterprise-server@2.21/developers/apps/differences-between-github-apps-and-oauth-apps",
"/en/enterprise/2.21/v3/auth": "/en/enterprise-server@2.21/rest/overview/other-authentication-methods",
"/en/enterprise/2.21/v3/guides/managing-deploy-keys": "/en/enterprise-server@2.21/developers/overview/managing-deploy-keys",
"/en/enterprise/2.21/v4/explorer": "/en/enterprise-server@2.21/graphql/overview/explorer",
"/en/enterprise/2.21/v4/guides/forming-calls": "/en/enterprise-server@2.21/graphql/guides/forming-calls-with-graphql",
"/en/enterprise/2.21/v4/guides/intro-to-graphql": "/en/enterprise-server@2.21/graphql/guides/introduction-to-graphql",
"/en/enterprise/2.21/v4/guides/migrating-from-rest": "/en/enterprise-server@2.21/graphql/guides/migrating-from-rest-to-graphql",
"/en/enterprise/2.21/webhooks": "/en/enterprise-server@2.21/developers/webhooks-and-events/about-webhooks"
}

View File

@@ -1,446 +0,0 @@
{
"/en/enterprise/2.18/user/v4/enum": "/en/enterprise/2.18/user/graphql/reference/enums",
"/en/enterprise/2.18/user/v4/enum/auditlogorderfield": "/en/enterprise/2.18/user/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.18/user/v4/enum/checkannotationlevel": "/en/enterprise/2.18/user/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.18/user/v4/guides": "/en/enterprise/2.18/user/graphql/guides",
"/en/enterprise/2.18/user/v4/input_object": "/en/enterprise/2.18/user/graphql/reference/input-objects",
"/en/enterprise/2.18/user/v4/interface": "/en/enterprise/2.18/user/graphql/reference/interfaces",
"/en/enterprise/2.18/user/v4/interface/actor": "/en/enterprise/2.18/user/graphql/reference/interfaces#actor",
"/en/enterprise/2.18/user/v4/interface/assignable": "/en/enterprise/2.18/user/graphql/reference/interfaces#assignable",
"/en/enterprise/2.18/user/v4/mutation": "/en/enterprise/2.18/user/graphql/reference/mutations",
"/en/enterprise/2.18/user/v4/object": "/en/enterprise/2.18/user/graphql/reference/objects",
"/en/enterprise/2.18/user/v4/object/actorlocation": "/en/enterprise/2.18/user/graphql/reference/objects#actorlocation",
"/en/enterprise/2.18/user/v4/object/addedtoprojectevent": "/en/enterprise/2.18/user/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.18/user/v4/previews": "/en/enterprise/2.18/user/graphql/overview/schema-previews",
"/en/enterprise/2.18/user/v4/public_schema": "/en/enterprise/2.18/user/graphql/overview/public-schema",
"/en/enterprise/2.18/user/v4/query": "/en/enterprise/2.18/user/graphql/reference/queries",
"/en/enterprise/2.18/user/v4/reference": "/en/enterprise/2.18/user/graphql/reference",
"/en/enterprise/2.18/user/v4/scalar": "/en/enterprise/2.18/user/graphql/reference/scalars",
"/en/enterprise/2.18/user/v4/scalar/boolean": "/en/enterprise/2.18/user/graphql/reference/scalars#boolean",
"/en/enterprise/2.18/user/v4/scalar/date": "/en/enterprise/2.18/user/graphql/reference/scalars#date",
"/en/enterprise/2.18/user/v4/union": "/en/enterprise/2.18/user/graphql/reference/unions",
"/en/enterprise/2.18/user/v4/union/auditentryactor": "/en/enterprise/2.18/user/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.18/v4/enum": "/en/enterprise/2.18/user/graphql/reference/enums",
"/en/enterprise/2.18/v4/enum/auditlogorderfield": "/en/enterprise/2.18/user/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.18/v4/enum/checkannotationlevel": "/en/enterprise/2.18/user/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.18/v4/guides": "/en/enterprise/2.18/user/graphql/guides",
"/en/enterprise/2.18/v4/input_object": "/en/enterprise/2.18/user/graphql/reference/input-objects",
"/en/enterprise/2.18/v4/interface": "/en/enterprise/2.18/user/graphql/reference/interfaces",
"/en/enterprise/2.18/v4/interface/actor": "/en/enterprise/2.18/user/graphql/reference/interfaces#actor",
"/en/enterprise/2.18/v4/interface/assignable": "/en/enterprise/2.18/user/graphql/reference/interfaces#assignable",
"/en/enterprise/2.18/v4/mutation": "/en/enterprise/2.18/user/graphql/reference/mutations",
"/en/enterprise/2.18/v4/object": "/en/enterprise/2.18/user/graphql/reference/objects",
"/en/enterprise/2.18/v4/object/actorlocation": "/en/enterprise/2.18/user/graphql/reference/objects#actorlocation",
"/en/enterprise/2.18/v4/object/addedtoprojectevent": "/en/enterprise/2.18/user/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.18/v4/previews": "/en/enterprise/2.18/user/graphql/overview/schema-previews",
"/en/enterprise/2.18/v4/public_schema": "/en/enterprise/2.18/user/graphql/overview/public-schema",
"/en/enterprise/2.18/v4/query": "/en/enterprise/2.18/user/graphql/reference/queries",
"/en/enterprise/2.18/v4/reference": "/en/enterprise/2.18/user/graphql/reference",
"/en/enterprise/2.18/v4/scalar": "/en/enterprise/2.18/user/graphql/reference/scalars",
"/en/enterprise/2.18/v4/scalar/boolean": "/en/enterprise/2.18/user/graphql/reference/scalars#boolean",
"/en/enterprise/2.18/v4/scalar/date": "/en/enterprise/2.18/user/graphql/reference/scalars#date",
"/en/enterprise/2.18/v4/union": "/en/enterprise/2.18/user/graphql/reference/unions",
"/en/enterprise/2.18/v4/union/auditentryactor": "/en/enterprise/2.18/user/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.19/user/v4/enum": "/en/enterprise-server@2.19/graphql/reference/enums",
"/en/enterprise/2.19/user/v4/enum/auditlogorderfield": "/en/enterprise-server@2.19/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.19/user/v4/enum/checkannotationlevel": "/en/enterprise-server@2.19/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.19/user/v4/guides": "/en/enterprise-server@2.19/graphql/guides",
"/en/enterprise/2.19/user/v4/input_object": "/en/enterprise-server@2.19/graphql/reference/input-objects",
"/en/enterprise/2.19/user/v4/interface": "/en/enterprise-server@2.19/graphql/reference/interfaces",
"/en/enterprise/2.19/user/v4/interface/actor": "/en/enterprise-server@2.19/graphql/reference/interfaces#actor",
"/en/enterprise/2.19/user/v4/interface/assignable": "/en/enterprise-server@2.19/graphql/reference/interfaces#assignable",
"/en/enterprise/2.19/user/v4/mutation": "/en/enterprise-server@2.19/graphql/reference/mutations",
"/en/enterprise/2.19/user/v4/object": "/en/enterprise-server@2.19/graphql/reference/objects",
"/en/enterprise/2.19/user/v4/object/actorlocation": "/en/enterprise-server@2.19/graphql/reference/objects#actorlocation",
"/en/enterprise/2.19/user/v4/object/addedtoprojectevent": "/en/enterprise-server@2.19/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.19/user/v4/previews": "/en/enterprise-server@2.19/graphql/overview/schema-previews",
"/en/enterprise/2.19/user/v4/public_schema": "/en/enterprise-server@2.19/graphql/overview/public-schema",
"/en/enterprise/2.19/user/v4/query": "/en/enterprise-server@2.19/graphql/reference/queries",
"/en/enterprise/2.19/user/v4/reference": "/en/enterprise-server@2.19/graphql/reference",
"/en/enterprise/2.19/user/v4/scalar": "/en/enterprise-server@2.19/graphql/reference/scalars",
"/en/enterprise/2.19/user/v4/scalar/boolean": "/en/enterprise-server@2.19/graphql/reference/scalars#boolean",
"/en/enterprise/2.19/user/v4/scalar/date": "/en/enterprise-server@2.19/graphql/reference/scalars#date",
"/en/enterprise/2.19/user/v4/union": "/en/enterprise-server@2.19/graphql/reference/unions",
"/en/enterprise/2.19/user/v4/union/assignee": "/en/enterprise-server@2.19/graphql/reference/unions#assignee",
"/en/enterprise/2.19/user/v4/union/auditentryactor": "/en/enterprise-server@2.19/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.19/v4/enum": "/en/enterprise-server@2.19/graphql/reference/enums",
"/en/enterprise/2.19/v4/enum/auditlogorderfield": "/en/enterprise-server@2.19/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.19/v4/enum/checkannotationlevel": "/en/enterprise-server@2.19/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.19/v4/guides": "/en/enterprise-server@2.19/graphql/guides",
"/en/enterprise/2.19/v4/input_object": "/en/enterprise-server@2.19/graphql/reference/input-objects",
"/en/enterprise/2.19/v4/interface": "/en/enterprise-server@2.19/graphql/reference/interfaces",
"/en/enterprise/2.19/v4/interface/actor": "/en/enterprise-server@2.19/graphql/reference/interfaces#actor",
"/en/enterprise/2.19/v4/interface/assignable": "/en/enterprise-server@2.19/graphql/reference/interfaces#assignable",
"/en/enterprise/2.19/v4/mutation": "/en/enterprise-server@2.19/graphql/reference/mutations",
"/en/enterprise/2.19/v4/object": "/en/enterprise-server@2.19/graphql/reference/objects",
"/en/enterprise/2.19/v4/object/actorlocation": "/en/enterprise-server@2.19/graphql/reference/objects#actorlocation",
"/en/enterprise/2.19/v4/object/addedtoprojectevent": "/en/enterprise-server@2.19/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.19/v4/previews": "/en/enterprise-server@2.19/graphql/overview/schema-previews",
"/en/enterprise/2.19/v4/public_schema": "/en/enterprise-server@2.19/graphql/overview/public-schema",
"/en/enterprise/2.19/v4/query": "/en/enterprise-server@2.19/graphql/reference/queries",
"/en/enterprise/2.19/v4/reference": "/en/enterprise-server@2.19/graphql/reference",
"/en/enterprise/2.19/v4/scalar": "/en/enterprise-server@2.19/graphql/reference/scalars",
"/en/enterprise/2.19/v4/scalar/boolean": "/en/enterprise-server@2.19/graphql/reference/scalars#boolean",
"/en/enterprise/2.19/v4/scalar/date": "/en/enterprise-server@2.19/graphql/reference/scalars#date",
"/en/enterprise/2.19/v4/union": "/en/enterprise-server@2.19/graphql/reference/unions",
"/en/enterprise/2.19/v4/union/assignee": "/en/enterprise-server@2.19/graphql/reference/unions#assignee",
"/en/enterprise/2.19/v4/union/auditentryactor": "/en/enterprise-server@2.19/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.20/user/v4/enum": "/en/enterprise-server@2.20/graphql/reference/enums",
"/en/enterprise/2.20/user/v4/enum/auditlogorderfield": "/en/enterprise-server@2.20/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.20/user/v4/enum/checkannotationlevel": "/en/enterprise-server@2.20/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.20/user/v4/guides": "/en/enterprise-server@2.20/graphql/guides",
"/en/enterprise/2.20/user/v4/input_object": "/en/enterprise-server@2.20/graphql/reference/input-objects",
"/en/enterprise/2.20/user/v4/interface": "/en/enterprise-server@2.20/graphql/reference/interfaces",
"/en/enterprise/2.20/user/v4/interface/actor": "/en/enterprise-server@2.20/graphql/reference/interfaces#actor",
"/en/enterprise/2.20/user/v4/interface/assignable": "/en/enterprise-server@2.20/graphql/reference/interfaces#assignable",
"/en/enterprise/2.20/user/v4/mutation": "/en/enterprise-server@2.20/graphql/reference/mutations",
"/en/enterprise/2.20/user/v4/object": "/en/enterprise-server@2.20/graphql/reference/objects",
"/en/enterprise/2.20/user/v4/object/actorlocation": "/en/enterprise-server@2.20/graphql/reference/objects#actorlocation",
"/en/enterprise/2.20/user/v4/object/addedtoprojectevent": "/en/enterprise-server@2.20/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.20/user/v4/previews": "/en/enterprise-server@2.20/graphql/overview/schema-previews",
"/en/enterprise/2.20/user/v4/public_schema": "/en/enterprise-server@2.20/graphql/overview/public-schema",
"/en/enterprise/2.20/user/v4/query": "/en/enterprise-server@2.20/graphql/reference/queries",
"/en/enterprise/2.20/user/v4/reference": "/en/enterprise-server@2.20/graphql/reference",
"/en/enterprise/2.20/user/v4/scalar": "/en/enterprise-server@2.20/graphql/reference/scalars",
"/en/enterprise/2.20/user/v4/scalar/boolean": "/en/enterprise-server@2.20/graphql/reference/scalars#boolean",
"/en/enterprise/2.20/user/v4/scalar/date": "/en/enterprise-server@2.20/graphql/reference/scalars#date",
"/en/enterprise/2.20/user/v4/union": "/en/enterprise-server@2.20/graphql/reference/unions",
"/en/enterprise/2.20/user/v4/union/assignee": "/en/enterprise-server@2.20/graphql/reference/unions#assignee",
"/en/enterprise/2.20/user/v4/union/auditentryactor": "/en/enterprise-server@2.20/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.20/v4/enum": "/en/enterprise-server@2.20/graphql/reference/enums",
"/en/enterprise/2.20/v4/enum/auditlogorderfield": "/en/enterprise-server@2.20/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.20/v4/enum/checkannotationlevel": "/en/enterprise-server@2.20/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.20/v4/guides": "/en/enterprise-server@2.20/graphql/guides",
"/en/enterprise/2.20/v4/input_object": "/en/enterprise-server@2.20/graphql/reference/input-objects",
"/en/enterprise/2.20/v4/interface": "/en/enterprise-server@2.20/graphql/reference/interfaces",
"/en/enterprise/2.20/v4/interface/actor": "/en/enterprise-server@2.20/graphql/reference/interfaces#actor",
"/en/enterprise/2.20/v4/interface/assignable": "/en/enterprise-server@2.20/graphql/reference/interfaces#assignable",
"/en/enterprise/2.20/v4/mutation": "/en/enterprise-server@2.20/graphql/reference/mutations",
"/en/enterprise/2.20/v4/object": "/en/enterprise-server@2.20/graphql/reference/objects",
"/en/enterprise/2.20/v4/object/actorlocation": "/en/enterprise-server@2.20/graphql/reference/objects#actorlocation",
"/en/enterprise/2.20/v4/object/addedtoprojectevent": "/en/enterprise-server@2.20/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.20/v4/previews": "/en/enterprise-server@2.20/graphql/overview/schema-previews",
"/en/enterprise/2.20/v4/public_schema": "/en/enterprise-server@2.20/graphql/overview/public-schema",
"/en/enterprise/2.20/v4/query": "/en/enterprise-server@2.20/graphql/reference/queries",
"/en/enterprise/2.20/v4/reference": "/en/enterprise-server@2.20/graphql/reference",
"/en/enterprise/2.20/v4/scalar": "/en/enterprise-server@2.20/graphql/reference/scalars",
"/en/enterprise/2.20/v4/scalar/boolean": "/en/enterprise-server@2.20/graphql/reference/scalars#boolean",
"/en/enterprise/2.20/v4/scalar/date": "/en/enterprise-server@2.20/graphql/reference/scalars#date",
"/en/enterprise/2.20/v4/union": "/en/enterprise-server@2.20/graphql/reference/unions",
"/en/enterprise/2.20/v4/union/assignee": "/en/enterprise-server@2.20/graphql/reference/unions#assignee",
"/en/enterprise/2.20/v4/union/auditentryactor": "/en/enterprise-server@2.20/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.21/user/v4/enum": "/en/enterprise-server@2.21/graphql/reference/enums",
"/en/enterprise/2.21/user/v4/enum/auditlogorderfield": "/en/enterprise-server@2.21/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.21/user/v4/enum/checkannotationlevel": "/en/enterprise-server@2.21/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.21/user/v4/guides": "/en/enterprise-server@2.21/graphql/guides",
"/en/enterprise/2.21/user/v4/input_object": "/en/enterprise-server@2.21/graphql/reference/input-objects",
"/en/enterprise/2.21/user/v4/interface": "/en/enterprise-server@2.21/graphql/reference/interfaces",
"/en/enterprise/2.21/user/v4/interface/actor": "/en/enterprise-server@2.21/graphql/reference/interfaces#actor",
"/en/enterprise/2.21/user/v4/interface/assignable": "/en/enterprise-server@2.21/graphql/reference/interfaces#assignable",
"/en/enterprise/2.21/user/v4/mutation": "/en/enterprise-server@2.21/graphql/reference/mutations",
"/en/enterprise/2.21/user/v4/object": "/en/enterprise-server@2.21/graphql/reference/objects",
"/en/enterprise/2.21/user/v4/object/actorlocation": "/en/enterprise-server@2.21/graphql/reference/objects#actorlocation",
"/en/enterprise/2.21/user/v4/object/addedtoprojectevent": "/en/enterprise-server@2.21/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.21/user/v4/previews": "/en/enterprise-server@2.21/graphql/overview/schema-previews",
"/en/enterprise/2.21/user/v4/public_schema": "/en/enterprise-server@2.21/graphql/overview/public-schema",
"/en/enterprise/2.21/user/v4/query": "/en/enterprise-server@2.21/graphql/reference/queries",
"/en/enterprise/2.21/user/v4/reference": "/en/enterprise-server@2.21/graphql/reference",
"/en/enterprise/2.21/user/v4/scalar": "/en/enterprise-server@2.21/graphql/reference/scalars",
"/en/enterprise/2.21/user/v4/scalar/boolean": "/en/enterprise-server@2.21/graphql/reference/scalars#boolean",
"/en/enterprise/2.21/user/v4/scalar/date": "/en/enterprise-server@2.21/graphql/reference/scalars#date",
"/en/enterprise/2.21/user/v4/union": "/en/enterprise-server@2.21/graphql/reference/unions",
"/en/enterprise/2.21/user/v4/union/assignee": "/en/enterprise-server@2.21/graphql/reference/unions#assignee",
"/en/enterprise/2.21/user/v4/union/auditentryactor": "/en/enterprise-server@2.21/graphql/reference/unions#auditentryactor",
"/en/enterprise/2.21/v4/enum": "/en/enterprise-server@2.21/graphql/reference/enums",
"/en/enterprise/2.21/v4/enum/auditlogorderfield": "/en/enterprise-server@2.21/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/2.21/v4/enum/checkannotationlevel": "/en/enterprise-server@2.21/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/2.21/v4/guides": "/en/enterprise-server@2.21/graphql/guides",
"/en/enterprise/2.21/v4/input_object": "/en/enterprise-server@2.21/graphql/reference/input-objects",
"/en/enterprise/2.21/v4/interface": "/en/enterprise-server@2.21/graphql/reference/interfaces",
"/en/enterprise/2.21/v4/interface/actor": "/en/enterprise-server@2.21/graphql/reference/interfaces#actor",
"/en/enterprise/2.21/v4/interface/assignable": "/en/enterprise-server@2.21/graphql/reference/interfaces#assignable",
"/en/enterprise/2.21/v4/mutation": "/en/enterprise-server@2.21/graphql/reference/mutations",
"/en/enterprise/2.21/v4/object": "/en/enterprise-server@2.21/graphql/reference/objects",
"/en/enterprise/2.21/v4/object/actorlocation": "/en/enterprise-server@2.21/graphql/reference/objects#actorlocation",
"/en/enterprise/2.21/v4/object/addedtoprojectevent": "/en/enterprise-server@2.21/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/2.21/v4/previews": "/en/enterprise-server@2.21/graphql/overview/schema-previews",
"/en/enterprise/2.21/v4/public_schema": "/en/enterprise-server@2.21/graphql/overview/public-schema",
"/en/enterprise/2.21/v4/query": "/en/enterprise-server@2.21/graphql/reference/queries",
"/en/enterprise/2.21/v4/reference": "/en/enterprise-server@2.21/graphql/reference",
"/en/enterprise/2.21/v4/scalar": "/en/enterprise-server@2.21/graphql/reference/scalars",
"/en/enterprise/2.21/v4/scalar/boolean": "/en/enterprise-server@2.21/graphql/reference/scalars#boolean",
"/en/enterprise/2.21/v4/scalar/date": "/en/enterprise-server@2.21/graphql/reference/scalars#date",
"/en/enterprise/2.21/v4/union": "/en/enterprise-server@2.21/graphql/reference/unions",
"/en/enterprise/2.21/v4/union/assignee": "/en/enterprise-server@2.21/graphql/reference/unions#assignee",
"/en/enterprise/2.21/v4/union/auditentryactor": "/en/enterprise-server@2.21/graphql/reference/unions#auditentryactor",
"/en/enterprise/v4/enum": "/en/enterprise-server/graphql/reference/enums",
"/en/enterprise/v4/enum/auditlogorderfield": "/en/enterprise-server/graphql/reference/enums#auditlogorderfield",
"/en/enterprise/v4/enum/checkannotationlevel": "/en/enterprise-server/graphql/reference/enums#checkannotationlevel",
"/en/enterprise/v4/guides": "/en/enterprise-server/graphql/guides",
"/en/enterprise/v4/input_object": "/en/enterprise-server/graphql/reference/input-objects",
"/en/enterprise/v4/interface": "/en/enterprise-server/graphql/reference/interfaces",
"/en/enterprise/v4/interface/actor": "/en/enterprise-server/graphql/reference/interfaces#actor",
"/en/enterprise/v4/interface/assignable": "/en/enterprise-server/graphql/reference/interfaces#assignable",
"/en/enterprise/v4/mutation": "/en/enterprise-server/graphql/reference/mutations",
"/en/enterprise/v4/object": "/en/enterprise-server/graphql/reference/objects",
"/en/enterprise/v4/object/actorlocation": "/en/enterprise-server/graphql/reference/objects#actorlocation",
"/en/enterprise/v4/object/addedtoprojectevent": "/en/enterprise-server/graphql/reference/objects#addedtoprojectevent",
"/en/enterprise/v4/previews": "/en/enterprise-server/graphql/overview/schema-previews",
"/en/enterprise/v4/public_schema": "/en/enterprise-server/graphql/overview/public-schema",
"/en/enterprise/v4/query": "/en/enterprise-server/graphql/reference/queries",
"/en/enterprise/v4/reference": "/en/enterprise-server/graphql/reference",
"/en/enterprise/v4/scalar": "/en/enterprise-server/graphql/reference/scalars",
"/en/enterprise/v4/scalar/boolean": "/en/enterprise-server/graphql/reference/scalars#boolean",
"/en/enterprise/v4/scalar/date": "/en/enterprise-server/graphql/reference/scalars#date",
"/en/enterprise/v4/union": "/en/enterprise-server/graphql/reference/unions",
"/en/enterprise/v4/union/assignee": "/en/enterprise-server/graphql/reference/unions#assignee",
"/en/enterprise/v4/union/auditentryactor": "/en/enterprise-server/graphql/reference/unions#auditentryactor",
"/en/v4/enum": "/en/free-pro-team@latest/graphql/reference/enums",
"/en/v4/enum/auditlogorderfield": "/en/free-pro-team@latest/graphql/reference/enums#auditlogorderfield",
"/en/v4/enum/checkannotationlevel": "/en/free-pro-team@latest/graphql/reference/enums#checkannotationlevel",
"/en/v4/guides": "/en/free-pro-team@latest/graphql/guides",
"/en/v4/input_object": "/en/free-pro-team@latest/graphql/reference/input-objects",
"/en/v4/input_object/acceptenterpriseadministratorinvitationinput": "/en/free-pro-team@latest/graphql/reference/input-objects#acceptenterpriseadministratorinvitationinput",
"/en/v4/input_object/accepttopicsuggestioninput": "/en/free-pro-team@latest/graphql/reference/input-objects#accepttopicsuggestioninput",
"/en/v4/interface": "/en/free-pro-team@latest/graphql/reference/interfaces",
"/en/v4/interface/actor": "/en/free-pro-team@latest/graphql/reference/interfaces#actor",
"/en/v4/interface/assignable": "/en/free-pro-team@latest/graphql/reference/interfaces#assignable",
"/en/v4/mutation": "/en/free-pro-team@latest/graphql/reference/mutations",
"/en/v4/mutation/acceptenterpriseadministratorinvitation": "/en/free-pro-team@latest/graphql/reference/mutations#acceptenterpriseadministratorinvitation",
"/en/v4/mutation/accepttopicsuggestion": "/en/free-pro-team@latest/graphql/reference/mutations#accepttopicsuggestion",
"/en/v4/object": "/en/free-pro-team@latest/graphql/reference/objects",
"/en/v4/object/actorlocation": "/en/free-pro-team@latest/graphql/reference/objects#actorlocation",
"/en/v4/object/addedtoprojectevent": "/en/free-pro-team@latest/graphql/reference/objects#addedtoprojectevent",
"/en/v4/previews": "/en/free-pro-team@latest/graphql/overview/schema-previews",
"/en/v4/public_schema": "/en/free-pro-team@latest/graphql/overview/public-schema",
"/en/v4/query": "/en/free-pro-team@latest/graphql/reference/queries",
"/en/v4/reference": "/en/free-pro-team@latest/graphql/reference",
"/en/v4/scalar": "/en/free-pro-team@latest/graphql/reference/scalars",
"/en/v4/scalar/boolean": "/en/free-pro-team@latest/graphql/reference/scalars#boolean",
"/en/v4/scalar/date": "/en/free-pro-team@latest/graphql/reference/scalars#date",
"/en/v4/union": "/en/free-pro-team@latest/graphql/reference/unions",
"/en/v4/union/assignee": "/en/free-pro-team@latest/graphql/reference/unions#assignee",
"/en/v4/union/auditentryactor": "/en/free-pro-team@latest/graphql/reference/unions#auditentryactor",
"/enterprise/2.18/user/v4/enum": "/en/enterprise/2.18/user/graphql/reference/enums",
"/enterprise/2.18/user/v4/enum/auditlogorderfield": "/en/enterprise/2.18/user/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.18/user/v4/enum/checkannotationlevel": "/en/enterprise/2.18/user/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.18/user/v4/guides": "/en/enterprise/2.18/user/graphql/guides",
"/enterprise/2.18/user/v4/input_object": "/en/enterprise/2.18/user/graphql/reference/input-objects",
"/enterprise/2.18/user/v4/interface": "/en/enterprise/2.18/user/graphql/reference/interfaces",
"/enterprise/2.18/user/v4/interface/actor": "/en/enterprise/2.18/user/graphql/reference/interfaces#actor",
"/enterprise/2.18/user/v4/interface/assignable": "/en/enterprise/2.18/user/graphql/reference/interfaces#assignable",
"/enterprise/2.18/user/v4/mutation": "/en/enterprise/2.18/user/graphql/reference/mutations",
"/enterprise/2.18/user/v4/object": "/en/enterprise/2.18/user/graphql/reference/objects",
"/enterprise/2.18/user/v4/object/actorlocation": "/en/enterprise/2.18/user/graphql/reference/objects#actorlocation",
"/enterprise/2.18/user/v4/object/addedtoprojectevent": "/en/enterprise/2.18/user/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.18/user/v4/previews": "/en/enterprise/2.18/user/graphql/overview/schema-previews",
"/enterprise/2.18/user/v4/public_schema": "/en/enterprise/2.18/user/graphql/overview/public-schema",
"/enterprise/2.18/user/v4/query": "/en/enterprise/2.18/user/graphql/reference/queries",
"/enterprise/2.18/user/v4/reference": "/en/enterprise/2.18/user/graphql/reference",
"/enterprise/2.18/user/v4/scalar": "/en/enterprise/2.18/user/graphql/reference/scalars",
"/enterprise/2.18/user/v4/scalar/boolean": "/en/enterprise/2.18/user/graphql/reference/scalars#boolean",
"/enterprise/2.18/user/v4/scalar/date": "/en/enterprise/2.18/user/graphql/reference/scalars#date",
"/enterprise/2.18/user/v4/union": "/en/enterprise/2.18/user/graphql/reference/unions",
"/enterprise/2.18/user/v4/union/auditentryactor": "/en/enterprise/2.18/user/graphql/reference/unions#auditentryactor",
"/enterprise/2.18/v4/enum": "/en/enterprise/2.18/user/graphql/reference/enums",
"/enterprise/2.18/v4/enum/auditlogorderfield": "/en/enterprise/2.18/user/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.18/v4/enum/checkannotationlevel": "/en/enterprise/2.18/user/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.18/v4/guides": "/en/enterprise/2.18/user/graphql/guides",
"/enterprise/2.18/v4/input_object": "/en/enterprise/2.18/user/graphql/reference/input-objects",
"/enterprise/2.18/v4/interface": "/en/enterprise/2.18/user/graphql/reference/interfaces",
"/enterprise/2.18/v4/interface/actor": "/en/enterprise/2.18/user/graphql/reference/interfaces#actor",
"/enterprise/2.18/v4/interface/assignable": "/en/enterprise/2.18/user/graphql/reference/interfaces#assignable",
"/enterprise/2.18/v4/mutation": "/en/enterprise/2.18/user/graphql/reference/mutations",
"/enterprise/2.18/v4/object": "/en/enterprise/2.18/user/graphql/reference/objects",
"/enterprise/2.18/v4/object/actorlocation": "/en/enterprise/2.18/user/graphql/reference/objects#actorlocation",
"/enterprise/2.18/v4/object/addedtoprojectevent": "/en/enterprise/2.18/user/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.18/v4/previews": "/en/enterprise/2.18/user/graphql/overview/schema-previews",
"/enterprise/2.18/v4/public_schema": "/en/enterprise/2.18/user/graphql/overview/public-schema",
"/enterprise/2.18/v4/query": "/en/enterprise/2.18/user/graphql/reference/queries",
"/enterprise/2.18/v4/reference": "/en/enterprise/2.18/user/graphql/reference",
"/enterprise/2.18/v4/scalar": "/en/enterprise/2.18/user/graphql/reference/scalars",
"/enterprise/2.18/v4/scalar/boolean": "/en/enterprise/2.18/user/graphql/reference/scalars#boolean",
"/enterprise/2.18/v4/scalar/date": "/en/enterprise/2.18/user/graphql/reference/scalars#date",
"/enterprise/2.18/v4/union": "/en/enterprise/2.18/user/graphql/reference/unions",
"/enterprise/2.18/v4/union/auditentryactor": "/en/enterprise/2.18/user/graphql/reference/unions#auditentryactor",
"/enterprise/2.19/user/v4/enum": "/en/enterprise-server@2.19/graphql/reference/enums",
"/enterprise/2.19/user/v4/enum/auditlogorderfield": "/en/enterprise-server@2.19/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.19/user/v4/enum/checkannotationlevel": "/en/enterprise-server@2.19/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.19/user/v4/guides": "/en/enterprise-server@2.19/graphql/guides",
"/enterprise/2.19/user/v4/input_object": "/en/enterprise-server@2.19/graphql/reference/input-objects",
"/enterprise/2.19/user/v4/interface": "/en/enterprise-server@2.19/graphql/reference/interfaces",
"/enterprise/2.19/user/v4/interface/actor": "/en/enterprise-server@2.19/graphql/reference/interfaces#actor",
"/enterprise/2.19/user/v4/interface/assignable": "/en/enterprise-server@2.19/graphql/reference/interfaces#assignable",
"/enterprise/2.19/user/v4/mutation": "/en/enterprise-server@2.19/graphql/reference/mutations",
"/enterprise/2.19/user/v4/object": "/en/enterprise-server@2.19/graphql/reference/objects",
"/enterprise/2.19/user/v4/object/actorlocation": "/en/enterprise-server@2.19/graphql/reference/objects#actorlocation",
"/enterprise/2.19/user/v4/object/addedtoprojectevent": "/en/enterprise-server@2.19/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.19/user/v4/previews": "/en/enterprise-server@2.19/graphql/overview/schema-previews",
"/enterprise/2.19/user/v4/public_schema": "/en/enterprise-server@2.19/graphql/overview/public-schema",
"/enterprise/2.19/user/v4/query": "/en/enterprise-server@2.19/graphql/reference/queries",
"/enterprise/2.19/user/v4/reference": "/en/enterprise-server@2.19/graphql/reference",
"/enterprise/2.19/user/v4/scalar": "/en/enterprise-server@2.19/graphql/reference/scalars",
"/enterprise/2.19/user/v4/scalar/boolean": "/en/enterprise-server@2.19/graphql/reference/scalars#boolean",
"/enterprise/2.19/user/v4/scalar/date": "/en/enterprise-server@2.19/graphql/reference/scalars#date",
"/enterprise/2.19/user/v4/union": "/en/enterprise-server@2.19/graphql/reference/unions",
"/enterprise/2.19/user/v4/union/assignee": "/en/enterprise-server@2.19/graphql/reference/unions#assignee",
"/enterprise/2.19/user/v4/union/auditentryactor": "/en/enterprise-server@2.19/graphql/reference/unions#auditentryactor",
"/enterprise/2.19/v4/enum": "/en/enterprise-server@2.19/graphql/reference/enums",
"/enterprise/2.19/v4/enum/auditlogorderfield": "/en/enterprise-server@2.19/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.19/v4/enum/checkannotationlevel": "/en/enterprise-server@2.19/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.19/v4/guides": "/en/enterprise-server@2.19/graphql/guides",
"/enterprise/2.19/v4/input_object": "/en/enterprise-server@2.19/graphql/reference/input-objects",
"/enterprise/2.19/v4/interface": "/en/enterprise-server@2.19/graphql/reference/interfaces",
"/enterprise/2.19/v4/interface/actor": "/en/enterprise-server@2.19/graphql/reference/interfaces#actor",
"/enterprise/2.19/v4/interface/assignable": "/en/enterprise-server@2.19/graphql/reference/interfaces#assignable",
"/enterprise/2.19/v4/mutation": "/en/enterprise-server@2.19/graphql/reference/mutations",
"/enterprise/2.19/v4/object": "/en/enterprise-server@2.19/graphql/reference/objects",
"/enterprise/2.19/v4/object/actorlocation": "/en/enterprise-server@2.19/graphql/reference/objects#actorlocation",
"/enterprise/2.19/v4/object/addedtoprojectevent": "/en/enterprise-server@2.19/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.19/v4/previews": "/en/enterprise-server@2.19/graphql/overview/schema-previews",
"/enterprise/2.19/v4/public_schema": "/en/enterprise-server@2.19/graphql/overview/public-schema",
"/enterprise/2.19/v4/query": "/en/enterprise-server@2.19/graphql/reference/queries",
"/enterprise/2.19/v4/reference": "/en/enterprise-server@2.19/graphql/reference",
"/enterprise/2.19/v4/scalar": "/en/enterprise-server@2.19/graphql/reference/scalars",
"/enterprise/2.19/v4/scalar/boolean": "/en/enterprise-server@2.19/graphql/reference/scalars#boolean",
"/enterprise/2.19/v4/scalar/date": "/en/enterprise-server@2.19/graphql/reference/scalars#date",
"/enterprise/2.19/v4/union": "/en/enterprise-server@2.19/graphql/reference/unions",
"/enterprise/2.19/v4/union/assignee": "/en/enterprise-server@2.19/graphql/reference/unions#assignee",
"/enterprise/2.19/v4/union/auditentryactor": "/en/enterprise-server@2.19/graphql/reference/unions#auditentryactor",
"/enterprise/2.20/user/v4/enum": "/en/enterprise-server@2.20/graphql/reference/enums",
"/enterprise/2.20/user/v4/enum/auditlogorderfield": "/en/enterprise-server@2.20/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.20/user/v4/enum/checkannotationlevel": "/en/enterprise-server@2.20/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.20/user/v4/guides": "/en/enterprise-server@2.20/graphql/guides",
"/enterprise/2.20/user/v4/input_object": "/en/enterprise-server@2.20/graphql/reference/input-objects",
"/enterprise/2.20/user/v4/interface": "/en/enterprise-server@2.20/graphql/reference/interfaces",
"/enterprise/2.20/user/v4/interface/actor": "/en/enterprise-server@2.20/graphql/reference/interfaces#actor",
"/enterprise/2.20/user/v4/interface/assignable": "/en/enterprise-server@2.20/graphql/reference/interfaces#assignable",
"/enterprise/2.20/user/v4/mutation": "/en/enterprise-server@2.20/graphql/reference/mutations",
"/enterprise/2.20/user/v4/object": "/en/enterprise-server@2.20/graphql/reference/objects",
"/enterprise/2.20/user/v4/object/actorlocation": "/en/enterprise-server@2.20/graphql/reference/objects#actorlocation",
"/enterprise/2.20/user/v4/object/addedtoprojectevent": "/en/enterprise-server@2.20/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.20/user/v4/previews": "/en/enterprise-server@2.20/graphql/overview/schema-previews",
"/enterprise/2.20/user/v4/public_schema": "/en/enterprise-server@2.20/graphql/overview/public-schema",
"/enterprise/2.20/user/v4/query": "/en/enterprise-server@2.20/graphql/reference/queries",
"/enterprise/2.20/user/v4/reference": "/en/enterprise-server@2.20/graphql/reference",
"/enterprise/2.20/user/v4/scalar": "/en/enterprise-server@2.20/graphql/reference/scalars",
"/enterprise/2.20/user/v4/scalar/boolean": "/en/enterprise-server@2.20/graphql/reference/scalars#boolean",
"/enterprise/2.20/user/v4/scalar/date": "/en/enterprise-server@2.20/graphql/reference/scalars#date",
"/enterprise/2.20/user/v4/union": "/en/enterprise-server@2.20/graphql/reference/unions",
"/enterprise/2.20/user/v4/union/assignee": "/en/enterprise-server@2.20/graphql/reference/unions#assignee",
"/enterprise/2.20/user/v4/union/auditentryactor": "/en/enterprise-server@2.20/graphql/reference/unions#auditentryactor",
"/enterprise/2.20/v4/enum": "/en/enterprise-server@2.20/graphql/reference/enums",
"/enterprise/2.20/v4/enum/auditlogorderfield": "/en/enterprise-server@2.20/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.20/v4/enum/checkannotationlevel": "/en/enterprise-server@2.20/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.20/v4/guides": "/en/enterprise-server@2.20/graphql/guides",
"/enterprise/2.20/v4/input_object": "/en/enterprise-server@2.20/graphql/reference/input-objects",
"/enterprise/2.20/v4/interface": "/en/enterprise-server@2.20/graphql/reference/interfaces",
"/enterprise/2.20/v4/interface/actor": "/en/enterprise-server@2.20/graphql/reference/interfaces#actor",
"/enterprise/2.20/v4/interface/assignable": "/en/enterprise-server@2.20/graphql/reference/interfaces#assignable",
"/enterprise/2.20/v4/mutation": "/en/enterprise-server@2.20/graphql/reference/mutations",
"/enterprise/2.20/v4/object": "/en/enterprise-server@2.20/graphql/reference/objects",
"/enterprise/2.20/v4/object/actorlocation": "/en/enterprise-server@2.20/graphql/reference/objects#actorlocation",
"/enterprise/2.20/v4/object/addedtoprojectevent": "/en/enterprise-server@2.20/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.20/v4/previews": "/en/enterprise-server@2.20/graphql/overview/schema-previews",
"/enterprise/2.20/v4/public_schema": "/en/enterprise-server@2.20/graphql/overview/public-schema",
"/enterprise/2.20/v4/query": "/en/enterprise-server@2.20/graphql/reference/queries",
"/enterprise/2.20/v4/reference": "/en/enterprise-server@2.20/graphql/reference",
"/enterprise/2.20/v4/scalar": "/en/enterprise-server@2.20/graphql/reference/scalars",
"/enterprise/2.20/v4/scalar/boolean": "/en/enterprise-server@2.20/graphql/reference/scalars#boolean",
"/enterprise/2.20/v4/scalar/date": "/en/enterprise-server@2.20/graphql/reference/scalars#date",
"/enterprise/2.20/v4/union": "/en/enterprise-server@2.20/graphql/reference/unions",
"/enterprise/2.20/v4/union/assignee": "/en/enterprise-server@2.20/graphql/reference/unions#assignee",
"/enterprise/2.20/v4/union/auditentryactor": "/en/enterprise-server@2.20/graphql/reference/unions#auditentryactor",
"/enterprise/2.21/user/v4/enum": "/en/enterprise-server@2.21/graphql/reference/enums",
"/enterprise/2.21/user/v4/enum/auditlogorderfield": "/en/enterprise-server@2.21/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.21/user/v4/enum/checkannotationlevel": "/en/enterprise-server@2.21/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.21/user/v4/guides": "/en/enterprise-server@2.21/graphql/guides",
"/enterprise/2.21/user/v4/input_object": "/en/enterprise-server@2.21/graphql/reference/input-objects",
"/enterprise/2.21/user/v4/interface": "/en/enterprise-server@2.21/graphql/reference/interfaces",
"/enterprise/2.21/user/v4/interface/actor": "/en/enterprise-server@2.21/graphql/reference/interfaces#actor",
"/enterprise/2.21/user/v4/interface/assignable": "/en/enterprise-server@2.21/graphql/reference/interfaces#assignable",
"/enterprise/2.21/user/v4/mutation": "/en/enterprise-server@2.21/graphql/reference/mutations",
"/enterprise/2.21/user/v4/object": "/en/enterprise-server@2.21/graphql/reference/objects",
"/enterprise/2.21/user/v4/object/actorlocation": "/en/enterprise-server@2.21/graphql/reference/objects#actorlocation",
"/enterprise/2.21/user/v4/object/addedtoprojectevent": "/en/enterprise-server@2.21/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.21/user/v4/previews": "/en/enterprise-server@2.21/graphql/overview/schema-previews",
"/enterprise/2.21/user/v4/public_schema": "/en/enterprise-server@2.21/graphql/overview/public-schema",
"/enterprise/2.21/user/v4/query": "/en/enterprise-server@2.21/graphql/reference/queries",
"/enterprise/2.21/user/v4/reference": "/en/enterprise-server@2.21/graphql/reference",
"/enterprise/2.21/user/v4/scalar": "/en/enterprise-server@2.21/graphql/reference/scalars",
"/enterprise/2.21/user/v4/scalar/boolean": "/en/enterprise-server@2.21/graphql/reference/scalars#boolean",
"/enterprise/2.21/user/v4/scalar/date": "/en/enterprise-server@2.21/graphql/reference/scalars#date",
"/enterprise/2.21/user/v4/union": "/en/enterprise-server@2.21/graphql/reference/unions",
"/enterprise/2.21/user/v4/union/assignee": "/en/enterprise-server@2.21/graphql/reference/unions#assignee",
"/enterprise/2.21/user/v4/union/auditentryactor": "/en/enterprise-server@2.21/graphql/reference/unions#auditentryactor",
"/enterprise/2.21/v4/enum": "/en/enterprise-server@2.21/graphql/reference/enums",
"/enterprise/2.21/v4/enum/auditlogorderfield": "/en/enterprise-server@2.21/graphql/reference/enums#auditlogorderfield",
"/enterprise/2.21/v4/enum/checkannotationlevel": "/en/enterprise-server@2.21/graphql/reference/enums#checkannotationlevel",
"/enterprise/2.21/v4/guides": "/en/enterprise-server@2.21/graphql/guides",
"/enterprise/2.21/v4/input_object": "/en/enterprise-server@2.21/graphql/reference/input-objects",
"/enterprise/2.21/v4/interface": "/en/enterprise-server@2.21/graphql/reference/interfaces",
"/enterprise/2.21/v4/interface/actor": "/en/enterprise-server@2.21/graphql/reference/interfaces#actor",
"/enterprise/2.21/v4/interface/assignable": "/en/enterprise-server@2.21/graphql/reference/interfaces#assignable",
"/enterprise/2.21/v4/mutation": "/en/enterprise-server@2.21/graphql/reference/mutations",
"/enterprise/2.21/v4/object": "/en/enterprise-server@2.21/graphql/reference/objects",
"/enterprise/2.21/v4/object/actorlocation": "/en/enterprise-server@2.21/graphql/reference/objects#actorlocation",
"/enterprise/2.21/v4/object/addedtoprojectevent": "/en/enterprise-server@2.21/graphql/reference/objects#addedtoprojectevent",
"/enterprise/2.21/v4/previews": "/en/enterprise-server@2.21/graphql/overview/schema-previews",
"/enterprise/2.21/v4/public_schema": "/en/enterprise-server@2.21/graphql/overview/public-schema",
"/enterprise/2.21/v4/query": "/en/enterprise-server@2.21/graphql/reference/queries",
"/enterprise/2.21/v4/reference": "/en/enterprise-server@2.21/graphql/reference",
"/enterprise/2.21/v4/scalar": "/en/enterprise-server@2.21/graphql/reference/scalars",
"/enterprise/2.21/v4/scalar/boolean": "/en/enterprise-server@2.21/graphql/reference/scalars#boolean",
"/enterprise/2.21/v4/scalar/date": "/en/enterprise-server@2.21/graphql/reference/scalars#date",
"/enterprise/2.21/v4/union": "/en/enterprise-server@2.21/graphql/reference/unions",
"/enterprise/2.21/v4/union/assignee": "/en/enterprise-server@2.21/graphql/reference/unions#assignee",
"/enterprise/2.21/v4/union/auditentryactor": "/en/enterprise-server@2.21/graphql/reference/unions#auditentryactor",
"/enterprise/v4/enum": "/en/enterprise-server/graphql/reference/enums",
"/enterprise/v4/enum/auditlogorderfield": "/en/enterprise-server/graphql/reference/enums#auditlogorderfield",
"/enterprise/v4/enum/checkannotationlevel": "/en/enterprise-server/graphql/reference/enums#checkannotationlevel",
"/enterprise/v4/guides": "/en/enterprise-server/graphql/guides",
"/enterprise/v4/input_object": "/en/enterprise-server/graphql/reference/input-objects",
"/enterprise/v4/interface": "/en/enterprise-server/graphql/reference/interfaces",
"/enterprise/v4/interface/actor": "/en/enterprise-server/graphql/reference/interfaces#actor",
"/enterprise/v4/interface/assignable": "/en/enterprise-server/graphql/reference/interfaces#assignable",
"/enterprise/v4/mutation": "/en/enterprise-server/graphql/reference/mutations",
"/enterprise/v4/object": "/en/enterprise-server/graphql/reference/objects",
"/enterprise/v4/object/actorlocation": "/en/enterprise-server/graphql/reference/objects#actorlocation",
"/enterprise/v4/object/addedtoprojectevent": "/en/enterprise-server/graphql/reference/objects#addedtoprojectevent",
"/enterprise/v4/previews": "/en/enterprise-server/graphql/overview/schema-previews",
"/enterprise/v4/public_schema": "/en/enterprise-server/graphql/overview/public-schema",
"/enterprise/v4/query": "/en/enterprise-server/graphql/reference/queries",
"/enterprise/v4/reference": "/en/enterprise-server/graphql/reference",
"/enterprise/v4/scalar": "/en/enterprise-server/graphql/reference/scalars",
"/enterprise/v4/scalar/boolean": "/en/enterprise-server/graphql/reference/scalars#boolean",
"/enterprise/v4/scalar/date": "/en/enterprise-server/graphql/reference/scalars#date",
"/enterprise/v4/union": "/en/enterprise-server/graphql/reference/unions",
"/enterprise/v4/union/assignee": "/en/enterprise-server/graphql/reference/unions#assignee",
"/enterprise/v4/union/auditentryactor": "/en/enterprise-server/graphql/reference/unions#auditentryactor",
"/v4/enum": "/en/free-pro-team@latest/graphql/reference/enums",
"/v4/enum/auditlogorderfield": "/en/free-pro-team@latest/graphql/reference/enums#auditlogorderfield",
"/v4/enum/checkannotationlevel": "/en/free-pro-team@latest/graphql/reference/enums#checkannotationlevel",
"/v4/guides": "/en/free-pro-team@latest/graphql/guides",
"/v4/input_object": "/en/free-pro-team@latest/graphql/reference/input-objects",
"/v4/input_object/acceptenterpriseadministratorinvitationinput": "/en/free-pro-team@latest/graphql/reference/input-objects#acceptenterpriseadministratorinvitationinput",
"/v4/input_object/accepttopicsuggestioninput": "/en/free-pro-team@latest/graphql/reference/input-objects#accepttopicsuggestioninput",
"/v4/interface": "/en/free-pro-team@latest/graphql/reference/interfaces",
"/v4/interface/actor": "/en/free-pro-team@latest/graphql/reference/interfaces#actor",
"/v4/interface/assignable": "/en/free-pro-team@latest/graphql/reference/interfaces#assignable",
"/v4/mutation": "/en/free-pro-team@latest/graphql/reference/mutations",
"/v4/mutation/acceptenterpriseadministratorinvitation": "/en/free-pro-team@latest/graphql/reference/mutations#acceptenterpriseadministratorinvitation",
"/v4/mutation/accepttopicsuggestion": "/en/free-pro-team@latest/graphql/reference/mutations#accepttopicsuggestion",
"/v4/object": "/en/free-pro-team@latest/graphql/reference/objects",
"/v4/object/actorlocation": "/en/free-pro-team@latest/graphql/reference/objects#actorlocation",
"/v4/object/addedtoprojectevent": "/en/free-pro-team@latest/graphql/reference/objects#addedtoprojectevent",
"/v4/previews": "/en/free-pro-team@latest/graphql/overview/schema-previews",
"/v4/public_schema": "/en/free-pro-team@latest/graphql/overview/public-schema",
"/v4/query": "/en/free-pro-team@latest/graphql/reference/queries",
"/v4/reference": "/en/free-pro-team@latest/graphql/reference",
"/v4/scalar": "/en/free-pro-team@latest/graphql/reference/scalars",
"/v4/scalar/boolean": "/en/free-pro-team@latest/graphql/reference/scalars#boolean",
"/v4/scalar/date": "/en/free-pro-team@latest/graphql/reference/scalars#date",
"/v4/union": "/en/free-pro-team@latest/graphql/reference/unions",
"/v4/union/assignee": "/en/free-pro-team@latest/graphql/reference/unions#assignee",
"/v4/union/auditentryactor": "/en/free-pro-team@latest/graphql/reference/unions#auditentryactor"
}

View File

@@ -1,6 +0,0 @@
---
title: Some page that exists in the content directory but not the translations directory
versions:
free-pro-team: '*'
---

View File

@@ -1,6 +0,0 @@
---
title: This is an article
intro: 'I've got broken frontmatter'
versions:
free-pro-team: '*'
---

View File

@@ -1,8 +0,0 @@
---
title: A page with redirects
redirect_from:
- /some-old-path
versions:
free-pro-team: '*'
---

View File

@@ -1,6 +0,0 @@
---
title: A sample article
versions:
free-pro-team: '*'
---

View File

@@ -1,6 +0,0 @@
---
title: A sample article
versions:
free-pro-team: '*'
---

View File

@@ -1,506 +0,0 @@
{
"/en/enterprise/2.18/v3/activity/event_types": "/en/enterprise/2.18/user/developers/webhooks-and-events/github-event-types",
"/en/enterprise/2.18/v3/activity/events/types": "/en/enterprise/2.18/user/developers/webhooks-and-events/webhook-events-and-payloads",
"/en/enterprise/2.18/v3/activity/events": "/en/enterprise/2.18/user/rest/reference/activity#events",
"/en/enterprise/2.18/v3/activity/feeds": "/en/enterprise/2.18/user/rest/reference/activity#feeds",
"/en/enterprise/2.18/v3/activity": "/en/enterprise/2.18/user/rest/reference/activity",
"/en/enterprise/2.18/v3/activity/notifications": "/en/enterprise/2.18/user/rest/reference/activity#notifications",
"/en/enterprise/2.18/v3/activity/starring": "/en/enterprise/2.18/user/rest/reference/activity#starring",
"/en/enterprise/2.18/v3/activity/watching": "/en/enterprise/2.18/user/rest/reference/activity#watching",
"/en/enterprise/2.18/v3/apps/available-endpoints": "/en/enterprise/2.18/user/rest/overview/endpoints-available-for-github-apps",
"/en/enterprise/2.18/v3/apps": "/en/enterprise/2.18/user/rest/reference/apps",
"/en/enterprise/2.18/v3/apps/installations": "/en/enterprise/2.18/user/rest/reference/apps#installations",
"/en/enterprise/2.18/v3/apps/permissions": "/en/enterprise/2.18/user/rest/reference/permissions-required-for-github-apps",
"/en/enterprise/2.18/v3/checks": "/en/enterprise/2.18/user/rest/reference/checks",
"/en/enterprise/2.18/v3/checks/runs": "/en/enterprise/2.18/user/rest/reference/checks#runs",
"/en/enterprise/2.18/v3/checks/suites": "/en/enterprise/2.18/user/rest/reference/checks#suites",
"/en/enterprise/2.18/v3/codes_of_conduct": "/en/enterprise/2.18/user/rest/reference/codes-of-conduct",
"/en/enterprise/2.18/v3/emojis": "/en/enterprise/2.18/user/rest/reference/emojis",
"/en/enterprise/2.18/v3/enterprise-admin/admin_stats": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#admin-stats",
"/en/enterprise/2.18/v3/enterprise-admin/global_webhooks": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#global-webhooks",
"/en/enterprise/2.18/v3/enterprise-admin": "/en/enterprise/2.18/user/rest/reference/enterprise-admin",
"/en/enterprise/2.18/v3/enterprise-admin/ldap": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#ldap",
"/en/enterprise/2.18/v3/enterprise-admin/license": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#license",
"/en/enterprise/2.18/v3/enterprise-admin/management_console": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#management-console",
"/en/enterprise/2.18/v3/enterprise-admin/org_pre_receive_hooks": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.18/v3/enterprise-admin/orgs": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#orgs",
"/en/enterprise/2.18/v3/enterprise-admin/pre_receive_environments": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#pre-receive-environments",
"/en/enterprise/2.18/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#pre-receive-hooks",
"/en/enterprise/2.18/v3/enterprise-admin/repo_pre_receive_hooks": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#repo-pre-receive-hooks",
"/en/enterprise/2.18/v3/enterprise-admin/search_indexing": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#search-indexing",
"/en/enterprise/2.18/v3/enterprise-admin/users": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#users",
"/en/enterprise/2.18/v3/gists/comments": "/en/enterprise/2.18/user/rest/reference/gists#comments",
"/en/enterprise/2.18/v3/gists": "/en/enterprise/2.18/user/rest/reference/gists",
"/en/enterprise/2.18/v3/git/blobs": "/en/enterprise/2.18/user/rest/reference/git#blobs",
"/en/enterprise/2.18/v3/git/commits": "/en/enterprise/2.18/user/rest/reference/git#commits",
"/en/enterprise/2.18/v3/git": "/en/enterprise/2.18/user/rest/reference/git",
"/en/enterprise/2.18/v3/git/refs": "/en/enterprise/2.18/user/rest/reference/git#refs",
"/en/enterprise/2.18/v3/git/tags": "/en/enterprise/2.18/user/rest/reference/git#tags",
"/en/enterprise/2.18/v3/git/trees": "/en/enterprise/2.18/user/rest/reference/git#trees",
"/en/enterprise/2.18/v3/gitignore": "/en/enterprise/2.18/user/rest/reference/gitignore",
"/en/enterprise/2.18/v3/issues/assignees": "/en/enterprise/2.18/user/rest/reference/issues#assignees",
"/en/enterprise/2.18/v3/issues/comments": "/en/enterprise/2.18/user/rest/reference/issues#comments",
"/en/enterprise/2.18/v3/issues/events": "/en/enterprise/2.18/user/rest/reference/issues#events",
"/en/enterprise/2.18/v3/issues": "/en/enterprise/2.18/user/rest/reference/issues",
"/en/enterprise/2.18/v3/issues/issue-event-types": "/en/enterprise/2.18/user/developers/webhooks-and-events/issue-event-types",
"/en/enterprise/2.18/v3/issues/labels": "/en/enterprise/2.18/user/rest/reference/issues#labels",
"/en/enterprise/2.18/v3/issues/milestones": "/en/enterprise/2.18/user/rest/reference/issues#milestones",
"/en/enterprise/2.18/v3/issues/timeline": "/en/enterprise/2.18/user/rest/reference/issues#timeline",
"/en/enterprise/2.18/v3/licenses": "/en/enterprise/2.18/user/rest/reference/licenses",
"/en/enterprise/2.18/v3/markdown": "/en/enterprise/2.18/user/rest/reference/markdown",
"/en/enterprise/2.18/v3/meta": "/en/enterprise/2.18/user/rest/reference/meta",
"/en/enterprise/2.18/v3/oauth_authorizations": "/en/enterprise/2.18/user/rest/reference/oauth-authorizations",
"/en/enterprise/2.18/v3/orgs/hooks": "/en/enterprise/2.18/user/rest/reference/orgs#hooks",
"/en/enterprise/2.18/v3/orgs": "/en/enterprise/2.18/user/rest/reference/orgs",
"/en/enterprise/2.18/v3/orgs/members": "/en/enterprise/2.18/user/rest/reference/orgs#members",
"/en/enterprise/2.18/v3/orgs/outside_collaborators": "/en/enterprise/2.18/user/rest/reference/orgs#outside-collaborators",
"/en/enterprise/2.18/v3/orgs/pre_receive_hooks": "/en/enterprise/2.18/user/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.18/v3/orgs/teams": "/en/enterprise/2.18/user/rest/reference/orgs#teams",
"/en/enterprise/2.18/v3/projects/cards": "/en/enterprise/2.18/user/rest/reference/projects#cards",
"/en/enterprise/2.18/v3/projects/collaborators": "/en/enterprise/2.18/user/rest/reference/projects#collaborators",
"/en/enterprise/2.18/v3/projects/columns": "/en/enterprise/2.18/user/rest/reference/projects#columns",
"/en/enterprise/2.18/v3/projects": "/en/enterprise/2.18/user/rest/reference/projects",
"/en/enterprise/2.18/v3/pulls/comments": "/en/enterprise/2.18/user/rest/reference/pulls#comments",
"/en/enterprise/2.18/v3/pulls": "/en/enterprise/2.18/user/rest/reference/pulls",
"/en/enterprise/2.18/v3/pulls/review_requests": "/en/enterprise/2.18/user/rest/reference/pulls#review-requests",
"/en/enterprise/2.18/v3/pulls/reviews": "/en/enterprise/2.18/user/rest/reference/pulls#reviews",
"/en/enterprise/2.18/v3/rate_limit": "/en/enterprise/2.18/user/rest/reference/rate-limit",
"/en/enterprise/2.18/v3/reactions": "/en/enterprise/2.18/user/rest/reference/reactions",
"/en/enterprise/2.18/v3/repos/branches": "/en/enterprise/2.18/user/rest/reference/repos#branches",
"/en/enterprise/2.18/v3/repos/collaborators": "/en/enterprise/2.18/user/rest/reference/repos#collaborators",
"/en/enterprise/2.18/v3/repos/comments": "/en/enterprise/2.18/user/rest/reference/repos#comments",
"/en/enterprise/2.18/v3/repos/commits": "/en/enterprise/2.18/user/rest/reference/repos#commits",
"/en/enterprise/2.18/v3/repos/contents": "/en/enterprise/2.18/user/rest/reference/repos#contents",
"/en/enterprise/2.18/v3/repos/deployments": "/en/enterprise/2.18/user/rest/reference/repos#deployments",
"/en/enterprise/2.18/v3/repos/downloads": "/en/enterprise/2.18/user/rest/reference/repos#downloads",
"/en/enterprise/2.18/v3/repos/forks": "/en/enterprise/2.18/user/rest/reference/repos#forks",
"/en/enterprise/2.18/v3/repos/hooks": "/en/enterprise/2.18/user/rest/reference/repos#hooks",
"/en/enterprise/2.18/v3/repos": "/en/enterprise/2.18/user/rest/reference/repos",
"/en/enterprise/2.18/v3/repos/invitations": "/en/enterprise/2.18/user/rest/reference/repos#invitations",
"/en/enterprise/2.18/v3/repos/keys": "/en/enterprise/2.18/user/rest/reference/repos#keys",
"/en/enterprise/2.18/v3/repos/merging": "/en/enterprise/2.18/user/rest/reference/repos#merging",
"/en/enterprise/2.18/v3/repos/pages": "/en/enterprise/2.18/user/rest/reference/repos#pages",
"/en/enterprise/2.18/v3/repos/pre_receive_hooks": "/en/enterprise/2.18/user/rest/reference/repos#pre-receive-hooks",
"/en/enterprise/2.18/v3/repos/releases": "/en/enterprise/2.18/user/rest/reference/repos#releases",
"/en/enterprise/2.18/v3/repos/statistics": "/en/enterprise/2.18/user/rest/reference/repos#statistics",
"/en/enterprise/2.18/v3/repos/statuses": "/en/enterprise/2.18/user/rest/reference/repos#statuses",
"/en/enterprise/2.18/v3/search": "/en/enterprise/2.18/user/rest/reference/search",
"/en/enterprise/2.18/v3/teams/discussion_comments": "/en/enterprise/2.18/user/rest/reference/teams#discussion-comments",
"/en/enterprise/2.18/v3/teams/discussions": "/en/enterprise/2.18/user/rest/reference/teams#discussions",
"/en/enterprise/2.18/v3/teams": "/en/enterprise/2.18/user/rest/reference/teams",
"/en/enterprise/2.18/v3/teams/members": "/en/enterprise/2.18/user/rest/reference/teams#members",
"/en/enterprise/2.18/v3/users/administration": "/en/enterprise/2.18/user/rest/reference/users#administration",
"/en/enterprise/2.18/v3/users/emails": "/en/enterprise/2.18/user/rest/reference/users#emails",
"/en/enterprise/2.18/v3/users/followers": "/en/enterprise/2.18/user/rest/reference/users#followers",
"/en/enterprise/2.18/v3/users/gpg_keys": "/en/enterprise/2.18/user/rest/reference/users#gpg-keys",
"/en/enterprise/2.18/v3/users": "/en/enterprise/2.18/user/rest/reference/users",
"/en/enterprise/2.18/v3/users/keys": "/en/enterprise/2.18/user/rest/reference/users#keys",
"/en/enterprise/2.19/v3/activity/event_types": "/en/enterprise-server@2.19/developers/webhooks-and-events/github-event-types",
"/en/enterprise/2.19/v3/activity/events/types": "/en/enterprise-server@2.19/developers/webhooks-and-events/webhook-events-and-payloads",
"/en/enterprise/2.19/v3/activity/events": "/en/enterprise-server@2.19/rest/reference/activity#events",
"/en/enterprise/2.19/v3/activity/feeds": "/en/enterprise-server@2.19/rest/reference/activity#feeds",
"/en/enterprise/2.19/v3/activity": "/en/enterprise-server@2.19/rest/reference/activity",
"/en/enterprise/2.19/v3/activity/notifications": "/en/enterprise-server@2.19/rest/reference/activity#notifications",
"/en/enterprise/2.19/v3/activity/starring": "/en/enterprise-server@2.19/rest/reference/activity#starring",
"/en/enterprise/2.19/v3/activity/watching": "/en/enterprise-server@2.19/rest/reference/activity#watching",
"/en/enterprise/2.19/v3/apps/available-endpoints": "/en/enterprise-server@2.19/rest/overview/endpoints-available-for-github-apps",
"/en/enterprise/2.19/v3/apps": "/en/enterprise-server@2.19/rest/reference/apps",
"/en/enterprise/2.19/v3/apps/installations": "/en/enterprise-server@2.19/rest/reference/apps#installations",
"/en/enterprise/2.19/v3/apps/permissions": "/en/enterprise-server@2.19/rest/reference/permissions-required-for-github-apps",
"/en/enterprise/2.19/v3/checks": "/en/enterprise-server@2.19/rest/reference/checks",
"/en/enterprise/2.19/v3/checks/runs": "/en/enterprise-server@2.19/rest/reference/checks#runs",
"/en/enterprise/2.19/v3/checks/suites": "/en/enterprise-server@2.19/rest/reference/checks#suites",
"/en/enterprise/2.19/v3/codes_of_conduct": "/en/enterprise-server@2.19/rest/reference/codes-of-conduct",
"/en/enterprise/2.19/v3/emojis": "/en/enterprise-server@2.19/rest/reference/emojis",
"/en/enterprise/2.19/v3/enterprise-admin/admin_stats": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#admin-stats",
"/en/enterprise/2.19/v3/enterprise-admin/global_webhooks": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#global-webhooks",
"/en/enterprise/2.19/v3/enterprise-admin": "/en/enterprise-server@2.19/rest/reference/enterprise-admin",
"/en/enterprise/2.19/v3/enterprise-admin/ldap": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#ldap",
"/en/enterprise/2.19/v3/enterprise-admin/license": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#license",
"/en/enterprise/2.19/v3/enterprise-admin/management_console": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#management-console",
"/en/enterprise/2.19/v3/enterprise-admin/org_pre_receive_hooks": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.19/v3/enterprise-admin/orgs": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#orgs",
"/en/enterprise/2.19/v3/enterprise-admin/pre_receive_environments": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#pre-receive-environments",
"/en/enterprise/2.19/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#pre-receive-hooks",
"/en/enterprise/2.19/v3/enterprise-admin/repo_pre_receive_hooks": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#repo-pre-receive-hooks",
"/en/enterprise/2.19/v3/enterprise-admin/search_indexing": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#search-indexing",
"/en/enterprise/2.19/v3/enterprise-admin/users": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#users",
"/en/enterprise/2.19/v3/gists/comments": "/en/enterprise-server@2.19/rest/reference/gists#comments",
"/en/enterprise/2.19/v3/gists": "/en/enterprise-server@2.19/rest/reference/gists",
"/en/enterprise/2.19/v3/git/blobs": "/en/enterprise-server@2.19/rest/reference/git#blobs",
"/en/enterprise/2.19/v3/git/commits": "/en/enterprise-server@2.19/rest/reference/git#commits",
"/en/enterprise/2.19/v3/git": "/en/enterprise-server@2.19/rest/reference/git",
"/en/enterprise/2.19/v3/git/refs": "/en/enterprise-server@2.19/rest/reference/git#refs",
"/en/enterprise/2.19/v3/git/tags": "/en/enterprise-server@2.19/rest/reference/git#tags",
"/en/enterprise/2.19/v3/git/trees": "/en/enterprise-server@2.19/rest/reference/git#trees",
"/en/enterprise/2.19/v3/gitignore": "/en/enterprise-server@2.19/rest/reference/gitignore",
"/en/enterprise/2.19/v3/issues/assignees": "/en/enterprise-server@2.19/rest/reference/issues#assignees",
"/en/enterprise/2.19/v3/issues/comments": "/en/enterprise-server@2.19/rest/reference/issues#comments",
"/en/enterprise/2.19/v3/issues/events": "/en/enterprise-server@2.19/rest/reference/issues#events",
"/en/enterprise/2.19/v3/issues": "/en/enterprise-server@2.19/rest/reference/issues",
"/en/enterprise/2.19/v3/issues/issue-event-types": "/en/enterprise-server@2.19/developers/webhooks-and-events/issue-event-types",
"/en/enterprise/2.19/v3/issues/labels": "/en/enterprise-server@2.19/rest/reference/issues#labels",
"/en/enterprise/2.19/v3/issues/milestones": "/en/enterprise-server@2.19/rest/reference/issues#milestones",
"/en/enterprise/2.19/v3/issues/timeline": "/en/enterprise-server@2.19/rest/reference/issues#timeline",
"/en/enterprise/2.19/v3/licenses": "/en/enterprise-server@2.19/rest/reference/licenses",
"/en/enterprise/2.19/v3/markdown": "/en/enterprise-server@2.19/rest/reference/markdown",
"/en/enterprise/2.19/v3/meta": "/en/enterprise-server@2.19/rest/reference/meta",
"/en/enterprise/2.19/v3/oauth_authorizations": "/en/enterprise-server@2.19/rest/reference/oauth-authorizations",
"/en/enterprise/2.19/v3/orgs/hooks": "/en/enterprise-server@2.19/rest/reference/orgs#hooks",
"/en/enterprise/2.19/v3/orgs": "/en/enterprise-server@2.19/rest/reference/orgs",
"/en/enterprise/2.19/v3/orgs/members": "/en/enterprise-server@2.19/rest/reference/orgs#members",
"/en/enterprise/2.19/v3/orgs/outside_collaborators": "/en/enterprise-server@2.19/rest/reference/orgs#outside-collaborators",
"/en/enterprise/2.19/v3/orgs/pre_receive_hooks": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.19/v3/orgs/teams": "/en/enterprise-server@2.19/rest/reference/orgs#teams",
"/en/enterprise/2.19/v3/projects/cards": "/en/enterprise-server@2.19/rest/reference/projects#cards",
"/en/enterprise/2.19/v3/projects/collaborators": "/en/enterprise-server@2.19/rest/reference/projects#collaborators",
"/en/enterprise/2.19/v3/projects/columns": "/en/enterprise-server@2.19/rest/reference/projects#columns",
"/en/enterprise/2.19/v3/projects": "/en/enterprise-server@2.19/rest/reference/projects",
"/en/enterprise/2.19/v3/pulls/comments": "/en/enterprise-server@2.19/rest/reference/pulls#comments",
"/en/enterprise/2.19/v3/pulls": "/en/enterprise-server@2.19/rest/reference/pulls",
"/en/enterprise/2.19/v3/pulls/review_requests": "/en/enterprise-server@2.19/rest/reference/pulls#review-requests",
"/en/enterprise/2.19/v3/pulls/reviews": "/en/enterprise-server@2.19/rest/reference/pulls#reviews",
"/en/enterprise/2.19/v3/rate_limit": "/en/enterprise-server@2.19/rest/reference/rate-limit",
"/en/enterprise/2.19/v3/reactions": "/en/enterprise-server@2.19/rest/reference/reactions",
"/en/enterprise/2.19/v3/repos/branches": "/en/enterprise-server@2.19/rest/reference/repos#branches",
"/en/enterprise/2.19/v3/repos/collaborators": "/en/enterprise-server@2.19/rest/reference/repos#collaborators",
"/en/enterprise/2.19/v3/repos/comments": "/en/enterprise-server@2.19/rest/reference/repos#comments",
"/en/enterprise/2.19/v3/repos/commits": "/en/enterprise-server@2.19/rest/reference/repos#commits",
"/en/enterprise/2.19/v3/repos/contents": "/en/enterprise-server@2.19/rest/reference/repos#contents",
"/en/enterprise/2.19/v3/repos/deployments": "/en/enterprise-server@2.19/rest/reference/repos#deployments",
"/en/enterprise/2.19/v3/repos/downloads": "/en/enterprise-server@2.19/rest/reference/repos#downloads",
"/en/enterprise/2.19/v3/repos/forks": "/en/enterprise-server@2.19/rest/reference/repos#forks",
"/en/enterprise/2.19/v3/repos/hooks": "/en/enterprise-server@2.19/rest/reference/repos#hooks",
"/en/enterprise/2.19/v3/repos": "/en/enterprise-server@2.19/rest/reference/repos",
"/en/enterprise/2.19/v3/repos/invitations": "/en/enterprise-server@2.19/rest/reference/repos#invitations",
"/en/enterprise/2.19/v3/repos/keys": "/en/enterprise-server@2.19/rest/reference/repos#keys",
"/en/enterprise/2.19/v3/repos/merging": "/en/enterprise-server@2.19/rest/reference/repos#merging",
"/en/enterprise/2.19/v3/repos/pages": "/en/enterprise-server@2.19/rest/reference/repos#pages",
"/en/enterprise/2.19/v3/repos/pre_receive_hooks": "/en/enterprise-server@2.19/rest/reference/repos#pre-receive-hooks",
"/en/enterprise/2.19/v3/repos/releases": "/en/enterprise-server@2.19/rest/reference/repos#releases",
"/en/enterprise/2.19/v3/repos/statistics": "/en/enterprise-server@2.19/rest/reference/repos#statistics",
"/en/enterprise/2.19/v3/repos/statuses": "/en/enterprise-server@2.19/rest/reference/repos#statuses",
"/en/enterprise/2.19/v3/search": "/en/enterprise-server@2.19/rest/reference/search",
"/en/enterprise/2.19/v3/teams/discussion_comments": "/en/enterprise-server@2.19/rest/reference/teams#discussion-comments",
"/en/enterprise/2.19/v3/teams/discussions": "/en/enterprise-server@2.19/rest/reference/teams#discussions",
"/en/enterprise/2.19/v3/teams": "/en/enterprise-server@2.19/rest/reference/teams",
"/en/enterprise/2.19/v3/teams/members": "/en/enterprise-server@2.19/rest/reference/teams#members",
"/en/enterprise/2.19/v3/users/administration": "/en/enterprise-server@2.19/rest/reference/users#administration",
"/en/enterprise/2.19/v3/users/emails": "/en/enterprise-server@2.19/rest/reference/users#emails",
"/en/enterprise/2.19/v3/users/followers": "/en/enterprise-server@2.19/rest/reference/users#followers",
"/en/enterprise/2.19/v3/users/gpg_keys": "/en/enterprise-server@2.19/rest/reference/users#gpg-keys",
"/en/enterprise/2.19/v3/users": "/en/enterprise-server@2.19/rest/reference/users",
"/en/enterprise/2.19/v3/users/keys": "/en/enterprise-server@2.19/rest/reference/users#keys",
"/en/enterprise/2.20/v3/activity/event_types": "/en/enterprise-server@2.20/developers/webhooks-and-events/github-event-types",
"/en/enterprise/2.20/v3/activity/events/types": "/en/enterprise-server@2.20/developers/webhooks-and-events/webhook-events-and-payloads",
"/en/enterprise/2.20/v3/activity/events": "/en/enterprise-server@2.20/rest/reference/activity#events",
"/en/enterprise/2.20/v3/activity/feeds": "/en/enterprise-server@2.20/rest/reference/activity#feeds",
"/en/enterprise/2.20/v3/activity": "/en/enterprise-server@2.20/rest/reference/activity",
"/en/enterprise/2.20/v3/activity/notifications": "/en/enterprise-server@2.20/rest/reference/activity#notifications",
"/en/enterprise/2.20/v3/activity/starring": "/en/enterprise-server@2.20/rest/reference/activity#starring",
"/en/enterprise/2.20/v3/activity/watching": "/en/enterprise-server@2.20/rest/reference/activity#watching",
"/en/enterprise/2.20/v3/apps/available-endpoints": "/en/enterprise-server@2.20/rest/overview/endpoints-available-for-github-apps",
"/en/enterprise/2.20/v3/apps": "/en/enterprise-server@2.20/rest/reference/apps",
"/en/enterprise/2.20/v3/apps/installations": "/en/enterprise-server@2.20/rest/reference/apps#installations",
"/en/enterprise/2.20/v3/apps/oauth_applications": "/en/enterprise-server@2.20/rest/reference/apps#oauth-applications",
"/en/enterprise/2.20/v3/apps/permissions": "/en/enterprise-server@2.20/rest/reference/permissions-required-for-github-apps",
"/en/enterprise/2.20/v3/checks": "/en/enterprise-server@2.20/rest/reference/checks",
"/en/enterprise/2.20/v3/checks/runs": "/en/enterprise-server@2.20/rest/reference/checks#runs",
"/en/enterprise/2.20/v3/checks/suites": "/en/enterprise-server@2.20/rest/reference/checks#suites",
"/en/enterprise/2.20/v3/codes_of_conduct": "/en/enterprise-server@2.20/rest/reference/codes-of-conduct",
"/en/enterprise/2.20/v3/emojis": "/en/enterprise-server@2.20/rest/reference/emojis",
"/en/enterprise/2.20/v3/enterprise-admin/admin_stats": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#admin-stats",
"/en/enterprise/2.20/v3/enterprise-admin/global_webhooks": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#global-webhooks",
"/en/enterprise/2.20/v3/enterprise-admin": "/en/enterprise-server@2.20/rest/reference/enterprise-admin",
"/en/enterprise/2.20/v3/enterprise-admin/ldap": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#ldap",
"/en/enterprise/2.20/v3/enterprise-admin/license": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#license",
"/en/enterprise/2.20/v3/enterprise-admin/management_console": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#management-console",
"/en/enterprise/2.20/v3/enterprise-admin/org_pre_receive_hooks": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.20/v3/enterprise-admin/orgs": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#orgs",
"/en/enterprise/2.20/v3/enterprise-admin/pre_receive_environments": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#pre-receive-environments",
"/en/enterprise/2.20/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#pre-receive-hooks",
"/en/enterprise/2.20/v3/enterprise-admin/repo_pre_receive_hooks": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#repo-pre-receive-hooks",
"/en/enterprise/2.20/v3/enterprise-admin/search_indexing": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#search-indexing",
"/en/enterprise/2.20/v3/enterprise-admin/users": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#users",
"/en/enterprise/2.20/v3/gists/comments": "/en/enterprise-server@2.20/rest/reference/gists#comments",
"/en/enterprise/2.20/v3/gists": "/en/enterprise-server@2.20/rest/reference/gists",
"/en/enterprise/2.20/v3/git/blobs": "/en/enterprise-server@2.20/rest/reference/git#blobs",
"/en/enterprise/2.20/v3/git/commits": "/en/enterprise-server@2.20/rest/reference/git#commits",
"/en/enterprise/2.20/v3/git": "/en/enterprise-server@2.20/rest/reference/git",
"/en/enterprise/2.20/v3/git/refs": "/en/enterprise-server@2.20/rest/reference/git#refs",
"/en/enterprise/2.20/v3/git/tags": "/en/enterprise-server@2.20/rest/reference/git#tags",
"/en/enterprise/2.20/v3/git/trees": "/en/enterprise-server@2.20/rest/reference/git#trees",
"/en/enterprise/2.20/v3/gitignore": "/en/enterprise-server@2.20/rest/reference/gitignore",
"/en/enterprise/2.20/v3/issues/assignees": "/en/enterprise-server@2.20/rest/reference/issues#assignees",
"/en/enterprise/2.20/v3/issues/comments": "/en/enterprise-server@2.20/rest/reference/issues#comments",
"/en/enterprise/2.20/v3/issues/events": "/en/enterprise-server@2.20/rest/reference/issues#events",
"/en/enterprise/2.20/v3/issues": "/en/enterprise-server@2.20/rest/reference/issues",
"/en/enterprise/2.20/v3/issues/issue-event-types": "/en/enterprise-server@2.20/developers/webhooks-and-events/issue-event-types",
"/en/enterprise/2.20/v3/issues/labels": "/en/enterprise-server@2.20/rest/reference/issues#labels",
"/en/enterprise/2.20/v3/issues/milestones": "/en/enterprise-server@2.20/rest/reference/issues#milestones",
"/en/enterprise/2.20/v3/issues/timeline": "/en/enterprise-server@2.20/rest/reference/issues#timeline",
"/en/enterprise/2.20/v3/licenses": "/en/enterprise-server@2.20/rest/reference/licenses",
"/en/enterprise/2.20/v3/markdown": "/en/enterprise-server@2.20/rest/reference/markdown",
"/en/enterprise/2.20/v3/meta": "/en/enterprise-server@2.20/rest/reference/meta",
"/en/enterprise/2.20/v3/oauth_authorizations": "/en/enterprise-server@2.20/rest/reference/oauth-authorizations",
"/en/enterprise/2.20/v3/orgs/hooks": "/en/enterprise-server@2.20/rest/reference/orgs#hooks",
"/en/enterprise/2.20/v3/orgs": "/en/enterprise-server@2.20/rest/reference/orgs",
"/en/enterprise/2.20/v3/orgs/members": "/en/enterprise-server@2.20/rest/reference/orgs#members",
"/en/enterprise/2.20/v3/orgs/outside_collaborators": "/en/enterprise-server@2.20/rest/reference/orgs#outside-collaborators",
"/en/enterprise/2.20/v3/orgs/pre_receive_hooks": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.20/v3/orgs/teams": "/en/enterprise-server@2.20/rest/reference/orgs#teams",
"/en/enterprise/2.20/v3/projects/cards": "/en/enterprise-server@2.20/rest/reference/projects#cards",
"/en/enterprise/2.20/v3/projects/collaborators": "/en/enterprise-server@2.20/rest/reference/projects#collaborators",
"/en/enterprise/2.20/v3/projects/columns": "/en/enterprise-server@2.20/rest/reference/projects#columns",
"/en/enterprise/2.20/v3/projects": "/en/enterprise-server@2.20/rest/reference/projects",
"/en/enterprise/2.20/v3/pulls/comments": "/en/enterprise-server@2.20/rest/reference/pulls#comments",
"/en/enterprise/2.20/v3/pulls": "/en/enterprise-server@2.20/rest/reference/pulls",
"/en/enterprise/2.20/v3/pulls/review_requests": "/en/enterprise-server@2.20/rest/reference/pulls#review-requests",
"/en/enterprise/2.20/v3/pulls/reviews": "/en/enterprise-server@2.20/rest/reference/pulls#reviews",
"/en/enterprise/2.20/v3/rate_limit": "/en/enterprise-server@2.20/rest/reference/rate-limit",
"/en/enterprise/2.20/v3/reactions": "/en/enterprise-server@2.20/rest/reference/reactions",
"/en/enterprise/2.20/v3/repos/branches": "/en/enterprise-server@2.20/rest/reference/repos#branches",
"/en/enterprise/2.20/v3/repos/collaborators": "/en/enterprise-server@2.20/rest/reference/repos#collaborators",
"/en/enterprise/2.20/v3/repos/comments": "/en/enterprise-server@2.20/rest/reference/repos#comments",
"/en/enterprise/2.20/v3/repos/commits": "/en/enterprise-server@2.20/rest/reference/repos#commits",
"/en/enterprise/2.20/v3/repos/contents": "/en/enterprise-server@2.20/rest/reference/repos#contents",
"/en/enterprise/2.20/v3/repos/deployments": "/en/enterprise-server@2.20/rest/reference/repos#deployments",
"/en/enterprise/2.20/v3/repos/downloads": "/en/enterprise-server@2.20/rest/reference/repos#downloads",
"/en/enterprise/2.20/v3/repos/forks": "/en/enterprise-server@2.20/rest/reference/repos#forks",
"/en/enterprise/2.20/v3/repos/hooks": "/en/enterprise-server@2.20/rest/reference/repos#hooks",
"/en/enterprise/2.20/v3/repos": "/en/enterprise-server@2.20/rest/reference/repos",
"/en/enterprise/2.20/v3/repos/invitations": "/en/enterprise-server@2.20/rest/reference/repos#invitations",
"/en/enterprise/2.20/v3/repos/keys": "/en/enterprise-server@2.20/rest/reference/repos#keys",
"/en/enterprise/2.20/v3/repos/merging": "/en/enterprise-server@2.20/rest/reference/repos#merging",
"/en/enterprise/2.20/v3/repos/pages": "/en/enterprise-server@2.20/rest/reference/repos#pages",
"/en/enterprise/2.20/v3/repos/pre_receive_hooks": "/en/enterprise-server@2.20/rest/reference/repos#pre-receive-hooks",
"/en/enterprise/2.20/v3/repos/releases": "/en/enterprise-server@2.20/rest/reference/repos#releases",
"/en/enterprise/2.20/v3/repos/statistics": "/en/enterprise-server@2.20/rest/reference/repos#statistics",
"/en/enterprise/2.20/v3/repos/statuses": "/en/enterprise-server@2.20/rest/reference/repos#statuses",
"/en/enterprise/2.20/v3/search": "/en/enterprise-server@2.20/rest/reference/search",
"/en/enterprise/2.20/v3/teams/discussion_comments": "/en/enterprise-server@2.20/rest/reference/teams#discussion-comments",
"/en/enterprise/2.20/v3/teams/discussions": "/en/enterprise-server@2.20/rest/reference/teams#discussions",
"/en/enterprise/2.20/v3/teams": "/en/enterprise-server@2.20/rest/reference/teams",
"/en/enterprise/2.20/v3/teams/members": "/en/enterprise-server@2.20/rest/reference/teams#members",
"/en/enterprise/2.20/v3/users/administration": "/en/enterprise-server@2.20/rest/reference/users#administration",
"/en/enterprise/2.20/v3/users/emails": "/en/enterprise-server@2.20/rest/reference/users#emails",
"/en/enterprise/2.20/v3/users/followers": "/en/enterprise-server@2.20/rest/reference/users#followers",
"/en/enterprise/2.20/v3/users/gpg_keys": "/en/enterprise-server@2.20/rest/reference/users#gpg-keys",
"/en/enterprise/2.20/v3/users": "/en/enterprise-server@2.20/rest/reference/users",
"/en/enterprise/2.20/v3/users/keys": "/en/enterprise-server@2.20/rest/reference/users#keys",
"/en/enterprise/2.21/v3/activity/event_types": "/en/enterprise-server@2.21/developers/webhooks-and-events/github-event-types",
"/en/enterprise/2.21/v3/activity/events/types": "/en/enterprise-server@2.21/developers/webhooks-and-events/webhook-events-and-payloads",
"/en/enterprise/2.21/v3/activity/events": "/en/enterprise-server@2.21/rest/reference/activity#events",
"/en/enterprise/2.21/v3/activity/feeds": "/en/enterprise-server@2.21/rest/reference/activity#feeds",
"/en/enterprise/2.21/v3/activity": "/en/enterprise-server@2.21/rest/reference/activity",
"/en/enterprise/2.21/v3/activity/notifications": "/en/enterprise-server@2.21/rest/reference/activity#notifications",
"/en/enterprise/2.21/v3/activity/starring": "/en/enterprise-server@2.21/rest/reference/activity#starring",
"/en/enterprise/2.21/v3/activity/watching": "/en/enterprise-server@2.21/rest/reference/activity#watching",
"/en/enterprise/2.21/v3/apps/available-endpoints": "/en/enterprise-server@2.21/rest/overview/endpoints-available-for-github-apps",
"/en/enterprise/2.21/v3/apps": "/en/enterprise-server@2.21/rest/reference/apps",
"/en/enterprise/2.21/v3/apps/installations": "/en/enterprise-server@2.21/rest/reference/apps#installations",
"/en/enterprise/2.21/v3/apps/oauth_applications": "/en/enterprise-server@2.21/rest/reference/apps#oauth-applications",
"/en/enterprise/2.21/v3/apps/permissions": "/en/enterprise-server@2.21/rest/reference/permissions-required-for-github-apps",
"/en/enterprise/2.21/v3/checks": "/en/enterprise-server@2.21/rest/reference/checks",
"/en/enterprise/2.21/v3/checks/runs": "/en/enterprise-server@2.21/rest/reference/checks#runs",
"/en/enterprise/2.21/v3/checks/suites": "/en/enterprise-server@2.21/rest/reference/checks#suites",
"/en/enterprise/2.21/v3/codes_of_conduct": "/en/enterprise-server@2.21/rest/reference/codes-of-conduct",
"/en/enterprise/2.21/v3/emojis": "/en/enterprise-server@2.21/rest/reference/emojis",
"/en/enterprise/2.21/v3/enterprise-admin/admin_stats": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#admin-stats",
"/en/enterprise/2.21/v3/enterprise-admin/global_webhooks": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#global-webhooks",
"/en/enterprise/2.21/v3/enterprise-admin": "/en/enterprise-server@2.21/rest/reference/enterprise-admin",
"/en/enterprise/2.21/v3/enterprise-admin/ldap": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#ldap",
"/en/enterprise/2.21/v3/enterprise-admin/license": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#license",
"/en/enterprise/2.21/v3/enterprise-admin/management_console": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#management-console",
"/en/enterprise/2.21/v3/enterprise-admin/org_pre_receive_hooks": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.21/v3/enterprise-admin/orgs": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#orgs",
"/en/enterprise/2.21/v3/enterprise-admin/pre_receive_environments": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#pre-receive-environments",
"/en/enterprise/2.21/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#pre-receive-hooks",
"/en/enterprise/2.21/v3/enterprise-admin/repo_pre_receive_hooks": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#repo-pre-receive-hooks",
"/en/enterprise/2.21/v3/enterprise-admin/search_indexing": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#search-indexing",
"/en/enterprise/2.21/v3/enterprise-admin/users": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#users",
"/en/enterprise/2.21/v3/gists/comments": "/en/enterprise-server@2.21/rest/reference/gists#comments",
"/en/enterprise/2.21/v3/gists": "/en/enterprise-server@2.21/rest/reference/gists",
"/en/enterprise/2.21/v3/git/blobs": "/en/enterprise-server@2.21/rest/reference/git#blobs",
"/en/enterprise/2.21/v3/git/commits": "/en/enterprise-server@2.21/rest/reference/git#commits",
"/en/enterprise/2.21/v3/git": "/en/enterprise-server@2.21/rest/reference/git",
"/en/enterprise/2.21/v3/git/refs": "/en/enterprise-server@2.21/rest/reference/git#refs",
"/en/enterprise/2.21/v3/git/tags": "/en/enterprise-server@2.21/rest/reference/git#tags",
"/en/enterprise/2.21/v3/git/trees": "/en/enterprise-server@2.21/rest/reference/git#trees",
"/en/enterprise/2.21/v3/gitignore": "/en/enterprise-server@2.21/rest/reference/gitignore",
"/en/enterprise/2.21/v3/issues/assignees": "/en/enterprise-server@2.21/rest/reference/issues#assignees",
"/en/enterprise/2.21/v3/issues/comments": "/en/enterprise-server@2.21/rest/reference/issues#comments",
"/en/enterprise/2.21/v3/issues/events": "/en/enterprise-server@2.21/rest/reference/issues#events",
"/en/enterprise/2.21/v3/issues": "/en/enterprise-server@2.21/rest/reference/issues",
"/en/enterprise/2.21/v3/issues/issue-event-types": "/en/enterprise-server@2.21/developers/webhooks-and-events/issue-event-types",
"/en/enterprise/2.21/v3/issues/labels": "/en/enterprise-server@2.21/rest/reference/issues#labels",
"/en/enterprise/2.21/v3/issues/milestones": "/en/enterprise-server@2.21/rest/reference/issues#milestones",
"/en/enterprise/2.21/v3/issues/timeline": "/en/enterprise-server@2.21/rest/reference/issues#timeline",
"/en/enterprise/2.21/v3/licenses": "/en/enterprise-server@2.21/rest/reference/licenses",
"/en/enterprise/2.21/v3/markdown": "/en/enterprise-server@2.21/rest/reference/markdown",
"/en/enterprise/2.21/v3/meta": "/en/enterprise-server@2.21/rest/reference/meta",
"/en/enterprise/2.21/v3/oauth_authorizations": "/en/enterprise-server@2.21/rest/reference/oauth-authorizations",
"/en/enterprise/2.21/v3/orgs/hooks": "/en/enterprise-server@2.21/rest/reference/orgs#hooks",
"/en/enterprise/2.21/v3/orgs": "/en/enterprise-server@2.21/rest/reference/orgs",
"/en/enterprise/2.21/v3/orgs/members": "/en/enterprise-server@2.21/rest/reference/orgs#members",
"/en/enterprise/2.21/v3/orgs/outside_collaborators": "/en/enterprise-server@2.21/rest/reference/orgs#outside-collaborators",
"/en/enterprise/2.21/v3/orgs/pre_receive_hooks": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.21/v3/orgs/teams": "/en/enterprise-server@2.21/rest/reference/orgs#teams",
"/en/enterprise/2.21/v3/projects/cards": "/en/enterprise-server@2.21/rest/reference/projects#cards",
"/en/enterprise/2.21/v3/projects/collaborators": "/en/enterprise-server@2.21/rest/reference/projects#collaborators",
"/en/enterprise/2.21/v3/projects/columns": "/en/enterprise-server@2.21/rest/reference/projects#columns",
"/en/enterprise/2.21/v3/projects": "/en/enterprise-server@2.21/rest/reference/projects",
"/en/enterprise/2.21/v3/pulls/comments": "/en/enterprise-server@2.21/rest/reference/pulls#comments",
"/en/enterprise/2.21/v3/pulls": "/en/enterprise-server@2.21/rest/reference/pulls",
"/en/enterprise/2.21/v3/pulls/review_requests": "/en/enterprise-server@2.21/rest/reference/pulls#review-requests",
"/en/enterprise/2.21/v3/pulls/reviews": "/en/enterprise-server@2.21/rest/reference/pulls#reviews",
"/en/enterprise/2.21/v3/rate_limit": "/en/enterprise-server@2.21/rest/reference/rate-limit",
"/en/enterprise/2.21/v3/reactions": "/en/enterprise-server@2.21/rest/reference/reactions",
"/en/enterprise/2.21/v3/repos/branches": "/en/enterprise-server@2.21/rest/reference/repos#branches",
"/en/enterprise/2.21/v3/repos/collaborators": "/en/enterprise-server@2.21/rest/reference/repos#collaborators",
"/en/enterprise/2.21/v3/repos/comments": "/en/enterprise-server@2.21/rest/reference/repos#comments",
"/en/enterprise/2.21/v3/repos/commits": "/en/enterprise-server@2.21/rest/reference/repos#commits",
"/en/enterprise/2.21/v3/repos/contents": "/en/enterprise-server@2.21/rest/reference/repos#contents",
"/en/enterprise/2.21/v3/repos/deployments": "/en/enterprise-server@2.21/rest/reference/repos#deployments",
"/en/enterprise/2.21/v3/repos/downloads": "/en/enterprise-server@2.21/rest/reference/repos#downloads",
"/en/enterprise/2.21/v3/repos/forks": "/en/enterprise-server@2.21/rest/reference/repos#forks",
"/en/enterprise/2.21/v3/repos/hooks": "/en/enterprise-server@2.21/rest/reference/repos#hooks",
"/en/enterprise/2.21/v3/repos": "/en/enterprise-server@2.21/rest/reference/repos",
"/en/enterprise/2.21/v3/repos/invitations": "/en/enterprise-server@2.21/rest/reference/repos#invitations",
"/en/enterprise/2.21/v3/repos/keys": "/en/enterprise-server@2.21/rest/reference/repos#keys",
"/en/enterprise/2.21/v3/repos/merging": "/en/enterprise-server@2.21/rest/reference/repos#merging",
"/en/enterprise/2.21/v3/repos/pages": "/en/enterprise-server@2.21/rest/reference/repos#pages",
"/en/enterprise/2.21/v3/repos/pre_receive_hooks": "/en/enterprise-server@2.21/rest/reference/repos#pre-receive-hooks",
"/en/enterprise/2.21/v3/repos/releases": "/en/enterprise-server@2.21/rest/reference/repos#releases",
"/en/enterprise/2.21/v3/repos/statistics": "/en/enterprise-server@2.21/rest/reference/repos#statistics",
"/en/enterprise/2.21/v3/repos/statuses": "/en/enterprise-server@2.21/rest/reference/repos#statuses",
"/en/enterprise/2.21/v3/search": "/en/enterprise-server@2.21/rest/reference/search",
"/en/enterprise/2.21/v3/teams/discussion_comments": "/en/enterprise-server@2.21/rest/reference/teams#discussion-comments",
"/en/enterprise/2.21/v3/teams/discussions": "/en/enterprise-server@2.21/rest/reference/teams#discussions",
"/en/enterprise/2.21/v3/teams": "/en/enterprise-server@2.21/rest/reference/teams",
"/en/enterprise/2.21/v3/teams/members": "/en/enterprise-server@2.21/rest/reference/teams#members",
"/en/enterprise/2.21/v3/users/administration": "/en/enterprise-server@2.21/rest/reference/users#administration",
"/en/enterprise/2.21/v3/users/emails": "/en/enterprise-server@2.21/rest/reference/users#emails",
"/en/enterprise/2.21/v3/users/followers": "/en/enterprise-server@2.21/rest/reference/users#followers",
"/en/enterprise/2.21/v3/users/gpg_keys": "/en/enterprise-server@2.21/rest/reference/users#gpg-keys",
"/en/enterprise/2.21/v3/users": "/en/enterprise-server@2.21/rest/reference/users",
"/en/enterprise/2.21/v3/users/keys": "/en/enterprise-server@2.21/rest/reference/users#keys",
"/v3/actions/artifacts": "/en/free-pro-team@latest/rest/reference/actions#artifacts",
"/v3/actions": "/en/free-pro-team@latest/rest/reference/actions",
"/v3/actions/secrets": "/en/free-pro-team@latest/rest/reference/actions#secrets",
"/v3/actions/self-hosted-runners": "/en/free-pro-team@latest/rest/reference/actions#self-hosted-runners",
"/v3/actions/self_hosted_runners": "/en/free-pro-team@latest/rest/reference/actions#self-hosted-runners",
"/v3/actions/workflow-jobs": "/en/free-pro-team@latest/rest/reference/actions#workflow-jobs",
"/v3/actions/workflow-runs": "/en/free-pro-team@latest/rest/reference/actions#workflow-runs",
"/v3/actions/workflows": "/en/free-pro-team@latest/rest/reference/actions#workflows",
"/v3/activity/event_types": "/en/free-pro-team@latest/developers/webhooks-and-events/github-event-types",
"/v3/activity/events/types": "/en/free-pro-team@latest/developers/webhooks-and-events/webhook-events-and-payloads",
"/v3/activity/events": "/en/free-pro-team@latest/rest/reference/activity#events",
"/v3/activity/feeds": "/en/free-pro-team@latest/rest/reference/activity#feeds",
"/v3/activity": "/en/free-pro-team@latest/rest/reference/activity",
"/v3/activity/notifications": "/en/free-pro-team@latest/rest/reference/activity#notifications",
"/v3/activity/starring": "/en/free-pro-team@latest/rest/reference/activity#starring",
"/v3/activity/watching": "/en/free-pro-team@latest/rest/reference/activity#watching",
"/v3/apps/available-endpoints": "/en/free-pro-team@latest/rest/overview/endpoints-available-for-github-apps",
"/v3/apps": "/en/free-pro-team@latest/rest/reference/apps",
"/v3/apps/installations": "/en/free-pro-team@latest/rest/reference/apps#installations",
"/v3/apps/marketplace": "/en/free-pro-team@latest/rest/reference/apps#marketplace",
"/v3/apps/oauth_applications": "/en/free-pro-team@latest/rest/reference/apps#oauth-applications",
"/v3/apps/permissions": "/en/free-pro-team@latest/rest/reference/permissions-required-for-github-apps",
"/v3/checks": "/en/free-pro-team@latest/rest/reference/checks",
"/v3/checks/runs": "/en/free-pro-team@latest/rest/reference/checks#runs",
"/v3/checks/suites": "/en/free-pro-team@latest/rest/reference/checks#suites",
"/v3/code-scanning": "/en/free-pro-team@latest/rest/reference/code-scanning",
"/v3/codes_of_conduct": "/en/free-pro-team@latest/rest/reference/codes-of-conduct",
"/v3/emojis": "/en/free-pro-team@latest/rest/reference/emojis",
"/v3/enterprise-admin": "/en/free-pro-team@latest/rest/reference/enterprise-admin",
"/v3/enterprise-admin/admin_stats": "/en/enterprise-server/rest/reference/enterprise-admin#admin-stats",
"/v3/enterprise-admin/global_webhooks": "/en/enterprise-server/rest/reference/enterprise-admin#global-webhooks",
"/v3/enterprise-admin/ldap": "/en/enterprise-server/rest/reference/enterprise-admin#ldap",
"/v3/enterprise-admin/license": "/en/enterprise-server/rest/reference/enterprise-admin#license",
"/v3/enterprise-admin/management_console": "/en/enterprise-server/rest/reference/enterprise-admin#management-console",
"/v3/enterprise-admin/orgs": "/en/enterprise-server/rest/reference/enterprise-admin#orgs",
"/v3/enterprise-admin/pre_receive_environments": "/en/enterprise-server/rest/reference/enterprise-admin#pre-receive-environments",
"/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise-server/rest/reference/enterprise-admin#pre-receive-hooks",
"/v3/enterprise-admin/search_indexing": "/en/enterprise-server/rest/reference/enterprise-admin#search-indexing",
"/v3/enterprise-admin/users": "/en/enterprise-server/rest/reference/enterprise-admin#users",
"/v3/gists/comments": "/en/free-pro-team@latest/rest/reference/gists#comments",
"/v3/gists": "/en/free-pro-team@latest/rest/reference/gists",
"/v3/git/blobs": "/en/free-pro-team@latest/rest/reference/git#blobs",
"/v3/git/commits": "/en/free-pro-team@latest/rest/reference/git#commits",
"/v3/git": "/en/free-pro-team@latest/rest/reference/git",
"/v3/git/refs": "/en/free-pro-team@latest/rest/reference/git#refs",
"/v3/git/tags": "/en/free-pro-team@latest/rest/reference/git#tags",
"/v3/git/trees": "/en/free-pro-team@latest/rest/reference/git#trees",
"/v3/gitignore": "/en/free-pro-team@latest/rest/reference/gitignore",
"/v3/interactions": "/en/free-pro-team@latest/rest/reference/interactions",
"/v3/interactions/orgs": "/en/free-pro-team@latest/rest/reference/interactions#orgs",
"/v3/interactions/repos": "/en/free-pro-team@latest/rest/reference/interactions#repos",
"/v3/issues/assignees": "/en/free-pro-team@latest/rest/reference/issues#assignees",
"/v3/issues/comments": "/en/free-pro-team@latest/rest/reference/issues#comments",
"/v3/issues/events": "/en/free-pro-team@latest/rest/reference/issues#events",
"/v3/issues": "/en/free-pro-team@latest/rest/reference/issues",
"/v3/issues/issue-event-types": "/en/free-pro-team@latest/developers/webhooks-and-events/issue-event-types",
"/v3/issues/labels": "/en/free-pro-team@latest/rest/reference/issues#labels",
"/v3/issues/milestones": "/en/free-pro-team@latest/rest/reference/issues#milestones",
"/v3/issues/timeline": "/en/free-pro-team@latest/rest/reference/issues#timeline",
"/v3/licenses": "/en/free-pro-team@latest/rest/reference/licenses",
"/v3/markdown": "/en/free-pro-team@latest/rest/reference/markdown",
"/v3/meta": "/en/free-pro-team@latest/rest/reference/meta",
"/v3/migrations": "/en/free-pro-team@latest/rest/reference/migrations",
"/v3/migrations/orgs": "/en/free-pro-team@latest/rest/reference/migrations#orgs",
"/v3/migrations/source_imports": "/en/free-pro-team@latest/rest/reference/migrations#source-imports",
"/v3/migrations/users": "/en/free-pro-team@latest/rest/reference/migrations#users",
"/v3/oauth_authorizations": "/en/free-pro-team@latest/rest/reference/oauth-authorizations",
"/v3/orgs/blocking": "/en/free-pro-team@latest/rest/reference/orgs#blocking",
"/v3/orgs/hooks": "/en/free-pro-team@latest/rest/reference/orgs#hooks",
"/v3/orgs": "/en/free-pro-team@latest/rest/reference/orgs",
"/v3/orgs/members": "/en/free-pro-team@latest/rest/reference/orgs#members",
"/v3/orgs/migrations": "/en/free-pro-team@latest/rest/reference/orgs#migrations",
"/v3/orgs/outside_collaborators": "/en/free-pro-team@latest/rest/reference/orgs#outside-collaborators",
"/v3/orgs/pre_receive_hooks": "/en/enterprise-server/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/v3/orgs/teams": "/en/free-pro-team@latest/rest/reference/orgs#teams",
"/v3/projects/cards": "/en/free-pro-team@latest/rest/reference/projects#cards",
"/v3/projects/collaborators": "/en/free-pro-team@latest/rest/reference/projects#collaborators",
"/v3/projects/columns": "/en/free-pro-team@latest/rest/reference/projects#columns",
"/v3/projects": "/en/free-pro-team@latest/rest/reference/projects",
"/v3/pulls/comments": "/en/free-pro-team@latest/rest/reference/pulls#comments",
"/v3/pulls": "/en/free-pro-team@latest/rest/reference/pulls",
"/v3/pulls/review_requests": "/en/free-pro-team@latest/rest/reference/pulls#review-requests",
"/v3/pulls/reviews": "/en/free-pro-team@latest/rest/reference/pulls#reviews",
"/v3/rate_limit": "/en/free-pro-team@latest/rest/reference/rate-limit",
"/v3/reactions": "/en/free-pro-team@latest/rest/reference/reactions",
"/v3/repos/branches": "/en/free-pro-team@latest/rest/reference/repos#branches",
"/v3/repos/collaborators": "/en/free-pro-team@latest/rest/reference/repos#collaborators",
"/v3/repos/comments": "/en/free-pro-team@latest/rest/reference/repos#comments",
"/v3/repos/commits": "/en/free-pro-team@latest/rest/reference/repos#commits",
"/v3/repos/community": "/en/free-pro-team@latest/rest/reference/repos#community",
"/v3/repos/contents": "/en/free-pro-team@latest/rest/reference/repos#contents",
"/v3/repos/deployments": "/en/free-pro-team@latest/rest/reference/repos#deployments",
"/v3/repos/downloads": "/en/free-pro-team@latest/rest/reference/repos#downloads",
"/v3/repos/forks": "/en/free-pro-team@latest/rest/reference/repos#forks",
"/v3/repos/hooks": "/en/free-pro-team@latest/rest/reference/repos#hooks",
"/v3/repos": "/en/free-pro-team@latest/rest/reference/repos",
"/v3/repos/invitations": "/en/free-pro-team@latest/rest/reference/repos#invitations",
"/v3/repos/keys": "/en/free-pro-team@latest/rest/reference/repos#keys",
"/v3/repos/merging": "/en/free-pro-team@latest/rest/reference/repos#merging",
"/v3/repos/pages": "/en/free-pro-team@latest/rest/reference/repos#pages",
"/v3/repos/pre_receive_hooks": "/en/free-pro-team@latest/rest/reference/repos#pre-receive-hooks",
"/v3/repos/releases": "/en/free-pro-team@latest/rest/reference/repos#releases",
"/v3/repos/statistics": "/en/free-pro-team@latest/rest/reference/repos#statistics",
"/v3/repos/statuses": "/en/free-pro-team@latest/rest/reference/repos#statuses",
"/v3/repos/traffic": "/en/free-pro-team@latest/rest/reference/repos#traffic",
"/v3/scim": "/en/free-pro-team@latest/rest/reference/scim",
"/v3/search": "/en/free-pro-team@latest/rest/reference/search",
"/v3/teams/discussion_comments": "/en/free-pro-team@latest/rest/reference/teams#discussion-comments",
"/v3/teams/discussions": "/en/free-pro-team@latest/rest/reference/teams#discussions",
"/v3/teams": "/en/free-pro-team@latest/rest/reference/teams",
"/v3/teams/members": "/en/free-pro-team@latest/rest/reference/teams#members",
"/v3/teams/team_sync": "/en/free-pro-team@latest/rest/reference/teams#team-sync",
"/v3/users/blocking": "/en/free-pro-team@latest/rest/reference/users#blocking",
"/v3/users/emails": "/en/free-pro-team@latest/rest/reference/users#emails",
"/v3/users/followers": "/en/free-pro-team@latest/rest/reference/users#followers",
"/v3/users/gpg_keys": "/en/free-pro-team@latest/rest/reference/users#gpg-keys",
"/v3/users": "/en/free-pro-team@latest/rest/reference/users",
"/v3/users/keys": "/en/free-pro-team@latest/rest/reference/users#keys"
}

View File

@@ -1,6 +0,0 @@
---
title: A sample article
versions:
free-pro-team: '*'
---

View File

@@ -1,7 +0,0 @@
---
title: A sample TOC
versions:
free-pro-team: '*'
---
{% link_in_list /sample-article %}

View File

@@ -1,9 +0,0 @@
---
title: Translated TOC
versions:
free-pro-team: '*'
---
### 目次
Placeholder text

View File

@@ -1,5 +1,6 @@
--- ---
title: Some page that exists in the content directory but not the translations directory title: Some page that exists in the content directory but not the translations directory
productVersions: versions:
dotcom: '*' free-pro-team: '*'
--- ---

View File

@@ -1,6 +1,6 @@
--- ---
title: This is an article title: This is an article
intro: 'I've got broken frontmatter' intro: 'I've got broken frontmatter'
productVersions: versions:
dotcom: '*' free-pro-team: '*'
--- ---

View File

@@ -2,6 +2,7 @@
title: A page with redirects title: A page with redirects
redirect_from: redirect_from:
- /some-old-path - /some-old-path
productVersions: versions:
dotcom: '*' free-pro-team: '*'
--- ---

View File

@@ -1,5 +1,6 @@
--- ---
title: A sample article title: A sample article
productVersions: versions:
dotcom: '*' free-pro-team: '*'
--- ---

View File

@@ -1,5 +0,0 @@
---
title: A sample article
productVersions:
enterprise: '>2.16'
---

View File

@@ -1,5 +1,6 @@
--- ---
title: A sample article title: A sample article
productVersions: versions:
dotcom: '*' free-pro-team: '*'
--- ---

View File

@@ -1,6 +1,6 @@
--- ---
title: Frontmatter title: Frontmatter
productVersions: versions:
dotcom: '*' dotcom: '*'
enterprise: '>=2.13' enterprise: '>=2.13'
--- ---

View File

@@ -1,6 +1,6 @@
--- ---
title: Frontmatter title: Frontmatter
productVersions: versions:
dotcom: '*' dotcom: '*'
enterprise: '>=2.14' enterprise: '>=2.14'
--- ---

View File

@@ -95,412 +95,412 @@
"/en/enterprise/2.18/v3/users/gpg_keys": "/en/enterprise/2.18/user/rest/reference/users#gpg-keys", "/en/enterprise/2.18/v3/users/gpg_keys": "/en/enterprise/2.18/user/rest/reference/users#gpg-keys",
"/en/enterprise/2.18/v3/users": "/en/enterprise/2.18/user/rest/reference/users", "/en/enterprise/2.18/v3/users": "/en/enterprise/2.18/user/rest/reference/users",
"/en/enterprise/2.18/v3/users/keys": "/en/enterprise/2.18/user/rest/reference/users#keys", "/en/enterprise/2.18/v3/users/keys": "/en/enterprise/2.18/user/rest/reference/users#keys",
"/en/enterprise/2.19/v3/activity/event_types": "/en/enterprise/2.19/user/developers/webhooks-and-events/github-event-types", "/en/enterprise/2.19/v3/activity/event_types": "/en/enterprise-server@2.19/developers/webhooks-and-events/github-event-types",
"/en/enterprise/2.19/v3/activity/events/types": "/en/enterprise/2.19/user/developers/webhooks-and-events/webhook-events-and-payloads", "/en/enterprise/2.19/v3/activity/events/types": "/en/enterprise-server@2.19/developers/webhooks-and-events/webhook-events-and-payloads",
"/en/enterprise/2.19/v3/activity/events": "/en/enterprise/2.19/user/rest/reference/activity#events", "/en/enterprise/2.19/v3/activity/events": "/en/enterprise-server@2.19/rest/reference/activity#events",
"/en/enterprise/2.19/v3/activity/feeds": "/en/enterprise/2.19/user/rest/reference/activity#feeds", "/en/enterprise/2.19/v3/activity/feeds": "/en/enterprise-server@2.19/rest/reference/activity#feeds",
"/en/enterprise/2.19/v3/activity": "/en/enterprise/2.19/user/rest/reference/activity", "/en/enterprise/2.19/v3/activity": "/en/enterprise-server@2.19/rest/reference/activity",
"/en/enterprise/2.19/v3/activity/notifications": "/en/enterprise/2.19/user/rest/reference/activity#notifications", "/en/enterprise/2.19/v3/activity/notifications": "/en/enterprise-server@2.19/rest/reference/activity#notifications",
"/en/enterprise/2.19/v3/activity/starring": "/en/enterprise/2.19/user/rest/reference/activity#starring", "/en/enterprise/2.19/v3/activity/starring": "/en/enterprise-server@2.19/rest/reference/activity#starring",
"/en/enterprise/2.19/v3/activity/watching": "/en/enterprise/2.19/user/rest/reference/activity#watching", "/en/enterprise/2.19/v3/activity/watching": "/en/enterprise-server@2.19/rest/reference/activity#watching",
"/en/enterprise/2.19/v3/apps/available-endpoints": "/en/enterprise/2.19/user/rest/overview/endpoints-available-for-github-apps", "/en/enterprise/2.19/v3/apps/available-endpoints": "/en/enterprise-server@2.19/rest/overview/endpoints-available-for-github-apps",
"/en/enterprise/2.19/v3/apps": "/en/enterprise/2.19/user/rest/reference/apps", "/en/enterprise/2.19/v3/apps": "/en/enterprise-server@2.19/rest/reference/apps",
"/en/enterprise/2.19/v3/apps/installations": "/en/enterprise/2.19/user/rest/reference/apps#installations", "/en/enterprise/2.19/v3/apps/installations": "/en/enterprise-server@2.19/rest/reference/apps#installations",
"/en/enterprise/2.19/v3/apps/permissions": "/en/enterprise/2.19/user/rest/reference/permissions-required-for-github-apps", "/en/enterprise/2.19/v3/apps/permissions": "/en/enterprise-server@2.19/rest/reference/permissions-required-for-github-apps",
"/en/enterprise/2.19/v3/checks": "/en/enterprise/2.19/user/rest/reference/checks", "/en/enterprise/2.19/v3/checks": "/en/enterprise-server@2.19/rest/reference/checks",
"/en/enterprise/2.19/v3/checks/runs": "/en/enterprise/2.19/user/rest/reference/checks#runs", "/en/enterprise/2.19/v3/checks/runs": "/en/enterprise-server@2.19/rest/reference/checks#runs",
"/en/enterprise/2.19/v3/checks/suites": "/en/enterprise/2.19/user/rest/reference/checks#suites", "/en/enterprise/2.19/v3/checks/suites": "/en/enterprise-server@2.19/rest/reference/checks#suites",
"/en/enterprise/2.19/v3/codes_of_conduct": "/en/enterprise/2.19/user/rest/reference/codes-of-conduct", "/en/enterprise/2.19/v3/codes_of_conduct": "/en/enterprise-server@2.19/rest/reference/codes-of-conduct",
"/en/enterprise/2.19/v3/emojis": "/en/enterprise/2.19/user/rest/reference/emojis", "/en/enterprise/2.19/v3/emojis": "/en/enterprise-server@2.19/rest/reference/emojis",
"/en/enterprise/2.19/v3/enterprise-admin/admin_stats": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#admin-stats", "/en/enterprise/2.19/v3/enterprise-admin/admin_stats": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#admin-stats",
"/en/enterprise/2.19/v3/enterprise-admin/global_webhooks": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#global-webhooks", "/en/enterprise/2.19/v3/enterprise-admin/global_webhooks": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#global-webhooks",
"/en/enterprise/2.19/v3/enterprise-admin": "/en/enterprise/2.19/user/rest/reference/enterprise-admin", "/en/enterprise/2.19/v3/enterprise-admin": "/en/enterprise-server@2.19/rest/reference/enterprise-admin",
"/en/enterprise/2.19/v3/enterprise-admin/ldap": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#ldap", "/en/enterprise/2.19/v3/enterprise-admin/ldap": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#ldap",
"/en/enterprise/2.19/v3/enterprise-admin/license": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#license", "/en/enterprise/2.19/v3/enterprise-admin/license": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#license",
"/en/enterprise/2.19/v3/enterprise-admin/management_console": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#management-console", "/en/enterprise/2.19/v3/enterprise-admin/management_console": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#management-console",
"/en/enterprise/2.19/v3/enterprise-admin/org_pre_receive_hooks": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#organization-pre-receive-hooks", "/en/enterprise/2.19/v3/enterprise-admin/org_pre_receive_hooks": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.19/v3/enterprise-admin/orgs": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#orgs", "/en/enterprise/2.19/v3/enterprise-admin/orgs": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#orgs",
"/en/enterprise/2.19/v3/enterprise-admin/pre_receive_environments": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#pre-receive-environments", "/en/enterprise/2.19/v3/enterprise-admin/pre_receive_environments": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#pre-receive-environments",
"/en/enterprise/2.19/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#pre-receive-hooks", "/en/enterprise/2.19/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#pre-receive-hooks",
"/en/enterprise/2.19/v3/enterprise-admin/repo_pre_receive_hooks": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#repo-pre-receive-hooks", "/en/enterprise/2.19/v3/enterprise-admin/repo_pre_receive_hooks": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#repo-pre-receive-hooks",
"/en/enterprise/2.19/v3/enterprise-admin/search_indexing": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#search-indexing", "/en/enterprise/2.19/v3/enterprise-admin/search_indexing": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#search-indexing",
"/en/enterprise/2.19/v3/enterprise-admin/users": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#users", "/en/enterprise/2.19/v3/enterprise-admin/users": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#users",
"/en/enterprise/2.19/v3/gists/comments": "/en/enterprise/2.19/user/rest/reference/gists#comments", "/en/enterprise/2.19/v3/gists/comments": "/en/enterprise-server@2.19/rest/reference/gists#comments",
"/en/enterprise/2.19/v3/gists": "/en/enterprise/2.19/user/rest/reference/gists", "/en/enterprise/2.19/v3/gists": "/en/enterprise-server@2.19/rest/reference/gists",
"/en/enterprise/2.19/v3/git/blobs": "/en/enterprise/2.19/user/rest/reference/git#blobs", "/en/enterprise/2.19/v3/git/blobs": "/en/enterprise-server@2.19/rest/reference/git#blobs",
"/en/enterprise/2.19/v3/git/commits": "/en/enterprise/2.19/user/rest/reference/git#commits", "/en/enterprise/2.19/v3/git/commits": "/en/enterprise-server@2.19/rest/reference/git#commits",
"/en/enterprise/2.19/v3/git": "/en/enterprise/2.19/user/rest/reference/git", "/en/enterprise/2.19/v3/git": "/en/enterprise-server@2.19/rest/reference/git",
"/en/enterprise/2.19/v3/git/refs": "/en/enterprise/2.19/user/rest/reference/git#refs", "/en/enterprise/2.19/v3/git/refs": "/en/enterprise-server@2.19/rest/reference/git#refs",
"/en/enterprise/2.19/v3/git/tags": "/en/enterprise/2.19/user/rest/reference/git#tags", "/en/enterprise/2.19/v3/git/tags": "/en/enterprise-server@2.19/rest/reference/git#tags",
"/en/enterprise/2.19/v3/git/trees": "/en/enterprise/2.19/user/rest/reference/git#trees", "/en/enterprise/2.19/v3/git/trees": "/en/enterprise-server@2.19/rest/reference/git#trees",
"/en/enterprise/2.19/v3/gitignore": "/en/enterprise/2.19/user/rest/reference/gitignore", "/en/enterprise/2.19/v3/gitignore": "/en/enterprise-server@2.19/rest/reference/gitignore",
"/en/enterprise/2.19/v3/issues/assignees": "/en/enterprise/2.19/user/rest/reference/issues#assignees", "/en/enterprise/2.19/v3/issues/assignees": "/en/enterprise-server@2.19/rest/reference/issues#assignees",
"/en/enterprise/2.19/v3/issues/comments": "/en/enterprise/2.19/user/rest/reference/issues#comments", "/en/enterprise/2.19/v3/issues/comments": "/en/enterprise-server@2.19/rest/reference/issues#comments",
"/en/enterprise/2.19/v3/issues/events": "/en/enterprise/2.19/user/rest/reference/issues#events", "/en/enterprise/2.19/v3/issues/events": "/en/enterprise-server@2.19/rest/reference/issues#events",
"/en/enterprise/2.19/v3/issues": "/en/enterprise/2.19/user/rest/reference/issues", "/en/enterprise/2.19/v3/issues": "/en/enterprise-server@2.19/rest/reference/issues",
"/en/enterprise/2.19/v3/issues/issue-event-types": "/en/enterprise/2.19/user/developers/webhooks-and-events/issue-event-types", "/en/enterprise/2.19/v3/issues/issue-event-types": "/en/enterprise-server@2.19/developers/webhooks-and-events/issue-event-types",
"/en/enterprise/2.19/v3/issues/labels": "/en/enterprise/2.19/user/rest/reference/issues#labels", "/en/enterprise/2.19/v3/issues/labels": "/en/enterprise-server@2.19/rest/reference/issues#labels",
"/en/enterprise/2.19/v3/issues/milestones": "/en/enterprise/2.19/user/rest/reference/issues#milestones", "/en/enterprise/2.19/v3/issues/milestones": "/en/enterprise-server@2.19/rest/reference/issues#milestones",
"/en/enterprise/2.19/v3/issues/timeline": "/en/enterprise/2.19/user/rest/reference/issues#timeline", "/en/enterprise/2.19/v3/issues/timeline": "/en/enterprise-server@2.19/rest/reference/issues#timeline",
"/en/enterprise/2.19/v3/licenses": "/en/enterprise/2.19/user/rest/reference/licenses", "/en/enterprise/2.19/v3/licenses": "/en/enterprise-server@2.19/rest/reference/licenses",
"/en/enterprise/2.19/v3/markdown": "/en/enterprise/2.19/user/rest/reference/markdown", "/en/enterprise/2.19/v3/markdown": "/en/enterprise-server@2.19/rest/reference/markdown",
"/en/enterprise/2.19/v3/meta": "/en/enterprise/2.19/user/rest/reference/meta", "/en/enterprise/2.19/v3/meta": "/en/enterprise-server@2.19/rest/reference/meta",
"/en/enterprise/2.19/v3/oauth_authorizations": "/en/enterprise/2.19/user/rest/reference/oauth-authorizations", "/en/enterprise/2.19/v3/oauth_authorizations": "/en/enterprise-server@2.19/rest/reference/oauth-authorizations",
"/en/enterprise/2.19/v3/orgs/hooks": "/en/enterprise/2.19/user/rest/reference/orgs#hooks", "/en/enterprise/2.19/v3/orgs/hooks": "/en/enterprise-server@2.19/rest/reference/orgs#hooks",
"/en/enterprise/2.19/v3/orgs": "/en/enterprise/2.19/user/rest/reference/orgs", "/en/enterprise/2.19/v3/orgs": "/en/enterprise-server@2.19/rest/reference/orgs",
"/en/enterprise/2.19/v3/orgs/members": "/en/enterprise/2.19/user/rest/reference/orgs#members", "/en/enterprise/2.19/v3/orgs/members": "/en/enterprise-server@2.19/rest/reference/orgs#members",
"/en/enterprise/2.19/v3/orgs/outside_collaborators": "/en/enterprise/2.19/user/rest/reference/orgs#outside-collaborators", "/en/enterprise/2.19/v3/orgs/outside_collaborators": "/en/enterprise-server@2.19/rest/reference/orgs#outside-collaborators",
"/en/enterprise/2.19/v3/orgs/pre_receive_hooks": "/en/enterprise/2.19/user/rest/reference/enterprise-admin#organization-pre-receive-hooks", "/en/enterprise/2.19/v3/orgs/pre_receive_hooks": "/en/enterprise-server@2.19/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.19/v3/orgs/teams": "/en/enterprise/2.19/user/rest/reference/orgs#teams", "/en/enterprise/2.19/v3/orgs/teams": "/en/enterprise-server@2.19/rest/reference/orgs#teams",
"/en/enterprise/2.19/v3/projects/cards": "/en/enterprise/2.19/user/rest/reference/projects#cards", "/en/enterprise/2.19/v3/projects/cards": "/en/enterprise-server@2.19/rest/reference/projects#cards",
"/en/enterprise/2.19/v3/projects/collaborators": "/en/enterprise/2.19/user/rest/reference/projects#collaborators", "/en/enterprise/2.19/v3/projects/collaborators": "/en/enterprise-server@2.19/rest/reference/projects#collaborators",
"/en/enterprise/2.19/v3/projects/columns": "/en/enterprise/2.19/user/rest/reference/projects#columns", "/en/enterprise/2.19/v3/projects/columns": "/en/enterprise-server@2.19/rest/reference/projects#columns",
"/en/enterprise/2.19/v3/projects": "/en/enterprise/2.19/user/rest/reference/projects", "/en/enterprise/2.19/v3/projects": "/en/enterprise-server@2.19/rest/reference/projects",
"/en/enterprise/2.19/v3/pulls/comments": "/en/enterprise/2.19/user/rest/reference/pulls#comments", "/en/enterprise/2.19/v3/pulls/comments": "/en/enterprise-server@2.19/rest/reference/pulls#comments",
"/en/enterprise/2.19/v3/pulls": "/en/enterprise/2.19/user/rest/reference/pulls", "/en/enterprise/2.19/v3/pulls": "/en/enterprise-server@2.19/rest/reference/pulls",
"/en/enterprise/2.19/v3/pulls/review_requests": "/en/enterprise/2.19/user/rest/reference/pulls#review-requests", "/en/enterprise/2.19/v3/pulls/review_requests": "/en/enterprise-server@2.19/rest/reference/pulls#review-requests",
"/en/enterprise/2.19/v3/pulls/reviews": "/en/enterprise/2.19/user/rest/reference/pulls#reviews", "/en/enterprise/2.19/v3/pulls/reviews": "/en/enterprise-server@2.19/rest/reference/pulls#reviews",
"/en/enterprise/2.19/v3/rate_limit": "/en/enterprise/2.19/user/rest/reference/rate-limit", "/en/enterprise/2.19/v3/rate_limit": "/en/enterprise-server@2.19/rest/reference/rate-limit",
"/en/enterprise/2.19/v3/reactions": "/en/enterprise/2.19/user/rest/reference/reactions", "/en/enterprise/2.19/v3/reactions": "/en/enterprise-server@2.19/rest/reference/reactions",
"/en/enterprise/2.19/v3/repos/branches": "/en/enterprise/2.19/user/rest/reference/repos#branches", "/en/enterprise/2.19/v3/repos/branches": "/en/enterprise-server@2.19/rest/reference/repos#branches",
"/en/enterprise/2.19/v3/repos/collaborators": "/en/enterprise/2.19/user/rest/reference/repos#collaborators", "/en/enterprise/2.19/v3/repos/collaborators": "/en/enterprise-server@2.19/rest/reference/repos#collaborators",
"/en/enterprise/2.19/v3/repos/comments": "/en/enterprise/2.19/user/rest/reference/repos#comments", "/en/enterprise/2.19/v3/repos/comments": "/en/enterprise-server@2.19/rest/reference/repos#comments",
"/en/enterprise/2.19/v3/repos/commits": "/en/enterprise/2.19/user/rest/reference/repos#commits", "/en/enterprise/2.19/v3/repos/commits": "/en/enterprise-server@2.19/rest/reference/repos#commits",
"/en/enterprise/2.19/v3/repos/contents": "/en/enterprise/2.19/user/rest/reference/repos#contents", "/en/enterprise/2.19/v3/repos/contents": "/en/enterprise-server@2.19/rest/reference/repos#contents",
"/en/enterprise/2.19/v3/repos/deployments": "/en/enterprise/2.19/user/rest/reference/repos#deployments", "/en/enterprise/2.19/v3/repos/deployments": "/en/enterprise-server@2.19/rest/reference/repos#deployments",
"/en/enterprise/2.19/v3/repos/downloads": "/en/enterprise/2.19/user/rest/reference/repos#downloads", "/en/enterprise/2.19/v3/repos/downloads": "/en/enterprise-server@2.19/rest/reference/repos#downloads",
"/en/enterprise/2.19/v3/repos/forks": "/en/enterprise/2.19/user/rest/reference/repos#forks", "/en/enterprise/2.19/v3/repos/forks": "/en/enterprise-server@2.19/rest/reference/repos#forks",
"/en/enterprise/2.19/v3/repos/hooks": "/en/enterprise/2.19/user/rest/reference/repos#hooks", "/en/enterprise/2.19/v3/repos/hooks": "/en/enterprise-server@2.19/rest/reference/repos#hooks",
"/en/enterprise/2.19/v3/repos": "/en/enterprise/2.19/user/rest/reference/repos", "/en/enterprise/2.19/v3/repos": "/en/enterprise-server@2.19/rest/reference/repos",
"/en/enterprise/2.19/v3/repos/invitations": "/en/enterprise/2.19/user/rest/reference/repos#invitations", "/en/enterprise/2.19/v3/repos/invitations": "/en/enterprise-server@2.19/rest/reference/repos#invitations",
"/en/enterprise/2.19/v3/repos/keys": "/en/enterprise/2.19/user/rest/reference/repos#keys", "/en/enterprise/2.19/v3/repos/keys": "/en/enterprise-server@2.19/rest/reference/repos#keys",
"/en/enterprise/2.19/v3/repos/merging": "/en/enterprise/2.19/user/rest/reference/repos#merging", "/en/enterprise/2.19/v3/repos/merging": "/en/enterprise-server@2.19/rest/reference/repos#merging",
"/en/enterprise/2.19/v3/repos/pages": "/en/enterprise/2.19/user/rest/reference/repos#pages", "/en/enterprise/2.19/v3/repos/pages": "/en/enterprise-server@2.19/rest/reference/repos#pages",
"/en/enterprise/2.19/v3/repos/pre_receive_hooks": "/en/enterprise/2.19/user/rest/reference/repos#pre-receive-hooks", "/en/enterprise/2.19/v3/repos/pre_receive_hooks": "/en/enterprise-server@2.19/rest/reference/repos#pre-receive-hooks",
"/en/enterprise/2.19/v3/repos/releases": "/en/enterprise/2.19/user/rest/reference/repos#releases", "/en/enterprise/2.19/v3/repos/releases": "/en/enterprise-server@2.19/rest/reference/repos#releases",
"/en/enterprise/2.19/v3/repos/statistics": "/en/enterprise/2.19/user/rest/reference/repos#statistics", "/en/enterprise/2.19/v3/repos/statistics": "/en/enterprise-server@2.19/rest/reference/repos#statistics",
"/en/enterprise/2.19/v3/repos/statuses": "/en/enterprise/2.19/user/rest/reference/repos#statuses", "/en/enterprise/2.19/v3/repos/statuses": "/en/enterprise-server@2.19/rest/reference/repos#statuses",
"/en/enterprise/2.19/v3/search": "/en/enterprise/2.19/user/rest/reference/search", "/en/enterprise/2.19/v3/search": "/en/enterprise-server@2.19/rest/reference/search",
"/en/enterprise/2.19/v3/teams/discussion_comments": "/en/enterprise/2.19/user/rest/reference/teams#discussion-comments", "/en/enterprise/2.19/v3/teams/discussion_comments": "/en/enterprise-server@2.19/rest/reference/teams#discussion-comments",
"/en/enterprise/2.19/v3/teams/discussions": "/en/enterprise/2.19/user/rest/reference/teams#discussions", "/en/enterprise/2.19/v3/teams/discussions": "/en/enterprise-server@2.19/rest/reference/teams#discussions",
"/en/enterprise/2.19/v3/teams": "/en/enterprise/2.19/user/rest/reference/teams", "/en/enterprise/2.19/v3/teams": "/en/enterprise-server@2.19/rest/reference/teams",
"/en/enterprise/2.19/v3/teams/members": "/en/enterprise/2.19/user/rest/reference/teams#members", "/en/enterprise/2.19/v3/teams/members": "/en/enterprise-server@2.19/rest/reference/teams#members",
"/en/enterprise/2.19/v3/users/administration": "/en/enterprise/2.19/user/rest/reference/users#administration", "/en/enterprise/2.19/v3/users/administration": "/en/enterprise-server@2.19/rest/reference/users#administration",
"/en/enterprise/2.19/v3/users/emails": "/en/enterprise/2.19/user/rest/reference/users#emails", "/en/enterprise/2.19/v3/users/emails": "/en/enterprise-server@2.19/rest/reference/users#emails",
"/en/enterprise/2.19/v3/users/followers": "/en/enterprise/2.19/user/rest/reference/users#followers", "/en/enterprise/2.19/v3/users/followers": "/en/enterprise-server@2.19/rest/reference/users#followers",
"/en/enterprise/2.19/v3/users/gpg_keys": "/en/enterprise/2.19/user/rest/reference/users#gpg-keys", "/en/enterprise/2.19/v3/users/gpg_keys": "/en/enterprise-server@2.19/rest/reference/users#gpg-keys",
"/en/enterprise/2.19/v3/users": "/en/enterprise/2.19/user/rest/reference/users", "/en/enterprise/2.19/v3/users": "/en/enterprise-server@2.19/rest/reference/users",
"/en/enterprise/2.19/v3/users/keys": "/en/enterprise/2.19/user/rest/reference/users#keys", "/en/enterprise/2.19/v3/users/keys": "/en/enterprise-server@2.19/rest/reference/users#keys",
"/en/enterprise/2.20/v3/activity/event_types": "/en/enterprise/2.20/user/developers/webhooks-and-events/github-event-types", "/en/enterprise/2.20/v3/activity/event_types": "/en/enterprise-server@2.20/developers/webhooks-and-events/github-event-types",
"/en/enterprise/2.20/v3/activity/events/types": "/en/enterprise/2.20/user/developers/webhooks-and-events/webhook-events-and-payloads", "/en/enterprise/2.20/v3/activity/events/types": "/en/enterprise-server@2.20/developers/webhooks-and-events/webhook-events-and-payloads",
"/en/enterprise/2.20/v3/activity/events": "/en/enterprise/2.20/user/rest/reference/activity#events", "/en/enterprise/2.20/v3/activity/events": "/en/enterprise-server@2.20/rest/reference/activity#events",
"/en/enterprise/2.20/v3/activity/feeds": "/en/enterprise/2.20/user/rest/reference/activity#feeds", "/en/enterprise/2.20/v3/activity/feeds": "/en/enterprise-server@2.20/rest/reference/activity#feeds",
"/en/enterprise/2.20/v3/activity": "/en/enterprise/2.20/user/rest/reference/activity", "/en/enterprise/2.20/v3/activity": "/en/enterprise-server@2.20/rest/reference/activity",
"/en/enterprise/2.20/v3/activity/notifications": "/en/enterprise/2.20/user/rest/reference/activity#notifications", "/en/enterprise/2.20/v3/activity/notifications": "/en/enterprise-server@2.20/rest/reference/activity#notifications",
"/en/enterprise/2.20/v3/activity/starring": "/en/enterprise/2.20/user/rest/reference/activity#starring", "/en/enterprise/2.20/v3/activity/starring": "/en/enterprise-server@2.20/rest/reference/activity#starring",
"/en/enterprise/2.20/v3/activity/watching": "/en/enterprise/2.20/user/rest/reference/activity#watching", "/en/enterprise/2.20/v3/activity/watching": "/en/enterprise-server@2.20/rest/reference/activity#watching",
"/en/enterprise/2.20/v3/apps/available-endpoints": "/en/enterprise/2.20/user/rest/overview/endpoints-available-for-github-apps", "/en/enterprise/2.20/v3/apps/available-endpoints": "/en/enterprise-server@2.20/rest/overview/endpoints-available-for-github-apps",
"/en/enterprise/2.20/v3/apps": "/en/enterprise/2.20/user/rest/reference/apps", "/en/enterprise/2.20/v3/apps": "/en/enterprise-server@2.20/rest/reference/apps",
"/en/enterprise/2.20/v3/apps/installations": "/en/enterprise/2.20/user/rest/reference/apps#installations", "/en/enterprise/2.20/v3/apps/installations": "/en/enterprise-server@2.20/rest/reference/apps#installations",
"/en/enterprise/2.20/v3/apps/oauth_applications": "/en/enterprise/2.20/user/rest/reference/apps#oauth-applications", "/en/enterprise/2.20/v3/apps/oauth_applications": "/en/enterprise-server@2.20/rest/reference/apps#oauth-applications",
"/en/enterprise/2.20/v3/apps/permissions": "/en/enterprise/2.20/user/rest/reference/permissions-required-for-github-apps", "/en/enterprise/2.20/v3/apps/permissions": "/en/enterprise-server@2.20/rest/reference/permissions-required-for-github-apps",
"/en/enterprise/2.20/v3/checks": "/en/enterprise/2.20/user/rest/reference/checks", "/en/enterprise/2.20/v3/checks": "/en/enterprise-server@2.20/rest/reference/checks",
"/en/enterprise/2.20/v3/checks/runs": "/en/enterprise/2.20/user/rest/reference/checks#runs", "/en/enterprise/2.20/v3/checks/runs": "/en/enterprise-server@2.20/rest/reference/checks#runs",
"/en/enterprise/2.20/v3/checks/suites": "/en/enterprise/2.20/user/rest/reference/checks#suites", "/en/enterprise/2.20/v3/checks/suites": "/en/enterprise-server@2.20/rest/reference/checks#suites",
"/en/enterprise/2.20/v3/codes_of_conduct": "/en/enterprise/2.20/user/rest/reference/codes-of-conduct", "/en/enterprise/2.20/v3/codes_of_conduct": "/en/enterprise-server@2.20/rest/reference/codes-of-conduct",
"/en/enterprise/2.20/v3/emojis": "/en/enterprise/2.20/user/rest/reference/emojis", "/en/enterprise/2.20/v3/emojis": "/en/enterprise-server@2.20/rest/reference/emojis",
"/en/enterprise/2.20/v3/enterprise-admin/admin_stats": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#admin-stats", "/en/enterprise/2.20/v3/enterprise-admin/admin_stats": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#admin-stats",
"/en/enterprise/2.20/v3/enterprise-admin/global_webhooks": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#global-webhooks", "/en/enterprise/2.20/v3/enterprise-admin/global_webhooks": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#global-webhooks",
"/en/enterprise/2.20/v3/enterprise-admin": "/en/enterprise/2.20/user/rest/reference/enterprise-admin", "/en/enterprise/2.20/v3/enterprise-admin": "/en/enterprise-server@2.20/rest/reference/enterprise-admin",
"/en/enterprise/2.20/v3/enterprise-admin/ldap": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#ldap", "/en/enterprise/2.20/v3/enterprise-admin/ldap": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#ldap",
"/en/enterprise/2.20/v3/enterprise-admin/license": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#license", "/en/enterprise/2.20/v3/enterprise-admin/license": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#license",
"/en/enterprise/2.20/v3/enterprise-admin/management_console": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#management-console", "/en/enterprise/2.20/v3/enterprise-admin/management_console": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#management-console",
"/en/enterprise/2.20/v3/enterprise-admin/org_pre_receive_hooks": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#organization-pre-receive-hooks", "/en/enterprise/2.20/v3/enterprise-admin/org_pre_receive_hooks": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.20/v3/enterprise-admin/orgs": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#orgs", "/en/enterprise/2.20/v3/enterprise-admin/orgs": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#orgs",
"/en/enterprise/2.20/v3/enterprise-admin/pre_receive_environments": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#pre-receive-environments", "/en/enterprise/2.20/v3/enterprise-admin/pre_receive_environments": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#pre-receive-environments",
"/en/enterprise/2.20/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#pre-receive-hooks", "/en/enterprise/2.20/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#pre-receive-hooks",
"/en/enterprise/2.20/v3/enterprise-admin/repo_pre_receive_hooks": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#repo-pre-receive-hooks", "/en/enterprise/2.20/v3/enterprise-admin/repo_pre_receive_hooks": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#repo-pre-receive-hooks",
"/en/enterprise/2.20/v3/enterprise-admin/search_indexing": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#search-indexing", "/en/enterprise/2.20/v3/enterprise-admin/search_indexing": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#search-indexing",
"/en/enterprise/2.20/v3/enterprise-admin/users": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#users", "/en/enterprise/2.20/v3/enterprise-admin/users": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#users",
"/en/enterprise/2.20/v3/gists/comments": "/en/enterprise/2.20/user/rest/reference/gists#comments", "/en/enterprise/2.20/v3/gists/comments": "/en/enterprise-server@2.20/rest/reference/gists#comments",
"/en/enterprise/2.20/v3/gists": "/en/enterprise/2.20/user/rest/reference/gists", "/en/enterprise/2.20/v3/gists": "/en/enterprise-server@2.20/rest/reference/gists",
"/en/enterprise/2.20/v3/git/blobs": "/en/enterprise/2.20/user/rest/reference/git#blobs", "/en/enterprise/2.20/v3/git/blobs": "/en/enterprise-server@2.20/rest/reference/git#blobs",
"/en/enterprise/2.20/v3/git/commits": "/en/enterprise/2.20/user/rest/reference/git#commits", "/en/enterprise/2.20/v3/git/commits": "/en/enterprise-server@2.20/rest/reference/git#commits",
"/en/enterprise/2.20/v3/git": "/en/enterprise/2.20/user/rest/reference/git", "/en/enterprise/2.20/v3/git": "/en/enterprise-server@2.20/rest/reference/git",
"/en/enterprise/2.20/v3/git/refs": "/en/enterprise/2.20/user/rest/reference/git#refs", "/en/enterprise/2.20/v3/git/refs": "/en/enterprise-server@2.20/rest/reference/git#refs",
"/en/enterprise/2.20/v3/git/tags": "/en/enterprise/2.20/user/rest/reference/git#tags", "/en/enterprise/2.20/v3/git/tags": "/en/enterprise-server@2.20/rest/reference/git#tags",
"/en/enterprise/2.20/v3/git/trees": "/en/enterprise/2.20/user/rest/reference/git#trees", "/en/enterprise/2.20/v3/git/trees": "/en/enterprise-server@2.20/rest/reference/git#trees",
"/en/enterprise/2.20/v3/gitignore": "/en/enterprise/2.20/user/rest/reference/gitignore", "/en/enterprise/2.20/v3/gitignore": "/en/enterprise-server@2.20/rest/reference/gitignore",
"/en/enterprise/2.20/v3/issues/assignees": "/en/enterprise/2.20/user/rest/reference/issues#assignees", "/en/enterprise/2.20/v3/issues/assignees": "/en/enterprise-server@2.20/rest/reference/issues#assignees",
"/en/enterprise/2.20/v3/issues/comments": "/en/enterprise/2.20/user/rest/reference/issues#comments", "/en/enterprise/2.20/v3/issues/comments": "/en/enterprise-server@2.20/rest/reference/issues#comments",
"/en/enterprise/2.20/v3/issues/events": "/en/enterprise/2.20/user/rest/reference/issues#events", "/en/enterprise/2.20/v3/issues/events": "/en/enterprise-server@2.20/rest/reference/issues#events",
"/en/enterprise/2.20/v3/issues": "/en/enterprise/2.20/user/rest/reference/issues", "/en/enterprise/2.20/v3/issues": "/en/enterprise-server@2.20/rest/reference/issues",
"/en/enterprise/2.20/v3/issues/issue-event-types": "/en/enterprise/2.20/user/developers/webhooks-and-events/issue-event-types", "/en/enterprise/2.20/v3/issues/issue-event-types": "/en/enterprise-server@2.20/developers/webhooks-and-events/issue-event-types",
"/en/enterprise/2.20/v3/issues/labels": "/en/enterprise/2.20/user/rest/reference/issues#labels", "/en/enterprise/2.20/v3/issues/labels": "/en/enterprise-server@2.20/rest/reference/issues#labels",
"/en/enterprise/2.20/v3/issues/milestones": "/en/enterprise/2.20/user/rest/reference/issues#milestones", "/en/enterprise/2.20/v3/issues/milestones": "/en/enterprise-server@2.20/rest/reference/issues#milestones",
"/en/enterprise/2.20/v3/issues/timeline": "/en/enterprise/2.20/user/rest/reference/issues#timeline", "/en/enterprise/2.20/v3/issues/timeline": "/en/enterprise-server@2.20/rest/reference/issues#timeline",
"/en/enterprise/2.20/v3/licenses": "/en/enterprise/2.20/user/rest/reference/licenses", "/en/enterprise/2.20/v3/licenses": "/en/enterprise-server@2.20/rest/reference/licenses",
"/en/enterprise/2.20/v3/markdown": "/en/enterprise/2.20/user/rest/reference/markdown", "/en/enterprise/2.20/v3/markdown": "/en/enterprise-server@2.20/rest/reference/markdown",
"/en/enterprise/2.20/v3/meta": "/en/enterprise/2.20/user/rest/reference/meta", "/en/enterprise/2.20/v3/meta": "/en/enterprise-server@2.20/rest/reference/meta",
"/en/enterprise/2.20/v3/oauth_authorizations": "/en/enterprise/2.20/user/rest/reference/oauth-authorizations", "/en/enterprise/2.20/v3/oauth_authorizations": "/en/enterprise-server@2.20/rest/reference/oauth-authorizations",
"/en/enterprise/2.20/v3/orgs/hooks": "/en/enterprise/2.20/user/rest/reference/orgs#hooks", "/en/enterprise/2.20/v3/orgs/hooks": "/en/enterprise-server@2.20/rest/reference/orgs#hooks",
"/en/enterprise/2.20/v3/orgs": "/en/enterprise/2.20/user/rest/reference/orgs", "/en/enterprise/2.20/v3/orgs": "/en/enterprise-server@2.20/rest/reference/orgs",
"/en/enterprise/2.20/v3/orgs/members": "/en/enterprise/2.20/user/rest/reference/orgs#members", "/en/enterprise/2.20/v3/orgs/members": "/en/enterprise-server@2.20/rest/reference/orgs#members",
"/en/enterprise/2.20/v3/orgs/outside_collaborators": "/en/enterprise/2.20/user/rest/reference/orgs#outside-collaborators", "/en/enterprise/2.20/v3/orgs/outside_collaborators": "/en/enterprise-server@2.20/rest/reference/orgs#outside-collaborators",
"/en/enterprise/2.20/v3/orgs/pre_receive_hooks": "/en/enterprise/2.20/user/rest/reference/enterprise-admin#organization-pre-receive-hooks", "/en/enterprise/2.20/v3/orgs/pre_receive_hooks": "/en/enterprise-server@2.20/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.20/v3/orgs/teams": "/en/enterprise/2.20/user/rest/reference/orgs#teams", "/en/enterprise/2.20/v3/orgs/teams": "/en/enterprise-server@2.20/rest/reference/orgs#teams",
"/en/enterprise/2.20/v3/projects/cards": "/en/enterprise/2.20/user/rest/reference/projects#cards", "/en/enterprise/2.20/v3/projects/cards": "/en/enterprise-server@2.20/rest/reference/projects#cards",
"/en/enterprise/2.20/v3/projects/collaborators": "/en/enterprise/2.20/user/rest/reference/projects#collaborators", "/en/enterprise/2.20/v3/projects/collaborators": "/en/enterprise-server@2.20/rest/reference/projects#collaborators",
"/en/enterprise/2.20/v3/projects/columns": "/en/enterprise/2.20/user/rest/reference/projects#columns", "/en/enterprise/2.20/v3/projects/columns": "/en/enterprise-server@2.20/rest/reference/projects#columns",
"/en/enterprise/2.20/v3/projects": "/en/enterprise/2.20/user/rest/reference/projects", "/en/enterprise/2.20/v3/projects": "/en/enterprise-server@2.20/rest/reference/projects",
"/en/enterprise/2.20/v3/pulls/comments": "/en/enterprise/2.20/user/rest/reference/pulls#comments", "/en/enterprise/2.20/v3/pulls/comments": "/en/enterprise-server@2.20/rest/reference/pulls#comments",
"/en/enterprise/2.20/v3/pulls": "/en/enterprise/2.20/user/rest/reference/pulls", "/en/enterprise/2.20/v3/pulls": "/en/enterprise-server@2.20/rest/reference/pulls",
"/en/enterprise/2.20/v3/pulls/review_requests": "/en/enterprise/2.20/user/rest/reference/pulls#review-requests", "/en/enterprise/2.20/v3/pulls/review_requests": "/en/enterprise-server@2.20/rest/reference/pulls#review-requests",
"/en/enterprise/2.20/v3/pulls/reviews": "/en/enterprise/2.20/user/rest/reference/pulls#reviews", "/en/enterprise/2.20/v3/pulls/reviews": "/en/enterprise-server@2.20/rest/reference/pulls#reviews",
"/en/enterprise/2.20/v3/rate_limit": "/en/enterprise/2.20/user/rest/reference/rate-limit", "/en/enterprise/2.20/v3/rate_limit": "/en/enterprise-server@2.20/rest/reference/rate-limit",
"/en/enterprise/2.20/v3/reactions": "/en/enterprise/2.20/user/rest/reference/reactions", "/en/enterprise/2.20/v3/reactions": "/en/enterprise-server@2.20/rest/reference/reactions",
"/en/enterprise/2.20/v3/repos/branches": "/en/enterprise/2.20/user/rest/reference/repos#branches", "/en/enterprise/2.20/v3/repos/branches": "/en/enterprise-server@2.20/rest/reference/repos#branches",
"/en/enterprise/2.20/v3/repos/collaborators": "/en/enterprise/2.20/user/rest/reference/repos#collaborators", "/en/enterprise/2.20/v3/repos/collaborators": "/en/enterprise-server@2.20/rest/reference/repos#collaborators",
"/en/enterprise/2.20/v3/repos/comments": "/en/enterprise/2.20/user/rest/reference/repos#comments", "/en/enterprise/2.20/v3/repos/comments": "/en/enterprise-server@2.20/rest/reference/repos#comments",
"/en/enterprise/2.20/v3/repos/commits": "/en/enterprise/2.20/user/rest/reference/repos#commits", "/en/enterprise/2.20/v3/repos/commits": "/en/enterprise-server@2.20/rest/reference/repos#commits",
"/en/enterprise/2.20/v3/repos/contents": "/en/enterprise/2.20/user/rest/reference/repos#contents", "/en/enterprise/2.20/v3/repos/contents": "/en/enterprise-server@2.20/rest/reference/repos#contents",
"/en/enterprise/2.20/v3/repos/deployments": "/en/enterprise/2.20/user/rest/reference/repos#deployments", "/en/enterprise/2.20/v3/repos/deployments": "/en/enterprise-server@2.20/rest/reference/repos#deployments",
"/en/enterprise/2.20/v3/repos/downloads": "/en/enterprise/2.20/user/rest/reference/repos#downloads", "/en/enterprise/2.20/v3/repos/downloads": "/en/enterprise-server@2.20/rest/reference/repos#downloads",
"/en/enterprise/2.20/v3/repos/forks": "/en/enterprise/2.20/user/rest/reference/repos#forks", "/en/enterprise/2.20/v3/repos/forks": "/en/enterprise-server@2.20/rest/reference/repos#forks",
"/en/enterprise/2.20/v3/repos/hooks": "/en/enterprise/2.20/user/rest/reference/repos#hooks", "/en/enterprise/2.20/v3/repos/hooks": "/en/enterprise-server@2.20/rest/reference/repos#hooks",
"/en/enterprise/2.20/v3/repos": "/en/enterprise/2.20/user/rest/reference/repos", "/en/enterprise/2.20/v3/repos": "/en/enterprise-server@2.20/rest/reference/repos",
"/en/enterprise/2.20/v3/repos/invitations": "/en/enterprise/2.20/user/rest/reference/repos#invitations", "/en/enterprise/2.20/v3/repos/invitations": "/en/enterprise-server@2.20/rest/reference/repos#invitations",
"/en/enterprise/2.20/v3/repos/keys": "/en/enterprise/2.20/user/rest/reference/repos#keys", "/en/enterprise/2.20/v3/repos/keys": "/en/enterprise-server@2.20/rest/reference/repos#keys",
"/en/enterprise/2.20/v3/repos/merging": "/en/enterprise/2.20/user/rest/reference/repos#merging", "/en/enterprise/2.20/v3/repos/merging": "/en/enterprise-server@2.20/rest/reference/repos#merging",
"/en/enterprise/2.20/v3/repos/pages": "/en/enterprise/2.20/user/rest/reference/repos#pages", "/en/enterprise/2.20/v3/repos/pages": "/en/enterprise-server@2.20/rest/reference/repos#pages",
"/en/enterprise/2.20/v3/repos/pre_receive_hooks": "/en/enterprise/2.20/user/rest/reference/repos#pre-receive-hooks", "/en/enterprise/2.20/v3/repos/pre_receive_hooks": "/en/enterprise-server@2.20/rest/reference/repos#pre-receive-hooks",
"/en/enterprise/2.20/v3/repos/releases": "/en/enterprise/2.20/user/rest/reference/repos#releases", "/en/enterprise/2.20/v3/repos/releases": "/en/enterprise-server@2.20/rest/reference/repos#releases",
"/en/enterprise/2.20/v3/repos/statistics": "/en/enterprise/2.20/user/rest/reference/repos#statistics", "/en/enterprise/2.20/v3/repos/statistics": "/en/enterprise-server@2.20/rest/reference/repos#statistics",
"/en/enterprise/2.20/v3/repos/statuses": "/en/enterprise/2.20/user/rest/reference/repos#statuses", "/en/enterprise/2.20/v3/repos/statuses": "/en/enterprise-server@2.20/rest/reference/repos#statuses",
"/en/enterprise/2.20/v3/search": "/en/enterprise/2.20/user/rest/reference/search", "/en/enterprise/2.20/v3/search": "/en/enterprise-server@2.20/rest/reference/search",
"/en/enterprise/2.20/v3/teams/discussion_comments": "/en/enterprise/2.20/user/rest/reference/teams#discussion-comments", "/en/enterprise/2.20/v3/teams/discussion_comments": "/en/enterprise-server@2.20/rest/reference/teams#discussion-comments",
"/en/enterprise/2.20/v3/teams/discussions": "/en/enterprise/2.20/user/rest/reference/teams#discussions", "/en/enterprise/2.20/v3/teams/discussions": "/en/enterprise-server@2.20/rest/reference/teams#discussions",
"/en/enterprise/2.20/v3/teams": "/en/enterprise/2.20/user/rest/reference/teams", "/en/enterprise/2.20/v3/teams": "/en/enterprise-server@2.20/rest/reference/teams",
"/en/enterprise/2.20/v3/teams/members": "/en/enterprise/2.20/user/rest/reference/teams#members", "/en/enterprise/2.20/v3/teams/members": "/en/enterprise-server@2.20/rest/reference/teams#members",
"/en/enterprise/2.20/v3/users/administration": "/en/enterprise/2.20/user/rest/reference/users#administration", "/en/enterprise/2.20/v3/users/administration": "/en/enterprise-server@2.20/rest/reference/users#administration",
"/en/enterprise/2.20/v3/users/emails": "/en/enterprise/2.20/user/rest/reference/users#emails", "/en/enterprise/2.20/v3/users/emails": "/en/enterprise-server@2.20/rest/reference/users#emails",
"/en/enterprise/2.20/v3/users/followers": "/en/enterprise/2.20/user/rest/reference/users#followers", "/en/enterprise/2.20/v3/users/followers": "/en/enterprise-server@2.20/rest/reference/users#followers",
"/en/enterprise/2.20/v3/users/gpg_keys": "/en/enterprise/2.20/user/rest/reference/users#gpg-keys", "/en/enterprise/2.20/v3/users/gpg_keys": "/en/enterprise-server@2.20/rest/reference/users#gpg-keys",
"/en/enterprise/2.20/v3/users": "/en/enterprise/2.20/user/rest/reference/users", "/en/enterprise/2.20/v3/users": "/en/enterprise-server@2.20/rest/reference/users",
"/en/enterprise/2.20/v3/users/keys": "/en/enterprise/2.20/user/rest/reference/users#keys", "/en/enterprise/2.20/v3/users/keys": "/en/enterprise-server@2.20/rest/reference/users#keys",
"/en/enterprise/2.21/v3/activity/event_types": "/en/enterprise/2.21/user/developers/webhooks-and-events/github-event-types", "/en/enterprise/2.21/v3/activity/event_types": "/en/enterprise-server@2.21/developers/webhooks-and-events/github-event-types",
"/en/enterprise/2.21/v3/activity/events/types": "/en/enterprise/2.21/user/developers/webhooks-and-events/webhook-events-and-payloads", "/en/enterprise/2.21/v3/activity/events/types": "/en/enterprise-server@2.21/developers/webhooks-and-events/webhook-events-and-payloads",
"/en/enterprise/2.21/v3/activity/events": "/en/enterprise/2.21/user/rest/reference/activity#events", "/en/enterprise/2.21/v3/activity/events": "/en/enterprise-server@2.21/rest/reference/activity#events",
"/en/enterprise/2.21/v3/activity/feeds": "/en/enterprise/2.21/user/rest/reference/activity#feeds", "/en/enterprise/2.21/v3/activity/feeds": "/en/enterprise-server@2.21/rest/reference/activity#feeds",
"/en/enterprise/2.21/v3/activity": "/en/enterprise/2.21/user/rest/reference/activity", "/en/enterprise/2.21/v3/activity": "/en/enterprise-server@2.21/rest/reference/activity",
"/en/enterprise/2.21/v3/activity/notifications": "/en/enterprise/2.21/user/rest/reference/activity#notifications", "/en/enterprise/2.21/v3/activity/notifications": "/en/enterprise-server@2.21/rest/reference/activity#notifications",
"/en/enterprise/2.21/v3/activity/starring": "/en/enterprise/2.21/user/rest/reference/activity#starring", "/en/enterprise/2.21/v3/activity/starring": "/en/enterprise-server@2.21/rest/reference/activity#starring",
"/en/enterprise/2.21/v3/activity/watching": "/en/enterprise/2.21/user/rest/reference/activity#watching", "/en/enterprise/2.21/v3/activity/watching": "/en/enterprise-server@2.21/rest/reference/activity#watching",
"/en/enterprise/2.21/v3/apps/available-endpoints": "/en/enterprise/2.21/user/rest/overview/endpoints-available-for-github-apps", "/en/enterprise/2.21/v3/apps/available-endpoints": "/en/enterprise-server@2.21/rest/overview/endpoints-available-for-github-apps",
"/en/enterprise/2.21/v3/apps": "/en/enterprise/2.21/user/rest/reference/apps", "/en/enterprise/2.21/v3/apps": "/en/enterprise-server@2.21/rest/reference/apps",
"/en/enterprise/2.21/v3/apps/installations": "/en/enterprise/2.21/user/rest/reference/apps#installations", "/en/enterprise/2.21/v3/apps/installations": "/en/enterprise-server@2.21/rest/reference/apps#installations",
"/en/enterprise/2.21/v3/apps/oauth_applications": "/en/enterprise/2.21/user/rest/reference/apps#oauth-applications", "/en/enterprise/2.21/v3/apps/oauth_applications": "/en/enterprise-server@2.21/rest/reference/apps#oauth-applications",
"/en/enterprise/2.21/v3/apps/permissions": "/en/enterprise/2.21/user/rest/reference/permissions-required-for-github-apps", "/en/enterprise/2.21/v3/apps/permissions": "/en/enterprise-server@2.21/rest/reference/permissions-required-for-github-apps",
"/en/enterprise/2.21/v3/checks": "/en/enterprise/2.21/user/rest/reference/checks", "/en/enterprise/2.21/v3/checks": "/en/enterprise-server@2.21/rest/reference/checks",
"/en/enterprise/2.21/v3/checks/runs": "/en/enterprise/2.21/user/rest/reference/checks#runs", "/en/enterprise/2.21/v3/checks/runs": "/en/enterprise-server@2.21/rest/reference/checks#runs",
"/en/enterprise/2.21/v3/checks/suites": "/en/enterprise/2.21/user/rest/reference/checks#suites", "/en/enterprise/2.21/v3/checks/suites": "/en/enterprise-server@2.21/rest/reference/checks#suites",
"/en/enterprise/2.21/v3/codes_of_conduct": "/en/enterprise/2.21/user/rest/reference/codes-of-conduct", "/en/enterprise/2.21/v3/codes_of_conduct": "/en/enterprise-server@2.21/rest/reference/codes-of-conduct",
"/en/enterprise/2.21/v3/emojis": "/en/enterprise/2.21/user/rest/reference/emojis", "/en/enterprise/2.21/v3/emojis": "/en/enterprise-server@2.21/rest/reference/emojis",
"/en/enterprise/2.21/v3/enterprise-admin/admin_stats": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#admin-stats", "/en/enterprise/2.21/v3/enterprise-admin/admin_stats": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#admin-stats",
"/en/enterprise/2.21/v3/enterprise-admin/global_webhooks": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#global-webhooks", "/en/enterprise/2.21/v3/enterprise-admin/global_webhooks": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#global-webhooks",
"/en/enterprise/2.21/v3/enterprise-admin": "/en/enterprise/2.21/user/rest/reference/enterprise-admin", "/en/enterprise/2.21/v3/enterprise-admin": "/en/enterprise-server@2.21/rest/reference/enterprise-admin",
"/en/enterprise/2.21/v3/enterprise-admin/ldap": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#ldap", "/en/enterprise/2.21/v3/enterprise-admin/ldap": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#ldap",
"/en/enterprise/2.21/v3/enterprise-admin/license": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#license", "/en/enterprise/2.21/v3/enterprise-admin/license": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#license",
"/en/enterprise/2.21/v3/enterprise-admin/management_console": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#management-console", "/en/enterprise/2.21/v3/enterprise-admin/management_console": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#management-console",
"/en/enterprise/2.21/v3/enterprise-admin/org_pre_receive_hooks": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#organization-pre-receive-hooks", "/en/enterprise/2.21/v3/enterprise-admin/org_pre_receive_hooks": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.21/v3/enterprise-admin/orgs": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#orgs", "/en/enterprise/2.21/v3/enterprise-admin/orgs": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#orgs",
"/en/enterprise/2.21/v3/enterprise-admin/pre_receive_environments": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#pre-receive-environments", "/en/enterprise/2.21/v3/enterprise-admin/pre_receive_environments": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#pre-receive-environments",
"/en/enterprise/2.21/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#pre-receive-hooks", "/en/enterprise/2.21/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#pre-receive-hooks",
"/en/enterprise/2.21/v3/enterprise-admin/repo_pre_receive_hooks": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#repo-pre-receive-hooks", "/en/enterprise/2.21/v3/enterprise-admin/repo_pre_receive_hooks": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#repo-pre-receive-hooks",
"/en/enterprise/2.21/v3/enterprise-admin/search_indexing": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#search-indexing", "/en/enterprise/2.21/v3/enterprise-admin/search_indexing": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#search-indexing",
"/en/enterprise/2.21/v3/enterprise-admin/users": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#users", "/en/enterprise/2.21/v3/enterprise-admin/users": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#users",
"/en/enterprise/2.21/v3/gists/comments": "/en/enterprise/2.21/user/rest/reference/gists#comments", "/en/enterprise/2.21/v3/gists/comments": "/en/enterprise-server@2.21/rest/reference/gists#comments",
"/en/enterprise/2.21/v3/gists": "/en/enterprise/2.21/user/rest/reference/gists", "/en/enterprise/2.21/v3/gists": "/en/enterprise-server@2.21/rest/reference/gists",
"/en/enterprise/2.21/v3/git/blobs": "/en/enterprise/2.21/user/rest/reference/git#blobs", "/en/enterprise/2.21/v3/git/blobs": "/en/enterprise-server@2.21/rest/reference/git#blobs",
"/en/enterprise/2.21/v3/git/commits": "/en/enterprise/2.21/user/rest/reference/git#commits", "/en/enterprise/2.21/v3/git/commits": "/en/enterprise-server@2.21/rest/reference/git#commits",
"/en/enterprise/2.21/v3/git": "/en/enterprise/2.21/user/rest/reference/git", "/en/enterprise/2.21/v3/git": "/en/enterprise-server@2.21/rest/reference/git",
"/en/enterprise/2.21/v3/git/refs": "/en/enterprise/2.21/user/rest/reference/git#refs", "/en/enterprise/2.21/v3/git/refs": "/en/enterprise-server@2.21/rest/reference/git#refs",
"/en/enterprise/2.21/v3/git/tags": "/en/enterprise/2.21/user/rest/reference/git#tags", "/en/enterprise/2.21/v3/git/tags": "/en/enterprise-server@2.21/rest/reference/git#tags",
"/en/enterprise/2.21/v3/git/trees": "/en/enterprise/2.21/user/rest/reference/git#trees", "/en/enterprise/2.21/v3/git/trees": "/en/enterprise-server@2.21/rest/reference/git#trees",
"/en/enterprise/2.21/v3/gitignore": "/en/enterprise/2.21/user/rest/reference/gitignore", "/en/enterprise/2.21/v3/gitignore": "/en/enterprise-server@2.21/rest/reference/gitignore",
"/en/enterprise/2.21/v3/issues/assignees": "/en/enterprise/2.21/user/rest/reference/issues#assignees", "/en/enterprise/2.21/v3/issues/assignees": "/en/enterprise-server@2.21/rest/reference/issues#assignees",
"/en/enterprise/2.21/v3/issues/comments": "/en/enterprise/2.21/user/rest/reference/issues#comments", "/en/enterprise/2.21/v3/issues/comments": "/en/enterprise-server@2.21/rest/reference/issues#comments",
"/en/enterprise/2.21/v3/issues/events": "/en/enterprise/2.21/user/rest/reference/issues#events", "/en/enterprise/2.21/v3/issues/events": "/en/enterprise-server@2.21/rest/reference/issues#events",
"/en/enterprise/2.21/v3/issues": "/en/enterprise/2.21/user/rest/reference/issues", "/en/enterprise/2.21/v3/issues": "/en/enterprise-server@2.21/rest/reference/issues",
"/en/enterprise/2.21/v3/issues/issue-event-types": "/en/enterprise/2.21/user/developers/webhooks-and-events/issue-event-types", "/en/enterprise/2.21/v3/issues/issue-event-types": "/en/enterprise-server@2.21/developers/webhooks-and-events/issue-event-types",
"/en/enterprise/2.21/v3/issues/labels": "/en/enterprise/2.21/user/rest/reference/issues#labels", "/en/enterprise/2.21/v3/issues/labels": "/en/enterprise-server@2.21/rest/reference/issues#labels",
"/en/enterprise/2.21/v3/issues/milestones": "/en/enterprise/2.21/user/rest/reference/issues#milestones", "/en/enterprise/2.21/v3/issues/milestones": "/en/enterprise-server@2.21/rest/reference/issues#milestones",
"/en/enterprise/2.21/v3/issues/timeline": "/en/enterprise/2.21/user/rest/reference/issues#timeline", "/en/enterprise/2.21/v3/issues/timeline": "/en/enterprise-server@2.21/rest/reference/issues#timeline",
"/en/enterprise/2.21/v3/licenses": "/en/enterprise/2.21/user/rest/reference/licenses", "/en/enterprise/2.21/v3/licenses": "/en/enterprise-server@2.21/rest/reference/licenses",
"/en/enterprise/2.21/v3/markdown": "/en/enterprise/2.21/user/rest/reference/markdown", "/en/enterprise/2.21/v3/markdown": "/en/enterprise-server@2.21/rest/reference/markdown",
"/en/enterprise/2.21/v3/meta": "/en/enterprise/2.21/user/rest/reference/meta", "/en/enterprise/2.21/v3/meta": "/en/enterprise-server@2.21/rest/reference/meta",
"/en/enterprise/2.21/v3/oauth_authorizations": "/en/enterprise/2.21/user/rest/reference/oauth-authorizations", "/en/enterprise/2.21/v3/oauth_authorizations": "/en/enterprise-server@2.21/rest/reference/oauth-authorizations",
"/en/enterprise/2.21/v3/orgs/hooks": "/en/enterprise/2.21/user/rest/reference/orgs#hooks", "/en/enterprise/2.21/v3/orgs/hooks": "/en/enterprise-server@2.21/rest/reference/orgs#hooks",
"/en/enterprise/2.21/v3/orgs": "/en/enterprise/2.21/user/rest/reference/orgs", "/en/enterprise/2.21/v3/orgs": "/en/enterprise-server@2.21/rest/reference/orgs",
"/en/enterprise/2.21/v3/orgs/members": "/en/enterprise/2.21/user/rest/reference/orgs#members", "/en/enterprise/2.21/v3/orgs/members": "/en/enterprise-server@2.21/rest/reference/orgs#members",
"/en/enterprise/2.21/v3/orgs/outside_collaborators": "/en/enterprise/2.21/user/rest/reference/orgs#outside-collaborators", "/en/enterprise/2.21/v3/orgs/outside_collaborators": "/en/enterprise-server@2.21/rest/reference/orgs#outside-collaborators",
"/en/enterprise/2.21/v3/orgs/pre_receive_hooks": "/en/enterprise/2.21/user/rest/reference/enterprise-admin#organization-pre-receive-hooks", "/en/enterprise/2.21/v3/orgs/pre_receive_hooks": "/en/enterprise-server@2.21/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/en/enterprise/2.21/v3/orgs/teams": "/en/enterprise/2.21/user/rest/reference/orgs#teams", "/en/enterprise/2.21/v3/orgs/teams": "/en/enterprise-server@2.21/rest/reference/orgs#teams",
"/en/enterprise/2.21/v3/projects/cards": "/en/enterprise/2.21/user/rest/reference/projects#cards", "/en/enterprise/2.21/v3/projects/cards": "/en/enterprise-server@2.21/rest/reference/projects#cards",
"/en/enterprise/2.21/v3/projects/collaborators": "/en/enterprise/2.21/user/rest/reference/projects#collaborators", "/en/enterprise/2.21/v3/projects/collaborators": "/en/enterprise-server@2.21/rest/reference/projects#collaborators",
"/en/enterprise/2.21/v3/projects/columns": "/en/enterprise/2.21/user/rest/reference/projects#columns", "/en/enterprise/2.21/v3/projects/columns": "/en/enterprise-server@2.21/rest/reference/projects#columns",
"/en/enterprise/2.21/v3/projects": "/en/enterprise/2.21/user/rest/reference/projects", "/en/enterprise/2.21/v3/projects": "/en/enterprise-server@2.21/rest/reference/projects",
"/en/enterprise/2.21/v3/pulls/comments": "/en/enterprise/2.21/user/rest/reference/pulls#comments", "/en/enterprise/2.21/v3/pulls/comments": "/en/enterprise-server@2.21/rest/reference/pulls#comments",
"/en/enterprise/2.21/v3/pulls": "/en/enterprise/2.21/user/rest/reference/pulls", "/en/enterprise/2.21/v3/pulls": "/en/enterprise-server@2.21/rest/reference/pulls",
"/en/enterprise/2.21/v3/pulls/review_requests": "/en/enterprise/2.21/user/rest/reference/pulls#review-requests", "/en/enterprise/2.21/v3/pulls/review_requests": "/en/enterprise-server@2.21/rest/reference/pulls#review-requests",
"/en/enterprise/2.21/v3/pulls/reviews": "/en/enterprise/2.21/user/rest/reference/pulls#reviews", "/en/enterprise/2.21/v3/pulls/reviews": "/en/enterprise-server@2.21/rest/reference/pulls#reviews",
"/en/enterprise/2.21/v3/rate_limit": "/en/enterprise/2.21/user/rest/reference/rate-limit", "/en/enterprise/2.21/v3/rate_limit": "/en/enterprise-server@2.21/rest/reference/rate-limit",
"/en/enterprise/2.21/v3/reactions": "/en/enterprise/2.21/user/rest/reference/reactions", "/en/enterprise/2.21/v3/reactions": "/en/enterprise-server@2.21/rest/reference/reactions",
"/en/enterprise/2.21/v3/repos/branches": "/en/enterprise/2.21/user/rest/reference/repos#branches", "/en/enterprise/2.21/v3/repos/branches": "/en/enterprise-server@2.21/rest/reference/repos#branches",
"/en/enterprise/2.21/v3/repos/collaborators": "/en/enterprise/2.21/user/rest/reference/repos#collaborators", "/en/enterprise/2.21/v3/repos/collaborators": "/en/enterprise-server@2.21/rest/reference/repos#collaborators",
"/en/enterprise/2.21/v3/repos/comments": "/en/enterprise/2.21/user/rest/reference/repos#comments", "/en/enterprise/2.21/v3/repos/comments": "/en/enterprise-server@2.21/rest/reference/repos#comments",
"/en/enterprise/2.21/v3/repos/commits": "/en/enterprise/2.21/user/rest/reference/repos#commits", "/en/enterprise/2.21/v3/repos/commits": "/en/enterprise-server@2.21/rest/reference/repos#commits",
"/en/enterprise/2.21/v3/repos/contents": "/en/enterprise/2.21/user/rest/reference/repos#contents", "/en/enterprise/2.21/v3/repos/contents": "/en/enterprise-server@2.21/rest/reference/repos#contents",
"/en/enterprise/2.21/v3/repos/deployments": "/en/enterprise/2.21/user/rest/reference/repos#deployments", "/en/enterprise/2.21/v3/repos/deployments": "/en/enterprise-server@2.21/rest/reference/repos#deployments",
"/en/enterprise/2.21/v3/repos/downloads": "/en/enterprise/2.21/user/rest/reference/repos#downloads", "/en/enterprise/2.21/v3/repos/downloads": "/en/enterprise-server@2.21/rest/reference/repos#downloads",
"/en/enterprise/2.21/v3/repos/forks": "/en/enterprise/2.21/user/rest/reference/repos#forks", "/en/enterprise/2.21/v3/repos/forks": "/en/enterprise-server@2.21/rest/reference/repos#forks",
"/en/enterprise/2.21/v3/repos/hooks": "/en/enterprise/2.21/user/rest/reference/repos#hooks", "/en/enterprise/2.21/v3/repos/hooks": "/en/enterprise-server@2.21/rest/reference/repos#hooks",
"/en/enterprise/2.21/v3/repos": "/en/enterprise/2.21/user/rest/reference/repos", "/en/enterprise/2.21/v3/repos": "/en/enterprise-server@2.21/rest/reference/repos",
"/en/enterprise/2.21/v3/repos/invitations": "/en/enterprise/2.21/user/rest/reference/repos#invitations", "/en/enterprise/2.21/v3/repos/invitations": "/en/enterprise-server@2.21/rest/reference/repos#invitations",
"/en/enterprise/2.21/v3/repos/keys": "/en/enterprise/2.21/user/rest/reference/repos#keys", "/en/enterprise/2.21/v3/repos/keys": "/en/enterprise-server@2.21/rest/reference/repos#keys",
"/en/enterprise/2.21/v3/repos/merging": "/en/enterprise/2.21/user/rest/reference/repos#merging", "/en/enterprise/2.21/v3/repos/merging": "/en/enterprise-server@2.21/rest/reference/repos#merging",
"/en/enterprise/2.21/v3/repos/pages": "/en/enterprise/2.21/user/rest/reference/repos#pages", "/en/enterprise/2.21/v3/repos/pages": "/en/enterprise-server@2.21/rest/reference/repos#pages",
"/en/enterprise/2.21/v3/repos/pre_receive_hooks": "/en/enterprise/2.21/user/rest/reference/repos#pre-receive-hooks", "/en/enterprise/2.21/v3/repos/pre_receive_hooks": "/en/enterprise-server@2.21/rest/reference/repos#pre-receive-hooks",
"/en/enterprise/2.21/v3/repos/releases": "/en/enterprise/2.21/user/rest/reference/repos#releases", "/en/enterprise/2.21/v3/repos/releases": "/en/enterprise-server@2.21/rest/reference/repos#releases",
"/en/enterprise/2.21/v3/repos/statistics": "/en/enterprise/2.21/user/rest/reference/repos#statistics", "/en/enterprise/2.21/v3/repos/statistics": "/en/enterprise-server@2.21/rest/reference/repos#statistics",
"/en/enterprise/2.21/v3/repos/statuses": "/en/enterprise/2.21/user/rest/reference/repos#statuses", "/en/enterprise/2.21/v3/repos/statuses": "/en/enterprise-server@2.21/rest/reference/repos#statuses",
"/en/enterprise/2.21/v3/search": "/en/enterprise/2.21/user/rest/reference/search", "/en/enterprise/2.21/v3/search": "/en/enterprise-server@2.21/rest/reference/search",
"/en/enterprise/2.21/v3/teams/discussion_comments": "/en/enterprise/2.21/user/rest/reference/teams#discussion-comments", "/en/enterprise/2.21/v3/teams/discussion_comments": "/en/enterprise-server@2.21/rest/reference/teams#discussion-comments",
"/en/enterprise/2.21/v3/teams/discussions": "/en/enterprise/2.21/user/rest/reference/teams#discussions", "/en/enterprise/2.21/v3/teams/discussions": "/en/enterprise-server@2.21/rest/reference/teams#discussions",
"/en/enterprise/2.21/v3/teams": "/en/enterprise/2.21/user/rest/reference/teams", "/en/enterprise/2.21/v3/teams": "/en/enterprise-server@2.21/rest/reference/teams",
"/en/enterprise/2.21/v3/teams/members": "/en/enterprise/2.21/user/rest/reference/teams#members", "/en/enterprise/2.21/v3/teams/members": "/en/enterprise-server@2.21/rest/reference/teams#members",
"/en/enterprise/2.21/v3/users/administration": "/en/enterprise/2.21/user/rest/reference/users#administration", "/en/enterprise/2.21/v3/users/administration": "/en/enterprise-server@2.21/rest/reference/users#administration",
"/en/enterprise/2.21/v3/users/emails": "/en/enterprise/2.21/user/rest/reference/users#emails", "/en/enterprise/2.21/v3/users/emails": "/en/enterprise-server@2.21/rest/reference/users#emails",
"/en/enterprise/2.21/v3/users/followers": "/en/enterprise/2.21/user/rest/reference/users#followers", "/en/enterprise/2.21/v3/users/followers": "/en/enterprise-server@2.21/rest/reference/users#followers",
"/en/enterprise/2.21/v3/users/gpg_keys": "/en/enterprise/2.21/user/rest/reference/users#gpg-keys", "/en/enterprise/2.21/v3/users/gpg_keys": "/en/enterprise-server@2.21/rest/reference/users#gpg-keys",
"/en/enterprise/2.21/v3/users": "/en/enterprise/2.21/user/rest/reference/users", "/en/enterprise/2.21/v3/users": "/en/enterprise-server@2.21/rest/reference/users",
"/en/enterprise/2.21/v3/users/keys": "/en/enterprise/2.21/user/rest/reference/users#keys", "/en/enterprise/2.21/v3/users/keys": "/en/enterprise-server@2.21/rest/reference/users#keys",
"/v3/actions/artifacts": "/en/rest/reference/actions#artifacts", "/v3/actions/artifacts": "/en/free-pro-team@latest/rest/reference/actions#artifacts",
"/v3/actions": "/en/rest/reference/actions", "/v3/actions": "/en/free-pro-team@latest/rest/reference/actions",
"/v3/actions/secrets": "/en/rest/reference/actions#secrets", "/v3/actions/secrets": "/en/free-pro-team@latest/rest/reference/actions#secrets",
"/v3/actions/self-hosted-runners": "/en/rest/reference/actions#self-hosted-runners", "/v3/actions/self-hosted-runners": "/en/free-pro-team@latest/rest/reference/actions#self-hosted-runners",
"/v3/actions/self_hosted_runners": "/en/rest/reference/actions#self-hosted-runners", "/v3/actions/self_hosted_runners": "/en/free-pro-team@latest/rest/reference/actions#self-hosted-runners",
"/v3/actions/workflow-jobs": "/en/rest/reference/actions#workflow-jobs", "/v3/actions/workflow-jobs": "/en/free-pro-team@latest/rest/reference/actions#workflow-jobs",
"/v3/actions/workflow-runs": "/en/rest/reference/actions#workflow-runs", "/v3/actions/workflow-runs": "/en/free-pro-team@latest/rest/reference/actions#workflow-runs",
"/v3/actions/workflows": "/en/rest/reference/actions#workflows", "/v3/actions/workflows": "/en/free-pro-team@latest/rest/reference/actions#workflows",
"/v3/activity/event_types": "/en/developers/webhooks-and-events/github-event-types", "/v3/activity/event_types": "/en/free-pro-team@latest/developers/webhooks-and-events/github-event-types",
"/v3/activity/events/types": "/en/developers/webhooks-and-events/webhook-events-and-payloads", "/v3/activity/events/types": "/en/free-pro-team@latest/developers/webhooks-and-events/webhook-events-and-payloads",
"/v3/activity/events": "/en/rest/reference/activity#events", "/v3/activity/events": "/en/free-pro-team@latest/rest/reference/activity#events",
"/v3/activity/feeds": "/en/rest/reference/activity#feeds", "/v3/activity/feeds": "/en/free-pro-team@latest/rest/reference/activity#feeds",
"/v3/activity": "/en/rest/reference/activity", "/v3/activity": "/en/free-pro-team@latest/rest/reference/activity",
"/v3/activity/notifications": "/en/rest/reference/activity#notifications", "/v3/activity/notifications": "/en/free-pro-team@latest/rest/reference/activity#notifications",
"/v3/activity/starring": "/en/rest/reference/activity#starring", "/v3/activity/starring": "/en/free-pro-team@latest/rest/reference/activity#starring",
"/v3/activity/watching": "/en/rest/reference/activity#watching", "/v3/activity/watching": "/en/free-pro-team@latest/rest/reference/activity#watching",
"/v3/apps/available-endpoints": "/en/rest/overview/endpoints-available-for-github-apps", "/v3/apps/available-endpoints": "/en/free-pro-team@latest/rest/overview/endpoints-available-for-github-apps",
"/v3/apps": "/en/rest/reference/apps", "/v3/apps": "/en/free-pro-team@latest/rest/reference/apps",
"/v3/apps/installations": "/en/rest/reference/apps#installations", "/v3/apps/installations": "/en/free-pro-team@latest/rest/reference/apps#installations",
"/v3/apps/marketplace": "/en/rest/reference/apps#marketplace", "/v3/apps/marketplace": "/en/free-pro-team@latest/rest/reference/apps#marketplace",
"/v3/apps/oauth_applications": "/en/rest/reference/apps#oauth-applications", "/v3/apps/oauth_applications": "/en/free-pro-team@latest/rest/reference/apps#oauth-applications",
"/v3/apps/permissions": "/en/rest/reference/permissions-required-for-github-apps", "/v3/apps/permissions": "/en/free-pro-team@latest/rest/reference/permissions-required-for-github-apps",
"/v3/checks": "/en/rest/reference/checks", "/v3/checks": "/en/free-pro-team@latest/rest/reference/checks",
"/v3/checks/runs": "/en/rest/reference/checks#runs", "/v3/checks/runs": "/en/free-pro-team@latest/rest/reference/checks#runs",
"/v3/checks/suites": "/en/rest/reference/checks#suites", "/v3/checks/suites": "/en/free-pro-team@latest/rest/reference/checks#suites",
"/v3/code-scanning": "/en/rest/reference/code-scanning", "/v3/code-scanning": "/en/free-pro-team@latest/rest/reference/code-scanning",
"/v3/codes_of_conduct": "/en/rest/reference/codes-of-conduct", "/v3/codes_of_conduct": "/en/free-pro-team@latest/rest/reference/codes-of-conduct",
"/v3/emojis": "/en/rest/reference/emojis", "/v3/emojis": "/en/free-pro-team@latest/rest/reference/emojis",
"/v3/enterprise-admin": "/en/rest/reference/enterprise-admin", "/v3/enterprise-admin": "/en/free-pro-team@latest/rest/reference/enterprise-admin",
"/v3/enterprise-admin/admin_stats": "/en/enterprise/user/rest/reference/enterprise-admin#admin-stats", "/v3/enterprise-admin/admin_stats": "/en/enterprise-server/rest/reference/enterprise-admin#admin-stats",
"/v3/enterprise-admin/global_webhooks": "/en/enterprise/user/rest/reference/enterprise-admin#global-webhooks", "/v3/enterprise-admin/global_webhooks": "/en/enterprise-server/rest/reference/enterprise-admin#global-webhooks",
"/v3/enterprise-admin/ldap": "/en/enterprise/user/rest/reference/enterprise-admin#ldap", "/v3/enterprise-admin/ldap": "/en/enterprise-server/rest/reference/enterprise-admin#ldap",
"/v3/enterprise-admin/license": "/en/enterprise/user/rest/reference/enterprise-admin#license", "/v3/enterprise-admin/license": "/en/enterprise-server/rest/reference/enterprise-admin#license",
"/v3/enterprise-admin/management_console": "/en/enterprise/user/rest/reference/enterprise-admin#management-console", "/v3/enterprise-admin/management_console": "/en/enterprise-server/rest/reference/enterprise-admin#management-console",
"/v3/enterprise-admin/orgs": "/en/enterprise/user/rest/reference/enterprise-admin#orgs", "/v3/enterprise-admin/orgs": "/en/enterprise-server/rest/reference/enterprise-admin#orgs",
"/v3/enterprise-admin/pre_receive_environments": "/en/enterprise/user/rest/reference/enterprise-admin#pre-receive-environments", "/v3/enterprise-admin/pre_receive_environments": "/en/enterprise-server/rest/reference/enterprise-admin#pre-receive-environments",
"/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise/user/rest/reference/enterprise-admin#pre-receive-hooks", "/v3/enterprise-admin/pre_receive_hooks": "/en/enterprise-server/rest/reference/enterprise-admin#pre-receive-hooks",
"/v3/enterprise-admin/search_indexing": "/en/enterprise/user/rest/reference/enterprise-admin#search-indexing", "/v3/enterprise-admin/search_indexing": "/en/enterprise-server/rest/reference/enterprise-admin#search-indexing",
"/v3/enterprise-admin/users": "/en/enterprise/user/rest/reference/enterprise-admin#users", "/v3/enterprise-admin/users": "/en/enterprise-server/rest/reference/enterprise-admin#users",
"/v3/gists/comments": "/en/rest/reference/gists#comments", "/v3/gists/comments": "/en/free-pro-team@latest/rest/reference/gists#comments",
"/v3/gists": "/en/rest/reference/gists", "/v3/gists": "/en/free-pro-team@latest/rest/reference/gists",
"/v3/git/blobs": "/en/rest/reference/git#blobs", "/v3/git/blobs": "/en/free-pro-team@latest/rest/reference/git#blobs",
"/v3/git/commits": "/en/rest/reference/git#commits", "/v3/git/commits": "/en/free-pro-team@latest/rest/reference/git#commits",
"/v3/git": "/en/rest/reference/git", "/v3/git": "/en/free-pro-team@latest/rest/reference/git",
"/v3/git/refs": "/en/rest/reference/git#refs", "/v3/git/refs": "/en/free-pro-team@latest/rest/reference/git#refs",
"/v3/git/tags": "/en/rest/reference/git#tags", "/v3/git/tags": "/en/free-pro-team@latest/rest/reference/git#tags",
"/v3/git/trees": "/en/rest/reference/git#trees", "/v3/git/trees": "/en/free-pro-team@latest/rest/reference/git#trees",
"/v3/gitignore": "/en/rest/reference/gitignore", "/v3/gitignore": "/en/free-pro-team@latest/rest/reference/gitignore",
"/v3/interactions": "/en/rest/reference/interactions", "/v3/interactions": "/en/free-pro-team@latest/rest/reference/interactions",
"/v3/interactions/orgs": "/en/rest/reference/interactions#orgs", "/v3/interactions/orgs": "/en/free-pro-team@latest/rest/reference/interactions#orgs",
"/v3/interactions/repos": "/en/rest/reference/interactions#repos", "/v3/interactions/repos": "/en/free-pro-team@latest/rest/reference/interactions#repos",
"/v3/issues/assignees": "/en/rest/reference/issues#assignees", "/v3/issues/assignees": "/en/free-pro-team@latest/rest/reference/issues#assignees",
"/v3/issues/comments": "/en/rest/reference/issues#comments", "/v3/issues/comments": "/en/free-pro-team@latest/rest/reference/issues#comments",
"/v3/issues/events": "/en/rest/reference/issues#events", "/v3/issues/events": "/en/free-pro-team@latest/rest/reference/issues#events",
"/v3/issues": "/en/rest/reference/issues", "/v3/issues": "/en/free-pro-team@latest/rest/reference/issues",
"/v3/issues/issue-event-types": "/en/developers/webhooks-and-events/issue-event-types", "/v3/issues/issue-event-types": "/en/free-pro-team@latest/developers/webhooks-and-events/issue-event-types",
"/v3/issues/labels": "/en/rest/reference/issues#labels", "/v3/issues/labels": "/en/free-pro-team@latest/rest/reference/issues#labels",
"/v3/issues/milestones": "/en/rest/reference/issues#milestones", "/v3/issues/milestones": "/en/free-pro-team@latest/rest/reference/issues#milestones",
"/v3/issues/timeline": "/en/rest/reference/issues#timeline", "/v3/issues/timeline": "/en/free-pro-team@latest/rest/reference/issues#timeline",
"/v3/licenses": "/en/rest/reference/licenses", "/v3/licenses": "/en/free-pro-team@latest/rest/reference/licenses",
"/v3/markdown": "/en/rest/reference/markdown", "/v3/markdown": "/en/free-pro-team@latest/rest/reference/markdown",
"/v3/meta": "/en/rest/reference/meta", "/v3/meta": "/en/free-pro-team@latest/rest/reference/meta",
"/v3/migrations": "/en/rest/reference/migrations", "/v3/migrations": "/en/free-pro-team@latest/rest/reference/migrations",
"/v3/migrations/orgs": "/en/rest/reference/migrations#orgs", "/v3/migrations/orgs": "/en/free-pro-team@latest/rest/reference/migrations#orgs",
"/v3/migrations/source_imports": "/en/rest/reference/migrations#source-imports", "/v3/migrations/source_imports": "/en/free-pro-team@latest/rest/reference/migrations#source-imports",
"/v3/migrations/users": "/en/rest/reference/migrations#users", "/v3/migrations/users": "/en/free-pro-team@latest/rest/reference/migrations#users",
"/v3/oauth_authorizations": "/en/rest/reference/oauth-authorizations", "/v3/oauth_authorizations": "/en/free-pro-team@latest/rest/reference/oauth-authorizations",
"/v3/orgs/blocking": "/en/rest/reference/orgs#blocking", "/v3/orgs/blocking": "/en/free-pro-team@latest/rest/reference/orgs#blocking",
"/v3/orgs/hooks": "/en/rest/reference/orgs#hooks", "/v3/orgs/hooks": "/en/free-pro-team@latest/rest/reference/orgs#hooks",
"/v3/orgs": "/en/rest/reference/orgs", "/v3/orgs": "/en/free-pro-team@latest/rest/reference/orgs",
"/v3/orgs/members": "/en/rest/reference/orgs#members", "/v3/orgs/members": "/en/free-pro-team@latest/rest/reference/orgs#members",
"/v3/orgs/migrations": "/en/rest/reference/orgs#migrations", "/v3/orgs/migrations": "/en/free-pro-team@latest/rest/reference/orgs#migrations",
"/v3/orgs/outside_collaborators": "/en/rest/reference/orgs#outside-collaborators", "/v3/orgs/outside_collaborators": "/en/free-pro-team@latest/rest/reference/orgs#outside-collaborators",
"/v3/orgs/pre_receive_hooks": "/en/enterprise/user/rest/reference/enterprise-admin#organization-pre-receive-hooks", "/v3/orgs/pre_receive_hooks": "/en/enterprise-server/rest/reference/enterprise-admin#organization-pre-receive-hooks",
"/v3/orgs/teams": "/en/rest/reference/orgs#teams", "/v3/orgs/teams": "/en/free-pro-team@latest/rest/reference/orgs#teams",
"/v3/projects/cards": "/en/rest/reference/projects#cards", "/v3/projects/cards": "/en/free-pro-team@latest/rest/reference/projects#cards",
"/v3/projects/collaborators": "/en/rest/reference/projects#collaborators", "/v3/projects/collaborators": "/en/free-pro-team@latest/rest/reference/projects#collaborators",
"/v3/projects/columns": "/en/rest/reference/projects#columns", "/v3/projects/columns": "/en/free-pro-team@latest/rest/reference/projects#columns",
"/v3/projects": "/en/rest/reference/projects", "/v3/projects": "/en/free-pro-team@latest/rest/reference/projects",
"/v3/pulls/comments": "/en/rest/reference/pulls#comments", "/v3/pulls/comments": "/en/free-pro-team@latest/rest/reference/pulls#comments",
"/v3/pulls": "/en/rest/reference/pulls", "/v3/pulls": "/en/free-pro-team@latest/rest/reference/pulls",
"/v3/pulls/review_requests": "/en/rest/reference/pulls#review-requests", "/v3/pulls/review_requests": "/en/free-pro-team@latest/rest/reference/pulls#review-requests",
"/v3/pulls/reviews": "/en/rest/reference/pulls#reviews", "/v3/pulls/reviews": "/en/free-pro-team@latest/rest/reference/pulls#reviews",
"/v3/rate_limit": "/en/rest/reference/rate-limit", "/v3/rate_limit": "/en/free-pro-team@latest/rest/reference/rate-limit",
"/v3/reactions": "/en/rest/reference/reactions", "/v3/reactions": "/en/free-pro-team@latest/rest/reference/reactions",
"/v3/repos/branches": "/en/rest/reference/repos#branches", "/v3/repos/branches": "/en/free-pro-team@latest/rest/reference/repos#branches",
"/v3/repos/collaborators": "/en/rest/reference/repos#collaborators", "/v3/repos/collaborators": "/en/free-pro-team@latest/rest/reference/repos#collaborators",
"/v3/repos/comments": "/en/rest/reference/repos#comments", "/v3/repos/comments": "/en/free-pro-team@latest/rest/reference/repos#comments",
"/v3/repos/commits": "/en/rest/reference/repos#commits", "/v3/repos/commits": "/en/free-pro-team@latest/rest/reference/repos#commits",
"/v3/repos/community": "/en/rest/reference/repos#community", "/v3/repos/community": "/en/free-pro-team@latest/rest/reference/repos#community",
"/v3/repos/contents": "/en/rest/reference/repos#contents", "/v3/repos/contents": "/en/free-pro-team@latest/rest/reference/repos#contents",
"/v3/repos/deployments": "/en/rest/reference/repos#deployments", "/v3/repos/deployments": "/en/free-pro-team@latest/rest/reference/repos#deployments",
"/v3/repos/downloads": "/en/rest/reference/repos#downloads", "/v3/repos/downloads": "/en/free-pro-team@latest/rest/reference/repos#downloads",
"/v3/repos/forks": "/en/rest/reference/repos#forks", "/v3/repos/forks": "/en/free-pro-team@latest/rest/reference/repos#forks",
"/v3/repos/hooks": "/en/rest/reference/repos#hooks", "/v3/repos/hooks": "/en/free-pro-team@latest/rest/reference/repos#hooks",
"/v3/repos": "/en/rest/reference/repos", "/v3/repos": "/en/free-pro-team@latest/rest/reference/repos",
"/v3/repos/invitations": "/en/rest/reference/repos#invitations", "/v3/repos/invitations": "/en/free-pro-team@latest/rest/reference/repos#invitations",
"/v3/repos/keys": "/en/rest/reference/repos#keys", "/v3/repos/keys": "/en/free-pro-team@latest/rest/reference/repos#keys",
"/v3/repos/merging": "/en/rest/reference/repos#merging", "/v3/repos/merging": "/en/free-pro-team@latest/rest/reference/repos#merging",
"/v3/repos/pages": "/en/rest/reference/repos#pages", "/v3/repos/pages": "/en/free-pro-team@latest/rest/reference/repos#pages",
"/v3/repos/pre_receive_hooks": "/en/rest/reference/repos#pre-receive-hooks", "/v3/repos/pre_receive_hooks": "/en/free-pro-team@latest/rest/reference/repos#pre-receive-hooks",
"/v3/repos/releases": "/en/rest/reference/repos#releases", "/v3/repos/releases": "/en/free-pro-team@latest/rest/reference/repos#releases",
"/v3/repos/statistics": "/en/rest/reference/repos#statistics", "/v3/repos/statistics": "/en/free-pro-team@latest/rest/reference/repos#statistics",
"/v3/repos/statuses": "/en/rest/reference/repos#statuses", "/v3/repos/statuses": "/en/free-pro-team@latest/rest/reference/repos#statuses",
"/v3/repos/traffic": "/en/rest/reference/repos#traffic", "/v3/repos/traffic": "/en/free-pro-team@latest/rest/reference/repos#traffic",
"/v3/scim": "/en/rest/reference/scim", "/v3/scim": "/en/free-pro-team@latest/rest/reference/scim",
"/v3/search": "/en/rest/reference/search", "/v3/search": "/en/free-pro-team@latest/rest/reference/search",
"/v3/teams/discussion_comments": "/en/rest/reference/teams#discussion-comments", "/v3/teams/discussion_comments": "/en/free-pro-team@latest/rest/reference/teams#discussion-comments",
"/v3/teams/discussions": "/en/rest/reference/teams#discussions", "/v3/teams/discussions": "/en/free-pro-team@latest/rest/reference/teams#discussions",
"/v3/teams": "/en/rest/reference/teams", "/v3/teams": "/en/free-pro-team@latest/rest/reference/teams",
"/v3/teams/members": "/en/rest/reference/teams#members", "/v3/teams/members": "/en/free-pro-team@latest/rest/reference/teams#members",
"/v3/teams/team_sync": "/en/rest/reference/teams#team-sync", "/v3/teams/team_sync": "/en/free-pro-team@latest/rest/reference/teams#team-sync",
"/v3/users/blocking": "/en/rest/reference/users#blocking", "/v3/users/blocking": "/en/free-pro-team@latest/rest/reference/users#blocking",
"/v3/users/emails": "/en/rest/reference/users#emails", "/v3/users/emails": "/en/free-pro-team@latest/rest/reference/users#emails",
"/v3/users/followers": "/en/rest/reference/users#followers", "/v3/users/followers": "/en/free-pro-team@latest/rest/reference/users#followers",
"/v3/users/gpg_keys": "/en/rest/reference/users#gpg-keys", "/v3/users/gpg_keys": "/en/free-pro-team@latest/rest/reference/users#gpg-keys",
"/v3/users": "/en/rest/reference/users", "/v3/users": "/en/free-pro-team@latest/rest/reference/users",
"/v3/users/keys": "/en/rest/reference/users#keys" "/v3/users/keys": "/en/free-pro-team@latest/rest/reference/users#keys"
} }

View File

@@ -1,5 +1,6 @@
--- ---
title: A sample article title: A sample article
productVersions: versions:
dotcom: '*' free-pro-team: '*'
--- ---

View File

@@ -1,7 +1,7 @@
--- ---
title: A sample TOC title: A sample TOC
productVersions: versions:
dotcom: '*' free-pro-team: '*'
--- ---
{% link_in_list /sample-article %} {% link_in_list /sample-article %}

View File

@@ -1,7 +1,7 @@
--- ---
title: Translated TOC title: Translated TOC
productVersions: versions:
dotcom: '*' free-pro-team: '*'
--- ---
### 目次 ### 目次

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const flat = require('flat') const flat = require('flat')
const { last } = require('lodash') const { last } = require('lodash')
const cheerio = require('cheerio') const cheerio = require('cheerio')
@@ -58,9 +57,7 @@ describe('page rendering', () => {
const brokenLinksPerPage = {} const brokenLinksPerPage = {}
// get an array of the pages product versions // get an array of the pages product versions
const pageVersions = process.env.FEATURE_NEW_VERSIONS const pageVersions = getApplicableVersions(page.versions, page.relativePath)
? getApplicableVersions(page.versions, page.relativePath)
: getApplicableVersions(page.productVersions, page.relativePath)
for (const pageVersion of pageVersions) { for (const pageVersion of pageVersions) {
// attach page-specific properties to context // attach page-specific properties to context
@@ -70,9 +67,7 @@ describe('page rendering', () => {
const relevantPermalink = page.permalinks.find(permalink => permalink.pageVersion === pageVersion) const relevantPermalink = page.permalinks.find(permalink => permalink.pageVersion === pageVersion)
const currentOldVersion = process.env.FEATURE_NEW_VERSIONS const currentOldVersion = getOldVersionFromNewVersion(pageVersion)
? getOldVersionFromNewVersion(pageVersion)
: pageVersion
// borrowed from middleware/contextualizers/graphql.js // borrowed from middleware/contextualizers/graphql.js
context.graphql = { context.graphql = {

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const cheerio = require('cheerio') const cheerio = require('cheerio')
const loadPages = require('../../lib/pages') const loadPages = require('../../lib/pages')
const loadSiteData = require('../../lib/site-data') const loadSiteData = require('../../lib/site-data')
@@ -50,9 +49,7 @@ describe('page rendering', () => {
const brokenLinksPerPage = {} const brokenLinksPerPage = {}
// get an array of the pages product versions // get an array of the pages product versions
const pageVersions = process.env.FEATURE_NEW_VERSIONS const pageVersions = getApplicableVersions(page.versions, page.relativePath)
? getApplicableVersions(page.versions, page.relativePath)
: getApplicableVersions(page.productVersions, page.relativePath)
for (const pageVersion of pageVersions) { for (const pageVersion of pageVersions) {
// attach page-specific properties to context // attach page-specific properties to context

View File

@@ -1,9 +1,6 @@
const { getDOM, getJSON } = require('../helpers') const { getDOM, getJSON } = require('../helpers')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
describe('breadcrumbs', () => { describe('breadcrumbs', () => {
jest.setTimeout(300 * 1000) jest.setTimeout(300 * 1000)
@@ -24,7 +21,7 @@ describe('breadcrumbs', () => {
expect($breadcrumbs.eq(3).attr('title')).toBe('article: Supported browsers') expect($breadcrumbs.eq(3).attr('title')).toBe('article: Supported browsers')
}) })
testFeatureNewVersions('maptopic pages include their own grayed-out breadcrumb', async () => { test('maptopic pages include their own grayed-out breadcrumb', async () => {
const $ = await getDOM('/github/getting-started-with-github/using-github') const $ = await getDOM('/github/getting-started-with-github/using-github')
const $breadcrumbs = $('.breadcrumbs a') const $breadcrumbs = $('.breadcrumbs a')
@@ -35,18 +32,7 @@ describe('breadcrumbs', () => {
expect($breadcrumbs.eq(2).hasClass('text-gray-light')).toBe(true) expect($breadcrumbs.eq(2).hasClass('text-gray-light')).toBe(true)
}) })
testFeatureOldVersions('maptopic pages include their own grayed-out breadcrumb', async () => { test('works for enterprise user pages', async () => {
const $ = await getDOM('/github/getting-started-with-github/using-github')
const $breadcrumbs = $('.breadcrumbs a')
expect($breadcrumbs).toHaveLength(3)
expect($breadcrumbs.eq(0).attr('title')).toBe('product: GitHub.com')
expect($breadcrumbs.eq(1).attr('title')).toBe('category: Getting started')
expect($breadcrumbs.eq(2).attr('title')).toBe('maptopic: Using GitHub')
expect($breadcrumbs.eq(2).hasClass('text-gray-light')).toBe(true)
})
testFeatureNewVersions('works for enterprise user pages', async () => {
const $ = await getDOM('/en/enterprise/user/github/getting-started-with-github/supported-browsers') const $ = await getDOM('/en/enterprise/user/github/getting-started-with-github/supported-browsers')
const $breadcrumbs = $('.breadcrumbs a') const $breadcrumbs = $('.breadcrumbs a')
expect($breadcrumbs).toHaveLength(4) expect($breadcrumbs).toHaveLength(4)
@@ -54,13 +40,6 @@ describe('breadcrumbs', () => {
expect($breadcrumbs.eq(0).attr('title')).toBe('product: GitHub.com') expect($breadcrumbs.eq(0).attr('title')).toBe('product: GitHub.com')
}) })
testFeatureOldVersions('works for enterprise user pages', async () => {
const $ = await getDOM('/en/enterprise/user/github/getting-started-with-github/supported-browsers')
const $breadcrumbs = $('.breadcrumbs a')
expect($breadcrumbs).toHaveLength(4)
expect($breadcrumbs.eq(0).attr('title')).toBe('product: GitHub Enterprise Server')
})
test('parses Liquid variables inside titles', async () => { test('parses Liquid variables inside titles', async () => {
const $ = await getDOM('/en/enterprise/admin/enterprise-support') const $ = await getDOM('/en/enterprise/admin/enterprise-support')
const $breadcrumbs = $('.breadcrumbs a') const $breadcrumbs = $('.breadcrumbs a')
@@ -68,33 +47,21 @@ describe('breadcrumbs', () => {
expect($breadcrumbs.eq(1).attr('title')).toBe('category: Working with GitHub Support') expect($breadcrumbs.eq(1).attr('title')).toBe('category: Working with GitHub Support')
}) })
testFeatureNewVersions('English breadcrumbs link to English pages', async () => { test('English breadcrumbs link to English pages', async () => {
const $ = await getDOM('/en/github/getting-started-with-github') const $ = await getDOM('/en/github/getting-started-with-github')
const $breadcrumbs = $('.breadcrumbs a') const $breadcrumbs = $('.breadcrumbs a')
expect($breadcrumbs.eq(0).attr('href')).toBe(`/en/${nonEnterpriseDefaultVersion}/github`) expect($breadcrumbs.eq(0).attr('href')).toBe(`/en/${nonEnterpriseDefaultVersion}/github`)
}) })
testFeatureOldVersions('English breadcrumbs link to English pages', async () => { test('localized breadcrumbs link to localize pages', async () => {
const $ = await getDOM('/en/github/getting-started-with-github')
const $breadcrumbs = $('.breadcrumbs a')
expect($breadcrumbs.eq(0).attr('href')).toBe('/en/github')
})
testFeatureNewVersions('localized breadcrumbs link to localize pages', async () => {
const $ = await getDOM('/ja/github/getting-started-with-github') const $ = await getDOM('/ja/github/getting-started-with-github')
const $breadcrumbs = $('.breadcrumbs a') const $breadcrumbs = $('.breadcrumbs a')
expect($breadcrumbs.eq(0).attr('href')).toBe(`/ja/${nonEnterpriseDefaultVersion}/github`) expect($breadcrumbs.eq(0).attr('href')).toBe(`/ja/${nonEnterpriseDefaultVersion}/github`)
}) })
testFeatureOldVersions('localized breadcrumbs link to localize pages', async () => {
const $ = await getDOM('/ja/github/getting-started-with-github')
const $breadcrumbs = $('.breadcrumbs a')
expect($breadcrumbs.eq(0).attr('href')).toBe('/ja/github')
})
}) })
describe('context.breadcrumbs object', () => { describe('context.breadcrumbs object', () => {
testFeatureNewVersions('works on product index pages', async () => { test('works on product index pages', async () => {
const breadcrumbs = await getJSON('/en/github?json=breadcrumbs') const breadcrumbs = await getJSON('/en/github?json=breadcrumbs')
const expected = { const expected = {
product: { product: {
@@ -105,18 +72,7 @@ describe('breadcrumbs', () => {
expect(breadcrumbs).toEqual(expected) expect(breadcrumbs).toEqual(expected)
}) })
testFeatureOldVersions('works on product index pages', async () => { test('works on category index pages', async () => {
const breadcrumbs = await getJSON('/en/github?json=breadcrumbs')
const expected = {
product: {
href: '/github',
title: 'GitHub.com'
}
}
expect(breadcrumbs).toEqual(expected)
})
testFeatureNewVersions('works on category index pages', async () => {
const breadcrumbs = await getJSON('/en/github/authenticating-to-github?json=breadcrumbs') const breadcrumbs = await getJSON('/en/github/authenticating-to-github?json=breadcrumbs')
const expected = { const expected = {
product: { product: {
@@ -131,22 +87,7 @@ describe('breadcrumbs', () => {
expect(breadcrumbs).toEqual(expected) expect(breadcrumbs).toEqual(expected)
}) })
testFeatureOldVersions('works on category index pages', async () => { test('works on maptopic pages', async () => {
const breadcrumbs = await getJSON('/en/github/authenticating-to-github?json=breadcrumbs')
const expected = {
product: {
href: '/github',
title: 'GitHub.com'
},
category: {
href: '/github/authenticating-to-github',
title: 'Authentication'
}
}
expect(breadcrumbs).toEqual(expected)
})
testFeatureNewVersions('works on maptopic pages', async () => {
const breadcrumbs = await getJSON('/en/github/authenticating-to-github/keeping-your-account-and-data-secure?json=breadcrumbs') const breadcrumbs = await getJSON('/en/github/authenticating-to-github/keeping-your-account-and-data-secure?json=breadcrumbs')
const expected = { const expected = {
product: { product: {
@@ -165,26 +106,7 @@ describe('breadcrumbs', () => {
expect(breadcrumbs).toEqual(expected) expect(breadcrumbs).toEqual(expected)
}) })
testFeatureOldVersions('works on maptopic pages', async () => { test('works on articles that DO have maptopics ', async () => {
const breadcrumbs = await getJSON('/en/github/authenticating-to-github/keeping-your-account-and-data-secure?json=breadcrumbs')
const expected = {
product: {
href: '/github',
title: 'GitHub.com'
},
category: {
href: '/github/authenticating-to-github',
title: 'Authentication'
},
maptopic: {
href: '/github/authenticating-to-github/keeping-your-account-and-data-secure',
title: 'Keeping your account and data secure'
}
}
expect(breadcrumbs).toEqual(expected)
})
testFeatureNewVersions('works on articles that DO have maptopics ', async () => {
const breadcrumbs = await getJSON('/en/github/authenticating-to-github/creating-a-strong-password?json=breadcrumbs') const breadcrumbs = await getJSON('/en/github/authenticating-to-github/creating-a-strong-password?json=breadcrumbs')
const expected = { const expected = {
product: { product: {
@@ -207,30 +129,7 @@ describe('breadcrumbs', () => {
expect(breadcrumbs).toEqual(expected) expect(breadcrumbs).toEqual(expected)
}) })
testFeatureOldVersions('works on articles that DO have maptopics ', async () => { test('works on articles that DO NOT have maptopics ', async () => {
const breadcrumbs = await getJSON('/en/github/authenticating-to-github/creating-a-strong-password?json=breadcrumbs')
const expected = {
product: {
href: '/github',
title: 'GitHub.com'
},
category: {
href: '/github/authenticating-to-github',
title: 'Authentication'
},
maptopic: {
href: '/github/authenticating-to-github/keeping-your-account-and-data-secure',
title: 'Keeping your account and data secure'
},
article: {
href: '/github/authenticating-to-github/creating-a-strong-password',
title: 'Creating a strong password'
}
}
expect(breadcrumbs).toEqual(expected)
})
testFeatureNewVersions('works on articles that DO NOT have maptopics ', async () => {
const breadcrumbs = await getJSON('/github/site-policy/github-privacy-statement?json=breadcrumbs') const breadcrumbs = await getJSON('/github/site-policy/github-privacy-statement?json=breadcrumbs')
const expected = { const expected = {
product: { product: {
@@ -249,25 +148,6 @@ describe('breadcrumbs', () => {
expect(breadcrumbs).toEqual(expected) expect(breadcrumbs).toEqual(expected)
}) })
testFeatureOldVersions('works on articles that DO NOT have maptopics ', async () => {
const breadcrumbs = await getJSON('/github/site-policy/github-privacy-statement?json=breadcrumbs')
const expected = {
product: {
href: '/github',
title: 'GitHub.com'
},
category: {
href: '/github/site-policy',
title: 'Site policy'
},
article: {
href: '/github/site-policy/github-privacy-statement',
title: 'GitHub Privacy Statement'
}
}
expect(breadcrumbs).toEqual(expected)
})
test('returns an empty object on the landing page', async () => { test('returns an empty object on the landing page', async () => {
const breadcrumbs = await getJSON('/en?json=breadcrumbs') const breadcrumbs = await getJSON('/en?json=breadcrumbs')
expect(breadcrumbs).toEqual({}) expect(breadcrumbs).toEqual({})

View File

@@ -1,11 +1,7 @@
require('../../lib/feature-flags')
const { getDOM } = require('../helpers') const { getDOM } = require('../helpers')
const { oldestSupported, latest } = require('../../lib/enterprise-server-releases') const { oldestSupported, latest } = require('../../lib/enterprise-server-releases')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
describe('header', () => { describe('header', () => {
jest.setTimeout(5 * 60 * 1000) jest.setTimeout(5 * 60 * 1000)
@@ -24,16 +20,11 @@ describe('header', () => {
}) })
describe('language links', () => { describe('language links', () => {
testFeatureNewVersions('lead to the same page in a different language', async () => { test('lead to the same page in a different language', async () => {
const $ = await getDOM('/en/github/administering-a-repository/enabling-required-status-checks') const $ = await getDOM('/en/github/administering-a-repository/enabling-required-status-checks')
expect($(`#languages-selector a[href="/ja/${nonEnterpriseDefaultVersion}/github/administering-a-repository/enabling-required-status-checks"]`).length).toBe(1) expect($(`#languages-selector a[href="/ja/${nonEnterpriseDefaultVersion}/github/administering-a-repository/enabling-required-status-checks"]`).length).toBe(1)
}) })
testFeatureOldVersions('lead to the same page in a different language', async () => {
const $ = await getDOM('/en/github/administering-a-repository/enabling-required-status-checks')
expect($('#languages-selector a[href="/ja/github/administering-a-repository/enabling-required-status-checks"]').length).toBe(1)
})
test('display the native name and the English name for each translated language', async () => { test('display the native name and the English name for each translated language', async () => {
const $ = await getDOM('/en') const $ = await getDOM('/en')
expect($('#languages-selector a[href="/en"]').text().trim()).toBe('English') expect($('#languages-selector a[href="/en"]').text().trim()).toBe('English')
@@ -76,7 +67,7 @@ describe('header', () => {
}) })
describe('mobile-only product dropdown links', () => { describe('mobile-only product dropdown links', () => {
testFeatureNewVersions('include github and admin, and emphasize the current product', async () => { test('include github and admin, and emphasize the current product', async () => {
const $ = await getDOM('/en/articles/enabling-required-status-checks') const $ = await getDOM('/en/articles/enabling-required-status-checks')
const github = $(`#homepages a.active[href="/en/${nonEnterpriseDefaultVersion}/github"]`) const github = $(`#homepages a.active[href="/en/${nonEnterpriseDefaultVersion}/github"]`)
@@ -90,46 +81,18 @@ describe('header', () => {
expect(ghe.attr('class').includes('active')).toBe(false) expect(ghe.attr('class').includes('active')).toBe(false)
}) })
testFeatureOldVersions('include dotcom and enterprise homepage, and emphasize the current product', async () => { test('point to homepages in the current page\'s language', async () => {
const $ = await getDOM('/en/articles/enabling-required-status-checks')
const dotcom = $('#homepages a.active[href="/en/github"]')
expect(dotcom.length).toBe(1)
expect(dotcom.text().trim()).toBe('GitHub.com')
expect(dotcom.attr('class').includes('active')).toBe(true)
const ghe = $('#homepages a[href="/en/enterprise/admin"]')
expect(ghe.length).toBe(1)
expect(ghe.text().trim()).toBe('Enterprise Server')
expect(ghe.attr('class').includes('active')).toBe(false)
})
testFeatureNewVersions('point to homepages in the current page\'s language', async () => {
const $ = await getDOM('/ja/articles/enabling-required-status-checks') const $ = await getDOM('/ja/articles/enabling-required-status-checks')
expect($(`#homepages a.active[href="/ja/${nonEnterpriseDefaultVersion}/github"]`).length).toBe(1) expect($(`#homepages a.active[href="/ja/${nonEnterpriseDefaultVersion}/github"]`).length).toBe(1)
expect($(`#homepages a[href="/ja/enterprise-server@${latest}/admin"]`).length).toBe(1) expect($(`#homepages a[href="/ja/enterprise-server@${latest}/admin"]`).length).toBe(1)
}) })
testFeatureOldVersions('point to homepages in the current page\'s language', async () => { test('emphasizes the product that corresponds to the current page', async () => {
const $ = await getDOM('/ja/articles/enabling-required-status-checks')
expect($('#homepages a.active[href="/ja/github"]').length).toBe(1)
expect($('#homepages a[href="/ja/enterprise/admin"]').length).toBe(1)
})
testFeatureNewVersions('emphasizes the product that corresponds to the current page', async () => {
const $ = await getDOM(`/en/enterprise/${oldestSupported}/user/github/setting-up-and-managing-your-github-user-account/setting-your-commit-email-address`) const $ = await getDOM(`/en/enterprise/${oldestSupported}/user/github/setting-up-and-managing-your-github-user-account/setting-your-commit-email-address`)
expect($(`#homepages a.active[href="/en/enterprise-server@${latest}/admin"]`).length).toBe(0) expect($(`#homepages a.active[href="/en/enterprise-server@${latest}/admin"]`).length).toBe(0)
expect($(`#homepages a[href="/en/${nonEnterpriseDefaultVersion}/github"]`).length).toBe(1) expect($(`#homepages a[href="/en/${nonEnterpriseDefaultVersion}/github"]`).length).toBe(1)
expect($(`#homepages a.active[href="/en/${nonEnterpriseDefaultVersion}/github"]`).length).toBe(1) expect($(`#homepages a.active[href="/en/${nonEnterpriseDefaultVersion}/github"]`).length).toBe(1)
}) })
testFeatureOldVersions('emphasizes the product that corresponds to the current page', async () => {
const $ = await getDOM(`/en/enterprise/${oldestSupported}/user/github/setting-up-and-managing-your-github-user-account/setting-your-commit-email-address`)
expect($('#homepages a.active[href="/en/enterprise/admin"]').length).toBe(0)
expect($('#homepages a[href="/en/github"]').length).toBe(1)
expect($('#homepages a.active[href="/en/github"]').length).toBe(1)
})
}) })
}) })

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const renderContent = require('../../lib/render-content') const renderContent = require('../../lib/render-content')
describe('octicon tag', () => { describe('octicon tag', () => {

View File

@@ -1,23 +1,14 @@
require('../../lib/feature-flags')
const enterpriseServerReleases = require('../../lib/enterprise-server-releases') const enterpriseServerReleases = require('../../lib/enterprise-server-releases')
const { getDOM } = require('../helpers') const { getDOM } = require('../helpers')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
describe('page titles', () => { describe('page titles', () => {
jest.setTimeout(300 * 1000) jest.setTimeout(300 * 1000)
testFeatureNewVersions('English homepage', async () => { test('English homepage', async () => {
const $ = await getDOM('/en') const $ = await getDOM('/en')
expect($('title').text()).toBe('GitHub Documentation') expect($('title').text()).toBe('GitHub Documentation')
}) })
testFeatureOldVersions('dotcom English homepage', async () => {
const $ = await getDOM('/en')
expect($('title').text()).toBe('GitHub.com Help Documentation')
})
test('dotcom English article', async () => { test('dotcom English article', async () => {
const $ = await getDOM('/en/articles/authorizing-oauth-apps') const $ = await getDOM('/en/articles/authorizing-oauth-apps')
expect($('title').text()).toBe('Authorizing OAuth Apps - GitHub Docs') expect($('title').text()).toBe('Authorizing OAuth Apps - GitHub Docs')
@@ -38,7 +29,7 @@ describe('page titles', () => {
expect($('title').text()).toBe('Managing large files - GitHub Docs') expect($('title').text()).toBe('Managing large files - GitHub Docs')
}) })
testFeatureNewVersions('dynamically parses liquid in page titles (even on subsequent requests)', async () => { test('dynamically parses liquid in page titles (even on subsequent requests)', async () => {
let $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}`) let $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}`)
expect($('title').text()).toBe('GitHub Enterprise Help Documentation - GitHub Docs') expect($('title').text()).toBe('GitHub Enterprise Help Documentation - GitHub Docs')
@@ -49,20 +40,6 @@ describe('page titles', () => {
expect($('title').text()).toBe('GitHub Enterprise Help Documentation - GitHub Docs') expect($('title').text()).toBe('GitHub Enterprise Help Documentation - GitHub Docs')
}) })
testFeatureOldVersions('dynamically parses liquid in page titles (even on subsequent requests)', async () => {
let $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}`)
expect($('h1').text()).toBe(`Enterprise Server ${enterpriseServerReleases.latest}`)
expect($('title').text()).toBe(`Enterprise Server ${enterpriseServerReleases.latest} - GitHub Docs`)
$ = await getDOM(`/en/enterprise/${enterpriseServerReleases.oldestSupported}`)
expect($('h1').text()).toBe(`Enterprise Server ${enterpriseServerReleases.oldestSupported}`)
expect($('title').text()).toBe(`Enterprise Server ${enterpriseServerReleases.oldestSupported} - GitHub Docs`)
$ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}`)
expect($('h1').text()).toBe(`Enterprise Server ${enterpriseServerReleases.latest}`)
expect($('title').text()).toBe(`Enterprise Server ${enterpriseServerReleases.latest} - GitHub Docs`)
})
// TODO enable this once translated content has synced with the versioning changes // TODO enable this once translated content has synced with the versioning changes
// Note the expected translations may need to be updated, since the English title changed // Note the expected translations may need to be updated, since the English title changed
// from `GitHub.com Help Documentation` to `GitHub Documentation` // from `GitHub.com Help Documentation` to `GitHub Documentation`
@@ -70,9 +47,4 @@ describe('page titles', () => {
expect((await getDOM('/cn'))('title').text()).toBe('GitHub 帮助文档') expect((await getDOM('/cn'))('title').text()).toBe('GitHub 帮助文档')
expect((await getDOM('/ja'))('title').text()).toBe('GitHub ヘルプドキュメント') expect((await getDOM('/ja'))('title').text()).toBe('GitHub ヘルプドキュメント')
}) })
testFeatureOldVersions('displays only the site name on localized homepages', async () => {
expect((await getDOM('/cn'))('title').text()).toBe('GitHub.com 帮助文档')
expect((await getDOM('/ja'))('title').text()).toBe('GitHub.com ヘルプドキュメント')
})
}) })

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const languages = require('../../lib/languages') const languages = require('../../lib/languages')
const robotsParser = require('robots-parser') const robotsParser = require('robots-parser')
const robotsMiddleware = require('../../middleware/robots') const robotsMiddleware = require('../../middleware/robots')

View File

@@ -1,13 +1,9 @@
require('../../lib/feature-flags')
const lodash = require('lodash') const lodash = require('lodash')
const enterpriseServerReleases = require('../../lib/enterprise-server-releases') const enterpriseServerReleases = require('../../lib/enterprise-server-releases')
const { get, getDOM, head } = require('../helpers') const { get, getDOM, head } = require('../helpers')
const path = require('path') const path = require('path')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
describe('server', () => { describe('server', () => {
jest.setTimeout(60 * 1000) jest.setTimeout(60 * 1000)
@@ -235,16 +231,11 @@ describe('server', () => {
expect($.text().includes('{{ page.title }}')).toBe(true) expect($.text().includes('{{ page.title }}')).toBe(true)
}) })
testFeatureNewVersions('displays links to categories on product TOCs', async () => { test('displays links to categories on product TOCs', async () => {
const $ = await getDOM('/en/github') const $ = await getDOM('/en/github')
expect($(`article a[href="/en/${nonEnterpriseDefaultVersion}/github/getting-started-with-github"]`)).toHaveLength(1) expect($(`article a[href="/en/${nonEnterpriseDefaultVersion}/github/getting-started-with-github"]`)).toHaveLength(1)
}) })
testFeatureOldVersions('displays links to categories on product TOCs', async () => {
const $ = await getDOM('/en/github')
expect($('article a[href="/en/github/getting-started-with-github"]')).toHaveLength(1)
})
describe('autogenerated mini TOCs', () => { describe('autogenerated mini TOCs', () => {
// TODO disable the mini TOC tests when we replace it with sticky TOC header // TODO disable the mini TOC tests when we replace it with sticky TOC header
test('renders mini TOC in articles with more than one heading', async () => { test('renders mini TOC in articles with more than one heading', async () => {
@@ -309,103 +300,56 @@ describe('server', () => {
}) })
describe('English local links', () => { describe('English local links', () => {
const latestEnterprisePath = process.env.FEATURE_NEW_VERSIONS const latestEnterprisePath = `/en/enterprise-server@${enterpriseServerReleases.latest}`
? `/en/enterprise-server@${enterpriseServerReleases.latest}`
: `/en/enterprise/${enterpriseServerReleases.latest}`
testFeatureNewVersions('dotcom articles on dotcom have links that include "en"', async () => { test('dotcom articles on dotcom have links that include "en"', async () => {
const $ = await getDOM('/en/articles/set-up-git') const $ = await getDOM('/en/articles/set-up-git')
expect($(`a[href="/en/${nonEnterpriseDefaultVersion}/articles/managing-files-on-github"]`).length).toBe(1) expect($(`a[href="/en/${nonEnterpriseDefaultVersion}/articles/managing-files-on-github"]`).length).toBe(1)
}) })
testFeatureOldVersions('dotcom articles on dotcom have links that include "en"', async () => { test('dotcom articles on dotcom have Enterprise Admin links with latest GHE version', async () => {
const $ = await getDOM('/en/articles/set-up-git')
expect($('a[href="/en/articles/managing-files-on-github"]').length).toBe(1)
})
testFeatureNewVersions('dotcom articles on dotcom have Enterprise Admin links with latest GHE version', async () => {
const $ = await getDOM('/en/articles/setting-up-a-trial-of-github-enterprise-server') const $ = await getDOM('/en/articles/setting-up-a-trial-of-github-enterprise-server')
expect($(`a[href="${latestEnterprisePath}/admin/installation/setting-up-a-github-enterprise-server-instance"]`).length).toBe(2) expect($(`a[href="${latestEnterprisePath}/admin/installation/setting-up-a-github-enterprise-server-instance"]`).length).toBe(2)
}) })
testFeatureOldVersions('dotcom articles on dotcom have Enterprise Admin links with latest GHE version', async () => { test('dotcom articles on GHE have Enterprise user links', async () => {
const $ = await getDOM('/en/articles/setting-up-a-trial-of-github-enterprise-server')
expect($(`a[href="${latestEnterprisePath}/admin/installation/setting-up-a-github-enterprise-server-instance"]`).length).toBe(2)
})
testFeatureNewVersions('dotcom articles on GHE have Enterprise user links', async () => {
const $ = await getDOM(`${latestEnterprisePath}/github/getting-started-with-github/set-up-git`) const $ = await getDOM(`${latestEnterprisePath}/github/getting-started-with-github/set-up-git`)
expect($(`a[href="${latestEnterprisePath}/articles/managing-files-on-github"]`).length).toBe(1) expect($(`a[href="${latestEnterprisePath}/articles/managing-files-on-github"]`).length).toBe(1)
}) })
testFeatureOldVersions('dotcom articles on GHE have Enterprise user links', async () => { test('dotcom categories on GHE have Enterprise user links', async () => {
const $ = await getDOM(`${latestEnterprisePath}/user/github/getting-started-with-github/set-up-git`)
expect($(`a[href="${latestEnterprisePath}/user/articles/managing-files-on-github"]`).length).toBe(1)
})
testFeatureNewVersions('dotcom categories on GHE have Enterprise user links', async () => {
const $ = await getDOM(`${latestEnterprisePath}/github/managing-large-files`) const $ = await getDOM(`${latestEnterprisePath}/github/managing-large-files`)
expect($(`article a[href="${latestEnterprisePath}/github/managing-large-files/conditions-for-large-files"]`).length).toBe(1) expect($(`article a[href="${latestEnterprisePath}/github/managing-large-files/conditions-for-large-files"]`).length).toBe(1)
}) })
testFeatureOldVersions('dotcom categories on GHE have Enterprise user links', async () => { test('dotcom-only links on GHE are dotcom-only', async () => {
const $ = await getDOM(`${latestEnterprisePath}/user/github/managing-large-files`)
expect($(`article a[href="${latestEnterprisePath}/user/github/managing-large-files/conditions-for-large-files"]`).length).toBe(1)
})
testFeatureNewVersions('dotcom-only links on GHE are dotcom-only', async () => {
const $ = await getDOM(`${latestEnterprisePath}/github/setting-up-and-managing-your-github-profile/sending-your-github-enterprise-server-contributions-to-your-githubcom-profile`) const $ = await getDOM(`${latestEnterprisePath}/github/setting-up-and-managing-your-github-profile/sending-your-github-enterprise-server-contributions-to-your-githubcom-profile`)
expect($(`article a[href="/en/${nonEnterpriseDefaultVersion}/articles/github-privacy-statement"]`).length).toBe(1) expect($(`article a[href="/en/${nonEnterpriseDefaultVersion}/articles/github-privacy-statement"]`).length).toBe(1)
}) })
testFeatureOldVersions('dotcom-only links on GHE are dotcom-only', async () => { test('desktop links on GHE are dotcom-only', async () => {
const $ = await getDOM(`${latestEnterprisePath}/user/github/setting-up-and-managing-your-github-profile/sending-your-github-enterprise-server-contributions-to-your-githubcom-profile`)
expect($('article a[href="/en/articles/github-privacy-statement"]').length).toBe(1)
})
testFeatureNewVersions('desktop links on GHE are dotcom-only', async () => {
const $ = await getDOM(`${latestEnterprisePath}/github/getting-started-with-github/set-up-git`) const $ = await getDOM(`${latestEnterprisePath}/github/getting-started-with-github/set-up-git`)
expect($(`article a[href="/en/${nonEnterpriseDefaultVersion}/desktop/installing-and-configuring-github-desktop"]`).length).toBe(1) expect($(`article a[href="/en/${nonEnterpriseDefaultVersion}/desktop/installing-and-configuring-github-desktop"]`).length).toBe(1)
}) })
testFeatureOldVersions('desktop links on GHE are dotcom-only', async () => { test('admin articles that link to non-admin articles have Enterprise user links', async () => {
const $ = await getDOM(`${latestEnterprisePath}/user/github/getting-started-with-github/set-up-git`)
expect($('article a[href="/en/desktop/installing-and-configuring-github-desktop"]').length).toBe(1)
})
testFeatureNewVersions('admin articles that link to non-admin articles have Enterprise user links', async () => {
const $ = await getDOM(`${latestEnterprisePath}/admin/installation/configuring-the-default-visibility-of-new-repositories-on-your-appliance`) const $ = await getDOM(`${latestEnterprisePath}/admin/installation/configuring-the-default-visibility-of-new-repositories-on-your-appliance`)
expect($(`article a[href="${latestEnterprisePath}/github/creating-cloning-and-archiving-repositories/about-repository-visibility"]`).length).toBeGreaterThan(0) expect($(`article a[href="${latestEnterprisePath}/github/creating-cloning-and-archiving-repositories/about-repository-visibility"]`).length).toBeGreaterThan(0)
}) })
testFeatureOldVersions('admin articles that link to non-admin articles have Enterprise user links', async () => { test('admin articles that link to Enterprise user articles have Enterprise user links', async () => {
const $ = await getDOM(`${latestEnterprisePath}/admin/installation/configuring-the-default-visibility-of-new-repositories-on-your-appliance`)
expect($(`article a[href="${latestEnterprisePath}/user/github/creating-cloning-and-archiving-repositories/about-repository-visibility"]`).length).toBeGreaterThan(0)
})
testFeatureNewVersions('admin articles that link to Enterprise user articles have Enterprise user links', async () => {
const $ = await getDOM(`${latestEnterprisePath}/admin/user-management/configuring-email-for-notifications`) const $ = await getDOM(`${latestEnterprisePath}/admin/user-management/configuring-email-for-notifications`)
expect($('article a[href*="about-email-notifications-for-pushes-to-your-repository"]').length).toBe(1) expect($('article a[href*="about-email-notifications-for-pushes-to-your-repository"]').length).toBe(1)
}) })
testFeatureOldVersions('admin articles that link to Enterprise user articles have Enterprise user links', async () => { test('articles that link to external links that contain /articles/ are not rewritten', async () => {
const $ = await getDOM(`${latestEnterprisePath}/admin/user-management/configuring-email-for-notifications`)
expect($('article a[href*="about-email-notifications-for-pushes-to-your-repository"]').length).toBe(1)
})
testFeatureNewVersions('articles that link to external links that contain /articles/ are not rewritten', async () => {
const $ = await getDOM(`${latestEnterprisePath}/admin/installation/upgrading-github-enterprise-server`)
expect($('article a[href="https://azure.microsoft.com/en-us/documentation/articles/backup-azure-vms/"]').length).toBe(1)
})
testFeatureOldVersions('articles that link to external links that contain /articles/ are not rewritten', async () => {
const $ = await getDOM(`${latestEnterprisePath}/admin/installation/upgrading-github-enterprise-server`) const $ = await getDOM(`${latestEnterprisePath}/admin/installation/upgrading-github-enterprise-server`)
expect($('article a[href="https://azure.microsoft.com/en-us/documentation/articles/backup-azure-vms/"]').length).toBe(1) expect($('article a[href="https://azure.microsoft.com/en-us/documentation/articles/backup-azure-vms/"]').length).toBe(1)
}) })
}) })
describe('article versions', () => { describe('article versions', () => {
testFeatureNewVersions('includes links to all versions of each article', async () => { test('includes links to all versions of each article', async () => {
const articlePath = 'github/setting-up-and-managing-your-github-user-account/about-your-personal-dashboard' const articlePath = 'github/setting-up-and-managing-your-github-user-account/about-your-personal-dashboard'
const $ = await getDOM(`/en/enterprise-server@${enterpriseServerReleases.latest}/${articlePath}`) const $ = await getDOM(`/en/enterprise-server@${enterpriseServerReleases.latest}/${articlePath}`)
expect($(`.article-versions a.active[href="/en/enterprise-server@${enterpriseServerReleases.latest}/${articlePath}"]`).length).toBe(2) expect($(`.article-versions a.active[href="/en/enterprise-server@${enterpriseServerReleases.latest}/${articlePath}"]`).length).toBe(2)
@@ -415,16 +359,6 @@ describe('server', () => {
expect($(`.article-versions a[href="/en/enterprise/2.13/user/${articlePath}"]`).length).toBe(0) expect($(`.article-versions a[href="/en/enterprise/2.13/user/${articlePath}"]`).length).toBe(0)
}) })
testFeatureOldVersions('includes links to all versions of each article', async () => {
const articlePath = 'github/setting-up-and-managing-your-github-user-account/about-your-personal-dashboard'
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/user/${articlePath}`)
expect($(`.article-versions a.active[href="/en/enterprise/${enterpriseServerReleases.latest}/user/${articlePath}"]`).length).toBe(2)
expect($(`.article-versions a.active[href="/en/${articlePath}"]`).length).toBe(0)
// 2.13 predates this feature, so it should be excluded:
expect($(`.article-versions a[href="/en/enterprise/2.13/user/${articlePath}"]`).length).toBe(0)
})
test('is not displayed if article has only one version', async () => { test('is not displayed if article has only one version', async () => {
const $ = await getDOM('/en/articles/signing-up-for-a-new-github-account') const $ = await getDOM('/en/articles/signing-up-for-a-new-github-account')
expect($('.article-versions').length).toBe(0) expect($('.article-versions').length).toBe(0)
@@ -437,16 +371,11 @@ describe('server', () => {
expect(res.statusCode).toBe(301) expect(res.statusCode).toBe(301)
}) })
testFeatureNewVersions('redirects old articles to their slugified URL', async () => { test('redirects old articles to their slugified URL', async () => {
const res = await get('/articles/about-github-s-ip-addresses') const res = await get('/articles/about-github-s-ip-addresses')
expect(res.text).toBe(`Moved Permanently. Redirecting to /en/${nonEnterpriseDefaultVersion}/github/authenticating-to-github/about-githubs-ip-addresses`) expect(res.text).toBe(`Moved Permanently. Redirecting to /en/${nonEnterpriseDefaultVersion}/github/authenticating-to-github/about-githubs-ip-addresses`)
}) })
testFeatureOldVersions('redirects old articles to their slugified URL', async () => {
const res = await get('/articles/about-github-s-ip-addresses')
expect(res.text).toBe('Moved Permanently. Redirecting to /en/github/authenticating-to-github/about-githubs-ip-addresses')
})
test('redirects / to /en', async () => { test('redirects / to /en', async () => {
const res = await get('/') const res = await get('/')
expect(res.statusCode).toBe(301) expect(res.statusCode).toBe(301)
@@ -465,18 +394,12 @@ describe('server', () => {
expect(res.headers.location).toBe('https://desktop.github.com') expect(res.headers.location).toBe('https://desktop.github.com')
}) })
testFeatureNewVersions('redirects /insights/foo paths to /enterprise/user/insights/foo', async () => { test('redirects /insights/foo paths to /enterprise/user/insights/foo', async () => {
const res = await get('/en/insights/installing-and-configuring-github-insights/about-github-insights') const res = await get('/en/insights/installing-and-configuring-github-insights/about-github-insights')
expect(res.statusCode).toBe(301) expect(res.statusCode).toBe(301)
expect(res.headers.location).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}/insights/installing-and-configuring-github-insights/about-github-insights`) expect(res.headers.location).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}/insights/installing-and-configuring-github-insights/about-github-insights`)
}) })
testFeatureOldVersions('redirects /insights/foo paths to /enterprise/user/insights/foo', async () => {
const res = await get('/en/insights/installing-and-configuring-github-insights/about-github-insights')
expect(res.statusCode).toBe(301)
expect(res.headers.location).toBe(`/en/enterprise/${enterpriseServerReleases.latest}/user/insights/installing-and-configuring-github-insights/about-github-insights`)
})
// this oneoff redirect is temporarily disabled because it introduces too much complexity // this oneoff redirect is temporarily disabled because it introduces too much complexity
// we can reenable it down the road if needed // we can reenable it down the road if needed
test.skip('redirects versioned category page', async () => { test.skip('redirects versioned category page', async () => {
@@ -487,45 +410,28 @@ describe('server', () => {
}) })
describe('categories and map topics', () => { describe('categories and map topics', () => {
testFeatureNewVersions('adds links to categories on the dotcom homepage', async () => { test('adds links to categories on the dotcom homepage', async () => {
const $ = await getDOM('/en/github') const $ = await getDOM('/en/github')
expect($(`article a[href="/en/${nonEnterpriseDefaultVersion}/github/managing-large-files"]`).length).toBe(1) expect($(`article a[href="/en/${nonEnterpriseDefaultVersion}/github/managing-large-files"]`).length).toBe(1)
expect($('article a[href="#managing-large-files"]').length).toBe(0) expect($('article a[href="#managing-large-files"]').length).toBe(0)
}) })
testFeatureOldVersions('adds links to categories on the dotcom homepage', async () => { test('adds links to map topics on a category homepage', async () => {
const $ = await getDOM('/en/github')
expect($('article a[href="/en/github/managing-large-files"]').length).toBe(1)
expect($('article a[href="#managing-large-files"]').length).toBe(0)
})
testFeatureNewVersions('adds links to map topics on a category homepage', async () => {
const $ = await getDOM('/en/github/setting-up-and-managing-your-github-user-account') const $ = await getDOM('/en/github/setting-up-and-managing-your-github-user-account')
expect($(`article a[href="/en/${nonEnterpriseDefaultVersion}/github/setting-up-and-managing-your-github-user-account/managing-user-account-settings"]`).length).toBe(1) expect($(`article a[href="/en/${nonEnterpriseDefaultVersion}/github/setting-up-and-managing-your-github-user-account/managing-user-account-settings"]`).length).toBe(1)
expect($('article a[href="#managing-user-account-settings"]').length).toBe(0) expect($('article a[href="#managing-user-account-settings"]').length).toBe(0)
}) })
testFeatureOldVersions('adds links to map topics on a category homepage', async () => {
const $ = await getDOM('/en/github/setting-up-and-managing-your-github-user-account')
expect($('article a[href="/en/github/setting-up-and-managing-your-github-user-account/managing-user-account-settings"]').length).toBe(1)
expect($('article a[href="#managing-user-account-settings"]').length).toBe(0)
})
test('category page renders with TOC', async () => { test('category page renders with TOC', async () => {
const $ = await getDOM('/en/github/managing-large-files') const $ = await getDOM('/en/github/managing-large-files')
expect($('.markdown-body ul li a').length).toBeGreaterThan(5) expect($('.markdown-body ul li a').length).toBeGreaterThan(5)
}) })
testFeatureNewVersions('map topic renders with h4 links to articles', async () => { test('map topic renders with h4 links to articles', async () => {
const $ = await getDOM('/en/github/setting-up-and-managing-your-github-user-account/managing-user-account-settings') const $ = await getDOM('/en/github/setting-up-and-managing-your-github-user-account/managing-user-account-settings')
expect($(`a[href="/en/${nonEnterpriseDefaultVersion}/github/setting-up-and-managing-your-github-user-account/changing-your-github-username"] h4`).length).toBe(1) expect($(`a[href="/en/${nonEnterpriseDefaultVersion}/github/setting-up-and-managing-your-github-user-account/changing-your-github-username"] h4`).length).toBe(1)
}) })
testFeatureOldVersions('map topic renders with h4 links to articles', async () => {
const $ = await getDOM('/en/github/setting-up-and-managing-your-github-user-account/managing-user-account-settings')
expect($('a[href="/en/github/setting-up-and-managing-your-github-user-account/changing-your-github-username"] h4').length).toBe(1)
})
test('map topic renders with one intro for every h4', async () => { test('map topic renders with one intro for every h4', async () => {
const $ = await getDOM('/en/github/setting-up-and-managing-your-github-user-account/managing-user-account-settings') const $ = await getDOM('/en/github/setting-up-and-managing-your-github-user-account/managing-user-account-settings')
const $h4s = $('article a.link-with-intro') const $h4s = $('article a.link-with-intro')
@@ -555,197 +461,107 @@ describe('URLs by language', () => {
}) })
describe('GitHub Enterprise URLs', () => { describe('GitHub Enterprise URLs', () => {
testFeatureNewVersions('renders the GHE user docs homepage', async () => { test('renders the GHE user docs homepage', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/user/github`) const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/user/github`)
expect($(`article a[href="/en/enterprise-server@${enterpriseServerReleases.latest}/github/getting-started-with-github"]`).length).toBe(1) expect($(`article a[href="/en/enterprise-server@${enterpriseServerReleases.latest}/github/getting-started-with-github"]`).length).toBe(1)
}) })
testFeatureOldVersions('renders the GHE user docs homepage', async () => { test('renders the Enterprise Server homepage with correct links', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/user/github`)
expect($(`article a[href="/en/enterprise/${enterpriseServerReleases.latest}/user/github/getting-started-with-github"]`).length).toBe(1)
})
testFeatureNewVersions('renders the Enterprise Server homepage with correct links', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}`) const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}`)
expect($(`section.container-xl a[href="/en/enterprise-server@${enterpriseServerReleases.latest}/admin"]`).length).toBe(1) expect($(`section.container-xl a[href="/en/enterprise-server@${enterpriseServerReleases.latest}/admin"]`).length).toBe(1)
expect($(`section.container-xl a[href="/en/enterprise-server@${enterpriseServerReleases.latest}/github"]`).length).toBe(1) expect($(`section.container-xl a[href="/en/enterprise-server@${enterpriseServerReleases.latest}/github"]`).length).toBe(1)
}) })
testFeatureOldVersions('renders the Enterprise homepage with correct links', async () => { test('renders the Enterprise Admin category homepage', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}`)
expect($(`article a[href="/en/enterprise/${enterpriseServerReleases.latest}/admin"]`).length).toBe(1)
expect($(`article a[href="/en/enterprise/${enterpriseServerReleases.latest}/user/github"]`).length).toBe(1)
})
testFeatureNewVersions('renders the Enterprise Admin category homepage', async () => {
const adminPath = `/en/enterprise-server@${enterpriseServerReleases.latest}/admin` const adminPath = `/en/enterprise-server@${enterpriseServerReleases.latest}/admin`
const $ = await getDOM(adminPath) const $ = await getDOM(adminPath)
expect($(`article a[href="${adminPath}/installation"]`).length).toBe(1) expect($(`article a[href="${adminPath}/installation"]`).length).toBe(1)
expect($.text()).toContain('This guide describes') expect($.text()).toContain('This guide describes')
}) })
testFeatureOldVersions('renders the Enterprise Admin category homepage', async () => { test('renders an Enterprise Admin category with correct links', async () => {
const adminPath = `/en/enterprise/${enterpriseServerReleases.latest}/admin`
const $ = await getDOM(adminPath)
expect($(`article a[href="${adminPath}/installation"]`).length).toBe(1)
expect($.text()).toContain('This guide describes')
})
testFeatureNewVersions('renders an Enterprise Admin category with correct links', async () => {
const installationCategoryHome = `/en/enterprise-server@${enterpriseServerReleases.latest}/admin/installation` const installationCategoryHome = `/en/enterprise-server@${enterpriseServerReleases.latest}/admin/installation`
const $ = await getDOM(installationCategoryHome) const $ = await getDOM(installationCategoryHome)
expect($(`article a[href^="${installationCategoryHome}/"]`).length).toBeGreaterThan(1) expect($(`article a[href^="${installationCategoryHome}/"]`).length).toBeGreaterThan(1)
}) })
testFeatureOldVersions('renders an Enterprise Admin category with correct links', async () => { test('renders a translated Enterprise Admin category with English links', async () => {
const installationCategoryHome = `/en/enterprise/${enterpriseServerReleases.latest}/admin/installation`
const $ = await getDOM(installationCategoryHome)
expect($(`article a[href^="${installationCategoryHome}/"]`).length).toBeGreaterThan(1)
})
testFeatureNewVersions('renders a translated Enterprise Admin category with English links', async () => {
const installationCategoryHome = `/ja/enterprise-server@${enterpriseServerReleases.latest}/admin/installation` const installationCategoryHome = `/ja/enterprise-server@${enterpriseServerReleases.latest}/admin/installation`
const $ = await getDOM(installationCategoryHome) const $ = await getDOM(installationCategoryHome)
expect($(`article a[href^="${installationCategoryHome}/"]`).length).toBeGreaterThan(1) expect($(`article a[href^="${installationCategoryHome}/"]`).length).toBeGreaterThan(1)
}) })
testFeatureOldVersions('renders a translated Enterprise Admin category with English links', async () => {
const installationCategoryHome = `/ja/enterprise/${enterpriseServerReleases.latest}/admin/installation`
const $ = await getDOM(installationCategoryHome)
expect($(`article a[href^="${installationCategoryHome}/"]`).length).toBeGreaterThan(1)
})
test('renders an Enterprise Admin category article', async () => { test('renders an Enterprise Admin category article', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/admin/installation/system-overview`) const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/admin/installation/system-overview`)
expect($.text()).toContain('your organization\'s private copy of GitHub') expect($.text()).toContain('your organization\'s private copy of GitHub')
}) })
testFeatureNewVersions('renders an Enterprise Admin map topic', async () => { test('renders an Enterprise Admin map topic', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/admin/enterprise-management/updating-the-virtual-machine-and-physical-resources`) const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/admin/enterprise-management/updating-the-virtual-machine-and-physical-resources`)
expect($(`article a[href^="/en/enterprise-server@${enterpriseServerReleases.latest}/admin/enterprise-management/"]`).length).toBeGreaterThan(1) expect($(`article a[href^="/en/enterprise-server@${enterpriseServerReleases.latest}/admin/enterprise-management/"]`).length).toBeGreaterThan(1)
}) })
testFeatureOldVersions('renders an Enterprise Admin map topic', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/admin/enterprise-management/updating-the-virtual-machine-and-physical-resources`)
expect($(`article a[href^="/en/enterprise/${enterpriseServerReleases.latest}/admin/enterprise-management/"]`).length).toBeGreaterThan(1)
})
test('renders an Enterprise Admin category article within a map topic', async () => { test('renders an Enterprise Admin category article within a map topic', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/admin/installation/upgrade-requirements`) const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/admin/installation/upgrade-requirements`)
expect($.text()).toContain('Before upgrading GitHub Enterprise') expect($.text()).toContain('Before upgrading GitHub Enterprise')
}) })
testFeatureNewVersions('renders Enterprise homepage in Japanese', async () => { test('renders Enterprise homepage in Japanese', async () => {
const res = await get(`/ja/enterprise-server@${enterpriseServerReleases.latest}`) const res = await get(`/ja/enterprise-server@${enterpriseServerReleases.latest}`)
expect(res.statusCode).toBe(200) expect(res.statusCode).toBe(200)
}) })
testFeatureOldVersions('renders Enterprise homepage in Japanese', async () => { test('renders Enterprise User homepage in Japanese', async () => {
const res = await get(`/ja/enterprise/${enterpriseServerReleases.latest}`)
expect(res.statusCode).toBe(200)
})
testFeatureNewVersions('renders Enterprise User homepage in Japanese', async () => {
const res = await get(`/ja/enterprise-server@${enterpriseServerReleases.latest}/github`) const res = await get(`/ja/enterprise-server@${enterpriseServerReleases.latest}/github`)
expect(res.statusCode).toBe(200) expect(res.statusCode).toBe(200)
}) })
testFeatureOldVersions('renders Enterprise User homepage in Japanese', async () => { test('renders Enterprise Admin homepage in Japanese', async () => {
const res = await get(`/ja/enterprise/${enterpriseServerReleases.latest}/user/github`)
expect(res.statusCode).toBe(200)
})
testFeatureNewVersions('renders Enterprise Admin homepage in Japanese', async () => {
const res = await get(`/ja/enterprise-server@${enterpriseServerReleases.latest}/admin`) const res = await get(`/ja/enterprise-server@${enterpriseServerReleases.latest}/admin`)
expect(res.statusCode).toBe(200) expect(res.statusCode).toBe(200)
}) })
testFeatureOldVersions('renders Enterprise Admin homepage in Japanese', async () => { test('renders Enterprise homepage in Chinese', async () => {
const res = await get(`/ja/enterprise/${enterpriseServerReleases.latest}/admin`)
expect(res.statusCode).toBe(200)
})
testFeatureNewVersions('renders Enterprise homepage in Chinese', async () => {
const res = await get(`/cn/enterprise-server@${enterpriseServerReleases.latest}`) const res = await get(`/cn/enterprise-server@${enterpriseServerReleases.latest}`)
expect(res.statusCode).toBe(200) expect(res.statusCode).toBe(200)
}) })
testFeatureOldVersions('renders Enterprise homepage in Chinese', async () => { test('renders Enterprise User homepage in Chinese', async () => {
const res = await get(`/cn/enterprise/${enterpriseServerReleases.latest}`)
expect(res.statusCode).toBe(200)
})
testFeatureNewVersions('renders Enterprise User homepage in Chinese', async () => {
const res = await get(`/cn/enterprise-server@${enterpriseServerReleases.latest}/github`) const res = await get(`/cn/enterprise-server@${enterpriseServerReleases.latest}/github`)
expect(res.statusCode).toBe(200) expect(res.statusCode).toBe(200)
}) })
testFeatureOldVersions('renders Enterprise User homepage in Chinese', async () => { test('renders Enterprise Admin homepage in Chinese', async () => {
const res = await get(`/cn/enterprise/${enterpriseServerReleases.latest}/user/github`)
expect(res.statusCode).toBe(200)
})
testFeatureNewVersions('renders Enterprise Admin homepage in Chinese', async () => {
const res = await get(`/cn/enterprise-server@${enterpriseServerReleases.latest}/admin`) const res = await get(`/cn/enterprise-server@${enterpriseServerReleases.latest}/admin`)
expect(res.statusCode).toBe(200) expect(res.statusCode).toBe(200)
}) })
testFeatureOldVersions('renders Enterprise Admin homepage in Chinese', async () => {
const res = await get(`/cn/enterprise/${enterpriseServerReleases.latest}/admin`)
expect(res.statusCode).toBe(200)
})
}) })
describe('GitHub Desktop URLs', () => { describe('GitHub Desktop URLs', () => {
testFeatureNewVersions('renders the GitHub Desktop homepage with correct links', async () => { test('renders the GitHub Desktop homepage with correct links', async () => {
const $ = await getDOM('/en/desktop') const $ = await getDOM('/en/desktop')
expect($(`article a[href^="/en/${nonEnterpriseDefaultVersion}/desktop/"]`).length).toBeGreaterThan(1) expect($(`article a[href^="/en/${nonEnterpriseDefaultVersion}/desktop/"]`).length).toBeGreaterThan(1)
}) })
testFeatureOldVersions('renders the GitHub Desktop homepage with correct links', async () => { test('renders a Desktop category with expected links', async () => {
const $ = await getDOM('/en/desktop')
expect($('article a[href^="/en/desktop/"]').length).toBeGreaterThan(1)
})
testFeatureNewVersions('renders a Desktop category with expected links', async () => {
const $ = await getDOM('/en/desktop/installing-and-configuring-github-desktop') const $ = await getDOM('/en/desktop/installing-and-configuring-github-desktop')
expect($(`article a[href^="/en/${nonEnterpriseDefaultVersion}/desktop/installing-and-configuring-github-desktop/"]`).length).toBeGreaterThan(1) expect($(`article a[href^="/en/${nonEnterpriseDefaultVersion}/desktop/installing-and-configuring-github-desktop/"]`).length).toBeGreaterThan(1)
}) })
testFeatureOldVersions('renders a Desktop category with expected links', async () => { test('renders a Desktop map topic', async () => {
const $ = await getDOM('/en/desktop/installing-and-configuring-github-desktop')
expect($('article a[href^="/en/desktop/installing-and-configuring-github-desktop/"]').length).toBeGreaterThan(1)
})
testFeatureNewVersions('renders a Desktop map topic', async () => {
const $ = await getDOM('/en/desktop/installing-and-configuring-github-desktop/installing-and-authenticating-to-github-desktop') const $ = await getDOM('/en/desktop/installing-and-configuring-github-desktop/installing-and-authenticating-to-github-desktop')
expect($(`article a[href^="/en/${nonEnterpriseDefaultVersion}/desktop/installing-and-configuring-github-desktop/"]`).length).toBeGreaterThan(1) expect($(`article a[href^="/en/${nonEnterpriseDefaultVersion}/desktop/installing-and-configuring-github-desktop/"]`).length).toBeGreaterThan(1)
}) })
testFeatureOldVersions('renders a Desktop map topic', async () => { test('renders a Desktop article within a map topic', async () => {
const $ = await getDOM('/en/desktop/installing-and-configuring-github-desktop/installing-and-authenticating-to-github-desktop')
expect($('article a[href^="/en/desktop/installing-and-configuring-github-desktop/"]').length).toBeGreaterThan(1)
})
testFeatureNewVersions('renders a Desktop article within a map topic', async () => {
const res = await get(`/en/${nonEnterpriseDefaultVersion}/desktop/installing-and-configuring-github-desktop/installing-github-desktop`) const res = await get(`/en/${nonEnterpriseDefaultVersion}/desktop/installing-and-configuring-github-desktop/installing-github-desktop`)
expect(res.statusCode).toBe(200) expect(res.statusCode).toBe(200)
}) })
testFeatureOldVersions('renders a Desktop article within a map topic', async () => { test('renders the Desktop homepage in Japanese', async () => {
const res = await get('/en/desktop/installing-and-configuring-github-desktop/installing-github-desktop')
expect(res.statusCode).toBe(200)
})
testFeatureNewVersions('renders the Desktop homepage in Japanese', async () => {
const res = await get(`/ja/${nonEnterpriseDefaultVersion}/desktop`) const res = await get(`/ja/${nonEnterpriseDefaultVersion}/desktop`)
expect(res.statusCode).toBe(200) expect(res.statusCode).toBe(200)
}) })
testFeatureOldVersions('renders the Desktop homepage in Japanese', async () => {
const res = await get('/ja/desktop')
expect(res.statusCode).toBe(200)
})
}) })
describe('static assets', () => { describe('static assets', () => {
@@ -894,39 +710,21 @@ describe('static routes', () => {
}) })
describe('index pages', () => { describe('index pages', () => {
const nonEnterpriseOnlyPath = process.env.FEATURE_NEW_VERSIONS const nonEnterpriseOnlyPath = `/en/${nonEnterpriseDefaultVersion}/github/getting-started-with-github/verifying-your-email-address`
? `/en/${nonEnterpriseDefaultVersion}/github/getting-started-with-github/verifying-your-email-address`
: '/en/github/getting-started-with-github/verifying-your-email-address'
testFeatureNewVersions('includes dotcom-only links in dotcom TOC', async () => { test('includes dotcom-only links in dotcom TOC', async () => {
const $ = await getDOM('/en/github/getting-started-with-github') const $ = await getDOM('/en/github/getting-started-with-github')
expect($(`article a[href="${nonEnterpriseOnlyPath}"]`).length).toBe(1) expect($(`article a[href="${nonEnterpriseOnlyPath}"]`).length).toBe(1)
}) })
testFeatureOldVersions('includes dotcom-only links in dotcom TOC', async () => { test('excludes dotcom-only from GHE TOC', async () => {
const $ = await getDOM('/en/github/getting-started-with-github')
expect($(`article a[href="${nonEnterpriseOnlyPath}"]`).length).toBe(1)
})
testFeatureNewVersions('excludes dotcom-only from GHE TOC', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/user/github/getting-started-with-github`) const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/user/github/getting-started-with-github`)
expect($(`a[href="${nonEnterpriseOnlyPath}"]`).length).toBe(0) expect($(`a[href="${nonEnterpriseOnlyPath}"]`).length).toBe(0)
}) })
testFeatureOldVersions('excludes dotcom-only from GHE TOC', async () => { test('includes correctly versioned links in GHE', async () => {
const $ = await getDOM(`/en/enterprise/${enterpriseServerReleases.latest}/user/github/getting-started-with-github`)
expect($(`a[href="${nonEnterpriseOnlyPath}"]`).length).toBe(0)
})
testFeatureNewVersions('includes correctly versioned links in GHE', async () => {
const installationLatest = `/en/enterprise-server@${enterpriseServerReleases.latest}/admin/installation` const installationLatest = `/en/enterprise-server@${enterpriseServerReleases.latest}/admin/installation`
const $ = await getDOM(installationLatest) const $ = await getDOM(installationLatest)
expect($(`article a[href^="${installationLatest}/"]`).length).toBeGreaterThan(0) expect($(`article a[href^="${installationLatest}/"]`).length).toBeGreaterThan(0)
}) })
testFeatureOldVersions('includes correctly versioned links in GHE', async () => {
const installationLatest = `/en/enterprise/${enterpriseServerReleases.latest}/admin/installation`
const $ = await getDOM(installationLatest)
expect($(`article a[href^="${installationLatest}/"]`).length).toBeGreaterThan(0)
})
}) })

View File

@@ -1,10 +1,6 @@
require('../../lib/feature-flags')
const { getDOM } = require('../helpers') const { getDOM } = require('../helpers')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
describe('sidebar', () => { describe('sidebar', () => {
jest.setTimeout(3 * 60 * 1000) jest.setTimeout(3 * 60 * 1000)
@@ -18,16 +14,11 @@ describe('sidebar', () => {
done() done()
}) })
testFeatureNewVersions('highlights active product on Enterprise pages', async () => { test('highlights active product on Enterprise pages', async () => {
expect($enterprisePage('.sidebar li.sidebar-product').length).toBe(1) expect($enterprisePage('.sidebar li.sidebar-product').length).toBe(1)
expect($enterprisePage('.sidebar li.sidebar-product > a').text().trim()).toBe('Enterprise Administrators') expect($enterprisePage('.sidebar li.sidebar-product > a').text().trim()).toBe('Enterprise Administrators')
}) })
testFeatureOldVersions('highlights active product on Enterprise pages', async () => {
expect($enterprisePage('.sidebar li.sidebar-product').length).toBe(1)
expect($enterprisePage('.sidebar li.sidebar-product > a').text().trim()).toBe('Enterprise Server')
})
test('highlights active product on GitHub pages', async () => { test('highlights active product on GitHub pages', async () => {
expect($githubPage('.sidebar li.sidebar-product').length).toBe(1) expect($githubPage('.sidebar li.sidebar-product').length).toBe(1)
expect($githubPage('.sidebar li.sidebar-product > a').text().trim()).toBe('GitHub.com') expect($githubPage('.sidebar li.sidebar-product > a').text().trim()).toBe('GitHub.com')
@@ -38,17 +29,10 @@ describe('sidebar', () => {
expect($homePage('.sidebar a[href="https://electronjs.org/docs"]')).toHaveLength(1) expect($homePage('.sidebar a[href="https://electronjs.org/docs"]')).toHaveLength(1)
}) })
testFeatureNewVersions('adds an `is-current-page` class to the sidebar link to the current page', async () => { test('adds an `is-current-page` class to the sidebar link to the current page', async () => {
const url = `/en/${nonEnterpriseDefaultVersion}/github/setting-up-and-managing-your-github-user-account/managing-user-account-settings` const url = `/en/${nonEnterpriseDefaultVersion}/github/setting-up-and-managing-your-github-user-account/managing-user-account-settings`
const $ = await getDOM(url) const $ = await getDOM(url)
expect($('.sidebar .is-current-page').length).toBe(1) expect($('.sidebar .is-current-page').length).toBe(1)
expect($('.sidebar .is-current-page a').attr('href')).toContain(url) expect($('.sidebar .is-current-page a').attr('href')).toContain(url)
}) })
testFeatureOldVersions('adds an `is-current-page` class to the sidebar link to the current page', async () => {
const url = '/en/github/setting-up-and-managing-your-github-user-account/managing-user-account-settings'
const $ = await getDOM(url)
expect($('.sidebar .is-current-page').length).toBe(1)
expect($('.sidebar .is-current-page a').attr('href')).toContain(url)
})
}) })

View File

@@ -1,18 +1,11 @@
require('../../lib/feature-flags')
const { eachOfLimit } = require('async') const { eachOfLimit } = require('async')
const enterpriseServerReleases = require('../../lib/enterprise-server-releases') const enterpriseServerReleases = require('../../lib/enterprise-server-releases')
const { get } = require('../helpers') const { get } = require('../helpers')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
let restRedirectFixtures, graphqlRedirectFixtures, developerRedirectFixtures const restRedirectFixtures = require('../fixtures/rest-redirects')
if (process.env.FEATURE_NEW_VERSIONS) { const graphqlRedirectFixtures = require('../fixtures/graphql-redirects')
restRedirectFixtures = require('../fixtures/new-versions/rest-redirects') const developerRedirectFixtures = require('../fixtures/developer-redirects')
graphqlRedirectFixtures = require('../fixtures/new-versions/graphql-redirects')
developerRedirectFixtures = require('../fixtures/new-versions/developer-redirects')
} else {
restRedirectFixtures = require('../fixtures/rest-redirects')
graphqlRedirectFixtures = require('../fixtures/graphql-redirects')
developerRedirectFixtures = require('../fixtures/developer-redirects')
}
const MAX_CONCURRENT_REQUESTS = 50 const MAX_CONCURRENT_REQUESTS = 50
describe('developer redirects', () => { describe('developer redirects', () => {
@@ -25,183 +18,82 @@ describe('developer redirects', () => {
await get('/v4') await get('/v4')
}) })
if (process.env.FEATURE_NEW_VERSIONS) { describe('redirects /v4 requests to /graphql', () => {
describe('redirects /v4 requests to /graphql with FEATURE_NEW_VERSIONS enabled', () => { test('graphql homepage', async () => {
test('graphql homepage', async () => { const res = await get('/v4')
const res = await get('/v4')
expect(res.statusCode).toBe(301)
const expectedFinalPath = `/en/${nonEnterpriseDefaultVersion}/graphql`
expect(res.headers.location).toBe(expectedFinalPath)
})
test('graphql enterprise homepage', async () => {
const res = await get('/enterprise/v4', { followAllRedirects: true })
expect(res.statusCode).toBe(200)
const finalPath = (new URL(res.request.url)).pathname
const expectedFinalPath = `/en/enterprise-server@${enterpriseServerReleases.latest}/graphql`
expect(finalPath).toBe(expectedFinalPath)
})
test('graphql overview paths', async () => {
const oldPath = '/v4/breaking_changes'
const newPath = `/${nonEnterpriseDefaultVersion}/graphql/overview/breaking-changes`
const res = await get(oldPath)
expect(res.statusCode).toBe(301)
expect(res.headers.location).toBe(`/en${newPath}`)
const enterpriseRes = await get(`/enterprise${oldPath}`, { followAllRedirects: true })
expect(enterpriseRes.statusCode).toBe(200)
const finalPath = (new URL(enterpriseRes.request.url)).pathname
const expectedFinalPath = newPath.replace(nonEnterpriseDefaultVersion, `enterprise-server@${enterpriseServerReleases.latest}`)
expect(finalPath).toBe(`/en${expectedFinalPath}`)
})
test('graphql reference paths with child pages', async () => {
const sclarRes = await get('/en/v4/scalar/boolean')
expect(sclarRes.statusCode).toBe(301)
const sclarResFinalPath = `/en/${nonEnterpriseDefaultVersion}/graphql/reference/scalars#boolean`
expect(sclarRes.headers.location).toBe(sclarResFinalPath)
const enumRes = await get('/en/v4/enum/searchtype')
expect(enumRes.statusCode).toBe(301)
const enumResFinalPath = `/en/${nonEnterpriseDefaultVersion}/graphql/reference/enums#searchtype`
expect(enumRes.headers.location).toBe(enumResFinalPath)
})
})
}
if (!process.env.FEATURE_NEW_VERSIONS) {
describe('redirects /v4 requests to /graphql', () => {
test('graphql homepage', async () => {
const res = await get('/v4')
expect(res.statusCode).toBe(301)
const expectedFinalPath = '/en/graphql'
expect(res.headers.location).toBe(expectedFinalPath)
})
test('graphql enterprise homepage', async () => {
const res = await get('/enterprise/v4', { followAllRedirects: true })
expect(res.statusCode).toBe(200)
const finalPath = (new URL(res.request.url)).pathname
const expectedFinalPath = `/en/enterprise/${enterpriseServerReleases.latest}/user/graphql`
expect(finalPath).toBe(expectedFinalPath)
})
test('graphql overview paths', async () => {
const oldPath = '/v4/breaking_changes'
const newPath = '/graphql/overview/breaking-changes'
const res = await get(oldPath)
expect(res.statusCode).toBe(301)
expect(res.headers.location).toBe(`/en${newPath}`)
const enterpriseRes = await get(`/enterprise${oldPath}`, { followAllRedirects: true })
expect(enterpriseRes.statusCode).toBe(200)
const finalPath = (new URL(enterpriseRes.request.url)).pathname
const expectedFinalPath = `/enterprise/${enterpriseServerReleases.latest}/user${newPath}`
expect(finalPath).toBe(`/en${expectedFinalPath}`)
})
test('graphql reference paths with child pages', async () => {
const sclarRes = await get('/en/v4/scalar/boolean')
expect(sclarRes.statusCode).toBe(301)
const sclarResFinalPath = '/en/graphql/reference/scalars#boolean'
expect(sclarRes.headers.location).toBe(sclarResFinalPath)
const enumRes = await get('/en/v4/enum/searchtype')
expect(enumRes.statusCode).toBe(301)
const enumResFinalPath = '/en/graphql/reference/enums#searchtype'
expect(enumRes.headers.location).toBe(enumResFinalPath)
})
})
}
if (process.env.FEATURE_NEW_VERSIONS) {
test('redirects /v3 requests to /rest', async () => {
let expectedFinalPath
let res = await get('/v3')
expect(res.statusCode).toBe(301) expect(res.statusCode).toBe(301)
expectedFinalPath = process.env.FEATURE_NEW_VERSIONS const expectedFinalPath = `/en/${nonEnterpriseDefaultVersion}/graphql`
? `/en/${nonEnterpriseDefaultVersion}/rest`
: '/en/rest'
expect(res.headers.location).toBe(expectedFinalPath)
// REST subresources like activity notifications don't have their own page
// any more, so redirect to an anchor on the resource page
res = await get('/en/v3/activity')
expect(res.statusCode).toBe(301)
expectedFinalPath = process.env.FEATURE_NEW_VERSIONS
? `/en/${nonEnterpriseDefaultVersion}/rest/reference/activity`
: '/en/rest/reference/activity'
expect(res.headers.location).toBe(expectedFinalPath)
// REST subresources like activity notifications don't have their own page
// any more, so redirect to an anchor on the resource page
res = await get('/en/v3/activity/notifications')
expect(res.statusCode).toBe(301)
expectedFinalPath = process.env.FEATURE_NEW_VERSIONS
? `/en/${nonEnterpriseDefaultVersion}/rest/reference/activity#notifications`
: '/en/rest/reference/activity#notifications'
expect(res.headers.location).toBe(expectedFinalPath)
// trailing slashes are handled separately by the `slashes` module;
// any request to a /v3 URL with a trailing slash will be redirected twice
res = await get('/en/v3/activity/notifications/')
expect(res.statusCode).toBe(301)
expect(res.headers.location).toBe('/en/v3/activity/notifications')
// non-reference redirects (e.g. guides)
res = await get('/en/v3/guides/basics-of-authentication')
expect(res.statusCode).toBe(301)
expectedFinalPath = process.env.FEATURE_NEW_VERSIONS
? `/en/${nonEnterpriseDefaultVersion}/rest/guides/basics-of-authentication`
: '/en/rest/guides/basics-of-authentication'
expect(res.headers.location).toBe(expectedFinalPath) expect(res.headers.location).toBe(expectedFinalPath)
}) })
}
if (!process.env.FEATURE_NEW_VERSIONS) { test('graphql enterprise homepage', async () => {
test('redirects /v3 requests to /rest', async () => { const res = await get('/enterprise/v4', { followAllRedirects: true })
let expectedFinalPath expect(res.statusCode).toBe(200)
let res = await get('/v3') const finalPath = (new URL(res.request.url)).pathname
expect(res.statusCode).toBe(301) const expectedFinalPath = `/en/enterprise-server@${enterpriseServerReleases.latest}/graphql`
expectedFinalPath = process.env.FEATURE_NEW_VERSIONS expect(finalPath).toBe(expectedFinalPath)
? `/en/${nonEnterpriseDefaultVersion}/rest`
: '/en/rest'
expect(res.headers.location).toBe(expectedFinalPath)
// REST subresources like activity notifications don't have their own page
// any more, so redirect to an anchor on the resource page
res = await get('/en/v3/activity')
expect(res.statusCode).toBe(301)
expectedFinalPath = process.env.FEATURE_NEW_VERSIONS
? `/en/${nonEnterpriseDefaultVersion}/rest/reference/activity`
: '/en/rest/reference/activity'
expect(res.headers.location).toBe(expectedFinalPath)
// REST subresources like activity notifications don't have their own page
// any more, so redirect to an anchor on the resource page
res = await get('/en/v3/activity/notifications')
expect(res.statusCode).toBe(301)
expectedFinalPath = process.env.FEATURE_NEW_VERSIONS
? `/en/${nonEnterpriseDefaultVersion}/rest/reference/activity#notifications`
: '/en/rest/reference/activity#notifications'
expect(res.headers.location).toBe(expectedFinalPath)
// trailing slashes are handled separately by the `slashes` module;
// any request to a /v3 URL with a trailing slash will be redirected twice
res = await get('/en/v3/activity/notifications/')
expect(res.statusCode).toBe(301)
expect(res.headers.location).toBe('/en/v3/activity/notifications')
// non-reference redirects (e.g. guides)
res = await get('/en/v3/guides/basics-of-authentication')
expect(res.statusCode).toBe(301)
expectedFinalPath = process.env.FEATURE_NEW_VERSIONS
? `/en/${nonEnterpriseDefaultVersion}/rest/guides/basics-of-authentication`
: '/en/rest/guides/basics-of-authentication'
expect(res.headers.location).toBe(expectedFinalPath)
}) })
}
test('graphql overview paths', async () => {
const oldPath = '/v4/breaking_changes'
const newPath = `/${nonEnterpriseDefaultVersion}/graphql/overview/breaking-changes`
const res = await get(oldPath)
expect(res.statusCode).toBe(301)
expect(res.headers.location).toBe(`/en${newPath}`)
const enterpriseRes = await get(`/enterprise${oldPath}`, { followAllRedirects: true })
expect(enterpriseRes.statusCode).toBe(200)
const finalPath = (new URL(enterpriseRes.request.url)).pathname
const expectedFinalPath = newPath.replace(nonEnterpriseDefaultVersion, `enterprise-server@${enterpriseServerReleases.latest}`)
expect(finalPath).toBe(`/en${expectedFinalPath}`)
})
test('graphql reference paths with child pages', async () => {
const sclarRes = await get('/en/v4/scalar/boolean')
expect(sclarRes.statusCode).toBe(301)
const sclarResFinalPath = `/en/${nonEnterpriseDefaultVersion}/graphql/reference/scalars#boolean`
expect(sclarRes.headers.location).toBe(sclarResFinalPath)
const enumRes = await get('/en/v4/enum/searchtype')
expect(enumRes.statusCode).toBe(301)
const enumResFinalPath = `/en/${nonEnterpriseDefaultVersion}/graphql/reference/enums#searchtype`
expect(enumRes.headers.location).toBe(enumResFinalPath)
})
})
test('redirects /v3 requests to /rest', async () => {
let expectedFinalPath
let res = await get('/v3')
expect(res.statusCode).toBe(301)
expectedFinalPath = `/en/${nonEnterpriseDefaultVersion}/rest`
expect(res.headers.location).toBe(expectedFinalPath)
// REST subresources like activity notifications don't have their own page
// any more, so redirect to an anchor on the resource page
res = await get('/en/v3/activity')
expect(res.statusCode).toBe(301)
expectedFinalPath = `/en/${nonEnterpriseDefaultVersion}/rest/reference/activity`
expect(res.headers.location).toBe(expectedFinalPath)
// REST subresources like activity notifications don't have their own page
// any more, so redirect to an anchor on the resource page
res = await get('/en/v3/activity/notifications')
expect(res.statusCode).toBe(301)
expectedFinalPath = `/en/${nonEnterpriseDefaultVersion}/rest/reference/activity#notifications`
expect(res.headers.location).toBe(expectedFinalPath)
// trailing slashes are handled separately by the `slashes` module;
// any request to a /v3 URL with a trailing slash will be redirected twice
res = await get('/en/v3/activity/notifications/')
expect(res.statusCode).toBe(301)
expect(res.headers.location).toBe('/en/v3/activity/notifications')
// non-reference redirects (e.g. guides)
res = await get('/en/v3/guides/basics-of-authentication')
expect(res.statusCode).toBe(301)
expectedFinalPath = `/en/${nonEnterpriseDefaultVersion}/rest/guides/basics-of-authentication`
expect(res.headers.location).toBe(expectedFinalPath)
})
describe('fixtures', () => { describe('fixtures', () => {
// this fixtures file includes paths like /apps and /webhooks, plus /enterprise paths // this fixtures file includes paths like /apps and /webhooks, plus /enterprise paths
@@ -217,76 +109,36 @@ describe('developer redirects', () => {
) )
}) })
if (process.env.FEATURE_NEW_VERSIONS) { // this fixtures file includes /v3 and /enterprise/v3 paths
// this fixtures file includes /v3 and /enterprise/v3 paths test('rest reference redirects', async () => {
test('rest reference redirects', async () => { await eachOfLimit(
await eachOfLimit( restRedirectFixtures,
restRedirectFixtures, MAX_CONCURRENT_REQUESTS,
MAX_CONCURRENT_REQUESTS, async (newPath, oldPath) => {
async (newPath, oldPath) => { // REST and GraphQL developer Enterprise paths with a version are only supported up to 2.21.
// REST and GraphQL developer Enterprise paths with a version are only supported up to 2.21. // We make an exception to always redirect versionless paths to the latest version.
// We make an exception to always redirect versionless paths to the latest version. newPath = newPath.replace('/enterprise-server/', `/enterprise-server@${enterpriseServerReleases.latest}/`)
newPath = newPath.replace('/enterprise-server/', `/enterprise-server@${enterpriseServerReleases.latest}/`) const res = await get(oldPath)
const res = await get(oldPath) expect(res.statusCode, `${oldPath} did not redirect to ${newPath}`).toBe(301)
expect(res.statusCode, `${oldPath} did not redirect to ${newPath}`).toBe(301) expect(res.headers.location).toBe(newPath)
expect(res.headers.location).toBe(newPath) }
} )
) })
})
}
if (!process.env.FEATURE_NEW_VERSIONS) { // this fixtures file includes /v4 and /enterprise/v4 paths
// this fixtures file includes /v3 and /enterprise/v3 paths test('graphql reference redirects', async () => {
test('rest reference redirects', async () => { await eachOfLimit(
await eachOfLimit( graphqlRedirectFixtures,
restRedirectFixtures, MAX_CONCURRENT_REQUESTS,
MAX_CONCURRENT_REQUESTS, async (newPath, oldPath) => {
async (newPath, oldPath) => { // REST and GraphQL developer Enterprise paths with a version are only supported up to 2.21.
// REST and GraphQL developer Enterprise paths with a version are only supported up to 2.21. // We make an exception to always redirect versionless paths to the latest version.
// We make an exception to always redirect versionless paths to the latest version. newPath = newPath.replace('/enterprise-server/', `/enterprise-server@${enterpriseServerReleases.latest}/`)
newPath = newPath.replace('/enterprise/user', `/enterprise/${enterpriseServerReleases.latest}/user`) const res = await get(oldPath)
const res = await get(oldPath) expect(res.statusCode, `${oldPath} did not redirect to ${newPath}`).toBe(301)
expect(res.statusCode, `${oldPath} did not redirect to ${newPath}`).toBe(301) expect(res.headers.location).toBe(newPath)
expect(res.headers.location).toBe(newPath) }
} )
) })
})
}
if (process.env.FEATURE_NEW_VERSIONS) {
// this fixtures file includes /v4 and /enterprise/v4 paths
test('graphql reference redirects', async () => {
await eachOfLimit(
graphqlRedirectFixtures,
MAX_CONCURRENT_REQUESTS,
async (newPath, oldPath) => {
// REST and GraphQL developer Enterprise paths with a version are only supported up to 2.21.
// We make an exception to always redirect versionless paths to the latest version.
newPath = newPath.replace('/enterprise-server/', `/enterprise-server@${enterpriseServerReleases.latest}/`)
const res = await get(oldPath)
expect(res.statusCode, `${oldPath} did not redirect to ${newPath}`).toBe(301)
expect(res.headers.location).toBe(newPath)
}
)
})
}
if (!process.env.FEATURE_NEW_VERSIONS) {
// this fixtures file includes /v4 and /enterprise/v4 paths
test('graphql reference redirects', async () => {
await eachOfLimit(
graphqlRedirectFixtures,
MAX_CONCURRENT_REQUESTS,
async (newPath, oldPath) => {
// REST and GraphQL developer Enterprise paths with a version are only supported up to 2.21.
// We make an exception to always redirect versionless paths to the latest version.
newPath = newPath.replace('/enterprise/user', `/enterprise/${enterpriseServerReleases.latest}/user`)
const res = await get(oldPath)
expect(res.statusCode, `${oldPath} did not redirect to ${newPath}`).toBe(301)
expect(res.headers.location).toBe(newPath)
}
)
})
}
}) })
}) })

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const path = require('path') const path = require('path')
const { isPlainObject } = require('lodash') const { isPlainObject } = require('lodash')
const supertest = require('supertest') const supertest = require('supertest')
@@ -33,21 +32,12 @@ describe('redirects', () => {
basePath: path.join(__dirname, '../../content'), basePath: path.join(__dirname, '../../content'),
languageCode: 'en' languageCode: 'en'
}) })
if (process.env.FEATURE_NEW_VERSIONS) { expect(page.redirects['/articles']).toBe(`/en/${nonEnterpriseDefaultVersion}/github`)
expect(page.redirects['/articles']).toBe(`/en/${nonEnterpriseDefaultVersion}/github`) expect(page.redirects['/en/articles']).toBe(`/en/${nonEnterpriseDefaultVersion}/github`)
expect(page.redirects['/en/articles']).toBe(`/en/${nonEnterpriseDefaultVersion}/github`) expect(page.redirects['/common-issues-and-questions']).toBe(`/en/${nonEnterpriseDefaultVersion}/github`)
expect(page.redirects['/common-issues-and-questions']).toBe(`/en/${nonEnterpriseDefaultVersion}/github`) expect(page.redirects['/en/common-issues-and-questions']).toBe(`/en/${nonEnterpriseDefaultVersion}/github`)
expect(page.redirects['/en/common-issues-and-questions']).toBe(`/en/${nonEnterpriseDefaultVersion}/github`) expect(page.redirects[`/en/enterprise/${enterpriseServerReleases.latest}/user/articles`]).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}/github`)
expect(page.redirects[`/en/enterprise/${enterpriseServerReleases.latest}/user/articles`]).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}/github`) expect(page.redirects[`/en/enterprise/${enterpriseServerReleases.latest}/user/common-issues-and-questions`]).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}/github`)
expect(page.redirects[`/en/enterprise/${enterpriseServerReleases.latest}/user/common-issues-and-questions`]).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}/github`)
} else {
expect(page.redirects['/articles']).toBe('/en/github')
expect(page.redirects['/en/articles']).toBe('/en/github')
expect(page.redirects['/common-issues-and-questions']).toBe('/en/github')
expect(page.redirects['/en/common-issues-and-questions']).toBe('/en/github')
expect(page.redirects[`/en/enterprise/${enterpriseServerReleases.latest}/user/articles`]).toBe(`/en/enterprise/${enterpriseServerReleases.latest}/user/github`)
expect(page.redirects[`/en/enterprise/${enterpriseServerReleases.latest}/user/common-issues-and-questions`]).toBe(`/en/enterprise/${enterpriseServerReleases.latest}/user/github`)
}
}) })
test('converts single `redirect_from` strings values into arrays', async () => { test('converts single `redirect_from` strings values into arrays', async () => {
@@ -56,9 +46,7 @@ describe('redirects', () => {
basePath: path.join(__dirname, '../../content'), basePath: path.join(__dirname, '../../content'),
languageCode: 'en' languageCode: 'en'
}) })
const expected = process.env.FEATURE_NEW_VERSIONS const expected = `/en/${nonEnterpriseDefaultVersion}/github/collaborating-with-issues-and-pull-requests/about-conversations-on-github`
? `/en/${nonEnterpriseDefaultVersion}/github/collaborating-with-issues-and-pull-requests/about-conversations-on-github`
: '/en/github/collaborating-with-issues-and-pull-requests/about-conversations-on-github'
expect(page.redirects['/en/articles/about-discussions-in-issues-and-pull-requests']).toBe(expected) expect(page.redirects['/en/articles/about-discussions-in-issues-and-pull-requests']).toBe(expected)
}) })
@@ -66,34 +54,26 @@ describe('redirects', () => {
test('are preserved in redirected URLs', async () => { test('are preserved in redirected URLs', async () => {
const res = await get('/enterprise/admin?query=pulls') const res = await get('/enterprise/admin?query=pulls')
expect(res.statusCode).toBe(301) expect(res.statusCode).toBe(301)
const expected = process.env.FEATURE_NEW_VERSIONS const expected = `/en/enterprise-server@${enterpriseServerReleases.latest}/admin?query=pulls`
? `/en/enterprise-server@${enterpriseServerReleases.latest}/admin?query=pulls`
: `/en/enterprise/${enterpriseServerReleases.latest}/admin?query=pulls`
expect(res.headers.location).toBe(expected) expect(res.headers.location).toBe(expected)
}) })
test('have q= converted to query=', async () => { test('have q= converted to query=', async () => {
const res = await get('/en/enterprise/admin?q=pulls') const res = await get('/en/enterprise/admin?q=pulls')
expect(res.statusCode).toBe(301) expect(res.statusCode).toBe(301)
const expected = process.env.FEATURE_NEW_VERSIONS const expected = `/en/enterprise-server@${enterpriseServerReleases.latest}/admin?query=pulls`
? `/en/enterprise-server@${enterpriseServerReleases.latest}/admin?query=pulls`
: `/en/enterprise/${enterpriseServerReleases.latest}/admin?query=pulls`
expect(res.headers.location).toBe(expected) expect(res.headers.location).toBe(expected)
}) })
test('work with redirected search paths', async () => { test('work with redirected search paths', async () => {
const res = await get('/en/enterprise/admin/search?utf8=%E2%9C%93&query=pulls') const res = await get('/en/enterprise/admin/search?utf8=%E2%9C%93&query=pulls')
expect(res.statusCode).toBe(301) expect(res.statusCode).toBe(301)
const expected = process.env.FEATURE_NEW_VERSIONS const expected = `/en/enterprise-server@${enterpriseServerReleases.latest}/admin?utf8=%E2%9C%93&query=pulls`
? `/en/enterprise-server@${enterpriseServerReleases.latest}/admin?utf8=%E2%9C%93&query=pulls`
: `/en/enterprise/${enterpriseServerReleases.latest}/admin?utf8=%E2%9C%93&query=pulls`
expect(res.headers.location).toBe(expected) expect(res.headers.location).toBe(expected)
}) })
test('do not work on other paths that include "search"', async () => { test('do not work on other paths that include "search"', async () => {
const reqPath = process.env.FEATURE_NEW_VERSIONS const reqPath = `/en/enterprise-server@${enterpriseServerReleases.latest}/admin/configuration/enabling-unified-search-between-github-enterprise-server-and-githubcom`
? `/en/enterprise-server@${enterpriseServerReleases.latest}/admin/configuration/enabling-unified-search-between-github-enterprise-server-and-githubcom`
: `/en/enterprise/${enterpriseServerReleases.latest}/admin/configuration/enabling-unified-search-between-github-enterprise-server-and-githubcom`
const res = await get(reqPath) const res = await get(reqPath)
expect(res.statusCode).toBe(200) expect(res.statusCode).toBe(200)
}) })
@@ -142,18 +122,13 @@ describe('redirects', () => {
test('redirect_from for renamed pages', async () => { test('redirect_from for renamed pages', async () => {
const { res } = await get('/ja/desktop/contributing-to-projects/changing-a-remote-s-url-from-github-desktop') const { res } = await get('/ja/desktop/contributing-to-projects/changing-a-remote-s-url-from-github-desktop')
expect(res.statusCode).toBe(301) expect(res.statusCode).toBe(301)
const expected = process.env.FEATURE_NEW_VERSIONS const expected = `/ja/${nonEnterpriseDefaultVersion}/desktop/contributing-and-collaborating-using-github-desktop/changing-a-remotes-url-from-github-desktop`
? `/ja/${nonEnterpriseDefaultVersion}/desktop/contributing-and-collaborating-using-github-desktop/changing-a-remotes-url-from-github-desktop`
: '/ja/desktop/contributing-and-collaborating-using-github-desktop/changing-a-remotes-url-from-github-desktop'
expect(res.headers.location).toBe(expected) expect(res.headers.location).toBe(expected)
}) })
}) })
describe('enterprise home page', () => { describe('enterprise home page', () => {
const enterpriseHome = process.env.FEATURE_NEW_VERSIONS const enterpriseHome = `/en/enterprise-server@${enterpriseServerReleases.latest}`
? `/en/enterprise-server@${enterpriseServerReleases.latest}`
: `/en/enterprise/${enterpriseServerReleases.latest}`
const japaneseEnterpriseHome = enterpriseHome.replace('/en/', '/ja/') const japaneseEnterpriseHome = enterpriseHome.replace('/en/', '/ja/')
test('/enterprise', async () => { test('/enterprise', async () => {
@@ -210,10 +185,7 @@ describe('redirects', () => {
}) })
describe('enterprise admin', () => { describe('enterprise admin', () => {
const enterpriseAdmin = process.env.FEATURE_NEW_VERSIONS const enterpriseAdmin = `/en/enterprise-server@${enterpriseServerReleases.latest}/admin`
? `/en/enterprise-server@${enterpriseServerReleases.latest}/admin`
: `/en/enterprise/${enterpriseServerReleases.latest}/admin`
const japaneseEnterpriseAdmin = enterpriseAdmin.replace('/en/', '/ja/') const japaneseEnterpriseAdmin = enterpriseAdmin.replace('/en/', '/ja/')
test('no language code redirects to english', async () => { test('no language code redirects to english', async () => {
@@ -245,9 +217,7 @@ describe('redirects', () => {
expect(res.statusCode).toBe(301) expect(res.statusCode).toBe(301)
const redirectRes = await get(res.headers.location) const redirectRes = await get(res.headers.location)
expect(redirectRes.statusCode).toBe(200) expect(redirectRes.statusCode).toBe(200)
const expected = process.env.FEATURE_NEW_VERSIONS const expected = `/en/enterprise-server@${enterpriseServerReleases.latest}/admin/enterprise-management/upgrading-github-enterprise-server`
? `/en/enterprise-server@${enterpriseServerReleases.latest}/admin/enterprise-management/upgrading-github-enterprise-server`
: `/en/enterprise/${enterpriseServerReleases.latest}/admin/enterprise-management/upgrading-github-enterprise-server`
expect(res.headers.location).toBe(expected) expect(res.headers.location).toBe(expected)
}) })
@@ -265,10 +235,7 @@ describe('redirects', () => {
}) })
describe('enterprise user homepage', () => { describe('enterprise user homepage', () => {
const enterpriseUser = process.env.FEATURE_NEW_VERSIONS const enterpriseUser = `/en/enterprise-server@${enterpriseServerReleases.latest}/github`
? `/en/enterprise-server@${enterpriseServerReleases.latest}/github`
: `/en/enterprise/${enterpriseServerReleases.latest}/user/github`
const japaneseEnterpriseUser = enterpriseUser.replace('/en/', '/ja/') const japaneseEnterpriseUser = enterpriseUser.replace('/en/', '/ja/')
test('no product redirects to GitHub.com product', async () => { test('no product redirects to GitHub.com product', async () => {
@@ -297,10 +264,7 @@ describe('redirects', () => {
}) })
describe('enterprise user article', () => { describe('enterprise user article', () => {
const userArticle = process.env.FEATURE_NEW_VERSIONS const userArticle = `/en/enterprise-server@${enterpriseServerReleases.latest}/github/getting-started-with-github/set-up-git`
? `/en/enterprise-server@${enterpriseServerReleases.latest}/github/getting-started-with-github/set-up-git`
: `/en/enterprise/${enterpriseServerReleases.latest}/user/github/getting-started-with-github/set-up-git`
const japaneseUserArticle = userArticle.replace('/en/', '/ja/') const japaneseUserArticle = userArticle.replace('/en/', '/ja/')
test('no product redirects to GitHub.com product on the latest version', async () => { test('no product redirects to GitHub.com product on the latest version', async () => {
@@ -335,11 +299,8 @@ describe('redirects', () => {
}) })
describe('enterprise user article with frontmatter redirect', () => { describe('enterprise user article with frontmatter redirect', () => {
const userArticle = process.env.FEATURE_NEW_VERSIONS const userArticle = `/en/enterprise-server@${enterpriseServerReleases.latest}/github/getting-started-with-github/access-permissions-on-github`
? `/en/enterprise-server@${enterpriseServerReleases.latest}/github/getting-started-with-github/access-permissions-on-github`
: `/en/enterprise/${enterpriseServerReleases.latest}/user/github/getting-started-with-github/access-permissions-on-github`
const redirectFromPath = '/articles/what-are-the-different-access-permissions' const redirectFromPath = '/articles/what-are-the-different-access-permissions'
const japaneseUserArticle = userArticle.replace('/en/', '/ja/') const japaneseUserArticle = userArticle.replace('/en/', '/ja/')
test('redirects to expected article', async () => { test('redirects to expected article', async () => {
@@ -368,10 +329,7 @@ describe('redirects', () => {
}) })
describe('desktop guide', () => { describe('desktop guide', () => {
const desktopGuide = process.env.FEATURE_NEW_VERSIONS const desktopGuide = `/en/${nonEnterpriseDefaultVersion}/desktop/contributing-and-collaborating-using-github-desktop/creating-an-issue-or-pull-request`
? `/en/${nonEnterpriseDefaultVersion}/desktop/contributing-and-collaborating-using-github-desktop/creating-an-issue-or-pull-request`
: '/en/desktop/contributing-and-collaborating-using-github-desktop/creating-an-issue-or-pull-request'
const japaneseDesktopGuides = desktopGuide.replace('/en/', '/ja/') const japaneseDesktopGuides = desktopGuide.replace('/en/', '/ja/')
test('no language code redirects to english', async () => { test('no language code redirects to english', async () => {

View File

@@ -1,20 +1,16 @@
require('../../lib/feature-flags')
const path = require('path') const path = require('path')
const Page = require('../../lib/page') const Page = require('../../lib/page')
const loadRedirects = require('../../lib/redirects/precompile') const loadRedirects = require('../../lib/redirects/precompile')
const findPage = require('../../lib/find-page') const findPage = require('../../lib/find-page')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
describe('find page', () => { describe('find page', () => {
jest.setTimeout(1000 * 1000) jest.setTimeout(1000 * 1000)
testFeatureNewVersions('falls back to the English page if it can\'t find a localized page', async () => { test('falls back to the English page if it can\'t find a localized page', async () => {
const page = new Page({ const page = new Page({
relativePath: 'page-that-does-not-exist-in-translations-dir.md', relativePath: 'page-that-does-not-exist-in-translations-dir.md',
basePath: path.join(__dirname, '../fixtures/new-versions'), basePath: path.join(__dirname, '../fixtures'),
languageCode: 'en' languageCode: 'en'
}) })
const pages = [page] const pages = [page]
@@ -28,27 +24,10 @@ describe('find page', () => {
expect(typeof localizedPage.title).toBe('string') expect(typeof localizedPage.title).toBe('string')
}) })
testFeatureOldVersions('falls back to the English page if it can\'t find a localized page', async () => { test('follows redirects', async () => {
const page = new Page({
relativePath: 'page-that-does-not-exist-in-translations-dir.md',
basePath: path.join(__dirname, '../fixtures'),
languageCode: 'en'
})
const pages = [page]
// add named keys
for (const page of pages) {
pages[`/en/${page.relativePath}`] = page
}
const localizedPage = findPage(page.relativePath, pages, {}, 'ja')
expect(typeof localizedPage.title).toBe('string')
})
testFeatureNewVersions('follows redirects', async () => {
const page = new Page({ const page = new Page({
relativePath: 'page-with-redirects.md', relativePath: 'page-with-redirects.md',
basePath: path.join(__dirname, '../fixtures/new-versions'), basePath: path.join(__dirname, '../fixtures'),
languageCode: 'en' languageCode: 'en'
}) })
const pages = [page] const pages = [page]
@@ -62,22 +41,4 @@ describe('find page', () => {
const redirectedPage = findPage('some-old-path', pages, redirects, 'en') const redirectedPage = findPage('some-old-path', pages, redirects, 'en')
expect(typeof redirectedPage.title).toBe('string') expect(typeof redirectedPage.title).toBe('string')
}) })
testFeatureOldVersions('follows redirects', async () => {
const page = new Page({
relativePath: 'page-with-redirects.md',
basePath: path.join(__dirname, '../fixtures'),
languageCode: 'en'
})
const pages = [page]
// add named keys
for (const page of pages) {
pages[`/en/${page.relativePath.replace('.md', '')}`] = page
}
const redirects = await loadRedirects(pages)
const redirectedPage = findPage('some-old-path', pages, redirects, 'en')
expect(typeof redirectedPage.title).toBe('string')
})
}) })

View File

@@ -1,20 +1,16 @@
require('../../lib/feature-flags')
const { liquid } = require('../../lib/render-content') const { liquid } = require('../../lib/render-content')
const loadPages = require('../../lib/pages') const loadPages = require('../../lib/pages')
const entities = new (require('html-entities').XmlEntities)() const entities = new (require('html-entities').XmlEntities)()
const { set } = require('lodash') const { set } = require('lodash')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
describe('liquid helper tags', () => { describe('liquid helper tags', () => {
const context = {} const context = {}
let pages let pages
beforeAll(async (done) => { beforeAll(async (done) => {
pages = await loadPages() pages = await loadPages()
context.currentLanguage = 'en' context.currentLanguage = 'en'
context.currentVersion = process.env.FEATURE_NEW_VERSIONS ? nonEnterpriseDefaultVersion : 'dotcom' context.currentVersion = nonEnterpriseDefaultVersion
context.pages = pages context.pages = pages
context.redirects = [] context.redirects = []
context.site = {} context.site = {}
@@ -48,7 +44,7 @@ describe('liquid helper tags', () => {
expect(output).toBe(expected) expect(output).toBe(expected)
}) })
testFeatureNewVersions('link_with_intro tag', async () => { test('link_with_intro tag', async () => {
const template = '{% link_with_intro /contributing-and-collaborating-using-github-desktop %}' const template = '{% link_with_intro /contributing-and-collaborating-using-github-desktop %}'
const page = pages[`/en/${nonEnterpriseDefaultVersion}/desktop/contributing-and-collaborating-using-github-desktop`] const page = pages[`/en/${nonEnterpriseDefaultVersion}/desktop/contributing-and-collaborating-using-github-desktop`]
const expected = `<a class="link-with-intro Bump-link--hover no-underline" href="/en/desktop/contributing-and-collaborating-using-github-desktop"> const expected = `<a class="link-with-intro Bump-link--hover no-underline" href="/en/desktop/contributing-and-collaborating-using-github-desktop">
@@ -59,18 +55,7 @@ describe('liquid helper tags', () => {
expect(output).toBe(expected) expect(output).toBe(expected)
}) })
testFeatureOldVersions('link_with_intro tag', async () => { test('homepage_link_with_intro tag', async () => {
const template = '{% link_with_intro /contributing-and-collaborating-using-github-desktop %}'
const page = pages['/en/desktop/contributing-and-collaborating-using-github-desktop']
const expected = `<a class="link-with-intro Bump-link--hover no-underline" href="/en/desktop/contributing-and-collaborating-using-github-desktop">
<h4 class="link-with-intro-title">${page.title}<span class="Bump-link-symbol">→</span></h4>
</a>
<p class="link-with-intro-intro">${page.intro}</p>`
const output = entities.decode(await liquid.parseAndRender(template, context))
expect(output).toBe(expected)
})
testFeatureNewVersions('homepage_link_with_intro tag', async () => {
const template = '{% homepage_link_with_intro /github/writing-on-github/basic-writing-and-formatting-syntax %}' const template = '{% homepage_link_with_intro /github/writing-on-github/basic-writing-and-formatting-syntax %}'
const page = pages[`/en/${nonEnterpriseDefaultVersion}/github/writing-on-github/basic-writing-and-formatting-syntax`] const page = pages[`/en/${nonEnterpriseDefaultVersion}/github/writing-on-github/basic-writing-and-formatting-syntax`]
const expected = `<a class="link-with-intro Bump-link--hover no-underline d-block offset-lg-2 col-lg-8 mb-5" href="/en/github/writing-on-github/basic-writing-and-formatting-syntax"> const expected = `<a class="link-with-intro Bump-link--hover no-underline d-block offset-lg-2 col-lg-8 mb-5" href="/en/github/writing-on-github/basic-writing-and-formatting-syntax">
@@ -81,17 +66,6 @@ describe('liquid helper tags', () => {
expect(output).toBe(expected) expect(output).toBe(expected)
}) })
testFeatureOldVersions('homepage_link_with_intro tag', async () => {
const template = '{% homepage_link_with_intro /github/writing-on-github/basic-writing-and-formatting-syntax %}'
const page = pages['/en/github/writing-on-github/basic-writing-and-formatting-syntax']
const expected = `<a class="link-with-intro Bump-link--hover no-underline d-block offset-lg-2 col-lg-8 mb-5" href="/en/github/writing-on-github/basic-writing-and-formatting-syntax">
<h4 class="link-with-intro-title h4-mktg">${page.title}<span class="Bump-link-symbol">→</span></h4>
<p class="link-with-intro-intro f5">${page.intro}</p>
</a>`
const output = await liquid.parseAndRender(template, context)
expect(output).toBe(expected)
})
test('link_in_list tag', async () => { test('link_in_list tag', async () => {
const template = '{% link_in_list /contributing-and-collaborating-using-github-desktop %}' const template = '{% link_in_list /contributing-and-collaborating-using-github-desktop %}'
const expected = '- <a class="article-link link Bump-link--hover no-underline" href="/en/desktop/contributing-and-collaborating-using-github-desktop">Contributing and collaborating using GitHub Desktop</a>' const expected = '- <a class="article-link link Bump-link--hover no-underline" href="/en/desktop/contributing-and-collaborating-using-github-desktop">Contributing and collaborating using GitHub Desktop</a>'

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const { liquid } = require('../../lib/render-content') const { liquid } = require('../../lib/render-content')
const template = ` const template = `
{% if page.version ver_gt "2.13" %}up to date{% endif %} {% if page.version ver_gt "2.13" %}up to date{% endif %}

View File

@@ -1,16 +1,10 @@
require('../../lib/feature-flags')
const path = require('path') const path = require('path')
const cheerio = require('cheerio') const cheerio = require('cheerio')
const Page = require('../../lib/page') const Page = require('../../lib/page')
const enterpriseServerReleases = require('../../lib/enterprise-server-releases') const enterpriseServerReleases = require('../../lib/enterprise-server-releases')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
// get the `free-pro-team` segment of `free-pro-team@latest` // get the `free-pro-team` segment of `free-pro-team@latest`
const nonEnterpriseDefaultPlan = process.env.FEATURE_NEW_VERSIONS && nonEnterpriseDefaultVersion.split('@')[0] const nonEnterpriseDefaultPlan = nonEnterpriseDefaultVersion.split('@')[0]
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
const describeFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? describe : describe.skip
const describeFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? describe.skip : describe
const opts = { const opts = {
relativePath: 'github/collaborating-with-issues-and-pull-requests/about-branches.md', relativePath: 'github/collaborating-with-issues-and-pull-requests/about-branches.md',
@@ -25,16 +19,7 @@ describe('Page class', () => {
expect(page.fullPath.includes(page.relativePath)).toBe(true) expect(page.fullPath.includes(page.relativePath)).toBe(true)
}) })
testFeatureNewVersions('does not error out on translated TOC with no links', () => { test('does not error out on translated TOC with no links', () => {
const page = new Page({
relativePath: 'translated-toc-with-no-links-index.md',
basePath: path.join(__dirname, '../fixtures/new-versions'),
languageCode: 'ja'
})
expect(typeof page.title).toBe('string')
})
testFeatureOldVersions('does not error out on translated TOC with no links', () => {
const page = new Page({ const page = new Page({
relativePath: 'translated-toc-with-no-links-index.md', relativePath: 'translated-toc-with-no-links-index.md',
basePath: path.join(__dirname, '../fixtures'), basePath: path.join(__dirname, '../fixtures'),
@@ -43,51 +28,7 @@ describe('Page class', () => {
expect(typeof page.title).toBe('string') expect(typeof page.title).toBe('string')
}) })
describeFeatureNewVersions('showMiniToc page property', () => { describe('showMiniToc page property', () => {
const article = new Page({
relativePath: 'sample-article.md',
basePath: path.join(__dirname, '../fixtures/new-versions'),
languageCode: 'en'
})
const articleWithFM = new Page({
showMiniToc: false,
relativePath: article.relativePath,
basePath: article.basePath,
languageCode: article.languageCode
})
const tocPage = new Page({
relativePath: 'sample-toc-index.md',
basePath: path.join(__dirname, '../fixtures/new-versions'),
languageCode: 'en'
})
const mapTopic = new Page({
mapTopic: true,
relativePath: article.relativePath,
basePath: article.basePath,
languageCode: article.languageCode
})
test('is true by default on articles', () => {
expect(article.showMiniToc).toBe(true)
})
test('is false on articles when set in frontmatter', () => {
expect(articleWithFM.showMiniToc).toBe(false)
})
test('is undefined by default on index.md pages', () => {
expect(tocPage.showMiniToc).toBeUndefined()
})
test('is undefined by default on map topics', () => {
expect(mapTopic.showMiniToc).toBeUndefined()
})
})
describeFeatureOldVersions('showMiniToc page property', () => {
const article = new Page({ const article = new Page({
relativePath: 'sample-article.md', relativePath: 'sample-article.md',
basePath: path.join(__dirname, '../fixtures'), basePath: path.join(__dirname, '../fixtures'),
@@ -132,7 +73,7 @@ describe('Page class', () => {
}) })
describe('page.render(context)', () => { describe('page.render(context)', () => {
testFeatureNewVersions('rewrites links to include the current language prefix and version', async () => { test('rewrites links to include the current language prefix and version', async () => {
const page = new Page(opts) const page = new Page(opts)
const context = { const context = {
page: { version: nonEnterpriseDefaultVersion }, page: { version: nonEnterpriseDefaultVersion },
@@ -148,23 +89,7 @@ describe('Page class', () => {
expect($(`a[href="/en/${nonEnterpriseDefaultVersion}/articles/about-pull-requests"]`).length).toBeGreaterThan(0) expect($(`a[href="/en/${nonEnterpriseDefaultVersion}/articles/about-pull-requests"]`).length).toBeGreaterThan(0)
}) })
testFeatureOldVersions('rewrites links to include the current language prefix', async () => { test('does not rewrite links that include deprecated enterprise release numbers', async () => {
const page = new Page(opts)
const context = {
page: { version: 'dotcom' },
currentVersion: 'dotcom',
currentPath: '/en/github/collaborating-with-issues-and-pull-requests/about-branches',
currentLanguage: 'en'
}
const rendered = await page.render(context)
const $ = cheerio.load(rendered)
expect(page.markdown.includes('(/articles/about-pull-requests)')).toBe(true)
expect(page.markdown.includes('(/en/articles/about-pull-requests)')).toBe(false)
expect($('a[href="/articles/about-pull-requests"]').length).toBe(0)
expect($('a[href="/en/articles/about-pull-requests"]').length).toBeGreaterThan(0)
})
testFeatureNewVersions('does not rewrite links that include deprecated enterprise release numbers', async () => {
const page = new Page({ const page = new Page({
relativePath: 'admin/enterprise-management/migrating-from-github-enterprise-1110x-to-2123.md', relativePath: 'admin/enterprise-management/migrating-from-github-enterprise-1110x-to-2123.md',
basePath: path.join(__dirname, '../../content'), basePath: path.join(__dirname, '../../content'),
@@ -183,26 +108,7 @@ describe('Page class', () => {
expect($('a[href="/en/enterprise/11.10.340/admin/articles/upgrading-to-the-latest-release"]').length).toBeGreaterThan(0) expect($('a[href="/en/enterprise/11.10.340/admin/articles/upgrading-to-the-latest-release"]').length).toBeGreaterThan(0)
}) })
testFeatureOldVersions('does not rewrite links that include deprecated enterprise release numbers', async () => { test('does not rewrite links to external redirects', async () => {
const page = new Page({
relativePath: 'enterprise/admin/enterprise-management/migrating-from-github-enterprise-1110x-to-2123.md',
basePath: path.join(__dirname, '../../content'),
languageCode: 'en'
})
const context = {
page: { version: enterpriseServerReleases.latest },
currentVersion: enterpriseServerReleases.latest,
currentPath: `/en/enterprise/${enterpriseServerReleases.latest}/admin/enterprise-management/migrating-from-github-enterprise-1110x-to-2123`,
currentLanguage: 'en'
}
const rendered = await page.render(context)
const $ = cheerio.load(rendered)
expect(page.markdown.includes('(/enterprise/11.10.340/admin/articles/upgrading-to-the-latest-release/)')).toBe(true)
expect($(`a[href="/en/enterprise/${enterpriseServerReleases.latest}/admin/articles/upgrading-to-the-latest-release"]`).length).toBe(0)
expect($('a[href="/en/enterprise/11.10.340/admin/articles/upgrading-to-the-latest-release"]').length).toBeGreaterThan(0)
})
testFeatureNewVersions('does not rewrite links to external redirects', async () => {
const page = new Page(opts) const page = new Page(opts)
page.markdown = `${page.markdown}\n\nSee [Capistrano](/capistrano).` page.markdown = `${page.markdown}\n\nSee [Capistrano](/capistrano).`
const context = { const context = {
@@ -215,20 +121,6 @@ describe('Page class', () => {
const $ = cheerio.load(rendered) const $ = cheerio.load(rendered)
expect($('a[href="/capistrano"]').length).toBe(1) expect($('a[href="/capistrano"]').length).toBe(1)
}) })
testFeatureOldVersions('does not rewrite links to external redirects', async () => {
const page = new Page(opts)
page.markdown = `${page.markdown}\n\nSee [Capistrano](/capistrano).`
const context = {
page: { version: 'dotcom' },
currentVersion: 'dotcom',
currentPath: '/en/github/collaborating-with-issues-and-pull-requests/about-branches',
currentLanguage: 'en'
}
const rendered = await page.render(context)
const $ = cheerio.load(rendered)
expect($('a[href="/capistrano"]').length).toBe(1)
})
}) })
test('preserves `languageCode`', () => { test('preserves `languageCode`', () => {
@@ -236,85 +128,49 @@ describe('Page class', () => {
expect(page.languageCode).toBe('en') expect(page.languageCode).toBe('en')
}) })
testFeatureNewVersions('parentProductId getter', () => { test('parentProductId getter', () => {
let page = new Page({ let page = new Page({
relativePath: 'github/some-category/some-article.md', relativePath: 'github/some-category/some-article.md',
basePath: path.join(__dirname, '../fixtures/new-versions/products'), basePath: path.join(__dirname, '../fixtures/products'),
languageCode: 'en' languageCode: 'en'
}) })
expect(page.parentProductId).toBe('github') expect(page.parentProductId).toBe('github')
page = new Page({ page = new Page({
relativePath: 'actions/some-category/some-article.md', relativePath: 'actions/some-category/some-article.md',
basePath: path.join(__dirname, '../fixtures/new-versions/products'), basePath: path.join(__dirname, '../fixtures/products'),
languageCode: 'en' languageCode: 'en'
}) })
expect(page.parentProductId).toBe('actions') expect(page.parentProductId).toBe('actions')
page = new Page({ page = new Page({
relativePath: 'admin/some-category/some-article.md', relativePath: 'admin/some-category/some-article.md',
basePath: path.join(__dirname, '../fixtures/new-versions/products'), basePath: path.join(__dirname, '../fixtures/products'),
languageCode: 'en' languageCode: 'en'
}) })
expect(page.parentProductId).toBe('admin') expect(page.parentProductId).toBe('admin')
}) })
testFeatureOldVersions('parentProductId getter', () => {
let page = new Page({
relativePath: 'github/some-category/some-article.md',
basePath: path.join(__dirname, '../fixtures/products'),
languageCode: 'en'
})
expect(page.parentProductId).toBe('github')
page = new Page({
relativePath: 'actions/some-category/some-article.md',
basePath: path.join(__dirname, '../fixtures/products'),
languageCode: 'en'
})
expect(page.parentProductId).toBe('actions')
page = new Page({
relativePath: 'enterprise/some-category/some-article.md',
basePath: path.join(__dirname, '../fixtures/products'),
languageCode: 'en'
})
expect(page.parentProductId).toBe('enterpriseServer')
})
describe('permalinks', () => { describe('permalinks', () => {
test('is an array', () => { test('is an array', () => {
const page = new Page(opts) const page = new Page(opts)
expect(Array.isArray(page.permalinks)).toBe(true) expect(Array.isArray(page.permalinks)).toBe(true)
}) })
testFeatureNewVersions('has a key for every supported enterprise version (and no deprecated versions)', () => { test('has a key for every supported enterprise version (and no deprecated versions)', () => {
const page = new Page(opts) const page = new Page(opts)
const pageVersions = page.permalinks.map(permalink => permalink.pageVersion) const pageVersions = page.permalinks.map(permalink => permalink.pageVersion)
expect(enterpriseServerReleases.supported.every(version => pageVersions.includes(`enterprise-server@${version}`))).toBe(true) expect(enterpriseServerReleases.supported.every(version => pageVersions.includes(`enterprise-server@${version}`))).toBe(true)
expect(enterpriseServerReleases.deprecated.every(version => !pageVersions.includes(`enterprise-server@${version}`))).toBe(true) expect(enterpriseServerReleases.deprecated.every(version => !pageVersions.includes(`enterprise-server@${version}`))).toBe(true)
}) })
testFeatureOldVersions('has a key for every supported enterprise version (and no deprecated versions)', () => { test('sets versioned values', () => {
const page = new Page(opts)
const pageVersions = page.permalinks.map(permalink => permalink.pageVersion)
expect(enterpriseServerReleases.supported.every(version => pageVersions.includes(version))).toBe(true)
expect(enterpriseServerReleases.deprecated.every(version => !pageVersions.includes(version))).toBe(true)
})
testFeatureNewVersions('sets versioned values', () => {
const page = new Page(opts) const page = new Page(opts)
expect(page.permalinks.find(permalink => permalink.pageVersion === nonEnterpriseDefaultVersion).href).toBe(`/en/${nonEnterpriseDefaultVersion}/github/collaborating-with-issues-and-pull-requests/about-branches`) expect(page.permalinks.find(permalink => permalink.pageVersion === nonEnterpriseDefaultVersion).href).toBe(`/en/${nonEnterpriseDefaultVersion}/github/collaborating-with-issues-and-pull-requests/about-branches`)
expect(page.permalinks.find(permalink => permalink.pageVersion === `enterprise-server@${enterpriseServerReleases.oldestSupported}`).href).toBe(`/en/enterprise-server@${enterpriseServerReleases.oldestSupported}/github/collaborating-with-issues-and-pull-requests/about-branches`) expect(page.permalinks.find(permalink => permalink.pageVersion === `enterprise-server@${enterpriseServerReleases.oldestSupported}`).href).toBe(`/en/enterprise-server@${enterpriseServerReleases.oldestSupported}/github/collaborating-with-issues-and-pull-requests/about-branches`)
}) })
testFeatureOldVersions('sets dotcom and enterprise values', () => { test('homepage permalinks', () => {
const page = new Page(opts)
expect(page.permalinks.find(permalink => permalink.pageVersion === 'dotcom').href).toBe('/en/github/collaborating-with-issues-and-pull-requests/about-branches')
expect(page.permalinks.find(permalink => permalink.pageVersion === enterpriseServerReleases.oldestSupported).href).toBe(`/en/enterprise/${enterpriseServerReleases.oldestSupported}/user/github/collaborating-with-issues-and-pull-requests/about-branches`)
})
testFeatureNewVersions('homepage permalinks', () => {
const page = new Page({ const page = new Page({
relativePath: 'index.md', relativePath: 'index.md',
basePath: path.join(__dirname, '../../content'), basePath: path.join(__dirname, '../../content'),
@@ -325,16 +181,7 @@ describe('Page class', () => {
expect(page.permalinks.find(permalink => permalink.pageVersion === 'homepage').href).toBe('/en') expect(page.permalinks.find(permalink => permalink.pageVersion === 'homepage').href).toBe('/en')
}) })
testFeatureOldVersions('homepage permalinks', () => { test('permalinks for dotcom-only pages', () => {
const page = new Page({
relativePath: 'index.md',
basePath: path.join(__dirname, '../../content'),
languageCode: 'en'
})
expect(page.permalinks[0].href).toBe('/en')
})
testFeatureNewVersions('permalinks for dotcom-only pages', () => {
const page = new Page({ const page = new Page({
relativePath: 'github/getting-started-with-github/signing-up-for-a-new-github-account.md', relativePath: 'github/getting-started-with-github/signing-up-for-a-new-github-account.md',
basePath: path.join(__dirname, '../../content'), basePath: path.join(__dirname, '../../content'),
@@ -344,20 +191,10 @@ describe('Page class', () => {
expect(page.permalinks.length).toBe(1) expect(page.permalinks.length).toBe(1)
}) })
testFeatureOldVersions('permalinks for dotcom-only pages', () => { test('permalinks for enterprise-only pages', () => {
const page = new Page({
relativePath: 'github/getting-started-with-github/signing-up-for-a-new-github-account.md',
basePath: path.join(__dirname, '../../content'),
languageCode: 'en'
})
expect(page.permalinks.find(permalink => permalink.pageVersion === 'dotcom').href).toBe('/en/github/getting-started-with-github/signing-up-for-a-new-github-account')
expect(page.permalinks.length).toBe(1)
})
testFeatureNewVersions('permalinks for enterprise-only pages', () => {
const page = new Page({ const page = new Page({
relativePath: 'products/admin/some-category/some-article.md', relativePath: 'products/admin/some-category/some-article.md',
basePath: path.join(__dirname, '../fixtures/new-versions'), basePath: path.join(__dirname, '../fixtures'),
languageCode: 'en' languageCode: 'en'
}) })
expect(page.permalinks.find(permalink => permalink.pageVersion === `enterprise-server@${enterpriseServerReleases.latest}`).href).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}/products/admin/some-category/some-article`) expect(page.permalinks.find(permalink => permalink.pageVersion === `enterprise-server@${enterpriseServerReleases.latest}`).href).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}/products/admin/some-category/some-article`)
@@ -366,39 +203,17 @@ describe('Page class', () => {
expect(pageVersions.includes(nonEnterpriseDefaultVersion)).toBe(false) expect(pageVersions.includes(nonEnterpriseDefaultVersion)).toBe(false)
}) })
testFeatureOldVersions('permalinks for enterprise-only pages', () => { test('permalinks for non-GitHub.com products without Enterprise versions', () => {
const page = new Page({
relativePath: 'products/enterprise/some-category/some-article.md',
basePath: path.join(__dirname, '../fixtures'),
languageCode: 'en'
})
expect(page.permalinks.find(permalink => permalink.pageVersion === enterpriseServerReleases.latest).href).toBe(`/en/enterprise/${enterpriseServerReleases.latest}/user/products/enterprise/some-category/some-article`)
const pageVersions = page.permalinks.map(permalink => permalink.pageVersion)
expect(pageVersions.length).toBeGreaterThan(1)
expect(pageVersions.includes('dotcom')).toBe(false)
})
testFeatureNewVersions('permalinks for non-GitHub.com products without Enterprise versions', () => {
const page = new Page({ const page = new Page({
relativePath: 'products/actions/some-category/some-article.md', relativePath: 'products/actions/some-category/some-article.md',
basePath: path.join(__dirname, '../fixtures/new-versions'), basePath: path.join(__dirname, '../fixtures'),
languageCode: 'en' languageCode: 'en'
}) })
expect(page.permalinks.find(permalink => permalink.pageVersion === nonEnterpriseDefaultVersion).href).toBe(`/en/${nonEnterpriseDefaultVersion}/products/actions/some-category/some-article`) expect(page.permalinks.find(permalink => permalink.pageVersion === nonEnterpriseDefaultVersion).href).toBe(`/en/${nonEnterpriseDefaultVersion}/products/actions/some-category/some-article`)
expect(page.permalinks.length).toBe(1) expect(page.permalinks.length).toBe(1)
}) })
testFeatureOldVersions('permalinks for non-GitHub.com products without Enterprise versions', () => { test('permalinks for non-GitHub.com products with Enterprise versions', () => {
const page = new Page({
relativePath: 'products/actions/some-category/some-article.md',
basePath: path.join(__dirname, '../fixtures'),
languageCode: 'en'
})
expect(page.permalinks.find(permalink => permalink.pageVersion === 'dotcom').href).toBe('/en/products/actions/some-category/some-article')
expect(page.permalinks.length).toBe(1)
})
testFeatureNewVersions('permalinks for non-GitHub.com products with Enterprise versions', () => {
const page = new Page({ const page = new Page({
relativePath: '/insights/installing-and-configuring-github-insights/about-github-insights.md', relativePath: '/insights/installing-and-configuring-github-insights/about-github-insights.md',
basePath: path.join(__dirname, '../../content'), basePath: path.join(__dirname, '../../content'),
@@ -409,18 +224,6 @@ describe('Page class', () => {
expect(pageVersions.length).toBeGreaterThan(1) expect(pageVersions.length).toBeGreaterThan(1)
expect(pageVersions.includes(nonEnterpriseDefaultVersion)).toBe(false) expect(pageVersions.includes(nonEnterpriseDefaultVersion)).toBe(false)
}) })
testFeatureOldVersions('permalinks for non-GitHub.com products with Enterprise versions', () => {
const page = new Page({
relativePath: '/insights/installing-and-configuring-github-insights/about-github-insights.md',
basePath: path.join(__dirname, '../../content'),
languageCode: 'en'
})
expect(page.permalinks.find(permalink => permalink.pageVersion === enterpriseServerReleases.latest).href).toBe(`/en/enterprise/${enterpriseServerReleases.latest}/user/insights/installing-and-configuring-github-insights/about-github-insights`)
const pageVersions = page.permalinks.map(permalink => permalink.pageVersion)
expect(pageVersions.length).toBeGreaterThan(1)
expect(pageVersions.includes('dotcom')).toBe(false)
})
}) })
describe('Page.parseFrontmatter()', () => { describe('Page.parseFrontmatter()', () => {
@@ -453,16 +256,7 @@ describe('Page class', () => {
}) })
}) })
testFeatureNewVersions('fixes translated frontmatter that includes verdadero', async () => { test('fixes translated frontmatter that includes verdadero', async () => {
const page = new Page({
relativePath: 'article-with-mislocalized-frontmatter.md',
basePath: path.join(__dirname, '../fixtures/new-versions'),
languageCode: 'ja'
})
expect(page.mapTopic).toBe(true)
})
testFeatureOldVersions('fixes translated frontmatter that includes verdadero', async () => {
const page = new Page({ const page = new Page({
relativePath: 'article-with-mislocalized-frontmatter.md', relativePath: 'article-with-mislocalized-frontmatter.md',
basePath: path.join(__dirname, '../fixtures'), basePath: path.join(__dirname, '../fixtures'),
@@ -476,7 +270,7 @@ describe('Page class', () => {
// There are none of these in the content at this time! // There are none of these in the content at this time!
}) })
testFeatureNewVersions('pages that apply to newer enterprise versions', async () => { test('pages that apply to newer enterprise versions', async () => {
const page = new Page({ const page = new Page({
relativePath: 'github/administering-a-repository/managing-the-automatic-deletion-of-branches.md', relativePath: 'github/administering-a-repository/managing-the-automatic-deletion-of-branches.md',
basePath: path.join(__dirname, '../../content'), basePath: path.join(__dirname, '../../content'),
@@ -486,17 +280,7 @@ describe('Page class', () => {
expect(page.versions['enterprise-server']).toBe('>=2.19') expect(page.versions['enterprise-server']).toBe('>=2.19')
}) })
testFeatureOldVersions('pages that apply to newer enterprise versions', async () => { test('index page', async () => {
const page = new Page({
relativePath: 'github/administering-a-repository/managing-the-automatic-deletion-of-branches.md',
basePath: path.join(__dirname, '../../content'),
languageCode: 'en'
})
expect('dotcom' in page.productVersions).toBe(true)
expect(page.productVersions.enterprise).toBe('>=2.19')
})
testFeatureNewVersions('index page', async () => {
const page = new Page({ const page = new Page({
relativePath: 'index.md', relativePath: 'index.md',
basePath: path.join(__dirname, '../../content'), basePath: path.join(__dirname, '../../content'),
@@ -506,27 +290,7 @@ describe('Page class', () => {
expect(page.versions['enterprise-server']).toBe('*') expect(page.versions['enterprise-server']).toBe('*')
}) })
testFeatureOldVersions('index page', async () => { test('enterprise admin index page', async () => {
const page = new Page({
relativePath: 'index.md',
basePath: path.join(__dirname, '../../content'),
languageCode: 'en'
})
expect(page.productVersions.dotcom).toBe('*')
})
// Note there is no more enterprise/index.md page with the latest versioning changes
testFeatureOldVersions('enterprise index page', async () => {
const page = new Page({
relativePath: 'enterprise/index.md',
basePath: path.join(__dirname, '../../content'),
languageCode: 'en'
})
expect('dotcom' in page.productVersions).toBe(false)
expect(page.productVersions.enterprise).toBe('*')
})
testFeatureNewVersions('enterprise admin index page', async () => {
const page = new Page({ const page = new Page({
relativePath: 'admin/index.md', relativePath: 'admin/index.md',
basePath: path.join(__dirname, '../../content'), basePath: path.join(__dirname, '../../content'),
@@ -536,34 +300,11 @@ describe('Page class', () => {
expect(nonEnterpriseDefaultPlan in page.versions).toBe(false) expect(nonEnterpriseDefaultPlan in page.versions).toBe(false)
expect(page.versions['enterprise-server']).toBe('*') expect(page.versions['enterprise-server']).toBe('*')
}) })
testFeatureOldVersions('enterprise admin index page', async () => {
const page = new Page({
relativePath: 'enterprise/admin/index.md',
basePath: path.join(__dirname, '../../content'),
languageCode: 'en'
})
expect('dotcom' in page.productVersions).toBe(false)
expect(page.productVersions.enterprise).toBe('*')
})
}) })
}) })
describe('catches errors thrown in Page class', () => { describe('catches errors thrown in Page class', () => {
testFeatureNewVersions('frontmatter parsing error', () => { test('frontmatter parsing error', () => {
function getPage () {
return new Page({
relativePath: 'page-with-frontmatter-error.md',
basePath: path.join(__dirname, '../fixtures/new-versions'),
languageCode: 'en'
})
}
expect(getPage).toThrowError('invalid frontmatter entry')
})
testFeatureOldVersions('frontmatter parsing error', () => {
function getPage () { function getPage () {
return new Page({ return new Page({
relativePath: 'page-with-frontmatter-error.md', relativePath: 'page-with-frontmatter-error.md',
@@ -575,7 +316,7 @@ describe('catches errors thrown in Page class', () => {
expect(getPage).toThrowError('invalid frontmatter entry') expect(getPage).toThrowError('invalid frontmatter entry')
}) })
testFeatureNewVersions('missing versions frontmatter', () => { test('missing versions frontmatter', () => {
function getPage () { function getPage () {
return new Page({ return new Page({
relativePath: 'page-with-missing-product-versions.md', relativePath: 'page-with-missing-product-versions.md',
@@ -586,16 +327,4 @@ describe('catches errors thrown in Page class', () => {
expect(getPage).toThrowError('versions') expect(getPage).toThrowError('versions')
}) })
testFeatureOldVersions('missing productVersions', () => {
function getPage () {
return new Page({
relativePath: 'page-with-missing-product-versions.md',
basePath: path.join(__dirname, '../fixtures'),
languageCode: 'en'
})
}
expect(getPage).toThrowError('productVersions')
})
}) })

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const path = require('path') const path = require('path')
const loadPages = require('../../lib/pages') const loadPages = require('../../lib/pages')
const languageCodes = Object.keys(require('../../lib/languages')) const languageCodes = Object.keys(require('../../lib/languages'))

View File

@@ -1,17 +1,13 @@
require('../../lib/feature-flags')
const Permalink = require('../../lib/permalink') const Permalink = require('../../lib/permalink')
const enterpriseServerReleases = require('../../lib/enterprise-server-releases') const enterpriseServerReleases = require('../../lib/enterprise-server-releases')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
// Permalink constructor requires: languageCode, pageVersion, relativePath, title // Permalink constructor requires: languageCode, pageVersion, relativePath, title
// Permalink.derive requires: languageCode, relativePath, title, versions (<- FM prop) // Permalink.derive requires: languageCode, relativePath, title, versions (<- FM prop)
describe('Permalink class', () => { describe('Permalink class', () => {
// We can only use Permalink.derive to get the special 'homepage' permalink // We can only use Permalink.derive to get the special 'homepage' permalink
testFeatureNewVersions('derives info for unversioned homepage', () => { test('derives info for unversioned homepage', () => {
const versions = { const versions = {
'free-pro-team': '*', 'free-pro-team': '*',
'enterprise-server': '*' 'enterprise-server': '*'
@@ -22,68 +18,35 @@ describe('Permalink class', () => {
expect(homepagePermalink.href).toBe('/en') expect(homepagePermalink.href).toBe('/en')
}) })
testFeatureOldVersions('derives info for homepage', () => { test('derives info for non-enterprise versioned homepage', () => {
const permalink = new Permalink('en', 'dotcom', 'index.md', 'Hello World')
expect(permalink.pageVersionTitle).toBe('GitHub.com')
expect(permalink.href).toBe('/en')
})
testFeatureNewVersions('derives info for non-enterprise versioned homepage', () => {
const permalink = new Permalink('en', nonEnterpriseDefaultVersion, 'index.md', 'Hello World') const permalink = new Permalink('en', nonEnterpriseDefaultVersion, 'index.md', 'Hello World')
expect(permalink.pageVersionTitle).toBe('Free, Pro, and Team') expect(permalink.pageVersionTitle).toBe('Free, Pro, and Team')
expect(permalink.href).toBe(`/en/${nonEnterpriseDefaultVersion}`) expect(permalink.href).toBe(`/en/${nonEnterpriseDefaultVersion}`)
}) })
testFeatureNewVersions('derives info for enterprise server versioned homepage', () => { test('derives info for enterprise server versioned homepage', () => {
const permalink = new Permalink('en', `enterprise-server@${enterpriseServerReleases.latest}`, 'index.md', 'Hello World') const permalink = new Permalink('en', `enterprise-server@${enterpriseServerReleases.latest}`, 'index.md', 'Hello World')
expect(permalink.pageVersionTitle).toBe(`Enterprise Server ${enterpriseServerReleases.latest}`) expect(permalink.pageVersionTitle).toBe(`Enterprise Server ${enterpriseServerReleases.latest}`)
expect(permalink.href).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}`) expect(permalink.href).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}`)
}) })
testFeatureNewVersions('derives info for GitHub.com homepage', () => { test('derives info for GitHub.com homepage', () => {
const permalink = new Permalink('en', nonEnterpriseDefaultVersion, 'github/index.md', 'Hello World') const permalink = new Permalink('en', nonEnterpriseDefaultVersion, 'github/index.md', 'Hello World')
expect(permalink.pageVersionTitle).toBe('Free, Pro, and Team') expect(permalink.pageVersionTitle).toBe('Free, Pro, and Team')
expect(permalink.href).toBe(`/en/${nonEnterpriseDefaultVersion}/github`) expect(permalink.href).toBe(`/en/${nonEnterpriseDefaultVersion}/github`)
}) })
testFeatureOldVersions('derives info for GitHub.com homepage', () => { test('derives info for enterprise version of GitHub.com homepage', () => {
const permalink = new Permalink('en', 'dotcom', 'github/index.md', 'Hello World')
expect(permalink.pageVersionTitle).toBe('GitHub.com')
expect(permalink.href).toBe('/en/github')
})
testFeatureNewVersions('derives info for enterprise version of GitHub.com homepage', () => {
const permalink = new Permalink('en', `enterprise-server@${enterpriseServerReleases.latest}`, 'github/index.md', 'Hello World') const permalink = new Permalink('en', `enterprise-server@${enterpriseServerReleases.latest}`, 'github/index.md', 'Hello World')
expect(permalink.pageVersionTitle).toBe(`Enterprise Server ${enterpriseServerReleases.latest}`) expect(permalink.pageVersionTitle).toBe(`Enterprise Server ${enterpriseServerReleases.latest}`)
expect(permalink.href).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}/github`) expect(permalink.href).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}/github`)
}) })
testFeatureOldVersions('derives info for enterprise version of GitHub.com homepage', () => { test('preserves input properties', () => {
const permalink = new Permalink('en', enterpriseServerReleases.latest, 'github/index.md', 'Hello World')
expect(permalink.pageVersionTitle).toBe(`Enterprise Server ${enterpriseServerReleases.latest}`)
expect(permalink.href).toBe(`/en/enterprise/${enterpriseServerReleases.latest}/user/github`)
})
// Note enterprise/index.md no longer exists after the latest versioning changes
testFeatureOldVersions('derives info for enterprise homepage', () => {
const permalink = new Permalink('en', enterpriseServerReleases.latest, 'enterprise/index.md', 'Hello World')
expect(permalink.pageVersionTitle).toBe(`Enterprise Server ${enterpriseServerReleases.latest}`)
expect(permalink.href).toBe(`/en/enterprise/${enterpriseServerReleases.latest}`)
})
testFeatureNewVersions('preserves input properties', () => {
const permalink = new Permalink('en', nonEnterpriseDefaultVersion, 'index.md', 'Hello World') const permalink = new Permalink('en', nonEnterpriseDefaultVersion, 'index.md', 'Hello World')
expect(permalink.languageCode).toBe('en') expect(permalink.languageCode).toBe('en')
expect(permalink.pageVersion).toBe(nonEnterpriseDefaultVersion) expect(permalink.pageVersion).toBe(nonEnterpriseDefaultVersion)
expect(permalink.relativePath).toBe('index.md') expect(permalink.relativePath).toBe('index.md')
expect(permalink.title).toBe('Hello World') expect(permalink.title).toBe('Hello World')
}) })
testFeatureOldVersions('preserves input properties', () => {
const permalink = new Permalink('en', 'dotcom', 'index.md', 'Hello World')
expect(permalink.languageCode).toBe('en')
expect(permalink.pageVersion).toBe('dotcom')
expect(permalink.relativePath).toBe('index.md')
expect(permalink.title).toBe('Hello World')
})
}) })

View File

@@ -1,13 +1,9 @@
require('../../lib/feature-flags')
const revalidator = require('revalidator') const revalidator = require('revalidator')
const products = require('../../lib/all-products') const products = require('../../lib/all-products')
const schema = require('../../lib/products-schema') const schema = require('../../lib/products-schema')
const { getDOM, getJSON } = require('../helpers') const { getDOM, getJSON } = require('../helpers')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
const testFeatureNewVersions = process.env.FEATURE_NEW_VERSIONS ? test : test.skip
const testFeatureOldVersions = process.env.FEATURE_NEW_VERSIONS ? test.skip : test
describe('products module', () => { describe('products module', () => {
test('is an object with product ids as keys', () => { test('is an object with product ids as keys', () => {
expect('github' in products).toBe(true) expect('github' in products).toBe(true)
@@ -26,7 +22,7 @@ describe('products module', () => {
describe('mobile-only products nav', () => { describe('mobile-only products nav', () => {
jest.setTimeout(5 * 60 * 1000) jest.setTimeout(5 * 60 * 1000)
testFeatureNewVersions('renders current product on various product pages for each product', async () => { test('renders current product on various product pages for each product', async () => {
// Note the unversioned homepage at `/` does not have a product selected in the mobile dropdown // Note the unversioned homepage at `/` does not have a product selected in the mobile dropdown
expect((await getDOM('/github'))('#current-product').text().trim()).toBe('GitHub.com') expect((await getDOM('/github'))('#current-product').text().trim()).toBe('GitHub.com')
@@ -41,22 +37,6 @@ describe('mobile-only products nav', () => {
// localized // localized
expect((await getDOM('/ja/desktop'))('#current-product').text().trim()).toBe('GitHub Desktop') expect((await getDOM('/ja/desktop'))('#current-product').text().trim()).toBe('GitHub Desktop')
}) })
testFeatureOldVersions('renders current product on various product pages for each product', async () => {
expect((await getDOM('/'))('#current-product').text().trim()).toBe('GitHub.com')
expect((await getDOM('/github'))('#current-product').text().trim()).toBe('GitHub.com')
// Enterprise user and server
expect((await getDOM('/en/enterprise/admin'))('#current-product').text().trim()).toBe('Enterprise Server')
expect((await getDOM('/en/enterprise/user/github/setting-up-and-managing-your-github-user-account/setting-your-commit-email-address'))('#current-product').text().trim()).toBe('GitHub.com')
expect((await getDOM('/desktop'))('#current-product').text().trim()).toBe('GitHub Desktop')
expect((await getDOM('/actions'))('#current-product').text().trim()).toBe('GitHub Actions')
// localized
expect((await getDOM('/ja/desktop'))('#current-product').text().trim()).toBe('GitHub Desktop')
})
}) })
describe('products middleware', () => { describe('products middleware', () => {
@@ -67,20 +47,13 @@ describe('products middleware', () => {
expect(Array.isArray(products)).toBe(true) expect(Array.isArray(products)).toBe(true)
}) })
testFeatureNewVersions('adds res.context.currentProduct string on homepage', async () => { test('adds res.context.currentProduct string on homepage', async () => {
const currentProduct = await getJSON('/en?json=currentProduct') const currentProduct = await getJSON('/en?json=currentProduct')
expect(currentProduct).toBe('homepage') expect(currentProduct).toBe('homepage')
}) })
testFeatureNewVersions('adds res.context.currentProduct object', async () => { test('adds res.context.currentProduct object', async () => {
const currentProduct = await getJSON(`/en/${nonEnterpriseDefaultVersion}/github?json=currentProduct`) const currentProduct = await getJSON(`/en/${nonEnterpriseDefaultVersion}/github?json=currentProduct`)
expect(currentProduct).toBe('github') expect(currentProduct).toBe('github')
}) })
testFeatureOldVersions('adds res.context.currentProduct object', async () => {
const currentProduct = await getJSON('/en?json=currentProduct')
expect('id' in currentProduct).toBe(true)
expect('name' in currentProduct).toBe(true)
expect('dir' in currentProduct).toBe(true)
})
}) })

View File

@@ -1,10 +1,6 @@
require('../../lib/feature-flags')
const loadPages = require('../../lib/pages') const loadPages = require('../../lib/pages')
const renderContent = require('../../lib/render-content') const renderContent = require('../../lib/render-content')
const allVersions = Object.keys(require('../../lib/all-versions')) const allVersions = Object.keys(require('../../lib/all-versions'))
const { oldVersions } = require('../../lib/old-versions-utils')
const versions = process.env.FEATURE_NEW_VERSIONS ? allVersions : oldVersions
describe('toc links', () => { describe('toc links', () => {
jest.setTimeout(3 * 60 * 1000) jest.setTimeout(3 * 60 * 1000)
@@ -17,7 +13,7 @@ describe('toc links', () => {
const issues = [] const issues = []
for (const pageVersion of versions) { for (const pageVersion of allVersions) {
for (const page of englishIndexPages) { for (const page of englishIndexPages) {
// skip page if it doesn't have a permalink for the current product version // skip page if it doesn't have a permalink for the current product version
if (!page.permalinks.some(permalink => permalink.pageVersion === pageVersion)) continue if (!page.permalinks.some(permalink => permalink.pageVersion === pageVersion)) continue

View File

@@ -1,4 +1,3 @@
require('../../lib/feature-flags')
const revalidator = require('revalidator') const revalidator = require('revalidator')
const allVersions = require('../../lib/all-versions') const allVersions = require('../../lib/all-versions')
const { latest } = require('../../lib/enterprise-server-releases') const { latest } = require('../../lib/enterprise-server-releases')
@@ -6,9 +5,7 @@ const schema = require('../../lib/versions-schema')
const { getJSON } = require('../helpers') const { getJSON } = require('../helpers')
const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version') const nonEnterpriseDefaultVersion = require('../../lib/non-enterprise-default-version')
const describeIf = process.env.FEATURE_NEW_VERSIONS ? describe : describe.skip describe('versions module', () => {
describeIf('versions module', () => {
test('is an object with versions as keys', () => { test('is an object with versions as keys', () => {
expect(nonEnterpriseDefaultVersion in allVersions).toBe(true) expect(nonEnterpriseDefaultVersion in allVersions).toBe(true)
expect(`enterprise-server@${latest}` in allVersions).toBe(true) expect(`enterprise-server@${latest}` in allVersions).toBe(true)
@@ -23,7 +20,7 @@ describeIf('versions module', () => {
}) })
}) })
describeIf('versions middleware', () => { describe('versions middleware', () => {
jest.setTimeout(5 * 60 * 1000) jest.setTimeout(5 * 60 * 1000)
test('adds res.context.allVersions object', async () => { test('adds res.context.allVersions object', async () => {