| import type { NextFunction, Response } from 'express' |
|
|
| import { formatReleases, renderPatchNotes } from '@/release-notes/lib/release-notes-utils' |
| import { all, latestStable } from '@/versions/lib/enterprise-server-releases' |
| import { executeWithFallback } from '@/languages/lib/render-with-fallback' |
| import { getReleaseNotes } from './get-release-notes' |
| import type { Context, ExtendedRequest } from '@/types' |
|
|
| export default async function ghesReleaseNotesContext( |
| req: ExtendedRequest, |
| res: Response, |
| next: NextFunction, |
| ) { |
| if (!req.pagePath || !req.context || !req.context.currentVersion) |
| throw new Error('request not contextualized') |
| if (!(req.pagePath.endsWith('/release-notes') || req.pagePath.endsWith('/admin'))) return next() |
| const [requestedPlan, requestedRelease] = req.context.currentVersion.split('@') |
| if (requestedPlan !== 'enterprise-server') return next() |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const ghesReleaseNotes = getReleaseNotes('enterprise-server', 'en') |
|
|
| |
| |
| |
| if (!Object.keys(ghesReleaseNotes).includes(requestedRelease.replace(/\./, '-'))) { |
| return all.includes(requestedRelease) |
| ? res.redirect(`https://enterprise.github.com/releases/${requestedRelease}.0/notes`) |
| : next() |
| } |
|
|
| |
| |
| |
| if (!req.context.page) return next() |
|
|
| |
| req.context.ghesReleases = formatReleases(ghesReleaseNotes) |
|
|
| |
| const matchedReleaseNotes = req.context.ghesReleases.find((r) => r.version === requestedRelease) |
| if (!matchedReleaseNotes) throw new Error('Release notes not found') |
| const currentReleaseNotes = matchedReleaseNotes.patches |
|
|
| |
| |
| |
| |
| const originalLanguage = req.context.currentLanguage |
| req.context.autotitleLanguage = originalLanguage |
| req.context.currentLanguage = 'en' |
|
|
| try { |
| |
| |
| req.context.ghesReleaseNotes = await executeWithFallback( |
| req.context, |
| () => renderPatchNotes(currentReleaseNotes, req.context!), |
| (enContext: Context) => { |
| |
| |
| |
| enContext.ghesReleases = formatReleases(ghesReleaseNotes) |
|
|
| const enMatchedNotes = enContext.ghesReleases!.find((r) => r.version === requestedRelease) |
| if (!enMatchedNotes) throw new Error('Release notes not found') |
| const enCurrentNotes = enMatchedNotes.patches |
| return renderPatchNotes(enCurrentNotes, enContext) |
| }, |
| ) |
| } finally { |
| |
| req.context.currentLanguage = originalLanguage |
| } |
|
|
| |
| |
| req.context.latestPatch = req.context.ghesReleaseNotes![0].version |
| req.context.latestRelease = latestStable |
|
|
| |
| for (const release of req.context.ghesReleases) { |
| release.firstPreviousRelease = all[all.findIndex((v) => v === release.version) + 1] |
| release.secondPreviousRelease = |
| all[all.findIndex((v) => v === release.firstPreviousRelease) + 1] |
| } |
|
|
| return next() |
| } |
|
|