diff --git a/scripts/capture-readme-screenshots.ts b/scripts/capture-readme-screenshots.ts index e61c4502..73838a5a 100644 --- a/scripts/capture-readme-screenshots.ts +++ b/scripts/capture-readme-screenshots.ts @@ -1,7 +1,9 @@ import path from "node:path"; +import { promises as fs } from "node:fs"; import { chromium, devices } from "playwright"; import { ensureDirectory, + legacyReadmeScreenshotsRoot, readmeScreenshotTargets, readmeScreenshotsRoot, startStaticServer, @@ -10,6 +12,7 @@ import { async function main() { await ensureDirectory(readmeScreenshotsRoot); + await ensureDirectory(legacyReadmeScreenshotsRoot); const server = await startStaticServer(); const browser = await chromium.launch({ headless: true }); @@ -18,13 +21,23 @@ async function main() { try { for (const target of readmeScreenshotTargets) { const page = await context.newPage(); + const screenshotPath = path.join( + readmeScreenshotsRoot, + target.outputName, + ); await page.goto(toAbsoluteSiteUrl(server.origin, target.routePath), { waitUntil: "networkidle", }); await page.screenshot({ - path: path.join(readmeScreenshotsRoot, target.outputName), + path: screenshotPath, fullPage: false, }); + if (legacyReadmeScreenshotsRoot !== readmeScreenshotsRoot) { + await fs.copyFile( + screenshotPath, + path.join(legacyReadmeScreenshotsRoot, target.outputName), + ); + } await page.close(); console.log(`Captured ${target.outputName}`); } diff --git a/scripts/export-site-utils.ts b/scripts/export-site-utils.ts index 8720c26c..89eba091 100644 --- a/scripts/export-site-utils.ts +++ b/scripts/export-site-utils.ts @@ -2,6 +2,7 @@ import http from "node:http"; import path from "node:path"; import { existsSync } from "node:fs"; import { promises as fs } from "node:fs"; +import { ACTIVE_COURSE_CONTENT_DIR } from "../docs/.vitepress/active-course.mjs"; export type Language = "en" | "zh"; @@ -19,10 +20,18 @@ export type ScreenshotTarget = { export const repoRoot = process.cwd(); export const docsRoot = path.resolve(repoRoot, "docs"); +export const activeCourseDocsRoot = path.resolve( + docsRoot, + ACTIVE_COURSE_CONTENT_DIR, +); export const distRoot = path.resolve(repoRoot, "docs/.vitepress/dist"); export const artifactsRoot = path.resolve(repoRoot, "artifacts"); export const pdfOutputRoot = path.resolve(artifactsRoot, "pdfs"); export const readmeScreenshotsRoot = path.resolve( + activeCourseDocsRoot, + "public/screenshots/readme", +); +export const legacyReadmeScreenshotsRoot = path.resolve( docsRoot, "public/screenshots/readme", ); @@ -86,7 +95,7 @@ export function toAbsoluteSiteUrl(origin: string, routePath: string) { export async function discoverCoursePages( language: Language, ): Promise { - const languageRoot = path.resolve(docsRoot, language); + const languageRoot = path.resolve(activeCourseDocsRoot, language); const files = await walkMarkdownFiles(languageRoot); return files @@ -195,7 +204,7 @@ function shouldIncludeInCoursePdf(relativePath: string) { } function compareCourseFiles(language: Language, left: string, right: string) { - const languageRoot = path.resolve(docsRoot, language); + const languageRoot = path.resolve(activeCourseDocsRoot, language); const leftRelative = path.relative(languageRoot, left).replace(/\\/g, "/"); const rightRelative = path.relative(languageRoot, right).replace(/\\/g, "/"); const leftWeight = sortWeight(leftRelative); @@ -216,7 +225,7 @@ function sortWeight(relativePath: string) { } function sourceFileToRoutePath(language: Language, filePath: string) { - const languageRoot = path.resolve(docsRoot, language); + const languageRoot = path.resolve(activeCourseDocsRoot, language); const relativePath = path .relative(languageRoot, filePath) .replace(/\\/g, "/"); diff --git a/tests/course-branding.test.mjs b/tests/course-branding.test.mjs index cc0ef460..b1f804b8 100644 --- a/tests/course-branding.test.mjs +++ b/tests/course-branding.test.mjs @@ -1,5 +1,7 @@ import test from "node:test"; import assert from "node:assert/strict"; +import fs from "node:fs"; +import path from "node:path"; import bootcampManifest from "../courses/agent-ops-bootcamp/course.manifest.mjs"; import courseManifest from "../docs/.vitepress/course.manifest.mjs"; @@ -55,6 +57,18 @@ test("course manifest centralizes product config in one source", () => { ); }); +test("active course content path resolves to a real course docs tree", () => { + const repoRoot = path.resolve(import.meta.dirname, ".."); + const activeCourseDocsRoot = path.resolve( + repoRoot, + "docs", + ACTIVE_COURSE_CONTENT_DIR, + ); + + assert.equal(fs.existsSync(path.join(activeCourseDocsRoot, "en")), true); + assert.equal(fs.existsSync(path.join(activeCourseDocsRoot, "public")), true); +}); + test("platform can load a second course manifest with distinct branding and curriculum", () => { assert.equal(bootcampManifest.site.title, "Agent Ops Bootcamp"); assert.equal(bootcampManifest.site.base, "/course-builder/");