From 2936a823cc74f511708b6655bc7092a170d4adce Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Thu, 12 Oct 2023 13:41:16 -0400 Subject: [PATCH] Omit page.languageVariants (#44265) --- components/DefaultLayout.tsx | 26 ++++++++++++------- components/context/MainContext.tsx | 3 +-- lib/page.js | 18 ------------- middleware/render-page.js | 4 --- src/frame/pages/app.tsx | 4 +++ src/languages/components/LanguagesContext.tsx | 1 + tests/unit/page.js | 14 ---------- 7 files changed, 22 insertions(+), 48 deletions(-) diff --git a/components/DefaultLayout.tsx b/components/DefaultLayout.tsx index 6b852eb380..6e17974b87 100644 --- a/components/DefaultLayout.tsx +++ b/components/DefaultLayout.tsx @@ -11,6 +11,7 @@ import { RestBanner } from 'src/rest/components/RestBanner' import { useMainContext } from 'components/context/MainContext' import { useTranslation } from 'src/languages/components/useTranslation' import { Breadcrumbs } from 'components/page-header/Breadcrumbs' +import { useLanguages } from 'src/languages/components/LanguagesContext' const MINIMAL_RENDER = Boolean(JSON.parse(process.env.MINIMAL_RENDER || 'false')) @@ -30,6 +31,7 @@ export const DefaultLayout = (props: Props) => { const { t } = useTranslation(['errors', 'meta', 'scroll_button']) const router = useRouter() const metaDescription = page.introPlainText ? page.introPlainText : t('default_description') + const { languages } = useLanguages() // This is only true when we do search indexing which renders every page // just to be able to `cheerio` load the main body (and the meta @@ -66,16 +68,20 @@ export const DefaultLayout = (props: Props) => { {/* For Google and Bots */} {page.hidden && } - {page.languageVariants.map((languageVariant) => { - return ( - - ) - })} + {Object.values(languages) + .filter((lang) => lang.code !== router.locale) + .map((variant) => { + return ( + + ) + })} {/* For local site search indexing */} {page.topics.length > 0 && } diff --git a/components/context/MainContext.tsx b/components/context/MainContext.tsx index ab42f36698..23131b86a3 100644 --- a/components/context/MainContext.tsx +++ b/components/context/MainContext.tsx @@ -55,6 +55,7 @@ type EnterpriseServerReleases = { nextDeprecationDate: string supported: Array } + export type MainContextT = { breadcrumbs: { product: BreadcrumbT @@ -83,7 +84,6 @@ export type MainContextT = { page: { documentType: string type?: string - languageVariants: Array<{ name: string; code: string; hreflang: string; href: string }> topics: Array title: string fullTitle?: string @@ -154,7 +154,6 @@ export const getMainContext = async (req: any, res: any): Promise currentPathWithoutLanguage: req.context.currentPathWithoutLanguage, relativePath: req.context.page?.relativePath, page: { - languageVariants: req.context.page.languageVariants, documentType, type: req.context.page.type || null, title: req.context.page.title, diff --git a/lib/page.js b/lib/page.js index 52d637b0db..43ea51b5fe 100644 --- a/lib/page.js +++ b/lib/page.js @@ -1,14 +1,11 @@ import assert from 'assert' import path from 'path' import cheerio from 'cheerio' -import patterns from './patterns.js' import getApplicableVersions from '#src/versions/lib/get-applicable-versions.js' import generateRedirectsForPermalinks from '#src/redirects/lib/permalinks.js' import getEnglishHeadings from './get-english-headings.js' import getTocItems from './get-toc-items.js' -import pathUtils from './path-utils.js' import Permalink from './permalink.js' -import languages from '#src/languages/lib/languages.js' import { renderContent } from '#src/content-render/index.js' import processLearningTracks from '#src/learning-track/lib/process-learning-tracks.js' import { productMap } from './all-products.js' @@ -329,21 +326,6 @@ class Page { static getHomepage(requestPath) { return requestPath.replace(/\/articles.*/, '') } - - // given a page path, return an array of objects containing hrefs - // for that page in all languages - static getLanguageVariants(href) { - const suffix = pathUtils.getPathWithoutLanguage(href) - return Object.values(languages).map(({ name, code, hreflang }) => { - // eslint-disable-line - return { - name, - code, - hreflang, - href: `/${code}${suffix}`.replace(patterns.trailingSlash, '$1'), - } - }) - } } export default Page diff --git a/middleware/render-page.js b/middleware/render-page.js index cfb2768772..59827639b3 100644 --- a/middleware/render-page.js +++ b/middleware/render-page.js @@ -3,7 +3,6 @@ import { get } from 'lodash-es' import FailBot from '#src/observability/lib/failbot.js' import patterns from '../lib/patterns.js' import getMiniTocItems from '../lib/get-mini-toc-items.js' -import Page from '../lib/page.js' import { pathLanguagePrefixed } from '#src/languages/lib/languages.js' import statsd from '#src/observability/lib/statsd.js' import { allVersions } from '#src/versions/lib/all-versions.js' @@ -88,9 +87,6 @@ export default async function renderPage(req, res) { res.setHeader('Last-Modified', new Date(page.effectiveDate).toUTCString()) } - // collect URLs for variants of this page in all languages - page.languageVariants = Page.getLanguageVariants(path) - // Stop processing if the connection was already dropped if (isConnectionDropped(req, res)) return diff --git a/src/frame/pages/app.tsx b/src/frame/pages/app.tsx index 7899b19c09..96e1fff37d 100644 --- a/src/frame/pages/app.tsx +++ b/src/frame/pages/app.tsx @@ -125,6 +125,10 @@ MyApp.getInitialProps = async (appContext: AppContext) => { name: langObj.name, code: langObj.code, } + // The `hreflang` is used for the `` tags. + if (langObj.hreflang && langObj.hreflang !== langObj.code) { + languagesContext.languages[langCode].hreflang = langObj.hreflang + } if (langObj.nativeName) { languagesContext.languages[langCode].nativeName = langObj.nativeName } diff --git a/src/languages/components/LanguagesContext.tsx b/src/languages/components/LanguagesContext.tsx index 6f15fd67ed..a90227f82b 100644 --- a/src/languages/components/LanguagesContext.tsx +++ b/src/languages/components/LanguagesContext.tsx @@ -5,6 +5,7 @@ export type LanguageItem = { name: string nativeName?: string code: string + hreflang?: string } export type LanguagesContextT = { diff --git a/tests/unit/page.js b/tests/unit/page.js index 8684c6c66a..d8f3347335 100644 --- a/tests/unit/page.js +++ b/tests/unit/page.js @@ -306,20 +306,6 @@ describe('Page class', () => { }) }) - describe('Page.getLanguageVariants()', () => { - it('returns an array of language variants of the given URL', () => { - const variants = Page.getLanguageVariants('/en') - expect(variants.every((variant) => variant.name)).toBe(true) - expect(variants.every((variant) => variant.code)).toBe(true) - expect(variants.every((variant) => variant.href)).toBe(true) - }) - - it('works for the homepage', () => { - const variants = Page.getLanguageVariants('/en') - expect(variants.find(({ code }) => code === 'en').href).toBe('/en') - }) - }) - describe('page.versions frontmatter', () => { test('pages that use short names in versions frontmatter', async () => { const page = await Page.init({