@@ -8,11 +8,85 @@ import { getLanguageCodeFromPath } from '@/languages/middleware/detect-language'
88import { pagelistValidationMiddleware } from './validation'
99import catchMiddlewareError from '@/observability/middleware/catch-middleware-error'
1010import statsd from '@/observability/lib/statsd'
11+ import { allVersions , allVersionKeys } from '@/versions/lib/all-versions'
12+ import enterpriseServerReleases from '@/versions/lib/enterprise-server-releases'
13+ import { languages , languageKeys } from '@/languages/lib/languages'
1114
1215const router = express . Router ( )
1316
1417// pagelistValidationMiddleware is used for every route to normalize the lang and version from the path
1518
19+ /**
20+ * Get all available product versions for the docs site.
21+ * @route GET /api/pagelist/versions
22+ * @returns {object } JSON object with version information
23+ * @example
24+ * β― curl -s https://docs.github.com/api/pagelist/versions | jq
25+ * {
26+ * "versions": ["free-pro-team@latest ", "enterprise-cloud@latest", "enterprise-server@3.19", ...],
27+ * "ghesVersions": ["3.19", "3.18", "3.17", ...],
28+ * "ghesLatest": "3.19",
29+ * ...
30+ * }
31+ */
32+ router . get (
33+ '/versions' ,
34+ catchMiddlewareError ( async function ( req : ExtendedRequest , res : Response ) {
35+ defaultCacheControl ( res )
36+
37+ const response = {
38+ // Simple list of all version strings
39+ versions : allVersionKeys ,
40+ // GHES-specific information
41+ ghesVersions : enterpriseServerReleases . supported ,
42+ ghesLatest : enterpriseServerReleases . latest ,
43+ ghesLatestStable : enterpriseServerReleases . latestStable ,
44+ ghesReleaseCandidate : enterpriseServerReleases . releaseCandidate ,
45+ ghesDeprecated : enterpriseServerReleases . deprecated ,
46+ // Full version details
47+ allVersions,
48+ }
49+
50+ res . json ( response )
51+ } ) as RequestHandler ,
52+ )
53+
54+ /**
55+ * Get all available languages for the docs site.
56+ * @route GET /api/pagelist/languages
57+ * @returns {object } JSON object with language information
58+ * @example
59+ * β― curl -s https://docs.github.com/api/pagelist/languages | jq
60+ * {
61+ * "languages": ["en", "es", "ja", "pt", "zh", "ru", "fr", "ko", "de"],
62+ * "allLanguages": { ... }
63+ * }
64+ */
65+ router . get (
66+ '/languages' ,
67+ catchMiddlewareError ( async function ( req : ExtendedRequest , res : Response ) {
68+ defaultCacheControl ( res )
69+
70+ // Remove redirectPatterns from output as they are RegExp objects and not JSON serializable
71+ const sanitizedLanguages = Object . fromEntries (
72+ Object . entries ( languages ) . map ( ( [ code , lang ] ) => {
73+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
74+ const { redirectPatterns, ...rest } = lang
75+ return [ code , rest ]
76+ } ) ,
77+ )
78+
79+ const response = {
80+ // Simple list of language codes
81+ languages : languageKeys ,
82+ // Full language details (without redirectPatterns)
83+ allLanguages : sanitizedLanguages ,
84+ }
85+
86+ res . json ( response )
87+ } ) as RequestHandler ,
88+ )
89+
1690// If no version or lang is provided we'll assume english and fpt and redirect there
1791router . get (
1892 '/' ,
0 commit comments