Convert languages.js to TypeScript (#56393)
This commit is contained in:
@@ -2,9 +2,11 @@ import fs from 'fs'
|
|||||||
import path from 'path'
|
import path from 'path'
|
||||||
|
|
||||||
import frontmatter from 'gray-matter'
|
import frontmatter from 'gray-matter'
|
||||||
import { languageKeys } from '#src/languages/lib/languages.js'
|
|
||||||
import { ROOT } from '#src/frame/lib/constants.js'
|
import { ROOT } from '#src/frame/lib/constants.js'
|
||||||
|
|
||||||
|
// Hard-coded language keys to avoid TypeScript import in config file
|
||||||
|
const languageKeys = ['en', 'es', 'ja', 'pt', 'zh', 'ru', 'fr', 'ko', 'de']
|
||||||
|
|
||||||
const homepage = path.posix.join(ROOT, 'content/index.md')
|
const homepage = path.posix.join(ROOT, 'content/index.md')
|
||||||
const { data } = frontmatter(fs.readFileSync(homepage, 'utf8'))
|
const { data } = frontmatter(fs.readFileSync(homepage, 'utf8'))
|
||||||
const productIds = data.children
|
const productIds = data.children
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import {
|
|||||||
} from '@/frame/middleware/set-fastly-surrogate-key.js'
|
} from '@/frame/middleware/set-fastly-surrogate-key.js'
|
||||||
import { readCompressedJsonFileFallbackLazily } from '@/frame/lib/read-json-file.js'
|
import { readCompressedJsonFileFallbackLazily } from '@/frame/lib/read-json-file.js'
|
||||||
import { archivedCacheControl, languageCacheControl } from '@/frame/middleware/cache-control.js'
|
import { archivedCacheControl, languageCacheControl } from '@/frame/middleware/cache-control.js'
|
||||||
import { pathLanguagePrefixed, languagePrefixPathRegex } from '@/languages/lib/languages.js'
|
import { pathLanguagePrefixed, languagePrefixPathRegex } from '@/languages/lib/languages'
|
||||||
import getRedirect, { splitPathByLanguage } from '@/redirects/lib/get-redirect.js'
|
import getRedirect, { splitPathByLanguage } from '@/redirects/lib/get-redirect.js'
|
||||||
import getRemoteJSON from '@/frame/lib/get-remote-json.js'
|
import getRemoteJSON from '@/frame/lib/get-remote-json.js'
|
||||||
import { ExtendedRequest } from '@/types'
|
import { ExtendedRequest } from '@/types'
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ import { brotliCompressSync } from 'zlib'
|
|||||||
import chalk from 'chalk'
|
import chalk from 'chalk'
|
||||||
import { program, Option } from 'commander'
|
import { program, Option } from 'commander'
|
||||||
|
|
||||||
import { languageKeys } from '@/languages/lib/languages.js'
|
import { languageKeys } from '@/languages/lib/languages'
|
||||||
import { loadPages, loadUnversionedTree } from '@/frame/lib/page-data.js'
|
import { loadPages, loadUnversionedTree } from '@/frame/lib/page-data.js'
|
||||||
import { CACHE_FILE_PATH, getPageInfo } from '../middleware/article-pageinfo'
|
import { CACHE_FILE_PATH, getPageInfo } from '../middleware/article-pageinfo'
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { visitParents } from 'unist-util-visit-parents'
|
|||||||
import { visit, SKIP } from 'unist-util-visit'
|
import { visit, SKIP } from 'unist-util-visit'
|
||||||
import { remove } from 'unist-util-remove'
|
import { remove } from 'unist-util-remove'
|
||||||
|
|
||||||
import { languageKeys } from '#src/languages/lib/languages.js'
|
import { languageKeys } from '#src/languages/lib/languages.ts'
|
||||||
import { MARKDOWN_OPTIONS } from '../../content-linter/lib/helpers/unified-formatter-options.js'
|
import { MARKDOWN_OPTIONS } from '../../content-linter/lib/helpers/unified-formatter-options.js'
|
||||||
|
|
||||||
const { targetDirectory, removeKeywords } = JSON.parse(
|
const { targetDirectory, removeKeywords } = JSON.parse(
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { filterTokens } from 'markdownlint-rule-helpers'
|
import { filterTokens } from 'markdownlint-rule-helpers'
|
||||||
|
|
||||||
import { addFixErrorDetail, getRange } from '../helpers/utils.js'
|
import { addFixErrorDetail, getRange } from '../helpers/utils.js'
|
||||||
import { allLanguageKeys } from '#src/languages/lib/languages.js'
|
import { allLanguageKeys } from '#src/languages/lib/languages.ts'
|
||||||
|
|
||||||
export const internalLinksNoLang = {
|
export const internalLinksNoLang = {
|
||||||
names: ['GHD002', 'internal-links-no-lang'],
|
names: ['GHD002', 'internal-links-no-lang'],
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import { defaultConfig } from '../lib/default-markdownlint-options.js'
|
|||||||
import { prettyPrintResults } from './pretty-print-results.js'
|
import { prettyPrintResults } from './pretty-print-results.js'
|
||||||
import { getLintableYml } from '#src/content-linter/lib/helpers/get-lintable-yml.js'
|
import { getLintableYml } from '#src/content-linter/lib/helpers/get-lintable-yml.js'
|
||||||
import { printAnnotationResults } from '../lib/helpers/print-annotations.js'
|
import { printAnnotationResults } from '../lib/helpers/print-annotations.js'
|
||||||
import languages from '#src/languages/lib/languages.js'
|
import languages from '#src/languages/lib/languages.ts'
|
||||||
|
|
||||||
program
|
program
|
||||||
.description('Run GitHub Docs Markdownlint rules.')
|
.description('Run GitHub Docs Markdownlint rules.')
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import walk from 'walk-sync'
|
|||||||
import { zip } from 'lodash-es'
|
import { zip } from 'lodash-es'
|
||||||
import { beforeAll, describe, expect, test } from 'vitest'
|
import { beforeAll, describe, expect, test } from 'vitest'
|
||||||
|
|
||||||
import languages from '#src/languages/lib/languages.js'
|
import languages from '#src/languages/lib/languages.ts'
|
||||||
import { getDiffFiles } from '../lib/diff-files.js'
|
import { getDiffFiles } from '../lib/diff-files.js'
|
||||||
|
|
||||||
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ import { writeFileSync, statSync } from 'fs'
|
|||||||
|
|
||||||
import { program, Option } from 'commander'
|
import { program, Option } from 'commander'
|
||||||
|
|
||||||
import { languageKeys } from '@/languages/lib/languages.js'
|
import { languageKeys } from '@/languages/lib/languages'
|
||||||
import { allVersions } from '@/versions/lib/all-versions'
|
import { allVersions } from '@/versions/lib/all-versions'
|
||||||
import { allDocuments, POSSIBLE_FIELDS, type AllDocument } from './lib'
|
import { allDocuments, POSSIBLE_FIELDS, type AllDocument } from './lib'
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { afterAll, beforeAll, describe, expect, test } from 'vitest'
|
import { afterAll, beforeAll, describe, expect, test } from 'vitest'
|
||||||
|
|
||||||
import Page from '#src/frame/lib/page.js'
|
import Page from '#src/frame/lib/page.js'
|
||||||
import languages from '#src/languages/lib/languages.js'
|
import languages from '#src/languages/lib/languages.ts'
|
||||||
import nonEnterpriseDefaultVersion from '#src/versions/lib/non-enterprise-default-version.js'
|
import nonEnterpriseDefaultVersion from '#src/versions/lib/non-enterprise-default-version.js'
|
||||||
import { DataDirectory } from '#src/tests/helpers/data-directory.js'
|
import { DataDirectory } from '#src/tests/helpers/data-directory.js'
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { afterAll, beforeAll, describe, expect, test, vi } from 'vitest'
|
import { afterAll, beforeAll, describe, expect, test, vi } from 'vitest'
|
||||||
|
|
||||||
import { liquid } from '#src/content-render/index.js'
|
import { liquid } from '#src/content-render/index.js'
|
||||||
import languages from '#src/languages/lib/languages.js'
|
import languages from '#src/languages/lib/languages.ts'
|
||||||
import { DataDirectory } from '#src/tests/helpers/data-directory.js'
|
import { DataDirectory } from '#src/tests/helpers/data-directory.js'
|
||||||
|
|
||||||
describe('liquid helper tags', () => {
|
describe('liquid helper tags', () => {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import yaml from 'js-yaml'
|
|||||||
import matter from 'gray-matter'
|
import matter from 'gray-matter'
|
||||||
import { merge, get } from 'lodash-es'
|
import { merge, get } from 'lodash-es'
|
||||||
|
|
||||||
import languages from '#src/languages/lib/languages.js'
|
import languages from '#src/languages/lib/languages.ts'
|
||||||
import { correctTranslatedContentStrings } from '#src/languages/lib/correct-translation-content.js'
|
import { correctTranslatedContentStrings } from '#src/languages/lib/correct-translation-content.js'
|
||||||
|
|
||||||
// If you run `export DEBUG_JIT_DATA_READS=true` in your terminal,
|
// If you run `export DEBUG_JIT_DATA_READS=true` in your terminal,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import fs from 'fs'
|
|||||||
import path from 'path'
|
import path from 'path'
|
||||||
|
|
||||||
import chalk from 'chalk'
|
import chalk from 'chalk'
|
||||||
import languages from '@/languages/lib/languages.js'
|
import languages from '@/languages/lib/languages'
|
||||||
|
|
||||||
type Options = {
|
type Options = {
|
||||||
verbose?: boolean
|
verbose?: boolean
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ import type { Page } from '@/types'
|
|||||||
import warmServer from '@/frame/lib/warm-server'
|
import warmServer from '@/frame/lib/warm-server'
|
||||||
import { getDeepDataByLanguage } from '@/data-directory/lib/get-data.js'
|
import { getDeepDataByLanguage } from '@/data-directory/lib/get-data.js'
|
||||||
import { getLiquidTokens } from '@/content-linter/lib/helpers/liquid-utils.js'
|
import { getLiquidTokens } from '@/content-linter/lib/helpers/liquid-utils.js'
|
||||||
import languages from '@/languages/lib/languages.js'
|
import languages from '@/languages/lib/languages'
|
||||||
import { correctTranslatedContentStrings } from '@/languages/lib/correct-translation-content.js'
|
import { correctTranslatedContentStrings } from '@/languages/lib/correct-translation-content.js'
|
||||||
|
|
||||||
const EXCEPTIONS = new Set([
|
const EXCEPTIONS = new Set([
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import path from 'path'
|
|||||||
|
|
||||||
import { afterAll, beforeAll, describe, expect, test } from 'vitest'
|
import { afterAll, beforeAll, describe, expect, test } from 'vitest'
|
||||||
|
|
||||||
import languages from '#src/languages/lib/languages.js'
|
import languages from '#src/languages/lib/languages.ts'
|
||||||
import {
|
import {
|
||||||
getDataByLanguage,
|
getDataByLanguage,
|
||||||
getDeepDataByLanguage,
|
getDeepDataByLanguage,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { expect, test, vi } from 'vitest'
|
|||||||
import { get, getDOM } from '@/tests/helpers/e2etest.js'
|
import { get, getDOM } from '@/tests/helpers/e2etest.js'
|
||||||
|
|
||||||
import { describeIfDocsEarlyAccess } from '@/tests/helpers/conditional-runs.js'
|
import { describeIfDocsEarlyAccess } from '@/tests/helpers/conditional-runs.js'
|
||||||
import languages from '@/languages/lib/languages.js'
|
import languages from '@/languages/lib/languages'
|
||||||
|
|
||||||
const VALID_EARLY_ACCESS_URI = '/early-access/github/save-time-with-slash-commands'
|
const VALID_EARLY_ACCESS_URI = '/early-access/github/save-time-with-slash-commands'
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { languageKeys } from '@/languages/lib/languages.js'
|
import { languageKeys } from '@/languages/lib/languages'
|
||||||
import { allVersionKeys } from '@/versions/lib/all-versions'
|
import { allVersionKeys } from '@/versions/lib/all-versions'
|
||||||
import { productIds } from '@/products/lib/all-products'
|
import { productIds } from '@/products/lib/all-products'
|
||||||
import { allTools } from '@/tools/lib/all-tools.js'
|
import { allTools } from '@/tools/lib/all-tools.js'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import path from 'path'
|
import path from 'path'
|
||||||
|
|
||||||
import languages from '#src/languages/lib/languages.js'
|
import languages from '#src/languages/lib/languages.ts'
|
||||||
import { allVersions } from '#src/versions/lib/all-versions.ts'
|
import { allVersions } from '#src/versions/lib/all-versions.ts'
|
||||||
import createTree from './create-tree.js'
|
import createTree from './create-tree.js'
|
||||||
import nonEnterpriseDefaultVersion from '#src/versions/lib/non-enterprise-default-version.js'
|
import nonEnterpriseDefaultVersion from '#src/versions/lib/non-enterprise-default-version.js'
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import type { NextFunction, Response } from 'express'
|
|||||||
|
|
||||||
import type { ExtendedRequest, Context } from '@/types'
|
import type { ExtendedRequest, Context } from '@/types'
|
||||||
|
|
||||||
import languages from '@/languages/lib/languages.js'
|
import languages from '@/languages/lib/languages'
|
||||||
import enterpriseServerReleases from '@/versions/lib/enterprise-server-releases.js'
|
import enterpriseServerReleases from '@/versions/lib/enterprise-server-releases.js'
|
||||||
import { allVersions } from '@/versions/lib/all-versions'
|
import { allVersions } from '@/versions/lib/all-versions'
|
||||||
import { productMap } from '@/products/lib/all-products.js'
|
import { productMap } from '@/products/lib/all-products.js'
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import type { Response, NextFunction } from 'express'
|
|||||||
import type { ExtendedRequest } from '@/types'
|
import type { ExtendedRequest } from '@/types'
|
||||||
import { getProductGroups } from '@/products/lib/get-product-groups'
|
import { getProductGroups } from '@/products/lib/get-product-groups'
|
||||||
import warmServer from '@/frame/lib/warm-server'
|
import warmServer from '@/frame/lib/warm-server'
|
||||||
import { languageKeys } from '@/languages/lib/languages.js'
|
import { languageKeys } from '@/languages/lib/languages'
|
||||||
import { allVersionKeys } from '@/versions/lib/all-versions'
|
import { allVersionKeys } from '@/versions/lib/all-versions'
|
||||||
|
|
||||||
const isHomepage = (path: string) => {
|
const isHomepage = (path: string) => {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { existsSync } from 'fs'
|
|||||||
|
|
||||||
import { ROOT } from '#src/frame/lib/constants.js'
|
import { ROOT } from '#src/frame/lib/constants.js'
|
||||||
import Page from '#src/frame/lib/page.js'
|
import Page from '#src/frame/lib/page.js'
|
||||||
import { languagePrefixPathRegex } from '#src/languages/lib/languages.js'
|
import { languagePrefixPathRegex } from '#src/languages/lib/languages.ts'
|
||||||
|
|
||||||
const englishPrefixRegex = /^\/en(\/|$)/
|
const englishPrefixRegex = /^\/en(\/|$)/
|
||||||
const CONTENT_ROOT = path.join(ROOT, 'content')
|
const CONTENT_ROOT = path.join(ROOT, 'content')
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import type { NextFunction, Request, Response } from 'express'
|
|||||||
import helmet from 'helmet'
|
import helmet from 'helmet'
|
||||||
import { isArchivedVersion } from '@/archives/lib/is-archived-version'
|
import { isArchivedVersion } from '@/archives/lib/is-archived-version'
|
||||||
import versionSatisfiesRange from '@/versions/lib/version-satisfies-range.js'
|
import versionSatisfiesRange from '@/versions/lib/version-satisfies-range.js'
|
||||||
import { languagePrefixPathRegex } from '@/languages/lib/languages.js'
|
import { languagePrefixPathRegex } from '@/languages/lib/languages'
|
||||||
|
|
||||||
const isDev = process.env.NODE_ENV === 'development'
|
const isDev = process.env.NODE_ENV === 'development'
|
||||||
const GITHUB_DOMAINS = [
|
const GITHUB_DOMAINS = [
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import type { ExtendedRequest } from '@/types'
|
|||||||
import { defaultCacheControl } from '@/frame/middleware/cache-control.js'
|
import { defaultCacheControl } from '@/frame/middleware/cache-control.js'
|
||||||
import catchMiddlewareError from '@/observability/middleware/catch-middleware-error.js'
|
import catchMiddlewareError from '@/observability/middleware/catch-middleware-error.js'
|
||||||
import statsd from '@/observability/lib/statsd.js'
|
import statsd from '@/observability/lib/statsd.js'
|
||||||
import languages from '@/languages/lib/languages.js'
|
import languages from '@/languages/lib/languages'
|
||||||
import { allVersions } from '@/versions/lib/all-versions'
|
import { allVersions } from '@/versions/lib/all-versions'
|
||||||
|
|
||||||
const router = express.Router()
|
const router = express.Router()
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import path from 'path'
|
|||||||
import type { Response, NextFunction } from 'express'
|
import type { Response, NextFunction } from 'express'
|
||||||
|
|
||||||
import type { ExtendedRequest, UnversionedTree, SiteTree } from '@/types'
|
import type { ExtendedRequest, UnversionedTree, SiteTree } from '@/types'
|
||||||
import languages, { languageKeys } from '@/languages/lib/languages.js'
|
import languages, { languageKeys } from '@/languages/lib/languages'
|
||||||
import createTree from '@/frame/lib/create-tree.js'
|
import createTree from '@/frame/lib/create-tree.js'
|
||||||
import warmServer from '@/frame/lib/warm-server'
|
import warmServer from '@/frame/lib/warm-server'
|
||||||
import { loadSiteTree, loadPages, loadPageMap } from '@/frame/lib/page-data.js'
|
import { loadSiteTree, loadPages, loadPageMap } from '@/frame/lib/page-data.js'
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import type { ExtendedRequest } from '@/types'
|
|||||||
import FailBot from '@/observability/lib/failbot.js'
|
import FailBot from '@/observability/lib/failbot.js'
|
||||||
import patterns from '@/frame/lib/patterns.js'
|
import patterns from '@/frame/lib/patterns.js'
|
||||||
import getMiniTocItems from '@/frame/lib/get-mini-toc-items.js'
|
import getMiniTocItems from '@/frame/lib/get-mini-toc-items.js'
|
||||||
import { pathLanguagePrefixed } from '@/languages/lib/languages.js'
|
import { pathLanguagePrefixed } from '@/languages/lib/languages'
|
||||||
import statsd from '@/observability/lib/statsd.js'
|
import statsd from '@/observability/lib/statsd.js'
|
||||||
import { allVersions } from '@/versions/lib/all-versions'
|
import { allVersions } from '@/versions/lib/all-versions'
|
||||||
import { isConnectionDropped } from './halt-on-dropped-connection'
|
import { isConnectionDropped } from './halt-on-dropped-connection'
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { decode } from 'html-entities'
|
|||||||
import { chain, pick } from 'lodash-es'
|
import { chain, pick } from 'lodash-es'
|
||||||
|
|
||||||
import { loadPages } from '#src/frame/lib/page-data.js'
|
import { loadPages } from '#src/frame/lib/page-data.js'
|
||||||
import libLanguages from '#src/languages/lib/languages.js'
|
import libLanguages from '#src/languages/lib/languages.ts'
|
||||||
import { liquid } from '#src/content-render/index.js'
|
import { liquid } from '#src/content-render/index.js'
|
||||||
import patterns from '#src/frame/lib/patterns.js'
|
import patterns from '#src/frame/lib/patterns.js'
|
||||||
import removeFPTFromPath from '#src/versions/lib/remove-fpt-from-path.js'
|
import removeFPTFromPath from '#src/versions/lib/remove-fpt-from-path.js'
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import createApp from '@/frame/lib/app'
|
|||||||
import EnterpriseServerReleases from '@/versions/lib/enterprise-server-releases.js'
|
import EnterpriseServerReleases from '@/versions/lib/enterprise-server-releases.js'
|
||||||
import loadRedirects from '@/redirects/lib/precompile.js'
|
import loadRedirects from '@/redirects/lib/precompile.js'
|
||||||
import { loadPageMap, loadPages } from '@/frame/lib/page-data.js'
|
import { loadPageMap, loadPages } from '@/frame/lib/page-data.js'
|
||||||
import { languageKeys } from '@/languages/lib/languages.js'
|
import { languageKeys } from '@/languages/lib/languages'
|
||||||
import { RewriteAssetPathsPlugin } from '@/ghes-releases/scripts/deprecate/rewrite-asset-paths'
|
import { RewriteAssetPathsPlugin } from '@/ghes-releases/scripts/deprecate/rewrite-asset-paths'
|
||||||
|
|
||||||
const port = '4001'
|
const port = '4001'
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import {
|
|||||||
readCompressedJsonFileFallback,
|
readCompressedJsonFileFallback,
|
||||||
} from '#src/frame/lib/read-json-file.js'
|
} from '#src/frame/lib/read-json-file.js'
|
||||||
import { getAutomatedPageMiniTocItems } from '#src/frame/lib/get-mini-toc-items.js'
|
import { getAutomatedPageMiniTocItems } from '#src/frame/lib/get-mini-toc-items.js'
|
||||||
import languages from '#src/languages/lib/languages.js'
|
import languages from '#src/languages/lib/languages.ts'
|
||||||
import { allVersions } from '#src/versions/lib/all-versions.ts'
|
import { allVersions } from '#src/versions/lib/all-versions.ts'
|
||||||
|
|
||||||
export const GRAPHQL_DATA_DIR = 'src/graphql/data'
|
export const GRAPHQL_DATA_DIR = 'src/graphql/data'
|
||||||
|
|||||||
23
src/languages/lib/languages.d.ts
vendored
23
src/languages/lib/languages.d.ts
vendored
@@ -1,23 +0,0 @@
|
|||||||
type Language = {
|
|
||||||
name: string
|
|
||||||
nativeName?: string
|
|
||||||
code: string
|
|
||||||
hreflang: string
|
|
||||||
redirectPatterns?: RegExp[]
|
|
||||||
dir: string
|
|
||||||
}
|
|
||||||
type Languages = {
|
|
||||||
[code: string]: Language
|
|
||||||
}
|
|
||||||
|
|
||||||
export const allLanguageKeys: string[]
|
|
||||||
|
|
||||||
export const languageKeys: string[]
|
|
||||||
|
|
||||||
export const languagePrefixPathRegex: RegExp
|
|
||||||
|
|
||||||
export declare function pathLanguagePrefixed(path: string): boolean
|
|
||||||
|
|
||||||
const languages: Languages
|
|
||||||
|
|
||||||
export default languages
|
|
||||||
@@ -6,11 +6,35 @@ import fs from 'fs'
|
|||||||
|
|
||||||
import dotenv from 'dotenv'
|
import dotenv from 'dotenv'
|
||||||
|
|
||||||
import { ROOT, TRANSLATIONS_ROOT, TRANSLATIONS_FIXTURE_ROOT } from '#src/frame/lib/constants.js'
|
import { ROOT, TRANSLATIONS_ROOT, TRANSLATIONS_FIXTURE_ROOT } from '@/frame/lib/constants'
|
||||||
|
|
||||||
dotenv.config({ quiet: true })
|
dotenv.config({ quiet: true })
|
||||||
|
|
||||||
const possibleEnvVars = {
|
export interface Language {
|
||||||
|
name: string
|
||||||
|
nativeName?: string
|
||||||
|
code: string
|
||||||
|
hreflang: string
|
||||||
|
redirectPatterns?: RegExp[]
|
||||||
|
dir: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export type LanguageCode = 'en' | 'es' | 'ja' | 'pt' | 'zh' | 'ru' | 'fr' | 'ko' | 'de'
|
||||||
|
export type LocaleCode =
|
||||||
|
| 'es-es'
|
||||||
|
| 'ja-jp'
|
||||||
|
| 'pt-br'
|
||||||
|
| 'zh-cn'
|
||||||
|
| 'ru-ru'
|
||||||
|
| 'fr-fr'
|
||||||
|
| 'ko-kr'
|
||||||
|
| 'de-de'
|
||||||
|
|
||||||
|
export interface Languages {
|
||||||
|
[code: string]: Language
|
||||||
|
}
|
||||||
|
|
||||||
|
const possibleEnvVars: Record<LocaleCode, string | undefined> = {
|
||||||
'es-es': process.env.TRANSLATIONS_ROOT_ES_ES,
|
'es-es': process.env.TRANSLATIONS_ROOT_ES_ES,
|
||||||
'ja-jp': process.env.TRANSLATIONS_ROOT_JA_JP,
|
'ja-jp': process.env.TRANSLATIONS_ROOT_JA_JP,
|
||||||
'pt-br': process.env.TRANSLATIONS_ROOT_PT_BR,
|
'pt-br': process.env.TRANSLATIONS_ROOT_PT_BR,
|
||||||
@@ -21,7 +45,7 @@ const possibleEnvVars = {
|
|||||||
'de-de': process.env.TRANSLATIONS_ROOT_DE_DE,
|
'de-de': process.env.TRANSLATIONS_ROOT_DE_DE,
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRoot(languageCode) {
|
function getRoot(languageCode: string): string {
|
||||||
if (languageCode === 'en') return ROOT
|
if (languageCode === 'en') return ROOT
|
||||||
|
|
||||||
// This one trumps anything else. This makes it possible, and convenient,
|
// This one trumps anything else. This makes it possible, and convenient,
|
||||||
@@ -32,7 +56,7 @@ function getRoot(languageCode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (languageCode in possibleEnvVars) {
|
if (languageCode in possibleEnvVars) {
|
||||||
const possibleEnvVar = possibleEnvVars[languageCode]
|
const possibleEnvVar = possibleEnvVars[languageCode as LocaleCode]
|
||||||
if (possibleEnvVar) {
|
if (possibleEnvVar) {
|
||||||
return possibleEnvVar
|
return possibleEnvVar
|
||||||
}
|
}
|
||||||
@@ -44,7 +68,7 @@ function getRoot(languageCode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Languages in order of accept-language header frequency
|
// Languages in order of accept-language header frequency
|
||||||
const allLanguages = {
|
const allLanguages: Languages = {
|
||||||
en: {
|
en: {
|
||||||
name: 'English',
|
name: 'English',
|
||||||
code: 'en',
|
code: 'en',
|
||||||
@@ -112,13 +136,14 @@ const allLanguages = {
|
|||||||
dir: getRoot('de-de'),
|
dir: getRoot('de-de'),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// Some markdownlint tests depend on having access to all
|
// Some markdownlint tests depend on having access to all
|
||||||
// language keys. Not modifying the original object makes
|
// language keys. Not modifying the original object makes
|
||||||
// it possible to export all keys, even when those directories
|
// it possible to export all keys, even when those directories
|
||||||
// don't exist on disk.
|
// don't exist on disk.
|
||||||
Object.freeze(allLanguages)
|
Object.freeze(allLanguages)
|
||||||
export const allLanguageKeys = Object.keys(allLanguages)
|
export const allLanguageKeys: string[] = Object.keys(allLanguages)
|
||||||
const languages = { ...allLanguages }
|
const languages: Languages = { ...allLanguages }
|
||||||
|
|
||||||
if (TRANSLATIONS_FIXTURE_ROOT) {
|
if (TRANSLATIONS_FIXTURE_ROOT) {
|
||||||
// Keep all languages that have a directory in the fixture root.
|
// Keep all languages that have a directory in the fixture root.
|
||||||
@@ -130,7 +155,7 @@ if (TRANSLATIONS_FIXTURE_ROOT) {
|
|||||||
} else if (process.env.ENABLED_LANGUAGES) {
|
} else if (process.env.ENABLED_LANGUAGES) {
|
||||||
if (process.env.ENABLED_LANGUAGES.toLowerCase() !== 'all') {
|
if (process.env.ENABLED_LANGUAGES.toLowerCase() !== 'all') {
|
||||||
Object.keys(languages).forEach((code) => {
|
Object.keys(languages).forEach((code) => {
|
||||||
if (!process.env.ENABLED_LANGUAGES.includes(code)) {
|
if (!process.env.ENABLED_LANGUAGES!.includes(code)) {
|
||||||
delete languages[code]
|
delete languages[code]
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -144,15 +169,15 @@ if (TRANSLATIONS_FIXTURE_ROOT) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const languageKeys = Object.keys(languages)
|
export const languageKeys: string[] = Object.keys(languages)
|
||||||
|
|
||||||
export const languagePrefixPathRegex = new RegExp(`^/(${languageKeys.join('|')})(/|$)`)
|
export const languagePrefixPathRegex: RegExp = new RegExp(`^/(${languageKeys.join('|')})(/|$)`)
|
||||||
|
|
||||||
/** Return true if the URL is something like /en/foo or /ja but return false
|
/** Return true if the URL is something like /en/foo or /ja but return false
|
||||||
* if it's something like /foo or /foo/bar or /fr (because French (fr)
|
* if it's something like /foo or /foo/bar or /fr (because French (fr)
|
||||||
* is currently not an active language)
|
* is currently not an active language)
|
||||||
*/
|
*/
|
||||||
export function pathLanguagePrefixed(path) {
|
export function pathLanguagePrefixed(path: string): boolean {
|
||||||
return languagePrefixPathRegex.test(path)
|
return languagePrefixPathRegex.test(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@ import type { Request, Response, NextFunction } from 'express'
|
|||||||
import parser from 'accept-language-parser'
|
import parser from 'accept-language-parser'
|
||||||
import type { Language as parserLanguage } from 'accept-language-parser'
|
import type { Language as parserLanguage } from 'accept-language-parser'
|
||||||
|
|
||||||
import languages, { languageKeys } from '@/languages/lib/languages.js'
|
import languages, { languageKeys } from '@/languages/lib/languages'
|
||||||
import { USER_LANGUAGE_COOKIE_NAME } from '@/frame/lib/constants.js'
|
import { USER_LANGUAGE_COOKIE_NAME } from '@/frame/lib/constants.js'
|
||||||
import type { ExtendedRequest, Languages } from '@/types'
|
import type { ExtendedRequest, Languages } from '@/types'
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { TokenizationError } from 'liquidjs'
|
|||||||
import walk from 'walk-sync'
|
import walk from 'walk-sync'
|
||||||
|
|
||||||
import { getLiquidTokens } from '@/content-linter/lib/helpers/liquid-utils.js'
|
import { getLiquidTokens } from '@/content-linter/lib/helpers/liquid-utils.js'
|
||||||
import languages from '@/languages/lib/languages.js'
|
import languages from '@/languages/lib/languages'
|
||||||
import warmServer from '@/frame/lib/warm-server'
|
import warmServer from '@/frame/lib/warm-server'
|
||||||
import type { Site } from '@/types'
|
import type { Site } from '@/types'
|
||||||
import { correctTranslatedContentStrings } from '@/languages/lib/correct-translation-content.js'
|
import { correctTranslatedContentStrings } from '@/languages/lib/correct-translation-content.js'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { languageKeys } from '#src/languages/lib/languages.js'
|
import { languageKeys } from '#src/languages/lib/languages.ts'
|
||||||
|
|
||||||
import { makeLanguageSurrogateKey } from '#src/frame/middleware/set-fastly-surrogate-key.js'
|
import { makeLanguageSurrogateKey } from '#src/frame/middleware/set-fastly-surrogate-key.js'
|
||||||
import purgeEdgeCache from '#src/workflows/purge-edge-cache.ts'
|
import purgeEdgeCache from '#src/workflows/purge-edge-cache.ts'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import languages from '#src/languages/lib/languages.js'
|
import languages from '#src/languages/lib/languages.ts'
|
||||||
import { describe, expect, test, vi } from 'vitest'
|
import { describe, expect, test, vi } from 'vitest'
|
||||||
|
|
||||||
describe('files', () => {
|
describe('files', () => {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { describe, expect, test, vi } from 'vitest'
|
import { describe, expect, test, vi } from 'vitest'
|
||||||
|
|
||||||
import { languageKeys } from '@/languages/lib/languages.js'
|
import { languageKeys } from '@/languages/lib/languages'
|
||||||
import { blockIndex } from '@/frame/middleware/block-robots'
|
import { blockIndex } from '@/frame/middleware/block-robots'
|
||||||
import { get, getDOMCached as getDOM } from '@/tests/helpers/e2etest.js'
|
import { get, getDOMCached as getDOM } from '@/tests/helpers/e2etest.js'
|
||||||
import Page from '@/frame/lib/page.js'
|
import Page from '@/frame/lib/page.js'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { describe, expect, test } from 'vitest'
|
import { describe, expect, test } from 'vitest'
|
||||||
|
|
||||||
import { languageKeys } from '@/languages/lib/languages.js'
|
import { languageKeys } from '@/languages/lib/languages'
|
||||||
import { getDOM } from '@/tests/helpers/e2etest.js'
|
import { getDOM } from '@/tests/helpers/e2etest.js'
|
||||||
|
|
||||||
const langs = languageKeys.filter((lang) => lang !== 'en')
|
const langs = languageKeys.filter((lang) => lang !== 'en')
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { describe, expect, test } from 'vitest'
|
import { describe, expect, test } from 'vitest'
|
||||||
import { get } from '@/tests/helpers/e2etest.js'
|
import { get } from '@/tests/helpers/e2etest.js'
|
||||||
import { languageKeys } from '@/languages/lib/languages.js'
|
import { languageKeys } from '@/languages/lib/languages'
|
||||||
|
|
||||||
const langs = languageKeys.filter((lang) => lang !== 'en')
|
const langs = languageKeys.filter((lang) => lang !== 'en')
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { describe, expect, test } from 'vitest'
|
import { describe, expect, test } from 'vitest'
|
||||||
|
|
||||||
import { languageKeys } from '#src/languages/lib/languages.js'
|
import { languageKeys } from '#src/languages/lib/languages.ts'
|
||||||
import { get } from '#src/tests/helpers/e2etest.js'
|
import { get } from '#src/tests/helpers/e2etest.js'
|
||||||
import { USER_LANGUAGE_COOKIE_NAME } from '#src/frame/lib/constants.js'
|
import { USER_LANGUAGE_COOKIE_NAME } from '#src/frame/lib/constants.js'
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { describe, expect, test } from 'vitest'
|
import { describe, expect, test } from 'vitest'
|
||||||
|
|
||||||
import { languageKeys } from '#src/languages/lib/languages'
|
import { languageKeys } from '#src/languages/lib/languages.ts'
|
||||||
import { get } from '#src/tests/helpers/e2etest.js'
|
import { get } from '#src/tests/helpers/e2etest.js'
|
||||||
|
|
||||||
const langs = languageKeys.filter((lang) => lang !== 'en')
|
const langs = languageKeys.filter((lang) => lang !== 'en')
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { languageKeys } from '#src/languages/lib/languages.js'
|
import { languageKeys } from '@/languages/lib/languages'
|
||||||
import nonEnterpriseDefaultVersion from '#src/versions/lib/non-enterprise-default-version.js'
|
import nonEnterpriseDefaultVersion from '#src/versions/lib/non-enterprise-default-version.js'
|
||||||
import { allVersions } from '@/versions/lib/all-versions'
|
import { allVersions } from '@/versions/lib/all-versions'
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import type { NextFunction, Response } from 'express'
|
import type { NextFunction, Response } from 'express'
|
||||||
|
|
||||||
import patterns from '@/frame/lib/patterns.js'
|
import patterns from '@/frame/lib/patterns.js'
|
||||||
import { pathLanguagePrefixed } from '@/languages/lib/languages.js'
|
import { pathLanguagePrefixed } from '@/languages/lib/languages'
|
||||||
import { deprecatedWithFunctionalRedirects } from '@/versions/lib/enterprise-server-releases.js'
|
import { deprecatedWithFunctionalRedirects } from '@/versions/lib/enterprise-server-releases.js'
|
||||||
import getRedirect from '../lib/get-redirect.js'
|
import getRedirect from '../lib/get-redirect.js'
|
||||||
import { defaultCacheControl, languageCacheControl } from '@/frame/middleware/cache-control.js'
|
import { defaultCacheControl, languageCacheControl } from '@/frame/middleware/cache-control.js'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import type { NextFunction, Response } from 'express'
|
import type { NextFunction, Response } from 'express'
|
||||||
|
|
||||||
import languages from '@/languages/lib/languages.js'
|
import languages from '@/languages/lib/languages'
|
||||||
import { defaultCacheControl } from '@/frame/middleware/cache-control.js'
|
import { defaultCacheControl } from '@/frame/middleware/cache-control.js'
|
||||||
import { ExtendedRequest } from '@/types'
|
import { ExtendedRequest } from '@/types'
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import path from 'path'
|
|||||||
import { readCompressedJsonFileFallback } from '#src/frame/lib/read-json-file.js'
|
import { readCompressedJsonFileFallback } from '#src/frame/lib/read-json-file.js'
|
||||||
import { getAutomatedPageMiniTocItems } from '#src/frame/lib/get-mini-toc-items.js'
|
import { getAutomatedPageMiniTocItems } from '#src/frame/lib/get-mini-toc-items.js'
|
||||||
import { allVersions, getOpenApiVersion } from '#src/versions/lib/all-versions.ts'
|
import { allVersions, getOpenApiVersion } from '#src/versions/lib/all-versions.ts'
|
||||||
import languages from '#src/languages/lib/languages.js'
|
import languages from '#src/languages/lib/languages.ts'
|
||||||
|
|
||||||
export const REST_DATA_DIR = 'src/rest/data'
|
export const REST_DATA_DIR = 'src/rest/data'
|
||||||
export const REST_SCHEMA_FILENAME = 'schema.json'
|
export const REST_SCHEMA_FILENAME = 'schema.json'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import languages from '@/languages/lib/languages.js'
|
import languages from '@/languages/lib/languages'
|
||||||
import { utcTimestamp } from '@/search/lib/helpers/time'
|
import { utcTimestamp } from '@/search/lib/helpers/time'
|
||||||
import { allIndexVersionKeys, versionToIndexVersionMap } from '@/search/lib/elasticsearch-versions'
|
import { allIndexVersionKeys, versionToIndexVersionMap } from '@/search/lib/elasticsearch-versions'
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
When a request is made to a /search endpoint with query parameters, e.g. ?query=foo&version=free-pro-team,
|
When a request is made to a /search endpoint with query parameters, e.g. ?query=foo&version=free-pro-team,
|
||||||
we need to validate and parse the parameters. This file contains the configuration for which parameters
|
we need to validate and parse the parameters. This file contains the configuration for which parameters
|
||||||
to expect based on the type of search request "e.g. general search vs autocomplete search" and how to validate them.
|
to expect based on the type of search request "e.g. general search vs autocomplete search" and how to validate them.
|
||||||
*/
|
*/
|
||||||
import languages from '@/languages/lib/languages'
|
import languages from '@/languages/lib/languages'
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { Command, Option } from 'commander'
|
|||||||
import chalk from 'chalk'
|
import chalk from 'chalk'
|
||||||
import dotenv from 'dotenv'
|
import dotenv from 'dotenv'
|
||||||
|
|
||||||
import { languageKeys } from '@/languages/lib/languages.js'
|
import { languageKeys } from '@/languages/lib/languages'
|
||||||
import { allVersions } from '@/versions/lib/all-versions'
|
import { allVersions } from '@/versions/lib/all-versions'
|
||||||
|
|
||||||
import type { IndicesAnalyzeAnalyzeToken } from '@elastic/elasticsearch/lib/api/types'
|
import type { IndicesAnalyzeAnalyzeToken } from '@elastic/elasticsearch/lib/api/types'
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { program, Option, Command, InvalidArgumentError } from 'commander'
|
|||||||
import { errors } from '@elastic/elasticsearch'
|
import { errors } from '@elastic/elasticsearch'
|
||||||
import dotenv from 'dotenv'
|
import dotenv from 'dotenv'
|
||||||
|
|
||||||
import { languageKeys } from '@/languages/lib/languages.js'
|
import { languageKeys } from '@/languages/lib/languages'
|
||||||
|
|
||||||
import { indexGeneralSearch } from './lib/index-general-search'
|
import { indexGeneralSearch } from './lib/index-general-search'
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Client } from '@elastic/elasticsearch'
|
import { Client } from '@elastic/elasticsearch'
|
||||||
|
|
||||||
import { languageKeys } from '@/languages/lib/languages.js'
|
import { languageKeys } from '@/languages/lib/languages'
|
||||||
import { getElasticSearchIndex } from '@/search/lib/elasticsearch-indexes'
|
import { getElasticSearchIndex } from '@/search/lib/elasticsearch-indexes'
|
||||||
import { getElasticsearchClient } from '@/search/lib/helpers/get-client'
|
import { getElasticsearchClient } from '@/search/lib/helpers/get-client'
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import dotenv from 'dotenv'
|
|||||||
import boxen from 'boxen'
|
import boxen from 'boxen'
|
||||||
import { HTTPError } from 'got'
|
import { HTTPError } from 'got'
|
||||||
|
|
||||||
import languages from '@/languages/lib/languages.js'
|
import languages from '@/languages/lib/languages'
|
||||||
import parsePageSectionsIntoRecords from '@/search/scripts/scrape/lib/parse-page-sections-into-records'
|
import parsePageSectionsIntoRecords from '@/search/scripts/scrape/lib/parse-page-sections-into-records'
|
||||||
import getPopularPages from '@/search/scripts/scrape/lib/popular-pages'
|
import getPopularPages from '@/search/scripts/scrape/lib/popular-pages'
|
||||||
import domwaiter from '@/search/scripts/scrape/lib/domwaiter'
|
import domwaiter from '@/search/scripts/scrape/lib/domwaiter'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import chalk from 'chalk'
|
import chalk from 'chalk'
|
||||||
|
|
||||||
import languages from '@/languages/lib/languages.js'
|
import languages from '@/languages/lib/languages'
|
||||||
import buildRecords from '@/search/scripts/scrape/lib/build-records'
|
import buildRecords from '@/search/scripts/scrape/lib/build-records'
|
||||||
import findIndexablePages from '@/search/scripts/scrape/lib/find-indexable-pages'
|
import findIndexablePages from '@/search/scripts/scrape/lib/find-indexable-pages'
|
||||||
import { writeIndexRecords } from '@/search/scripts/scrape/lib/search-index-records'
|
import { writeIndexRecords } from '@/search/scripts/scrape/lib/search-index-records'
|
||||||
|
|||||||
Reference in New Issue
Block a user