Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion scripts/capture-readme-screenshots.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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 });
Expand All @@ -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}`);
}
Expand Down
15 changes: 12 additions & 3 deletions scripts/export-site-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand All @@ -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",
);
Expand Down Expand Up @@ -86,7 +95,7 @@ export function toAbsoluteSiteUrl(origin: string, routePath: string) {
export async function discoverCoursePages(
language: Language,
): Promise<CoursePage[]> {
const languageRoot = path.resolve(docsRoot, language);
const languageRoot = path.resolve(activeCourseDocsRoot, language);
const files = await walkMarkdownFiles(languageRoot);

return files
Expand Down Expand Up @@ -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);
Expand All @@ -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, "/");
Expand Down
14 changes: 14 additions & 0 deletions tests/course-branding.test.mjs
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -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/");
Expand Down