playwright-checkpoint 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -0
- package/dist/{chunk-KG37WSYS.js → chunk-M3BRR3LT.js} +9 -3
- package/dist/{chunk-KG37WSYS.js.map → chunk-M3BRR3LT.js.map} +1 -1
- package/dist/{chunk-X5IPL32H.js → chunk-WXZOP7XI.js} +153 -35
- package/dist/chunk-WXZOP7XI.js.map +1 -0
- package/dist/{chunk-K5DX32TO.js → chunk-YUFXGGZM.js} +2 -2
- package/dist/cli/bin.cjs +2501 -2386
- package/dist/cli/bin.cjs.map +1 -1
- package/dist/cli/bin.js +3 -2
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/index.cjs +1405 -68
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +2 -2
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +3 -2
- package/dist/{core-CD4jHGgI.d.cts → core-6gyzs35M.d.ts} +2 -1
- package/dist/{core-CZvnc0rE.d.ts → core-Dd3WLuTs.d.cts} +2 -1
- package/dist/core.cjs +8 -2
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +2 -2
- package/dist/core.d.ts +2 -2
- package/dist/core.js +1 -1
- package/dist/{index-BjYQX_hK.d.ts → index-CvcgBzvl.d.ts} +1 -1
- package/dist/{index-Cabk31qi.d.cts → index-OQx9qcVO.d.cts} +1 -1
- package/dist/index.cjs +212 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +69 -15
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.cjs +148 -34
- package/dist/mcp/index.cjs.map +1 -1
- package/dist/mcp/index.js +4 -4
- package/dist/teardown.cjs +1409 -72
- package/dist/teardown.cjs.map +1 -1
- package/dist/teardown.js +3 -2
- package/dist/teardown.js.map +1 -1
- package/dist/{types-G7w4n8kR.d.cts → types-wX4eB9mb.d.cts} +16 -1
- package/dist/{types-G7w4n8kR.d.ts → types-wX4eB9mb.d.ts} +16 -1
- package/package.json +2 -1
- package/dist/chunk-X5IPL32H.js.map +0 -1
- /package/dist/{chunk-K5DX32TO.js.map → chunk-YUFXGGZM.js.map} +0 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core.ts","../src/collectors/aria-snapshot.ts","../src/collectors/axe.ts","../src/page-utils.ts","../src/collectors/console.ts","../src/collectors/dom-stats.ts","../src/collectors/forms.ts","../src/collectors/html.ts","../src/collectors/metadata.ts","../src/collectors/network.ts","../src/collectors/network-timing.ts","../src/collectors/screenshot.ts","../src/collectors/storage.ts","../src/collectors/web-vitals.ts","../src/collectors/builtin-collectors.ts","../src/collectors/registry.ts","../src/fixture.ts","../src/device-profile.ts","../src/collectors/index.ts","../src/report/index.ts","../src/report/html-reporter.ts","../src/report/story-utils.ts","../src/report/markdown-reporter.ts","../src/report/mdx-reporter.ts","../src/report/annotate.ts"],"sourcesContent":["export type * from './types';\nexport * from './core';\nexport * from './fixture';\nexport { type CheckpointCollector } from './types';\nexport { type ReportGenerator } from './types';\nexport * from './collectors';\nexport * from './report';\n\nexport const VERSION = '0.1.0';\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page, TestInfo } from '@playwright/test';\nimport { builtinCollectors as defaultBuiltinCollectors } from './collectors/builtin-collectors';\nimport { getBuiltinCollectors, registerBuiltinCollector, registerBuiltinCollectors } from './collectors/registry';\nimport { settlePage } from './page-utils';\nimport type {\n CheckpointCollector,\n CheckpointConfig,\n CheckpointManifest,\n CheckpointOptions,\n CheckpointRecord,\n CollectorArtifact,\n CollectorConfig,\n CollectorOptions,\n CollectorResult,\n ResolvedCollectorConfig,\n TestCheckpointConfig,\n} from './types';\n\ntype CollectorInput = boolean | CollectorOptions | CollectorConfig | undefined;\n\ntype MutableCollectorState = {\n enabled: boolean;\n config: ResolvedCollectorConfig;\n};\n\nexport type CheckpointSessionMetadata = Partial<\n Pick<CheckpointManifest, 'environment' | 'project' | 'testId' | 'title' | 'tags'>\n>;\n\nexport type CheckpointSessionOptions = Omit<CheckpointConfig, 'collectors'> & {\n outputDir: string;\n collectors?: Partial<Record<string, boolean | CollectorConfig>>;\n sessionMetadata?: CheckpointSessionMetadata;\n manifest?: CheckpointManifest;\n manifestPath?: string;\n testInfo?: TestInfo;\n adjustTimeout?: (ms: number) => void;\n};\n\nexport type CaptureCheckpointOptions = CheckpointSessionOptions & CheckpointOptions;\n\nexport type CheckpointSession = {\n outputDir: string;\n manifest: CheckpointManifest;\n checkpoint(name: string, options?: CheckpointOptions): Promise<CheckpointRecord>;\n finalize(): Promise<CheckpointManifest>;\n};\n\nexport type RunCollectorPipelineArgs = {\n page: Page;\n name: string;\n outputDir: string;\n resolvedCollectors: Map<string, ResolvedCollectorConfig>;\n registry: Map<string, CheckpointCollector>;\n options?: CheckpointOptions;\n manifest?: CheckpointManifest;\n slug?: string;\n redact?: string[];\n testInfo?: TestInfo;\n adjustTimeout?: (ms: number) => void;\n};\n\nregisterBuiltinCollectors(defaultBuiltinCollectors);\n\nfunction cloneResolvedConfig(config: ResolvedCollectorConfig): ResolvedCollectorConfig {\n return { ...config };\n}\n\nfunction cloneCollectorState(state: MutableCollectorState | undefined): MutableCollectorState {\n return {\n enabled: state?.enabled ?? false,\n config: cloneResolvedConfig(state?.config ?? {}),\n };\n}\n\nfunction applyCollectorInput(state: MutableCollectorState | undefined, input: CollectorInput): MutableCollectorState {\n const next = cloneCollectorState(state);\n\n if (input === undefined) {\n return next;\n }\n\n if (input === false) {\n return {\n enabled: false,\n config: {},\n };\n }\n\n if (input === true) {\n return {\n enabled: true,\n config: next.config,\n };\n }\n\n return {\n enabled: true,\n config: {\n ...next.config,\n ...input,\n },\n };\n}\n\nfunction collectorRegistryFor(config: CheckpointConfig = {}): Map<string, CheckpointCollector> {\n const registry = getBuiltinCollectors();\n\n for (const collector of config.custom ?? []) {\n registry.set(collector.name, collector);\n }\n\n return registry;\n}\n\nfunction cloneCheckpointOptions(options: CheckpointOptions): CheckpointOptions {\n return {\n ...options,\n ...(options.collectors ? { collectors: { ...options.collectors } } : {}),\n };\n}\n\nfunction defaultManifestEnvironment(): string {\n return process.env.PLAYWRIGHT_CHECKPOINT_ENV || process.env.NODE_ENV || 'test';\n}\n\nfunction createManifest(sessionMetadata: CheckpointSessionMetadata | undefined): CheckpointManifest {\n return {\n environment: sessionMetadata?.environment ?? defaultManifestEnvironment(),\n project: sessionMetadata?.project ?? '',\n testId: sessionMetadata?.testId ?? '',\n title: sessionMetadata?.title ?? '',\n tags: [...(sessionMetadata?.tags ?? [])],\n startedAt: new Date().toISOString(),\n checkpoints: [],\n };\n}\n\nasync function writeManifestFile(manifestPath: string, manifest: CheckpointManifest): Promise<string> {\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n return manifestPath;\n}\n\nexport function warn(message: string, error?: unknown): void {\n if (error instanceof Error) {\n console.warn(`[playwright-checkpoint] ${message}`, error);\n return;\n }\n\n if (error !== undefined) {\n console.warn(`[playwright-checkpoint] ${message}`, String(error));\n return;\n }\n\n console.warn(`[playwright-checkpoint] ${message}`);\n}\n\nexport function sanitizeSegment(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'checkpoint'\n );\n}\n\nexport function checkpointSlug(name: string, existing: CheckpointRecord[]): string {\n const base = sanitizeSegment(name);\n const existingSlugs = new Set(existing.map((record) => record.slug));\n\n if (!existingSlugs.has(base)) {\n return base;\n }\n\n let index = 2;\n let candidate = `${base}-${index}`;\n while (existingSlugs.has(candidate)) {\n index += 1;\n candidate = `${base}-${index}`;\n }\n\n return candidate;\n}\n\nasync function attachArtifacts(\n testInfo: TestInfo | undefined,\n checkpointSlugValue: string,\n collectorName: string,\n artifacts: CollectorArtifact[],\n): Promise<void> {\n const attach = testInfo?.attach;\n if (typeof attach !== 'function') {\n return;\n }\n\n for (const artifact of artifacts) {\n try {\n await attach.call(testInfo, `${checkpointSlugValue}/${collectorName}/${artifact.name}`, {\n path: artifact.path,\n contentType: artifact.contentType,\n });\n } catch (error) {\n warn(`Failed to attach artifact \"${artifact.name}\" from collector \"${collectorName}\".`, error);\n }\n }\n}\n\nexport async function collectPageTitle(page: Page): Promise<string> {\n try {\n return await page.title();\n } catch {\n return '';\n }\n}\n\nexport async function runCollectorSetup(\n collectors: Iterable<CheckpointCollector>,\n page: Page,\n testInfo?: TestInfo,\n): Promise<void> {\n for (const collector of collectors) {\n if (!collector.setup) {\n continue;\n }\n\n try {\n await collector.setup({ page, testInfo });\n } catch (error) {\n warn(`Collector \"${collector.name}\" setup failed.`, error);\n }\n }\n}\n\nexport async function runCollectorTeardown(\n collectors: Iterable<CheckpointCollector>,\n page: Page,\n testInfo?: TestInfo,\n): Promise<void> {\n const collectorList = Array.from(collectors).reverse();\n\n for (const collector of collectorList) {\n if (!collector.teardown) {\n continue;\n }\n\n try {\n await collector.teardown({ page, testInfo });\n } catch (error) {\n warn(`Collector \"${collector.name}\" teardown failed.`, error);\n }\n }\n}\n\nexport function resolveCollectors(\n globalConfig: CheckpointConfig = {},\n testConfig: TestCheckpointConfig | null = null,\n checkpointOptions: CheckpointOptions = {},\n): Map<string, ResolvedCollectorConfig> {\n const registry = collectorRegistryFor(globalConfig);\n const states = new Map<string, MutableCollectorState>();\n\n for (const collector of registry.values()) {\n states.set(collector.name, {\n enabled: collector.defaultEnabled,\n config: {},\n });\n }\n\n const levels = [globalConfig.collectors, testConfig?.collectors, checkpointOptions.collectors];\n\n for (const level of levels) {\n for (const [name, input] of Object.entries(level ?? {})) {\n states.set(name, applyCollectorInput(states.get(name), input));\n }\n }\n\n const resolved = new Map<string, ResolvedCollectorConfig>();\n\n for (const [name, state] of states) {\n if (state.enabled) {\n resolved.set(name, cloneResolvedConfig(state.config));\n }\n }\n\n return resolved;\n}\n\nexport async function runCollectorPipeline(args: RunCollectorPipelineArgs): Promise<CheckpointRecord> {\n const options = cloneCheckpointOptions(args.options ?? {});\n const slug = args.slug ?? checkpointSlug(args.name, args.manifest?.checkpoints ?? []);\n const checkpointDir = path.join(args.outputDir, slug);\n const collectorResults: Record<string, CollectorResult> = {};\n\n await fs.mkdir(checkpointDir, { recursive: true });\n await settlePage(args.page);\n\n for (const [collectorName, collectorConfig] of args.resolvedCollectors) {\n const collector = args.registry.get(collectorName);\n if (!collector) {\n warn(`Collector \"${collectorName}\" is enabled but no implementation is registered.`);\n continue;\n }\n\n try {\n const result = await collector.collect({\n page: args.page,\n testInfo: args.testInfo,\n checkpointDir,\n checkpointName: args.name,\n checkpointSlug: slug,\n redact: [...(args.redact ?? [])],\n config: cloneResolvedConfig(collectorConfig),\n options,\n adjustTimeout: args.adjustTimeout,\n });\n\n collectorResults[collectorName] = result;\n await attachArtifacts(args.testInfo, slug, collectorName, result.artifacts);\n } catch (error) {\n warn(`Collector \"${collectorName}\" failed during checkpoint \"${args.name}\".`, error);\n }\n }\n\n const record: CheckpointRecord = {\n name: args.name,\n slug,\n url: args.page.url(),\n title: await collectPageTitle(args.page),\n timestamp: new Date().toISOString(),\n ...(options.description ? { description: options.description } : {}),\n ...(typeof options.step === 'number' ? { step: options.step } : {}),\n collectors: collectorResults,\n };\n\n args.manifest?.checkpoints.push(record);\n return record;\n}\n\nexport async function captureCheckpoint(\n page: Page,\n name: string,\n options: CaptureCheckpointOptions,\n): Promise<CheckpointRecord> {\n const sessionConfig: CheckpointConfig = {\n collectors: options.collectors,\n custom: options.custom,\n redact: options.redact,\n };\n const registry = collectorRegistryFor(sessionConfig);\n const resolvedCollectors = resolveCollectors(sessionConfig, null, options);\n const enabledCollectors = Array.from(resolvedCollectors.keys())\n .map((collectorName) => registry.get(collectorName))\n .filter((collector): collector is CheckpointCollector => Boolean(collector));\n\n await fs.mkdir(options.outputDir, { recursive: true });\n await runCollectorSetup(enabledCollectors, page, options.testInfo);\n\n try {\n return await runCollectorPipeline({\n page,\n name,\n outputDir: options.outputDir,\n resolvedCollectors,\n registry,\n options,\n redact: options.redact,\n testInfo: options.testInfo,\n adjustTimeout: options.adjustTimeout,\n slug: checkpointSlug(name, []),\n });\n } finally {\n await runCollectorTeardown(enabledCollectors, page, options.testInfo);\n }\n}\n\nexport async function createCheckpointSession(page: Page, options: CheckpointSessionOptions): Promise<CheckpointSession> {\n const sessionConfig: CheckpointConfig = {\n collectors: options.collectors,\n custom: options.custom,\n redact: options.redact,\n };\n const outputDir = options.outputDir;\n const registry = collectorRegistryFor(sessionConfig);\n const manifest = options.manifest ?? createManifest(options.sessionMetadata);\n const setupCollectorNames = new Set<string>();\n const setupCollectors: CheckpointCollector[] = [];\n let finalizePromise: Promise<CheckpointManifest> | null = null;\n\n async function ensureCollectorsSetup(resolvedCollectors: Map<string, ResolvedCollectorConfig>): Promise<void> {\n for (const collectorName of resolvedCollectors.keys()) {\n if (setupCollectorNames.has(collectorName)) {\n continue;\n }\n\n const collector = registry.get(collectorName);\n if (!collector) {\n warn(`Collector \"${collectorName}\" is enabled but no implementation is registered.`);\n continue;\n }\n\n setupCollectorNames.add(collectorName);\n setupCollectors.push(collector);\n await runCollectorSetup([collector], page, options.testInfo);\n }\n }\n\n await fs.mkdir(outputDir, { recursive: true });\n await ensureCollectorsSetup(resolveCollectors(sessionConfig));\n\n return {\n outputDir,\n manifest,\n async checkpoint(name, checkpointOptions = {}) {\n if (finalizePromise) {\n throw new Error('Checkpoint session has already been finalized.');\n }\n\n const resolvedCollectors = resolveCollectors(sessionConfig, null, checkpointOptions);\n await ensureCollectorsSetup(resolvedCollectors);\n\n return runCollectorPipeline({\n page,\n name,\n outputDir,\n resolvedCollectors,\n registry,\n options: checkpointOptions,\n manifest,\n redact: options.redact,\n testInfo: options.testInfo,\n adjustTimeout: options.adjustTimeout,\n });\n },\n finalize() {\n if (!finalizePromise) {\n finalizePromise = (async () => {\n await runCollectorTeardown(setupCollectors, page, options.testInfo);\n await writeManifestFile(options.manifestPath ?? path.join(outputDir, 'checkpoint-manifest.json'), manifest);\n return manifest;\n })();\n }\n\n return finalizePromise;\n },\n };\n}\n\nexport { registerBuiltinCollector, registerBuiltinCollectors, settlePage };\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointCollector, AriaSnapshotCollectorData } from '../types';\n\nfunction countSnapshotNodes(value: unknown): number {\n if (value == null) {\n return 0;\n }\n\n if (Array.isArray(value)) {\n return value.reduce((total, item) => total + countSnapshotNodes(item), 0);\n }\n\n if (typeof value !== 'object') {\n return 1;\n }\n\n const node = value as { children?: unknown };\n const children = Array.isArray(node.children) ? node.children : [];\n return 1 + children.reduce((total, child) => total + countSnapshotNodes(child), 0);\n}\n\nasync function captureAriaSnapshot(page: {\n locator: (selector: string) => { ariaSnapshot?: () => Promise<unknown> };\n accessibility?: { snapshot?: (options?: { interestingOnly?: boolean }) => Promise<unknown> };\n}): Promise<unknown | null> {\n try {\n const root = page.locator(':root');\n if (typeof root.ariaSnapshot === 'function') {\n const snapshot = await root.ariaSnapshot();\n return snapshot ?? null;\n }\n } catch {\n // Fall through to accessibility.snapshot.\n }\n\n if (typeof page.accessibility?.snapshot === 'function') {\n try {\n const snapshot = await page.accessibility.snapshot({ interestingOnly: false });\n return snapshot ?? null;\n } catch {\n return null;\n }\n }\n\n return null;\n}\n\nexport const ariaSnapshotCollector: CheckpointCollector = {\n name: 'aria-snapshot',\n defaultEnabled: false,\n\n async collect(ctx) {\n const snapshot = await captureAriaSnapshot(ctx.page as unknown as Parameters<typeof captureAriaSnapshot>[0]);\n const nodeCount = countSnapshotNodes(snapshot);\n const outputPath = path.join(ctx.checkpointDir, 'aria-snapshot.json');\n\n const data: AriaSnapshotCollectorData = {\n snapshot,\n nodeCount,\n };\n\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'aria-snapshot',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n nodeCount,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page } from '@playwright/test';\nimport { settlePage } from '../page-utils';\nimport type { AxeCollectorData, CheckpointCollector } from '../types';\n\ntype AxeBuilderInstance = {\n analyze(): Promise<unknown>;\n};\n\ntype AxeBuilderConstructor = new (options: { page: Page }) => AxeBuilderInstance;\n\ntype AxeModule = {\n default?: AxeBuilderConstructor;\n AxeBuilder?: AxeBuilderConstructor;\n};\n\nlet axeLoader: () => Promise<AxeModule> = () => import('@axe-core/playwright');\nlet warnedAboutMissingAxe = false;\n\nfunction warnOnce(message: string, error?: unknown): void {\n if (warnedAboutMissingAxe) {\n return;\n }\n\n warnedAboutMissingAxe = true;\n if (error instanceof Error) {\n console.warn(`[playwright-checkpoint] ${message}`, error);\n return;\n }\n\n if (error !== undefined) {\n console.warn(`[playwright-checkpoint] ${message}`, String(error));\n return;\n }\n\n console.warn(`[playwright-checkpoint] ${message}`);\n}\n\nfunction resolveAxeBuilder(module: AxeModule): AxeBuilderConstructor | null {\n return module.default ?? module.AxeBuilder ?? null;\n}\n\nasync function analyzeAccessibility(page: Page, AxeBuilder: AxeBuilderConstructor): Promise<unknown> {\n try {\n await settlePage(page);\n return await new AxeBuilder({ page }).analyze();\n } catch {\n await page.waitForTimeout(500);\n await settlePage(page);\n return await new AxeBuilder({ page }).analyze();\n }\n}\n\nfunction skippedAxeResult(reason: string): {\n data: AxeCollectorData;\n artifacts: [];\n summary: { violations: number };\n} {\n return {\n data: {\n skipped: true,\n reason,\n violations: 0,\n results: null,\n },\n artifacts: [],\n summary: {\n violations: 0,\n },\n };\n}\n\nexport function setAxeLoaderForTests(loader: (() => Promise<AxeModule>) | null): void {\n axeLoader = loader ?? (() => import('@axe-core/playwright'));\n warnedAboutMissingAxe = false;\n}\n\nexport const axeCollector: CheckpointCollector = {\n name: 'axe',\n defaultEnabled: true,\n\n async collect(ctx) {\n const timeoutBudgetMs = typeof ctx.config.timeoutMs === 'number' ? ctx.config.timeoutMs : 5_000;\n\n if (timeoutBudgetMs > 0) {\n if (typeof ctx.adjustTimeout === 'function') {\n ctx.adjustTimeout(timeoutBudgetMs);\n } else if (ctx.testInfo && typeof ctx.testInfo.setTimeout === 'function') {\n ctx.testInfo.setTimeout(ctx.testInfo.timeout + timeoutBudgetMs);\n }\n }\n\n let module: AxeModule;\n try {\n module = await axeLoader();\n } catch (error) {\n warnOnce('Skipping axe collector because @axe-core/playwright is unavailable.', error);\n return skippedAxeResult('@axe-core/playwright is unavailable');\n }\n\n const AxeBuilder = resolveAxeBuilder(module);\n if (!AxeBuilder) {\n warnOnce('Skipping axe collector because @axe-core/playwright did not expose an AxeBuilder export.');\n return skippedAxeResult('@axe-core/playwright did not expose AxeBuilder');\n }\n\n const results = await analyzeAccessibility(ctx.page, AxeBuilder);\n const violations =\n results &&\n typeof results === 'object' &&\n Array.isArray((results as { violations?: unknown }).violations)\n ? (results as { violations: unknown[] }).violations.length\n : 0;\n const axePath = path.join(ctx.checkpointDir, 'axe.json');\n\n await fs.writeFile(axePath, `${JSON.stringify(results, null, 2)}\\n`, 'utf8');\n\n return {\n data: {\n skipped: false,\n reason: null,\n violations,\n results,\n } satisfies AxeCollectorData,\n artifacts: [\n {\n name: 'axe',\n path: axePath,\n contentType: 'application/json',\n },\n ],\n summary: {\n violations,\n },\n };\n },\n};\n","import type { Page } from '@playwright/test';\n\nexport async function settlePage(page: Page): Promise<void> {\n await page.waitForLoadState('domcontentloaded').catch(() => undefined);\n await page.waitForLoadState('load', { timeout: 3_000 }).catch(() => undefined);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { ConsoleMessage, Page } from '@playwright/test';\nimport type { CheckpointCollector, ConsoleErrorRecord } from '../types';\n\ntype ConsoleCollectorState = {\n entries: ConsoleErrorRecord[];\n offset: number;\n recordConsoleMessage: (message: ConsoleMessage) => void | Promise<void>;\n recordPageError: (error: Error) => void;\n};\n\nconst consoleStates = new WeakMap<Page, ConsoleCollectorState>();\n\nfunction getLocation(message: ConsoleMessage): ConsoleErrorRecord['location'] {\n const location = message.location();\n if (!location.url && location.lineNumber == null && location.columnNumber == null) {\n return null;\n }\n\n return {\n ...(location.url ? { url: location.url } : {}),\n ...(location.lineNumber == null ? {} : { lineNumber: location.lineNumber }),\n ...(location.columnNumber == null ? {} : { columnNumber: location.columnNumber }),\n };\n}\n\nexport const consoleCollector: CheckpointCollector = {\n name: 'console',\n defaultEnabled: true,\n\n async setup({ page }) {\n if (consoleStates.has(page)) {\n return;\n }\n\n const entries: ConsoleErrorRecord[] = [];\n\n const recordConsoleMessage = (message: ConsoleMessage): void => {\n if (message.type() !== 'error') {\n return;\n }\n\n entries.push({\n type: message.type(),\n text: message.text(),\n location: getLocation(message),\n timestamp: new Date().toISOString(),\n });\n };\n\n const recordPageError = (error: Error): void => {\n entries.push({\n type: 'pageerror',\n text: error.message,\n location: null,\n timestamp: new Date().toISOString(),\n });\n };\n\n page.on('console', recordConsoleMessage);\n page.on('pageerror', recordPageError);\n\n consoleStates.set(page, {\n entries,\n offset: 0,\n recordConsoleMessage,\n recordPageError,\n });\n },\n\n async collect(ctx) {\n const state = consoleStates.get(ctx.page);\n const checkpointEntries = state ? state.entries.slice(state.offset) : [];\n\n if (state) {\n state.offset = state.entries.length;\n }\n\n const outputPath = path.join(ctx.checkpointDir, 'console-errors.json');\n await fs.writeFile(outputPath, `${JSON.stringify(checkpointEntries, null, 2)}\\n`, 'utf8');\n\n return {\n data: checkpointEntries,\n artifacts: [\n {\n name: 'console-errors',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n consoleErrorCount: checkpointEntries.length,\n },\n };\n },\n\n async teardown({ page }) {\n const state = consoleStates.get(page);\n if (!state) {\n return;\n }\n\n page.off('console', state.recordConsoleMessage);\n page.off('pageerror', state.recordPageError);\n consoleStates.delete(page);\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointCollector, DomStatsCollectorData } from '../types';\n\nexport const domStatsCollector: CheckpointCollector = {\n name: 'dom-stats',\n defaultEnabled: false,\n\n async collect(ctx) {\n const stats = await ctx.page.evaluate(() => {\n const allNodes = document.querySelectorAll('*');\n\n const maxDepthFrom = (root: Element | null): number => {\n if (!root) {\n return 0;\n }\n\n let maxDepth = 1;\n const queue: Array<{ node: Element; depth: number }> = [{ node: root, depth: 1 }];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n\n maxDepth = Math.max(maxDepth, current.depth);\n for (const child of Array.from(current.node.children)) {\n queue.push({ node: child, depth: current.depth + 1 });\n }\n }\n\n return maxDepth;\n };\n\n const maybeGetEventListeners =\n (globalThis as { getEventListeners?: (target: EventTarget) => Record<string, unknown[]> }).getEventListeners;\n\n let eventListenerCount: number | null = null;\n if (typeof maybeGetEventListeners === 'function') {\n eventListenerCount = 0;\n const targets: EventTarget[] = [window, document, ...Array.from(allNodes)];\n\n for (const target of targets) {\n try {\n const listeners = maybeGetEventListeners(target) ?? {};\n for (const entries of Object.values(listeners)) {\n eventListenerCount += Array.isArray(entries) ? entries.length : 0;\n }\n } catch {\n // Ignore inaccessible targets.\n }\n }\n }\n\n return {\n nodeCount: allNodes.length,\n maxDepth: maxDepthFrom(document.documentElement),\n formCount: document.querySelectorAll('form').length,\n imageCount: document.querySelectorAll('img').length,\n scriptCount: document.querySelectorAll('script').length,\n stylesheetCount: document.styleSheets.length,\n eventListenerCount,\n };\n });\n\n const data: DomStatsCollectorData = {\n nodeCount: stats.nodeCount,\n maxDepth: stats.maxDepth,\n formCount: stats.formCount,\n imageCount: stats.imageCount,\n scriptCount: stats.scriptCount,\n stylesheetCount: stats.stylesheetCount,\n eventListenerCount: stats.eventListenerCount,\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'dom-stats.json');\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'dom-stats',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n nodeCount: data.nodeCount,\n maxDepth: data.maxDepth,\n formCount: data.formCount,\n imageCount: data.imageCount,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n CheckpointCollector,\n FormFieldState,\n FormFieldValue,\n FormsCollectorData,\n} from '../types';\n\nconst REDACTED = '[REDACTED]';\nconst DEFAULT_REDACT_PATTERNS = ['password', 'token', 'secret', 'api[_-]?key', 'authorization', 'bearer'];\nconst EMAIL_LIKE_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\ntype RawFieldState = Omit<FormFieldState, 'redacted'>;\n\nfunction toRegex(pattern: string): RegExp | null {\n const trimmed = pattern.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n return new RegExp(trimmed, 'i');\n } catch {\n return null;\n }\n}\n\nfunction redactionRegexes(ctx: { redact: string[]; config: Record<string, unknown> }): RegExp[] {\n const fromConfig = Array.isArray(ctx.config.redact)\n ? ctx.config.redact.filter((entry): entry is string => typeof entry === 'string')\n : [];\n\n return [...DEFAULT_REDACT_PATTERNS, ...ctx.redact, ...fromConfig]\n .map((pattern) => toRegex(pattern))\n .filter((value): value is RegExp => value instanceof RegExp);\n}\n\nfunction shouldRedactText(value: string, regexes: RegExp[]): boolean {\n if (EMAIL_LIKE_REGEX.test(value.trim())) {\n return true;\n }\n\n return regexes.some((regex) => regex.test(value));\n}\n\nfunction fieldIdentifier(field: RawFieldState): string {\n return [field.type, field.name, field.id, field.label, field.placeholder].filter((value): value is string => !!value).join(' ');\n}\n\nfunction redactValue(value: FormFieldValue): FormFieldValue {\n if (value == null) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(() => REDACTED);\n }\n\n return REDACTED;\n}\n\nfunction fieldNeedsRedaction(field: RawFieldState, regexes: RegExp[]): boolean {\n if (shouldRedactText(fieldIdentifier(field), regexes)) {\n return true;\n }\n\n if (field.value == null) {\n return false;\n }\n\n if (Array.isArray(field.value)) {\n return field.value.some((entry) => shouldRedactText(entry, regexes));\n }\n\n return shouldRedactText(field.value, regexes);\n}\n\nexport const formsCollector: CheckpointCollector = {\n name: 'forms',\n defaultEnabled: false,\n\n async collect(ctx) {\n const rawFields = await ctx.page.evaluate(() => {\n const elements = Array.from(document.querySelectorAll('input, select, textarea'));\n\n const isVisible = (element: Element): boolean => {\n if (!(element instanceof HTMLElement)) {\n return false;\n }\n\n const inputType = element instanceof HTMLInputElement ? element.type.toLowerCase() : null;\n if (inputType === 'hidden') {\n return false;\n }\n\n if (element.hasAttribute('hidden') || element.getAttribute('aria-hidden') === 'true') {\n return false;\n }\n\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden' || Number(style.opacity) === 0) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n };\n\n const readLabel = (element: Element): string | null => {\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n const fromLabels = element.labels && element.labels.length > 0 ? element.labels[0]?.textContent?.trim() : null;\n if (fromLabels) {\n return fromLabels;\n }\n }\n\n return element.getAttribute('aria-label')?.trim() ?? null;\n };\n\n const readValue = (element: Element): { value: string | string[] | null; checked: boolean | null; type: string | null } => {\n if (element instanceof HTMLSelectElement) {\n if (element.multiple) {\n return {\n value: Array.from(element.selectedOptions).map((option) => option.value),\n checked: null,\n type: 'select-multiple',\n };\n }\n\n return {\n value: element.value,\n checked: null,\n type: 'select-one',\n };\n }\n\n if (element instanceof HTMLTextAreaElement) {\n return {\n value: element.value,\n checked: null,\n type: 'textarea',\n };\n }\n\n if (element instanceof HTMLInputElement) {\n const inputType = element.type.toLowerCase();\n if (inputType === 'checkbox' || inputType === 'radio') {\n return {\n value: element.checked ? element.value || 'on' : null,\n checked: element.checked,\n type: inputType,\n };\n }\n\n if (inputType === 'file') {\n return {\n value: element.files ? Array.from(element.files).map((file) => file.name) : [],\n checked: null,\n type: inputType,\n };\n }\n\n return {\n value: element.value,\n checked: null,\n type: inputType || null,\n };\n }\n\n return {\n value: null,\n checked: null,\n type: null,\n };\n };\n\n return elements\n .filter((element) => isVisible(element))\n .map((element) => {\n const { value, checked, type } = readValue(element);\n\n return {\n tagName: element.tagName.toLowerCase() as 'input' | 'select' | 'textarea',\n type,\n name: element.getAttribute('name'),\n id: element.getAttribute('id'),\n label: readLabel(element),\n placeholder: element.getAttribute('placeholder'),\n value,\n checked,\n disabled: (element as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement).disabled,\n required: (element as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement).required,\n };\n });\n });\n\n const regexes = redactionRegexes({ redact: ctx.redact, config: ctx.config });\n let redactedCount = 0;\n\n const fields: FormFieldState[] = (rawFields as RawFieldState[]).map((field) => {\n const redacted = fieldNeedsRedaction(field, regexes);\n if (redacted) {\n redactedCount += 1;\n }\n\n return {\n ...field,\n redacted,\n value: redacted ? redactValue(field.value) : field.value,\n };\n });\n\n const data: FormsCollectorData = {\n fieldCount: fields.length,\n redactedCount,\n fields,\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'form-state.json');\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'form-state',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n fieldCount: data.fieldCount,\n redactedCount: data.redactedCount,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page } from '@playwright/test';\nimport { settlePage } from '../page-utils';\nimport type { CheckpointCollector, HtmlCollectorData } from '../types';\n\nasync function readPageContent(page: Page): Promise<string> {\n try {\n await settlePage(page);\n return await page.content();\n } catch {\n await page.waitForTimeout(500);\n await settlePage(page);\n return await page.content();\n }\n}\n\nexport const htmlCollector: CheckpointCollector = {\n name: 'html',\n defaultEnabled: true,\n\n async collect(ctx) {\n const htmlPath = path.join(ctx.checkpointDir, 'page.html');\n const html = await readPageContent(ctx.page);\n\n await fs.writeFile(htmlPath, html, 'utf8');\n\n return {\n data: {\n contentLength: html.length,\n } satisfies HtmlCollectorData,\n artifacts: [\n {\n name: 'html',\n path: htmlPath,\n contentType: 'text/html',\n },\n ],\n summary: {\n htmlPath: 'page.html',\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointCollector, PageMetadata } from '../types';\n\nfunction normalizeStructuredData(scriptContents: Array<string | null>): unknown[] {\n const values: unknown[] = [];\n\n for (const content of scriptContents) {\n const value = content?.trim();\n if (!value) {\n continue;\n }\n\n try {\n values.push(JSON.parse(value));\n } catch {\n values.push({\n parseError: 'Invalid JSON-LD',\n raw: value,\n });\n }\n }\n\n return values;\n}\n\nexport const metadataCollector: CheckpointCollector = {\n name: 'metadata',\n defaultEnabled: true,\n\n async collect(ctx) {\n const metadata = await ctx.page.evaluate(() => {\n const meta = (selector: string): string | null => document.querySelector(selector)?.getAttribute('content') ?? null;\n const canonicalLink = document.querySelector('link[rel=\"canonical\"]');\n const html = document.documentElement;\n const structuredDataScripts = Array.from(document.querySelectorAll('script[type=\"application/ld+json\"]')).map((script) => script.textContent ?? null);\n\n return {\n url: location.href,\n title: document.title,\n description: meta('meta[name=\"description\"]'),\n openGraph: {\n title: meta('meta[property=\"og:title\"]'),\n description: meta('meta[property=\"og:description\"]'),\n image: meta('meta[property=\"og:image\"]'),\n },\n canonicalUrl: canonicalLink?.getAttribute('href') ?? null,\n lang: html.getAttribute('lang'),\n viewport: meta('meta[name=\"viewport\"]'),\n structuredDataScripts,\n };\n });\n\n const normalizedMetadata: PageMetadata = {\n url: metadata.url,\n title: metadata.title,\n description: metadata.description,\n openGraph: metadata.openGraph,\n canonicalUrl: metadata.canonicalUrl,\n lang: metadata.lang,\n viewport: metadata.viewport,\n structuredData: normalizeStructuredData(metadata.structuredDataScripts),\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'metadata.json');\n await fs.writeFile(outputPath, `${JSON.stringify(normalizedMetadata, null, 2)}\\n`, 'utf8');\n\n return {\n data: normalizedMetadata,\n artifacts: [\n {\n name: 'metadata',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n url: normalizedMetadata.url,\n title: normalizedMetadata.title,\n lang: normalizedMetadata.lang,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page, Request, Response } from '@playwright/test';\nimport type { CheckpointCollector, FailedRequestRecord } from '../types';\n\ntype NetworkCollectorState = {\n entries: FailedRequestRecord[];\n offset: number;\n recordRequestFailure: (request: Request) => void;\n recordHttpError: (response: Response) => void;\n};\n\nconst networkStates = new WeakMap<Page, NetworkCollectorState>();\n\nexport const networkCollector: CheckpointCollector = {\n name: 'network',\n defaultEnabled: true,\n\n async setup({ page }) {\n if (networkStates.has(page)) {\n return;\n }\n\n const entries: FailedRequestRecord[] = [];\n\n const recordRequestFailure = (request: Request): void => {\n entries.push({\n kind: 'requestfailed',\n url: request.url(),\n method: request.method(),\n status: null,\n statusText: null,\n failureText: request.failure()?.errorText ?? null,\n timestamp: new Date().toISOString(),\n });\n };\n\n const recordHttpError = (response: Response): void => {\n if (response.status() < 400) {\n return;\n }\n\n entries.push({\n kind: 'http-error',\n url: response.url(),\n method: response.request().method(),\n status: response.status(),\n statusText: response.statusText(),\n failureText: null,\n timestamp: new Date().toISOString(),\n });\n };\n\n page.on('requestfailed', recordRequestFailure);\n page.on('response', recordHttpError);\n\n networkStates.set(page, {\n entries,\n offset: 0,\n recordRequestFailure,\n recordHttpError,\n });\n },\n\n async collect(ctx) {\n const state = networkStates.get(ctx.page);\n const checkpointEntries = state ? state.entries.slice(state.offset) : [];\n\n if (state) {\n state.offset = state.entries.length;\n }\n\n const outputPath = path.join(ctx.checkpointDir, 'failed-requests.json');\n await fs.writeFile(outputPath, `${JSON.stringify(checkpointEntries, null, 2)}\\n`, 'utf8');\n\n return {\n data: checkpointEntries,\n artifacts: [\n {\n name: 'failed-requests',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n failedRequestCount: checkpointEntries.length,\n },\n };\n },\n\n async teardown({ page }) {\n const state = networkStates.get(page);\n if (!state) {\n return;\n }\n\n page.off('requestfailed', state.recordRequestFailure);\n page.off('response', state.recordHttpError);\n networkStates.delete(page);\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page, Response } from '@playwright/test';\nimport type {\n CheckpointCollector,\n NetworkTimingCollectorData,\n NetworkTimingRecord,\n} from '../types';\n\ntype ResponseEventRecord = {\n url: string;\n status: number | null;\n statusText: string | null;\n resourceType: string | null;\n timestamp: string;\n};\n\ntype ResourceTimingRecord = {\n name: string;\n duration: number;\n transferSize: number;\n encodedBodySize: number;\n decodedBodySize: number;\n nextHopProtocol: string;\n startTime: number;\n redirectStart: number;\n redirectEnd: number;\n domainLookupStart: number;\n domainLookupEnd: number;\n connectStart: number;\n connectEnd: number;\n secureConnectionStart: number;\n requestStart: number;\n responseStart: number;\n responseEnd: number;\n};\n\ntype NetworkTimingCollectorState = {\n responses: ResponseEventRecord[];\n responseOffset: number;\n resourceOffsetByUrl: Map<string, number>;\n recordResponse: (response: Response) => void;\n};\n\nconst timingStates = new WeakMap<Page, NetworkTimingCollectorState>();\n\nfunction maybeDuration(start: number, end: number): number | null {\n if (start <= 0 || end <= 0 || end < start) {\n return null;\n }\n\n return end - start;\n}\n\nfunction toNetworkRecord(response: ResponseEventRecord, timing: ResourceTimingRecord | null): NetworkTimingRecord {\n return {\n url: response.url,\n status: response.status,\n statusText: response.statusText,\n resourceType: response.resourceType,\n timestamp: response.timestamp,\n durationMs: timing ? timing.duration : null,\n transferSize: timing ? timing.transferSize : null,\n encodedBodySize: timing ? timing.encodedBodySize : null,\n decodedBodySize: timing ? timing.decodedBodySize : null,\n nextHopProtocol: timing ? timing.nextHopProtocol || null : null,\n timing: {\n startTimeMs: timing ? timing.startTime : null,\n redirectMs: timing ? maybeDuration(timing.redirectStart, timing.redirectEnd) : null,\n dnsMs: timing ? maybeDuration(timing.domainLookupStart, timing.domainLookupEnd) : null,\n connectMs: timing ? maybeDuration(timing.connectStart, timing.connectEnd) : null,\n tlsMs: timing ? maybeDuration(timing.secureConnectionStart, timing.connectEnd) : null,\n requestMs: timing ? maybeDuration(timing.requestStart, timing.responseStart) : null,\n responseMs: timing ? maybeDuration(timing.responseStart, timing.responseEnd) : null,\n },\n };\n}\n\nexport const networkTimingCollector: CheckpointCollector = {\n name: 'network-timing',\n defaultEnabled: false,\n\n async setup({ page }) {\n if (timingStates.has(page)) {\n return;\n }\n\n const responses: ResponseEventRecord[] = [];\n\n const recordResponse = (response: Response): void => {\n responses.push({\n url: response.url(),\n status: response.status(),\n statusText: response.statusText(),\n resourceType: response.request().resourceType(),\n timestamp: new Date().toISOString(),\n });\n };\n\n page.on('response', recordResponse);\n\n timingStates.set(page, {\n responses,\n responseOffset: 0,\n resourceOffsetByUrl: new Map<string, number>(),\n recordResponse,\n });\n },\n\n async collect(ctx) {\n const state = timingStates.get(ctx.page);\n const recentResponses = state ? state.responses.slice(state.responseOffset) : [];\n\n if (state) {\n state.responseOffset = state.responses.length;\n }\n\n const resourceTimings = (await ctx.page.evaluate(() => {\n const entries = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n return entries.map((entry) => ({\n name: entry.name,\n duration: entry.duration,\n transferSize: entry.transferSize,\n encodedBodySize: entry.encodedBodySize,\n decodedBodySize: entry.decodedBodySize,\n nextHopProtocol: entry.nextHopProtocol,\n startTime: entry.startTime,\n redirectStart: entry.redirectStart,\n redirectEnd: entry.redirectEnd,\n domainLookupStart: entry.domainLookupStart,\n domainLookupEnd: entry.domainLookupEnd,\n connectStart: entry.connectStart,\n connectEnd: entry.connectEnd,\n secureConnectionStart: entry.secureConnectionStart,\n requestStart: entry.requestStart,\n responseStart: entry.responseStart,\n responseEnd: entry.responseEnd,\n }));\n })) as ResourceTimingRecord[];\n\n const timingsByUrl = new Map<string, ResourceTimingRecord[]>();\n for (const timing of resourceTimings) {\n const list = timingsByUrl.get(timing.name);\n if (list) {\n list.push(timing);\n } else {\n timingsByUrl.set(timing.name, [timing]);\n }\n }\n\n const requests: NetworkTimingRecord[] = recentResponses.map((response) => {\n if (!state) {\n return toNetworkRecord(response, null);\n }\n\n const list = timingsByUrl.get(response.url) ?? [];\n const currentOffset = state.resourceOffsetByUrl.get(response.url) ?? 0;\n const match = list[currentOffset] ?? null;\n\n if (match) {\n state.resourceOffsetByUrl.set(response.url, currentOffset + 1);\n }\n\n return toNetworkRecord(response, match);\n });\n\n const totalBytes = requests.reduce((total, request) => {\n if (typeof request.transferSize !== 'number' || request.transferSize < 0) {\n return total;\n }\n\n return total + request.transferSize;\n }, 0);\n\n const slowestRequestMs = requests.reduce((slowest, request) => {\n if (typeof request.durationMs !== 'number') {\n return slowest;\n }\n\n return Math.max(slowest, request.durationMs);\n }, 0);\n\n const data: NetworkTimingCollectorData = {\n requestCount: requests.length,\n totalBytes,\n slowestRequestMs,\n requests,\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'network-timing.json');\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'network-timing',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n requestCount: data.requestCount,\n totalBytes: data.totalBytes,\n slowestRequestMs: data.slowestRequestMs,\n },\n };\n },\n\n async teardown({ page }) {\n const state = timingStates.get(page);\n if (!state) {\n return;\n }\n\n page.off('response', state.recordResponse);\n timingStates.delete(page);\n },\n};\n","import path from 'node:path';\nimport type { CheckpointCollector, ScreenshotCollectorData } from '../types';\n\nconst PNG_SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n\nfunction readPngSize(buffer: Buffer): ScreenshotCollectorData['imageSize'] {\n if (buffer.length < 24 || !buffer.subarray(0, 8).equals(PNG_SIGNATURE)) {\n return null;\n }\n\n if (buffer.toString('ascii', 12, 16) !== 'IHDR') {\n return null;\n }\n\n return {\n width: buffer.readUInt32BE(16),\n height: buffer.readUInt32BE(20),\n };\n}\n\nexport const screenshotCollector: CheckpointCollector = {\n name: 'screenshot',\n defaultEnabled: true,\n\n async collect(ctx) {\n const fullPage = ctx.options.fullPage ?? true;\n const screenshotPath = path.join(ctx.checkpointDir, 'page.png');\n const screenshotBuffer = await ctx.page.screenshot({ path: screenshotPath, fullPage });\n\n let highlightBounds: ScreenshotCollectorData['highlightBounds'] = null;\n if (ctx.options.highlightSelector) {\n highlightBounds = await ctx.page\n .locator(ctx.options.highlightSelector)\n .boundingBox()\n .catch(() => null);\n }\n\n return {\n data: {\n fullPage,\n highlightBounds,\n highlightSelector: ctx.options.highlightSelector ?? null,\n imageSize: Buffer.isBuffer(screenshotBuffer) ? readPngSize(screenshotBuffer) : null,\n } satisfies ScreenshotCollectorData,\n artifacts: [\n {\n name: 'screenshot',\n path: screenshotPath,\n contentType: 'image/png',\n },\n ],\n summary: {\n screenshotPath: 'page.png',\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n CheckpointCollector,\n StorageCollectorData,\n StorageCookieState,\n StorageEntryState,\n} from '../types';\n\nconst REDACTED = '[REDACTED]';\nconst DEFAULT_REDACT_PATTERNS = ['password', 'token', 'secret', 'api[_-]?key', 'authorization', 'session', 'email'];\nconst EMAIL_LIKE_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\ntype RawCookie = {\n name: string;\n domain: string;\n path: string;\n value: string;\n expires: number;\n httpOnly: boolean;\n secure: boolean;\n sameSite: string;\n};\n\ntype RawStorageEntry = {\n key: string;\n value: string;\n};\n\nfunction toRegex(pattern: string): RegExp | null {\n const trimmed = pattern.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n return new RegExp(trimmed, 'i');\n } catch {\n return null;\n }\n}\n\nfunction buildRedactionRegexes(ctx: { redact: string[]; config: Record<string, unknown> }): RegExp[] {\n const fromConfig = Array.isArray(ctx.config.redact)\n ? ctx.config.redact.filter((entry): entry is string => typeof entry === 'string')\n : [];\n\n return [...DEFAULT_REDACT_PATTERNS, ...ctx.redact, ...fromConfig]\n .map((pattern) => toRegex(pattern))\n .filter((value): value is RegExp => value instanceof RegExp);\n}\n\nfunction shouldRedact(identifier: string, value: string | null, regexes: RegExp[]): boolean {\n if (regexes.some((regex) => regex.test(identifier))) {\n return true;\n }\n\n if (!value) {\n return false;\n }\n\n if (EMAIL_LIKE_REGEX.test(value.trim())) {\n return true;\n }\n\n return regexes.some((regex) => regex.test(value));\n}\n\nexport const storageCollector: CheckpointCollector = {\n name: 'storage',\n defaultEnabled: false,\n\n async collect(ctx) {\n const includeCookieValues = ctx.config.includeCookieValues === true;\n const includeLocalStorageValues = ctx.config.includeLocalStorageValues === true;\n const redactValues = ctx.config.redactValues !== false;\n const regexes = buildRedactionRegexes({ redact: ctx.redact, config: ctx.config });\n\n const cookies = (await ctx.page.context().cookies()) as RawCookie[];\n const localStorageEntries = await ctx.page.evaluate(() =>\n Object.keys(localStorage).map((key) => ({\n key,\n value: localStorage.getItem(key) ?? '',\n })),\n );\n\n const normalizedCookies: StorageCookieState[] = cookies.map((cookie) => {\n const rawValue = includeCookieValues ? cookie.value : null;\n const redacted = redactValues && shouldRedact(cookie.name, rawValue, regexes);\n\n return {\n name: cookie.name,\n domain: cookie.domain,\n path: cookie.path,\n value: rawValue == null ? null : redacted ? REDACTED : rawValue,\n redacted,\n expires: cookie.expires,\n httpOnly: cookie.httpOnly,\n secure: cookie.secure,\n sameSite: cookie.sameSite,\n };\n });\n\n const normalizedLocalStorage: StorageEntryState[] = (localStorageEntries as RawStorageEntry[]).map((entry) => {\n const rawValue = includeLocalStorageValues ? entry.value : null;\n const redacted = redactValues && shouldRedact(entry.key, rawValue, regexes);\n\n return {\n key: entry.key,\n value: rawValue == null ? null : redacted ? REDACTED : rawValue,\n redacted,\n };\n });\n\n const data: StorageCollectorData = {\n cookieCount: normalizedCookies.length,\n localStorageKeyCount: normalizedLocalStorage.length,\n cookies: normalizedCookies,\n localStorage: normalizedLocalStorage,\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'storage-state.json');\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'storage-state',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n cookieCount: data.cookieCount,\n localStorageKeyCount: data.localStorageKeyCount,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page } from '@playwright/test';\nimport type {\n CheckpointCollector,\n WebVitalMetric,\n WebVitalRating,\n WebVitalsSnapshot,\n} from '../types';\n\ntype RawWebVitals = {\n cls: number | null;\n fcp: number | null;\n lcp: number | null;\n inp: number | null;\n ttfb: number | null;\n domContentLoaded: number | null;\n loadEvent: number | null;\n url: string;\n};\n\nconst initializedPages = new WeakSet<Page>();\n\nfunction rateMetric(\n value: number | null,\n thresholds: { good: number; needsImprovement: number },\n): WebVitalRating {\n if (value == null || Number.isNaN(value)) {\n return 'unknown';\n }\n if (value <= thresholds.good) {\n return 'good';\n }\n if (value <= thresholds.needsImprovement) {\n return 'needs-improvement';\n }\n return 'poor';\n}\n\nfunction metric(value: number | null, thresholds: { good: number; needsImprovement: number }): WebVitalMetric {\n return {\n value,\n rating: rateMetric(value, thresholds),\n };\n}\n\nasync function captureWebVitals(page: Page): Promise<WebVitalsSnapshot> {\n const raw = await page.evaluate(() => {\n const globalState = globalThis as typeof globalThis & {\n __e2eWebVitals?: {\n cls: number;\n fcp: number | null;\n lcp: number | null;\n inp: number | null;\n };\n };\n\n const state = globalState.__e2eWebVitals ?? {\n cls: 0,\n fcp: null,\n lcp: null,\n inp: null,\n };\n const navigation = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n\n return {\n cls: state.cls,\n fcp: state.fcp,\n lcp: state.lcp,\n inp: state.inp,\n ttfb: navigation ? navigation.responseStart : null,\n domContentLoaded: navigation ? navigation.domContentLoadedEventEnd : null,\n loadEvent: navigation ? navigation.loadEventEnd : null,\n url: location.href,\n } satisfies RawWebVitals;\n });\n\n return {\n url: raw.url,\n capturedAt: new Date().toISOString(),\n cls: metric(raw.cls, { good: 0.1, needsImprovement: 0.25 }),\n fcpMs: metric(raw.fcp, { good: 1800, needsImprovement: 3000 }),\n lcpMs: metric(raw.lcp, { good: 2500, needsImprovement: 4000 }),\n inpMs: metric(raw.inp, { good: 200, needsImprovement: 500 }),\n ttfbMs: metric(raw.ttfb, { good: 800, needsImprovement: 1800 }),\n domContentLoadedMs: raw.domContentLoaded,\n loadEventMs: raw.loadEvent,\n };\n}\n\nexport const webVitalsCollector: CheckpointCollector = {\n name: 'web-vitals',\n defaultEnabled: true,\n\n async setup({ page }) {\n if (initializedPages.has(page)) {\n return;\n }\n\n initializedPages.add(page);\n\n await page.addInitScript(() => {\n const globalState = globalThis as typeof globalThis & {\n __e2eWebVitals?: {\n cls: number;\n fcp: number | null;\n lcp: number | null;\n inp: number | null;\n };\n };\n\n if (!globalState.__e2eWebVitals) {\n globalState.__e2eWebVitals = {\n cls: 0,\n fcp: null,\n lcp: null,\n inp: null,\n };\n }\n\n const state = globalState.__e2eWebVitals;\n\n try {\n const paintObserver = new PerformanceObserver((entryList) => {\n for (const entry of entryList.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n state.fcp = entry.startTime;\n }\n }\n });\n paintObserver.observe({ type: 'paint', buffered: true });\n } catch {\n // Unsupported in this browser context.\n }\n\n try {\n const lcpObserver = new PerformanceObserver((entryList) => {\n const entries = entryList.getEntries();\n const lastEntry = entries[entries.length - 1];\n if (lastEntry) {\n state.lcp = lastEntry.startTime;\n }\n });\n lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n addEventListener('pagehide', () => lcpObserver.disconnect(), { once: true });\n } catch {\n // Unsupported in this browser context.\n }\n\n try {\n const clsObserver = new PerformanceObserver((entryList) => {\n for (const entry of entryList.getEntries() as Array<PerformanceEntry & { hadRecentInput?: boolean; value?: number }>) {\n if (!entry.hadRecentInput) {\n state.cls += entry.value ?? 0;\n }\n }\n });\n clsObserver.observe({ type: 'layout-shift', buffered: true });\n addEventListener('pagehide', () => clsObserver.disconnect(), { once: true });\n } catch {\n // Unsupported in this browser context.\n }\n\n try {\n const inpObserver = new PerformanceObserver((entryList) => {\n for (const entry of entryList.getEntries() as Array<PerformanceEntry & { duration?: number }>) {\n const duration = entry.duration ?? 0;\n if (state.inp == null || duration > state.inp) {\n state.inp = duration;\n }\n }\n });\n inpObserver.observe({ type: 'event', buffered: true, durationThreshold: 40 } as PerformanceObserverInit);\n addEventListener('pagehide', () => inpObserver.disconnect(), { once: true });\n } catch {\n // Unsupported in this browser context.\n }\n });\n },\n\n async collect(ctx) {\n const snapshot = await captureWebVitals(ctx.page);\n const outputPath = path.join(ctx.checkpointDir, 'web-vitals.json');\n\n await fs.writeFile(outputPath, `${JSON.stringify(snapshot, null, 2)}\\n`, 'utf8');\n\n return {\n data: snapshot,\n artifacts: [\n {\n name: 'web-vitals',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n cls: snapshot.cls,\n fcp: snapshot.fcpMs,\n lcp: snapshot.lcpMs,\n inp: snapshot.inpMs,\n ttfb: snapshot.ttfbMs,\n },\n };\n },\n\n async teardown({ page }) {\n initializedPages.delete(page);\n },\n};\n","import { ariaSnapshotCollector } from './aria-snapshot';\nimport { axeCollector } from './axe';\nimport { consoleCollector } from './console';\nimport { domStatsCollector } from './dom-stats';\nimport { formsCollector } from './forms';\nimport { htmlCollector } from './html';\nimport { metadataCollector } from './metadata';\nimport { networkCollector } from './network';\nimport { networkTimingCollector } from './network-timing';\nimport { screenshotCollector } from './screenshot';\nimport { storageCollector } from './storage';\nimport { webVitalsCollector } from './web-vitals';\n\nexport const builtinCollectors = [\n screenshotCollector,\n htmlCollector,\n axeCollector,\n webVitalsCollector,\n consoleCollector,\n networkCollector,\n metadataCollector,\n ariaSnapshotCollector,\n domStatsCollector,\n formsCollector,\n storageCollector,\n networkTimingCollector,\n];\n","import type { CheckpointCollector } from '../types';\n\nconst builtinCollectors = new Map<string, CheckpointCollector>();\nlet builtinsRegistered = false;\n\nexport function registerBuiltinCollector(collector: CheckpointCollector): void {\n builtinCollectors.set(collector.name, collector);\n}\n\nexport function registerBuiltinCollectors(collectors: CheckpointCollector[]): void {\n if (builtinsRegistered) {\n return;\n }\n\n for (const collector of collectors) {\n registerBuiltinCollector(collector);\n }\n\n builtinsRegistered = true;\n}\n\nexport function getBuiltinCollectors(): Map<string, CheckpointCollector> {\n return new Map(builtinCollectors);\n}\n","import fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport type * as PlaywrightModule from '@playwright/test';\nimport type {\n Page,\n PlaywrightTestArgs,\n PlaywrightTestOptions,\n PlaywrightWorkerArgs,\n PlaywrightWorkerOptions,\n TestInfo,\n TestType,\n} from '@playwright/test';\nimport {\n createCheckpointSession,\n registerBuiltinCollector,\n resolveCollectors,\n sanitizeSegment,\n settlePage,\n warn,\n} from './core';\nimport { createDeviceProfile, type DeviceProfile } from './device-profile';\nimport type {\n CheckpointConfig,\n CheckpointManifest,\n CheckpointOptions,\n CheckpointRecord,\n CollectorConfig,\n CollectorOptions,\n TestCheckpointConfig,\n} from './types';\n\ntype PlaywrightRuntime = typeof PlaywrightModule;\n\ntype TestCheckpointConfigController = {\n set(config: TestCheckpointConfig): void;\n get(): TestCheckpointConfig | null;\n};\n\ntype CheckpointFixtures = {\n checkpoint: (name: string, options?: CheckpointOptions) => Promise<CheckpointRecord>;\n checkpointManifest: CheckpointManifest;\n testCheckpointConfig: TestCheckpointConfigController;\n deviceProfile: DeviceProfile;\n};\n\nconst require = (() => {\n try {\n return Function('return require')() as NodeRequire;\n } catch {\n return createRequire(path.join(process.cwd(), 'playwright-checkpoint-runtime.cjs'));\n }\n})();\n\nfunction loadPlaywright(): PlaywrightRuntime {\n return require('@playwright/test') as PlaywrightRuntime;\n}\n\nfunction mergeCollectorOverrides(\n current: Partial<Record<string, boolean | CollectorOptions>> | undefined,\n updates: Partial<Record<string, boolean | CollectorOptions>> | undefined,\n): Partial<Record<string, boolean | CollectorOptions>> | undefined {\n if (!current && !updates) {\n return undefined;\n }\n\n const merged: Partial<Record<string, boolean | CollectorOptions>> = {\n ...(current ?? {}),\n };\n\n for (const [name, value] of Object.entries(updates ?? {})) {\n const previous = merged[name];\n\n if (value && typeof value === 'object' && !Array.isArray(value) && previous && typeof previous === 'object' && !Array.isArray(previous)) {\n merged[name] = {\n ...previous,\n ...value,\n };\n continue;\n }\n\n merged[name] = value;\n }\n\n return merged;\n}\n\nfunction mergeTestConfig(current: TestCheckpointConfig | null, update: TestCheckpointConfig): TestCheckpointConfig {\n const collectors = mergeCollectorOverrides(current?.collectors, update.collectors);\n\n return {\n description: update.description ?? current?.description,\n ...(collectors ? { collectors } : {}),\n };\n}\n\nfunction manifestEnvironment(): string {\n return process.env.PLAYWRIGHT_CHECKPOINT_ENV || process.env.NODE_ENV || 'test';\n}\n\nfunction explicitTestTags(testInfo: TestInfo): string[] {\n return (((testInfo as TestInfo & { tags?: string[] }).tags ?? []) as string[]).map((tag) => tag.toLowerCase());\n}\n\nexport function titleParts(testInfo: TestInfo): string[] {\n const maybeTitlePath = (testInfo as { titlePath?: unknown }).titlePath;\n return typeof maybeTitlePath === 'function' ? maybeTitlePath.call(testInfo) : [testInfo.title];\n}\n\nexport function collectTags(parts: string[]): Set<string> {\n const tags = new Set<string>();\n\n for (const part of parts) {\n for (const token of part.match(/@[a-z0-9-]+/gi) || []) {\n tags.add(token.toLowerCase());\n }\n }\n\n return tags;\n}\n\nexport function manifestTags(testInfo: TestInfo): string[] {\n return Array.from(new Set([...explicitTestTags(testInfo), ...collectTags(titleParts(testInfo))]));\n}\n\nexport function createCheckpointManifestRecord(testInfo: TestInfo): CheckpointManifest {\n return {\n environment: manifestEnvironment(),\n project: testInfo.project.name,\n testId: testInfo.testId,\n title: testInfo.title,\n tags: manifestTags(testInfo),\n startedAt: new Date().toISOString(),\n checkpoints: [],\n };\n}\n\nexport async function writeCheckpointManifest(testInfo: TestInfo, manifest: CheckpointManifest): Promise<string> {\n const manifestPath = testInfo.outputPath('checkpoint-manifest.json');\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n return manifestPath;\n}\n\nfunction createAdjustTimeout(testInfo: TestInfo): (ms: number) => void {\n return (ms: number) => {\n if (ms > 0 && typeof testInfo.setTimeout === 'function') {\n testInfo.setTimeout(testInfo.timeout + ms);\n }\n };\n}\n\nfunction mergeConfig(\n globalConfig: CheckpointConfig = {},\n testConfig: TestCheckpointConfig | null,\n): Partial<Record<string, boolean | CollectorConfig>> | undefined {\n return mergeCollectorOverrides(\n globalConfig.collectors,\n testConfig?.collectors,\n ) as Partial<Record<string, boolean | CollectorConfig>> | undefined;\n}\n\nexport async function captureCheckpointRecord(args: {\n globalConfig?: CheckpointConfig;\n page: Page;\n testInfo: TestInfo;\n checkpointManifest: CheckpointManifest;\n testConfig?: TestCheckpointConfig | null;\n name: string;\n options?: CheckpointOptions;\n}): Promise<CheckpointRecord> {\n const globalConfig = args.globalConfig ?? {};\n const session = await createCheckpointSession(args.page, {\n outputDir: args.testInfo.outputPath('checkpoints'),\n manifestPath: args.testInfo.outputPath('checkpoint-manifest.json'),\n manifest: args.checkpointManifest,\n collectors: mergeConfig(globalConfig, args.testConfig ?? null),\n custom: globalConfig.custom,\n redact: globalConfig.redact,\n testInfo: args.testInfo,\n adjustTimeout: createAdjustTimeout(args.testInfo),\n });\n\n try {\n return await session.checkpoint(args.name, args.options);\n } finally {\n await session.finalize();\n }\n}\n\nexport function createCheckpoint(globalConfig: CheckpointConfig = {}): {\n test: TestType<PlaywrightTestArgs & PlaywrightTestOptions & CheckpointFixtures, PlaywrightWorkerArgs & PlaywrightWorkerOptions>;\n} {\n const playwright = loadPlaywright();\n const base = playwright.test as TestType<\n PlaywrightTestArgs & PlaywrightTestOptions,\n PlaywrightWorkerArgs & PlaywrightWorkerOptions\n >;\n\n const test = base.extend<CheckpointFixtures>({\n checkpointManifest: [\n async ({}, use, testInfo) => {\n const manifest = createCheckpointManifestRecord(testInfo);\n\n try {\n await use(manifest);\n } finally {\n try {\n await writeCheckpointManifest(testInfo, manifest);\n } catch (error) {\n warn(`Failed to write checkpoint manifest for test \"${testInfo.title}\".`, error);\n }\n }\n },\n { auto: true },\n ],\n\n testCheckpointConfig: async ({}, use) => {\n let current: TestCheckpointConfig | null = null;\n\n const controller: TestCheckpointConfigController = {\n set(config) {\n current = mergeTestConfig(current, config);\n },\n get() {\n return current\n ? {\n ...current,\n ...(current.collectors ? { collectors: mergeCollectorOverrides(undefined, current.collectors) } : {}),\n }\n : null;\n },\n };\n\n await use(controller);\n },\n\n deviceProfile: async ({}, use, testInfo) => {\n await use(createDeviceProfile(testInfo));\n },\n\n checkpoint: async ({ page, checkpointManifest, testCheckpointConfig }, use, testInfo) => {\n const session = await createCheckpointSession(page, {\n outputDir: testInfo.outputPath('checkpoints'),\n manifestPath: testInfo.outputPath('checkpoint-manifest.json'),\n manifest: checkpointManifest,\n collectors: mergeConfig(globalConfig, testCheckpointConfig.get()),\n custom: globalConfig.custom,\n redact: globalConfig.redact,\n testInfo,\n adjustTimeout: createAdjustTimeout(testInfo),\n });\n\n try {\n await use((name, options = {}) => session.checkpoint(name, options));\n } finally {\n await session.finalize();\n }\n },\n });\n\n return { test };\n}\n\nexport const expect = loadPlaywright().expect;\nexport const { test } = createCheckpoint();\nexport { createCheckpointSession, createDeviceProfile, registerBuiltinCollector, resolveCollectors, sanitizeSegment, settlePage, warn };\nexport type { DeviceProfile, TestCheckpointConfigController };\n","import type { TestInfo } from '@playwright/test';\n\nexport type DeviceSurface = 'desktop' | 'mobile';\n\nexport type DeviceProfile = {\n name: string;\n isMobile: boolean;\n surface: DeviceSurface;\n};\n\nexport function createDeviceProfile(testInfo: TestInfo): DeviceProfile {\n const use = testInfo.project.use as { isMobile?: boolean } | undefined;\n const isMobile = Boolean(use?.isMobile);\n\n return {\n name: testInfo.project.name,\n isMobile,\n surface: isMobile ? 'mobile' : 'desktop',\n };\n}\n","import { builtinCollectors } from './builtin-collectors';\nimport { registerBuiltinCollectors } from './registry';\n\nregisterBuiltinCollectors(builtinCollectors);\n\nexport { registerBuiltinCollector, registerBuiltinCollectors, getBuiltinCollectors } from './registry';\nexport { screenshotCollector } from './screenshot';\nexport { htmlCollector } from './html';\nexport { axeCollector, setAxeLoaderForTests } from './axe';\nexport { webVitalsCollector } from './web-vitals';\nexport { consoleCollector } from './console';\nexport { networkCollector } from './network';\nexport { metadataCollector } from './metadata';\nexport { ariaSnapshotCollector } from './aria-snapshot';\nexport { domStatsCollector } from './dom-stats';\nexport { formsCollector } from './forms';\nexport { storageCollector } from './storage';\nexport { networkTimingCollector } from './network-timing';\nexport type { CheckpointCollector } from '../types';\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n CheckpointConfig,\n CheckpointManifest,\n ReportGenerationResults,\n ReportGenerator,\n ReporterConfig,\n RunRecord,\n} from '../types';\nimport { htmlReporter } from './html-reporter';\nimport { markdownReporter } from './markdown-reporter';\nimport { mdxReporter } from './mdx-reporter';\nexport { groupByStory, orderedCheckpointNames } from './story-utils';\n\nconst builtinReporters = new Map<string, ReportGenerator>();\nconst builtinReporterDefaults: Partial<Record<string, ReporterConfig>> = {\n html: true,\n markdown: false,\n mdx: false,\n};\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const dirents = await fs.readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n\n for (const dirent of dirents) {\n const absolutePath = path.join(directory, dirent.name);\n if (dirent.isDirectory()) {\n files.push(...(await walkFiles(absolutePath)));\n continue;\n }\n if (dirent.isFile()) {\n files.push(absolutePath);\n }\n }\n\n return files;\n}\n\nfunction isCheckpointManifestFile(filePath: string): boolean {\n const fileName = path.basename(filePath);\n return fileName === 'checkpoint-manifest.json' || (fileName.startsWith('checkpoint-manifest-') && fileName.endsWith('.json'));\n}\n\nfunction isCheckpointManifest(value: unknown): value is CheckpointManifest {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const manifest = value as Partial<CheckpointManifest>;\n return (\n typeof manifest.project === 'string' &&\n typeof manifest.testId === 'string' &&\n typeof manifest.title === 'string' &&\n typeof manifest.startedAt === 'string' &&\n Array.isArray(manifest.tags) &&\n Array.isArray(manifest.checkpoints)\n );\n}\n\nfunction toRunRecord(manifest: CheckpointManifest, sourceManifestPath: string): RunRecord {\n return {\n key: `${manifest.testId}|${manifest.project}|${manifest.startedAt}`,\n sourceManifestPath,\n environment: manifest.environment || 'unknown',\n project: manifest.project,\n testId: manifest.testId,\n title: manifest.title,\n tags: manifest.tags,\n startedAt: manifest.startedAt,\n checkpoints: manifest.checkpoints,\n };\n}\n\nfunction toManifest(run: RunRecord): CheckpointManifest {\n return {\n environment: run.environment,\n project: run.project,\n testId: run.testId,\n title: run.title,\n tags: run.tags,\n startedAt: run.startedAt,\n checkpoints: run.checkpoints,\n };\n}\n\nfunction normalizeReporterConfig(config: ReporterConfig | undefined): Record<string, unknown> | null {\n if (config == null || config === false) {\n return null;\n }\n\n if (config === true) {\n return {};\n }\n\n return { ...config };\n}\n\nexport function registerBuiltinReporter(reporter: ReportGenerator): void {\n builtinReporters.set(reporter.name, reporter);\n}\n\nexport function dedupeRuns(runs: RunRecord[]): RunRecord[] {\n const map = new Map<string, RunRecord>();\n\n for (const run of runs) {\n const existing = map.get(run.key);\n if (!existing) {\n map.set(run.key, run);\n continue;\n }\n\n const existingTime = new Date(existing.startedAt).getTime();\n const currentTime = new Date(run.startedAt).getTime();\n if (currentTime >= existingTime) {\n map.set(run.key, run);\n }\n }\n\n return [...map.values()];\n}\n\nexport async function loadRuns(testResultsDir: string): Promise<RunRecord[]> {\n let manifestFiles: string[];\n try {\n manifestFiles = (await walkFiles(testResultsDir)).filter(isCheckpointManifestFile);\n } catch {\n return [];\n }\n\n const runs: RunRecord[] = [];\n for (const manifestPath of manifestFiles) {\n let rawManifest: unknown;\n try {\n rawManifest = JSON.parse(await fs.readFile(manifestPath, 'utf8'));\n } catch {\n continue;\n }\n\n if (!isCheckpointManifest(rawManifest)) {\n continue;\n }\n\n runs.push(toRunRecord(rawManifest, manifestPath));\n }\n\n return dedupeRuns(runs);\n}\n\nexport async function runReporters(\n config: CheckpointConfig,\n testResultsDir: string,\n outputDir: string,\n): Promise<ReportGenerationResults> {\n const runs = await loadRuns(testResultsDir);\n const manifests = runs.map(toManifest);\n const results: ReportGenerationResults = {};\n const reporterConfigMap: Partial<Record<string, ReporterConfig>> = {\n ...builtinReporterDefaults,\n ...(config.reporters ?? {}),\n };\n\n for (const [name, value] of Object.entries(reporterConfigMap)) {\n const reporterConfig = normalizeReporterConfig(value);\n if (!reporterConfig) {\n continue;\n }\n\n const reporter = builtinReporters.get(name);\n if (!reporter) {\n throw new Error(`Reporter \"${name}\" is enabled but no implementation is registered.`);\n }\n\n if (reporter.validateConfig && !reporter.validateConfig(reporterConfig)) {\n throw new Error(`Reporter \"${name}\" received invalid configuration.`);\n }\n\n results[name] = await reporter.generate({\n runs,\n outputDir,\n config: reporterConfig,\n manifests,\n });\n }\n\n return results;\n}\n\nregisterBuiltinReporter(htmlReporter);\nregisterBuiltinReporter(markdownReporter);\nregisterBuiltinReporter(mdxReporter);\n\nexport { annotateScreenshot } from './annotate';\nexport { htmlReporter, markdownReporter, mdxReporter };\nexport type { ReportGenerator } from '../types';\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointRecord, ReportGenerator, RunRecord, ScreenshotCollectorData } from '../types';\nimport { groupByStory, orderedCheckpointNames } from './story-utils';\n\ntype HtmlReporterConfig = {\n title?: string;\n projectOrder?: string[];\n};\n\nconst DEFAULT_PROJECT_ORDER = ['desktop-light', 'desktop-dark', 'mobile-light', 'mobile-dark'];\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n}\n\nfunction slugify(value: string): string {\n return (\n value\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'story'\n );\n}\n\nfunction formatDateTime(isoDate: string): string {\n const date = new Date(isoDate);\n if (Number.isNaN(date.getTime())) {\n return isoDate;\n }\n\n return new Intl.DateTimeFormat('en-US', {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(date);\n}\n\nfunction projectWeight(projectName: string, projectOrder: string[]): number {\n const index = projectOrder.indexOf(projectName);\n return index === -1 ? Number.MAX_SAFE_INTEGER : index;\n}\n\nfunction formatProjectLabel(projectName: string): string {\n const [device, mode] = projectName.split('-');\n if (!device || !mode) {\n return projectName;\n }\n\n const deviceLabel = device === 'desktop' ? 'Desktop' : device === 'mobile' ? 'Mobile' : device;\n const modeLabel = mode === 'light' ? 'Light' : mode === 'dark' ? 'Dark' : mode;\n return `${deviceLabel} / ${modeLabel}`;\n}\n\nfunction sortByProjectAndTime(a: RunRecord, b: RunRecord, projectOrder: string[]): number {\n const byProject = projectWeight(a.project, projectOrder) - projectWeight(b.project, projectOrder);\n if (byProject !== 0) {\n return byProject;\n }\n\n const byProjectName = a.project.localeCompare(b.project);\n if (byProjectName !== 0) {\n return byProjectName;\n }\n\n return new Date(a.startedAt).getTime() - new Date(b.startedAt).getTime();\n}\n\nfunction getCollectorSummaryNumber(checkpoint: CheckpointRecord, collectorName: string, key: string): number | null {\n const value = checkpoint.collectors[collectorName]?.summary[key];\n return typeof value === 'number' ? value : null;\n}\n\nfunction screenshotData(checkpoint: CheckpointRecord): Partial<ScreenshotCollectorData> | null {\n const data = checkpoint.collectors.screenshot?.data;\n return data && typeof data === 'object' ? (data as Partial<ScreenshotCollectorData>) : null;\n}\n\nfunction highlightOverlayStyle(checkpoint: CheckpointRecord): string | null {\n const data = screenshotData(checkpoint);\n const bounds = data?.highlightBounds;\n const imageSize = data?.imageSize;\n\n if (\n !bounds ||\n !imageSize ||\n typeof bounds.x !== 'number' ||\n typeof bounds.y !== 'number' ||\n typeof bounds.width !== 'number' ||\n typeof bounds.height !== 'number' ||\n typeof imageSize.width !== 'number' ||\n typeof imageSize.height !== 'number' ||\n imageSize.width <= 0 ||\n imageSize.height <= 0\n ) {\n return null;\n }\n\n const left = (bounds.x / imageSize.width) * 100;\n const top = (bounds.y / imageSize.height) * 100;\n const width = (bounds.width / imageSize.width) * 100;\n const height = (bounds.height / imageSize.height) * 100;\n\n return [\n `left:${left.toFixed(4)}%`,\n `top:${top.toFixed(4)}%`,\n `width:${width.toFixed(4)}%`,\n `height:${height.toFixed(4)}%`,\n ].join(';');\n}\n\nfunction highlightLabel(checkpoint: CheckpointRecord): string | null {\n const selector = screenshotData(checkpoint)?.highlightSelector;\n return typeof selector === 'string' && selector.trim().length > 0 ? `Focus: ${selector.trim()}` : null;\n}\n\nfunction resolveArtifactPath(run: RunRecord, artifactPath: string): string {\n return path.isAbsolute(artifactPath) ? artifactPath : path.resolve(path.dirname(run.sourceManifestPath), artifactPath);\n}\n\nfunction toEncodedHref(outputDir: string, filePath: string | null): string | null {\n if (!filePath) {\n return null;\n }\n\n const relativePath = path.relative(outputDir, filePath);\n return relativePath.split(path.sep).map(encodeURIComponent).join('/');\n}\n\nfunction getArtifactHref(\n run: RunRecord,\n checkpoint: CheckpointRecord,\n outputDir: string,\n collectorName: string,\n artifactName?: string,\n): string | null {\n const artifacts = checkpoint.collectors[collectorName]?.artifacts ?? [];\n const artifact = artifactName\n ? artifacts.find((entry) => entry.name === artifactName)\n : artifacts[0];\n\n if (!artifact?.path) {\n return null;\n }\n\n return toEncodedHref(outputDir, resolveArtifactPath(run, artifact.path));\n}\n\nfunction renderArtifactLinks(run: RunRecord, checkpoint: CheckpointRecord, outputDir: string): string {\n const links: Array<{ label: string; href: string | null }> = [\n { label: 'DOM HTML', href: getArtifactHref(run, checkpoint, outputDir, 'html', 'html') },\n { label: 'Axe', href: getArtifactHref(run, checkpoint, outputDir, 'axe', 'axe') },\n { label: 'Web Vitals', href: getArtifactHref(run, checkpoint, outputDir, 'web-vitals', 'web-vitals') },\n { label: 'Console', href: getArtifactHref(run, checkpoint, outputDir, 'console', 'console-errors') },\n { label: 'Failed Requests', href: getArtifactHref(run, checkpoint, outputDir, 'network', 'failed-requests') },\n ];\n\n return links\n .map((link) => {\n if (!link.href) {\n return `<span class=\"artifact disabled\">${escapeHtml(link.label)}</span>`;\n }\n\n return `<a class=\"artifact\" href=\"${link.href}\" target=\"_blank\" rel=\"noreferrer\">${escapeHtml(link.label)}</a>`;\n })\n .join('');\n}\n\nfunction renderCheckpointCard(run: RunRecord, checkpointName: string, outputDir: string): string {\n const checkpoint = run.checkpoints.find((entry) => entry.name === checkpointName);\n if (!checkpoint) {\n return `\n <article class=\"variant-card missing\">\n <header class=\"variant-card-header\">\n <div>\n <h5>${escapeHtml(formatProjectLabel(run.project))}</h5>\n <p>${escapeHtml(run.project)}</p>\n </div>\n <time>${escapeHtml(formatDateTime(run.startedAt))}</time>\n </header>\n <div class=\"empty-card\">No checkpoint captured for this run.</div>\n </article>\n `;\n }\n\n const screenshotHref = getArtifactHref(run, checkpoint, outputDir, 'screenshot', 'screenshot');\n const overlayStyle = highlightOverlayStyle(checkpoint);\n const focus = highlightLabel(checkpoint);\n const axeViolations = getCollectorSummaryNumber(checkpoint, 'axe', 'violations');\n const consoleErrors = getCollectorSummaryNumber(checkpoint, 'console', 'consoleErrorCount') ?? 0;\n const failedRequests = getCollectorSummaryNumber(checkpoint, 'network', 'failedRequestCount') ?? 0;\n\n return `\n <article class=\"variant-card\">\n <header class=\"variant-card-header\">\n <div>\n <h5>${escapeHtml(formatProjectLabel(run.project))}</h5>\n <p>${escapeHtml(run.project)}</p>\n </div>\n <time>${escapeHtml(formatDateTime(checkpoint.timestamp || run.startedAt))}</time>\n </header>\n <p class=\"page-meta\">\n <span>${escapeHtml(checkpoint.title || 'Untitled page')}</span>\n <span class=\"page-url\">${escapeHtml(checkpoint.url)}</span>\n </p>\n ${\n screenshotHref\n ? `<a class=\"thumbnail-link\" href=\"${screenshotHref}\" target=\"_blank\" rel=\"noreferrer\">\n <img src=\"${screenshotHref}\" alt=\"${escapeHtml(`${run.project} — ${checkpoint.name}`)}\" loading=\"lazy\" />\n ${overlayStyle ? `<span class=\"highlight-overlay\" style=\"${overlayStyle}\" aria-hidden=\"true\"></span>` : ''}\n ${focus ? `<span class=\"highlight-label\">${escapeHtml(focus)}</span>` : ''}\n </a>`\n : '<div class=\"empty-card\">Screenshot unavailable.</div>'\n }\n <div class=\"stats-grid\">\n <span><strong>${axeViolations ?? 'n/a'}</strong><small>Axe violations</small></span>\n <span><strong>${consoleErrors}</strong><small>Console errors</small></span>\n <span><strong>${failedRequests}</strong><small>Failed requests</small></span>\n </div>\n <div class=\"artifact-list\">${renderArtifactLinks(run, checkpoint, outputDir)}</div>\n </article>\n `;\n}\n\nfunction renderStorySection(title: string, runs: RunRecord[], outputDir: string): string {\n const checkpointNames = orderedCheckpointNames(runs);\n const environments = [...new Set(runs.map((run) => run.environment))].sort();\n const tags = [...new Set(runs.flatMap((run) => run.tags))].sort();\n\n const checkpointBlocks = checkpointNames\n .map(\n (checkpointName) => `\n <details class=\"accordion checkpoint-block\">\n <summary class=\"checkpoint-summary\">\n <span>${escapeHtml(checkpointName)}</span>\n <span class=\"checkpoint-meta\">${runs.length} variants</span>\n </summary>\n <div class=\"variant-grid\">\n ${runs.map((run) => renderCheckpointCard(run, checkpointName, outputDir)).join('')}\n </div>\n </details>\n `,\n )\n .join('');\n\n return `\n <details class=\"accordion story-block\" id=\"story-${slugify(title)}\" open>\n <summary class=\"story-summary\">\n <span class=\"story-title\">${escapeHtml(title)}</span>\n <span class=\"story-meta-chip\">${runs.length} run${runs.length === 1 ? '' : 's'}</span>\n </summary>\n <div class=\"story-body\">\n <div class=\"story-meta-row\">\n <span><strong>Projects</strong> ${escapeHtml(runs.map((run) => run.project).join(', '))}</span>\n <span><strong>Environments</strong> ${escapeHtml(environments.join(', ') || 'n/a')}</span>\n <span><strong>Tags</strong> ${escapeHtml(tags.join(', ') || 'none')}</span>\n </div>\n ${checkpointBlocks || '<p class=\"empty-state\">No checkpoints captured for this story.</p>'}\n </div>\n </details>\n `;\n}\n\nfunction buildHtmlReport(runs: RunRecord[], outputDir: string, config: HtmlReporterConfig): string {\n const groupedRuns = groupByStory(runs);\n const storyTitles = [...groupedRuns.keys()].sort((a, b) => a.localeCompare(b));\n const projectOrder = Array.isArray(config.projectOrder)\n ? config.projectOrder.filter((value): value is string => typeof value === 'string')\n : DEFAULT_PROJECT_ORDER;\n const generatedAt = new Date().toISOString();\n const reportTitle = typeof config.title === 'string' && config.title.trim() ? config.title.trim() : 'Playwright Checkpoint Report';\n\n for (const title of storyTitles) {\n groupedRuns.get(title)?.sort((a, b) => sortByProjectAndTime(a, b, projectOrder));\n }\n\n const navLinks = storyTitles\n .map((title) => `<a href=\"#story-${slugify(title)}\">${escapeHtml(title)}</a>`)\n .join('');\n\n const storySections = storyTitles\n .map((title) => renderStorySection(title, groupedRuns.get(title) ?? [], outputDir))\n .join('');\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(reportTitle)}</title>\n <style>\n :root {\n color-scheme: dark;\n --bg: #0b1020;\n --panel: rgba(15, 23, 42, 0.88);\n --panel-2: rgba(17, 25, 40, 0.98);\n --text: #e5eefb;\n --muted: #9fb3c8;\n --accent: #60a5fa;\n --accent-2: #22d3ee;\n --border: rgba(148, 163, 184, 0.18);\n --success: #34d399;\n --warning: #fbbf24;\n --danger: #fb7185;\n --shadow: 0 24px 64px rgba(2, 6, 23, 0.45);\n }\n * { box-sizing: border-box; }\n html { scroll-behavior: smooth; }\n body {\n margin: 0;\n min-height: 100vh;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n background:\n radial-gradient(circle at top, rgba(96, 165, 250, 0.14), transparent 30%),\n linear-gradient(180deg, #07101f 0%, #0b1020 100%);\n color: var(--text);\n }\n a { color: inherit; }\n .page {\n width: min(1600px, calc(100vw - 32px));\n margin: 0 auto;\n padding: 28px 0 56px;\n }\n .hero {\n background: linear-gradient(180deg, rgba(15, 23, 42, 0.96), rgba(15, 23, 42, 0.84));\n border: 1px solid var(--border);\n border-radius: 24px;\n padding: 24px;\n box-shadow: var(--shadow);\n backdrop-filter: blur(18px);\n }\n .hero h1 {\n margin: 0;\n font-size: clamp(1.9rem, 2.6vw, 3rem);\n line-height: 1.1;\n }\n .hero p {\n margin: 10px 0 0;\n color: var(--muted);\n max-width: 72ch;\n line-height: 1.6;\n }\n .summary-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n margin-top: 18px;\n }\n .summary-pill {\n display: inline-flex;\n gap: 8px;\n align-items: center;\n padding: 9px 12px;\n border: 1px solid var(--border);\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.72);\n color: var(--muted);\n font-size: 0.92rem;\n }\n .summary-pill strong { color: var(--text); }\n .toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n gap: 16px;\n margin-top: 18px;\n padding-top: 18px;\n border-top: 1px solid var(--border);\n }\n .story-nav {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n }\n .story-nav a,\n .toolbar button,\n .artifact {\n border: 1px solid var(--border);\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.7);\n color: var(--text);\n text-decoration: none;\n padding: 8px 12px;\n font: inherit;\n font-size: 0.86rem;\n transition: transform 140ms ease, border-color 140ms ease, background 140ms ease;\n }\n .toolbar button:hover,\n .story-nav a:hover,\n .artifact:hover {\n transform: translateY(-1px);\n border-color: rgba(96, 165, 250, 0.55);\n background: rgba(30, 41, 59, 0.96);\n cursor: pointer;\n }\n .content {\n display: grid;\n gap: 18px;\n margin-top: 22px;\n }\n .accordion {\n border: 1px solid var(--border);\n border-radius: 22px;\n background: var(--panel);\n box-shadow: var(--shadow);\n overflow: hidden;\n }\n .accordion summary {\n list-style: none;\n cursor: pointer;\n }\n .accordion summary::-webkit-details-marker { display: none; }\n .story-summary,\n .checkpoint-summary {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n }\n .story-summary {\n padding: 20px 22px;\n background: linear-gradient(180deg, rgba(15, 23, 42, 0.92), rgba(15, 23, 42, 0.74));\n }\n .story-title {\n font-size: 1.1rem;\n font-weight: 700;\n }\n .story-meta-chip,\n .checkpoint-meta {\n color: var(--muted);\n font-size: 0.84rem;\n white-space: nowrap;\n }\n .story-body {\n padding: 0 22px 22px;\n }\n .story-meta-row {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n color: var(--muted);\n font-size: 0.92rem;\n line-height: 1.5;\n margin: 4px 0 18px;\n }\n .story-meta-row strong { color: var(--text); margin-right: 6px; }\n .checkpoint-block {\n margin-top: 14px;\n border-radius: 18px;\n background: var(--panel-2);\n border: 1px solid rgba(148, 163, 184, 0.14);\n }\n .checkpoint-summary {\n padding: 16px 18px;\n font-weight: 600;\n background: rgba(15, 23, 42, 0.68);\n }\n .variant-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 14px;\n padding: 0 18px 18px;\n }\n .variant-card {\n display: grid;\n gap: 12px;\n border: 1px solid rgba(148, 163, 184, 0.14);\n border-radius: 18px;\n background: rgba(15, 23, 42, 0.72);\n padding: 16px;\n min-height: 100%;\n }\n .variant-card.missing {\n opacity: 0.72;\n border-style: dashed;\n }\n .variant-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 10px;\n }\n .variant-card-header h5 {\n margin: 0;\n font-size: 1rem;\n }\n .variant-card-header p,\n .variant-card-header time {\n margin: 4px 0 0;\n color: var(--muted);\n font-size: 0.83rem;\n }\n .page-meta {\n display: grid;\n gap: 4px;\n margin: 0;\n color: var(--muted);\n font-size: 0.9rem;\n }\n .page-url {\n overflow-wrap: anywhere;\n font-size: 0.82rem;\n }\n .thumbnail-link {\n position: relative;\n display: block;\n border-radius: 14px;\n overflow: hidden;\n border: 1px solid rgba(148, 163, 184, 0.18);\n background: rgba(2, 6, 23, 0.65);\n }\n .thumbnail-link img {\n display: block;\n width: 100%;\n aspect-ratio: 16 / 10;\n object-fit: cover;\n }\n .highlight-overlay {\n position: absolute;\n border: 2px solid var(--danger);\n border-radius: 12px;\n background: rgba(251, 113, 133, 0.08);\n box-shadow: 0 0 0 999px rgba(251, 113, 133, 0.02);\n pointer-events: none;\n }\n .highlight-label {\n position: absolute;\n left: 12px;\n bottom: 12px;\n max-width: calc(100% - 24px);\n padding: 6px 9px;\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.9);\n border: 1px solid rgba(251, 113, 133, 0.35);\n color: #ffe4e6;\n font-size: 0.74rem;\n line-height: 1.3;\n overflow-wrap: anywhere;\n }\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 10px;\n }\n .stats-grid span {\n display: grid;\n gap: 6px;\n padding: 10px 12px;\n border-radius: 14px;\n background: rgba(2, 6, 23, 0.42);\n border: 1px solid rgba(148, 163, 184, 0.12);\n }\n .stats-grid strong {\n font-size: 1.15rem;\n line-height: 1;\n }\n .stats-grid small {\n color: var(--muted);\n font-size: 0.76rem;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .artifact-list {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n .artifact.disabled {\n opacity: 0.45;\n pointer-events: none;\n }\n .empty-state,\n .empty-card {\n margin: 0;\n color: var(--muted);\n padding: 12px;\n border: 1px dashed rgba(148, 163, 184, 0.2);\n border-radius: 14px;\n background: rgba(2, 6, 23, 0.24);\n }\n @media (max-width: 720px) {\n .page {\n width: min(100vw - 20px, 1600px);\n padding-top: 18px;\n }\n .hero,\n .story-summary,\n .story-body,\n .checkpoint-summary,\n .variant-grid {\n padding-left: 16px;\n padding-right: 16px;\n }\n .variant-card-header,\n .story-summary,\n .checkpoint-summary,\n .toolbar {\n flex-direction: column;\n align-items: flex-start;\n }\n .stats-grid {\n grid-template-columns: 1fr;\n }\n }\n </style>\n</head>\n<body>\n <main class=\"page\">\n <section class=\"hero\">\n <h1>${escapeHtml(reportTitle)}</h1>\n <p>Explore checkpoint runs by story, inspect every project variant side-by-side, and jump directly to screenshots and generated artifacts.</p>\n <div class=\"summary-bar\">\n <span class=\"summary-pill\"><strong>Generated</strong> ${escapeHtml(formatDateTime(generatedAt))}</span>\n <span class=\"summary-pill\"><strong>Stories</strong> ${storyTitles.length}</span>\n <span class=\"summary-pill\"><strong>Runs</strong> ${runs.length}</span>\n <span class=\"summary-pill\"><strong>Output</strong> ${escapeHtml(outputDir)}</span>\n </div>\n <div class=\"toolbar\">\n <nav class=\"story-nav\">${navLinks || '<span class=\"summary-pill\">No stories found</span>'}</nav>\n <div class=\"toolbar-actions\">\n <button type=\"button\" data-action=\"expand-all\">Expand all</button>\n <button type=\"button\" data-action=\"collapse-all\">Collapse all</button>\n </div>\n </div>\n </section>\n <section class=\"content\">\n ${storySections || '<p class=\"empty-state\">No checkpoint manifests found.</p>'}\n </section>\n </main>\n <script>\n (() => {\n const details = Array.from(document.querySelectorAll('details.accordion'));\n const setAll = (open) => {\n details.forEach((entry) => {\n entry.open = open;\n });\n };\n document.querySelector('[data-action=\"expand-all\"]')?.addEventListener('click', () => setAll(true));\n document.querySelector('[data-action=\"collapse-all\"]')?.addEventListener('click', () => setAll(false));\n const revealHash = () => {\n if (!window.location.hash) {\n return;\n }\n const target = document.querySelector(window.location.hash);\n if (!(target instanceof HTMLElement)) {\n return;\n }\n const parentDetails = target.closest('details');\n if (parentDetails instanceof HTMLDetailsElement) {\n parentDetails.open = true;\n }\n target.scrollIntoView({ block: 'start', behavior: 'smooth' });\n };\n window.addEventListener('hashchange', revealHash);\n revealHash();\n })();\n </script>\n</body>\n</html>\n`;\n}\n\nexport const htmlReporter: ReportGenerator = {\n name: 'html',\n description: 'Responsive HTML report for checkpoint manifests.',\n\n validateConfig(config): boolean {\n return config != null && typeof config === 'object' && !Array.isArray(config);\n },\n\n async generate(context) {\n const outputFile = path.join(context.outputDir, 'index.html');\n const html = buildHtmlReport(context.runs, context.outputDir, context.config as HtmlReporterConfig);\n\n await fs.mkdir(context.outputDir, { recursive: true });\n await fs.writeFile(outputFile, html, 'utf8');\n\n const storyCount = new Set(context.runs.map((run) => run.title)).size;\n\n return {\n files: [outputFile],\n summary: `Generated HTML report for ${storyCount} stor${storyCount === 1 ? 'y' : 'ies'} (${context.runs.length} run${context.runs.length === 1 ? '' : 's'}).`,\n };\n },\n};\n","import type { RunRecord } from '../types';\n\nexport function groupByStory(runs: RunRecord[]): Map<string, RunRecord[]> {\n const stories = new Map<string, RunRecord[]>();\n\n for (const run of runs) {\n const existing = stories.get(run.title) ?? [];\n existing.push(run);\n stories.set(run.title, existing);\n }\n\n return stories;\n}\n\nexport function orderedCheckpointNames(runs: RunRecord[]): string[] {\n const names: string[] = [];\n const seen = new Set<string>();\n\n for (const run of runs) {\n for (const checkpoint of run.checkpoints) {\n if (seen.has(checkpoint.name)) {\n continue;\n }\n\n seen.add(checkpoint.name);\n names.push(checkpoint.name);\n }\n }\n\n return names;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointRecord, ReportGenerator, RunRecord, ScreenshotCollectorData } from '../types';\nimport { groupByStory } from './story-utils';\n\ntype MarkdownReporterConfig = {\n storiesDir?: string;\n screenshotsDir?: string;\n includeTags?: string[];\n preferredProject?: string;\n header?: string;\n footer?: string;\n frontmatter?: boolean | Record<string, unknown>;\n imagePathPrefix?: string;\n copyScreenshots?: boolean;\n};\n\ntype MarkdownStep = {\n checkpoint: CheckpointRecord;\n order: number;\n heading: string;\n description: string;\n imagePath: string | null;\n urlLabel: string;\n breadcrumbLabel: string | null;\n focusNote: string | null;\n};\n\nfunction slugify(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'story'\n );\n}\n\nfunction stripTags(value: string): string {\n const stripped = value.replace(/\\s+@[a-z0-9-]+/gi, ' ').replace(/\\s+/g, ' ').trim();\n return stripped || value.trim() || 'Untitled story';\n}\n\nfunction normalizeConfig(config: Record<string, unknown>): MarkdownReporterConfig {\n return {\n storiesDir: typeof config.storiesDir === 'string' ? config.storiesDir : '.',\n screenshotsDir: typeof config.screenshotsDir === 'string' ? config.screenshotsDir : 'screenshots',\n includeTags: Array.isArray(config.includeTags)\n ? config.includeTags.filter((value): value is string => typeof value === 'string')\n : undefined,\n preferredProject: typeof config.preferredProject === 'string' ? config.preferredProject : undefined,\n header: typeof config.header === 'string' ? config.header : undefined,\n footer: typeof config.footer === 'string' ? config.footer : undefined,\n frontmatter:\n config.frontmatter === true ||\n config.frontmatter === false ||\n (config.frontmatter != null && typeof config.frontmatter === 'object' && !Array.isArray(config.frontmatter))\n ? (config.frontmatter as MarkdownReporterConfig['frontmatter'])\n : false,\n imagePathPrefix: typeof config.imagePathPrefix === 'string' ? config.imagePathPrefix : undefined,\n copyScreenshots: typeof config.copyScreenshots === 'boolean' ? config.copyScreenshots : true,\n };\n}\n\nfunction normalizeTags(tags: string[] | undefined): string[] {\n return (tags ?? []).map((tag) => tag.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction shouldIncludeRun(run: RunRecord, config: MarkdownReporterConfig): boolean {\n const includeTags = normalizeTags(config.includeTags);\n if (includeTags.length > 0) {\n const runTags = new Set(normalizeTags(run.tags));\n return includeTags.some((tag) => runTags.has(tag));\n }\n\n return run.checkpoints.some((checkpoint) => {\n const hasDescription = typeof checkpoint.description === 'string' && checkpoint.description.trim().length > 0;\n return hasDescription || typeof checkpoint.step === 'number';\n });\n}\n\nfunction choosePrimaryRun(runs: RunRecord[], preferredProject?: string): RunRecord | null {\n if (runs.length === 0) {\n return null;\n }\n\n return [...runs].sort((left, right) => {\n const leftPreferred = preferredProject && left.project === preferredProject ? 0 : 1;\n const rightPreferred = preferredProject && right.project === preferredProject ? 0 : 1;\n if (leftPreferred !== rightPreferred) {\n return leftPreferred - rightPreferred;\n }\n\n const rightTime = new Date(right.startedAt).getTime();\n const leftTime = new Date(left.startedAt).getTime();\n if (rightTime !== leftTime) {\n return rightTime - leftTime;\n }\n\n return left.project.localeCompare(right.project);\n })[0] ?? null;\n}\n\nfunction resolveArtifactPath(run: RunRecord, artifactPath: string): string {\n return path.isAbsolute(artifactPath) ? artifactPath : path.resolve(path.dirname(run.sourceManifestPath), artifactPath);\n}\n\nfunction screenshotSourcePath(run: RunRecord, checkpoint: CheckpointRecord): string | null {\n const artifacts = checkpoint.collectors.screenshot?.artifacts ?? [];\n const artifact = artifacts.find((entry) => entry.name === 'screenshot') ?? artifacts[0];\n return artifact?.path ? resolveArtifactPath(run, artifact.path) : null;\n}\n\nfunction screenshotData(checkpoint: CheckpointRecord): Partial<ScreenshotCollectorData> | null {\n const data = checkpoint.collectors.screenshot?.data;\n return data && typeof data === 'object' ? (data as Partial<ScreenshotCollectorData>) : null;\n}\n\nfunction focusNote(checkpoint: CheckpointRecord): string | null {\n const data = screenshotData(checkpoint);\n const selector = typeof data?.highlightSelector === 'string' ? data.highlightSelector.trim() : '';\n if (selector) {\n return `Focus: \\`${selector}\\``;\n }\n\n const bounds = data?.highlightBounds;\n if (\n bounds &&\n typeof bounds.x === 'number' &&\n typeof bounds.y === 'number' &&\n typeof bounds.width === 'number' &&\n typeof bounds.height === 'number'\n ) {\n return 'Focus: highlighted UI element.';\n }\n\n return null;\n}\n\nfunction urlLabel(url: string): string {\n try {\n const parsed = new URL(url);\n const value = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n return value || '/';\n } catch {\n return url || '/';\n }\n}\n\nfunction breadcrumbLabel(url: string): string | null {\n const label = urlLabel(url);\n if (!label.startsWith('/')) {\n return null;\n }\n\n const [withoutQuery = label] = label.split('?');\n const [withoutHash = withoutQuery] = withoutQuery.split('#');\n\n const segments = withoutHash\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment).replace(/[-_]+/g, ' '));\n\n return segments.length > 0 ? segments.join(' › ') : 'home';\n}\n\nfunction autoDescription(checkpoint: CheckpointRecord): string {\n const pageTitle = checkpoint.title.trim();\n const location = urlLabel(checkpoint.url);\n\n if (pageTitle) {\n return `This step captures **${pageTitle}** at \\`${location}\\`.`;\n }\n\n return `This step captures **${checkpoint.name}** at \\`${location}\\`.`;\n}\n\nfunction markdownRelativePath(fromFile: string, toFile: string): string {\n const relativePath = path.relative(path.dirname(fromFile), toFile).split(path.sep).join('/');\n if (relativePath.startsWith('.')) {\n return relativePath;\n }\n\n return `./${relativePath}`;\n}\n\nfunction rewriteImagePath(markdownFile: string, imageFile: string, outputDir: string, prefix?: string): string {\n const relativePath = path.relative(outputDir, imageFile).split(path.sep).join('/');\n if (prefix) {\n return `${prefix.replace(/\\/+$/g, '')}/${relativePath.replace(/^\\/+/, '')}`;\n }\n\n return markdownRelativePath(markdownFile, imageFile);\n}\n\nfunction yamlScalar(value: unknown): string {\n return JSON.stringify(value);\n}\n\nfunction serializeFrontmatter(fields: Record<string, unknown>): string {\n const lines = ['---'];\n\n for (const [key, value] of Object.entries(fields)) {\n if (value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n lines.push(`${key}:`);\n if (value.length === 0) {\n lines.push(' []');\n continue;\n }\n\n for (const item of value) {\n lines.push(` - ${yamlScalar(item)}`);\n }\n continue;\n }\n\n lines.push(`${key}: ${yamlScalar(value)}`);\n }\n\n lines.push('---', '');\n return lines.join('\\n');\n}\n\nasync function materializeScreenshot(args: {\n run: RunRecord;\n checkpoint: CheckpointRecord;\n storySlug: string;\n stepOrder: number;\n outputDir: string;\n markdownFile: string;\n config: MarkdownReporterConfig;\n writtenFiles: Set<string>;\n}): Promise<string | null> {\n const sourcePath = screenshotSourcePath(args.run, args.checkpoint);\n if (!sourcePath) {\n return null;\n }\n\n const extension = path.extname(sourcePath) || '.png';\n const targetPath = path.join(\n args.outputDir,\n args.config.screenshotsDir ?? 'screenshots',\n args.storySlug,\n `${String(args.stepOrder).padStart(2, '0')}-${slugify(args.checkpoint.name)}${extension}`,\n );\n\n try {\n if (args.config.copyScreenshots !== false) {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.copyFile(sourcePath, targetPath);\n args.writtenFiles.add(targetPath);\n return rewriteImagePath(args.markdownFile, targetPath, args.outputDir, args.config.imagePathPrefix);\n }\n\n return rewriteImagePath(args.markdownFile, sourcePath, args.outputDir, args.config.imagePathPrefix);\n } catch {\n return null;\n }\n}\n\nfunction orderedCheckpoints(checkpoints: CheckpointRecord[]): CheckpointRecord[] {\n return [...checkpoints].sort((left, right) => {\n const leftOrder = typeof left.step === 'number' ? left.step : Number.MAX_SAFE_INTEGER;\n const rightOrder = typeof right.step === 'number' ? right.step : Number.MAX_SAFE_INTEGER;\n if (leftOrder !== rightOrder) {\n return leftOrder - rightOrder;\n }\n\n return checkpoints.indexOf(left) - checkpoints.indexOf(right);\n });\n}\n\nasync function buildSteps(args: {\n run: RunRecord;\n storySlug: string;\n outputDir: string;\n markdownFile: string;\n config: MarkdownReporterConfig;\n writtenFiles: Set<string>;\n}): Promise<MarkdownStep[]> {\n const checkpoints = orderedCheckpoints(args.run.checkpoints);\n const steps: MarkdownStep[] = [];\n\n for (const [index, checkpoint] of checkpoints.entries()) {\n const order = typeof checkpoint.step === 'number' ? checkpoint.step : index + 1;\n steps.push({\n checkpoint,\n order,\n heading: checkpoint.name,\n description:\n typeof checkpoint.description === 'string' && checkpoint.description.trim().length > 0\n ? checkpoint.description.trim()\n : autoDescription(checkpoint),\n imagePath: await materializeScreenshot({\n run: args.run,\n checkpoint,\n storySlug: args.storySlug,\n stepOrder: order,\n outputDir: args.outputDir,\n markdownFile: args.markdownFile,\n config: args.config,\n writtenFiles: args.writtenFiles,\n }),\n urlLabel: urlLabel(checkpoint.url),\n breadcrumbLabel: breadcrumbLabel(checkpoint.url),\n focusNote: focusNote(checkpoint),\n });\n }\n\n return steps;\n}\n\nfunction renderMarkdown(args: {\n title: string;\n steps: MarkdownStep[];\n run: RunRecord;\n config: MarkdownReporterConfig;\n generatedAt: string;\n}): string {\n const frontmatterFields =\n args.config.frontmatter === true || typeof args.config.frontmatter === 'object'\n ? {\n title: args.title,\n project: args.run.project,\n testId: args.run.testId,\n tags: args.run.tags,\n startedAt: args.run.startedAt,\n generatedAt: args.generatedAt,\n ...(args.config.frontmatter && typeof args.config.frontmatter === 'object' ? args.config.frontmatter : {}),\n }\n : null;\n\n const sections = args.steps\n .map((step) => {\n const lines = [`## Step ${step.order}: ${step.heading}`, ''];\n\n if (step.imagePath) {\n lines.push(``, '');\n }\n\n lines.push(`**URL:** \\`${step.urlLabel}\\``);\n if (step.breadcrumbLabel) {\n lines.push('', `**Breadcrumb:** ${step.breadcrumbLabel}`);\n }\n\n if (step.focusNote) {\n lines.push('', `> ${step.focusNote}`);\n }\n\n lines.push('', step.description);\n\n return lines.join('\\n');\n })\n .join('\\n\\n');\n\n const parts = [\n frontmatterFields ? serializeFrontmatter(frontmatterFields) : '',\n `# ${args.title}`,\n args.config.header ? args.config.header.trim() : '',\n sections,\n args.config.footer ? args.config.footer.trim() : '',\n ].filter((value) => value.trim().length > 0);\n\n return `${parts.join('\\n\\n')}\\n`;\n}\n\nexport const markdownReporter: ReportGenerator = {\n name: 'markdown',\n description: 'Generates one Markdown help article per captured story.',\n\n validateConfig(config): boolean {\n return config != null && typeof config === 'object' && !Array.isArray(config);\n },\n\n async generate(context) {\n const config = normalizeConfig(context.config);\n const stories = groupByStory(context.runs);\n const generatedAt = new Date().toISOString();\n const writtenFiles = new Set<string>();\n let articleCount = 0;\n\n for (const [storyTitle, runs] of stories) {\n const primaryRun = choosePrimaryRun(runs, config.preferredProject);\n if (!primaryRun || !shouldIncludeRun(primaryRun, config)) {\n continue;\n }\n\n const title = stripTags(storyTitle);\n const storySlug = slugify(title);\n const markdownFile = path.join(context.outputDir, config.storiesDir ?? '.', `${storySlug}.md`);\n const steps = await buildSteps({\n run: primaryRun,\n storySlug,\n outputDir: context.outputDir,\n markdownFile,\n config,\n writtenFiles,\n });\n\n await fs.mkdir(path.dirname(markdownFile), { recursive: true });\n await fs.writeFile(\n markdownFile,\n renderMarkdown({\n title,\n steps,\n run: primaryRun,\n config,\n generatedAt,\n }),\n 'utf8',\n );\n\n writtenFiles.add(markdownFile);\n articleCount += 1;\n }\n\n return {\n files: [...writtenFiles],\n summary: `Generated ${articleCount} Markdown article${articleCount === 1 ? '' : 's'}.`,\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointRecord, ReportGenerator, RunRecord, ScreenshotCollectorData } from '../types';\nimport { groupByStory } from './story-utils';\n\ntype MdxReporterConfig = {\n storiesDir?: string;\n screenshotsDir?: string;\n includeTags?: string[];\n preferredProject?: string;\n imagePathPrefix?: string;\n copyScreenshots?: boolean;\n componentImportPath?: string;\n};\n\ntype MdxVariant = {\n project: string;\n projectLabel: string;\n imagePath: string | null;\n imageAlt: string;\n};\n\ntype MdxStep = {\n checkpoint: CheckpointRecord;\n order: number;\n title: string;\n description: string;\n focusNote: string | null;\n variants: MdxVariant[];\n};\n\nconst DEFAULT_PROJECT_ORDER = ['desktop-light', 'desktop-dark', 'mobile-light', 'mobile-dark'];\n\nfunction slugify(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'story'\n );\n}\n\nfunction stripTags(value: string): string {\n const stripped = value.replace(/\\s+@[a-z0-9-]+/gi, ' ').replace(/\\s+/g, ' ').trim();\n return stripped || value.trim() || 'Untitled story';\n}\n\nfunction normalizeConfig(config: Record<string, unknown>): MdxReporterConfig {\n return {\n storiesDir: typeof config.storiesDir === 'string' ? config.storiesDir : '.',\n screenshotsDir: typeof config.screenshotsDir === 'string' ? config.screenshotsDir : 'screenshots',\n includeTags: Array.isArray(config.includeTags)\n ? config.includeTags.filter((value): value is string => typeof value === 'string')\n : undefined,\n preferredProject: typeof config.preferredProject === 'string' ? config.preferredProject : undefined,\n imagePathPrefix: typeof config.imagePathPrefix === 'string' ? config.imagePathPrefix : undefined,\n copyScreenshots: typeof config.copyScreenshots === 'boolean' ? config.copyScreenshots : true,\n componentImportPath:\n typeof config.componentImportPath === 'string' ? config.componentImportPath : 'playwright-checkpoint/components',\n };\n}\n\nfunction normalizeTags(tags: string[] | undefined): string[] {\n return (tags ?? []).map((tag) => tag.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction frontmatterTags(tags: string[]): string[] {\n return normalizeTags(tags).map((tag) => tag.replace(/^@+/, '')).filter(Boolean);\n}\n\nfunction shouldIncludeRun(run: RunRecord, config: MdxReporterConfig): boolean {\n const includeTags = normalizeTags(config.includeTags);\n if (includeTags.length > 0) {\n const runTags = new Set(normalizeTags(run.tags));\n return includeTags.some((tag) => runTags.has(tag));\n }\n\n return run.checkpoints.some((checkpoint) => {\n const hasDescription = typeof checkpoint.description === 'string' && checkpoint.description.trim().length > 0;\n return hasDescription || typeof checkpoint.step === 'number';\n });\n}\n\nfunction choosePrimaryRun(runs: RunRecord[], preferredProject?: string): RunRecord | null {\n if (runs.length === 0) {\n return null;\n }\n\n return [...runs].sort((left, right) => {\n const leftPreferred = preferredProject && left.project === preferredProject ? 0 : 1;\n const rightPreferred = preferredProject && right.project === preferredProject ? 0 : 1;\n if (leftPreferred !== rightPreferred) {\n return leftPreferred - rightPreferred;\n }\n\n const rightTime = new Date(right.startedAt).getTime();\n const leftTime = new Date(left.startedAt).getTime();\n if (rightTime !== leftTime) {\n return rightTime - leftTime;\n }\n\n return left.project.localeCompare(right.project);\n })[0] ?? null;\n}\n\nfunction orderedCheckpoints(checkpoints: CheckpointRecord[]): CheckpointRecord[] {\n return [...checkpoints].sort((left, right) => {\n const leftOrder = typeof left.step === 'number' ? left.step : Number.MAX_SAFE_INTEGER;\n const rightOrder = typeof right.step === 'number' ? right.step : Number.MAX_SAFE_INTEGER;\n if (leftOrder !== rightOrder) {\n return leftOrder - rightOrder;\n }\n\n return checkpoints.indexOf(left) - checkpoints.indexOf(right);\n });\n}\n\nfunction resolveArtifactPath(run: RunRecord, artifactPath: string): string {\n return path.isAbsolute(artifactPath) ? artifactPath : path.resolve(path.dirname(run.sourceManifestPath), artifactPath);\n}\n\nfunction screenshotSourcePath(run: RunRecord, checkpoint: CheckpointRecord): string | null {\n const artifacts = checkpoint.collectors.screenshot?.artifacts ?? [];\n const artifact = artifacts.find((entry) => entry.name === 'screenshot') ?? artifacts[0];\n return artifact?.path ? resolveArtifactPath(run, artifact.path) : null;\n}\n\nfunction screenshotData(checkpoint: CheckpointRecord): Partial<ScreenshotCollectorData> | null {\n const data = checkpoint.collectors.screenshot?.data;\n return data && typeof data === 'object' ? (data as Partial<ScreenshotCollectorData>) : null;\n}\n\nfunction focusNote(checkpoint: CheckpointRecord): string | null {\n const data = screenshotData(checkpoint);\n const selector = typeof data?.highlightSelector === 'string' ? data.highlightSelector.trim() : '';\n if (selector) {\n return `Focus: \\`${selector}\\``;\n }\n\n const bounds = data?.highlightBounds;\n if (\n bounds &&\n typeof bounds.x === 'number' &&\n typeof bounds.y === 'number' &&\n typeof bounds.width === 'number' &&\n typeof bounds.height === 'number'\n ) {\n return 'Focus: highlighted UI element.';\n }\n\n return null;\n}\n\nfunction urlLabel(url: string): string {\n try {\n const parsed = new URL(url);\n const value = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n return value || '/';\n } catch {\n return url || '/';\n }\n}\n\nfunction autoDescription(checkpoint: CheckpointRecord): string {\n const pageTitle = checkpoint.title.trim();\n const location = urlLabel(checkpoint.url);\n\n if (pageTitle) {\n return `This step captures **${pageTitle}** at \\`${location}\\`.`;\n }\n\n return `This step captures **${checkpoint.name}** at \\`${location}\\`.`;\n}\n\nfunction markdownRelativePath(fromFile: string, toFile: string): string {\n const relativePath = path.relative(path.dirname(fromFile), toFile).split(path.sep).join('/');\n if (relativePath.startsWith('.')) {\n return relativePath;\n }\n\n return `./${relativePath}`;\n}\n\nfunction rewriteImagePath(mdxFile: string, imageFile: string, outputDir: string, prefix?: string): string {\n const relativePath = path.relative(outputDir, imageFile).split(path.sep).join('/');\n if (prefix) {\n return `${prefix.replace(/\\/+$/g, '')}/${relativePath.replace(/^\\/+/, '')}`;\n }\n\n return markdownRelativePath(mdxFile, imageFile);\n}\n\nfunction yamlScalar(value: unknown): string {\n return JSON.stringify(value);\n}\n\nfunction serializeFrontmatter(fields: Record<string, unknown>): string {\n const lines = ['---'];\n\n for (const [key, value] of Object.entries(fields)) {\n if (value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n lines.push(`${key}:`);\n if (value.length === 0) {\n lines.push(' []');\n continue;\n }\n\n for (const item of value) {\n lines.push(` - ${yamlScalar(item)}`);\n }\n continue;\n }\n\n lines.push(`${key}: ${yamlScalar(value)}`);\n }\n\n lines.push('---', '');\n return lines.join('\\n');\n}\n\nfunction quoteJsx(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction projectWeight(projectName: string): number {\n const index = DEFAULT_PROJECT_ORDER.indexOf(projectName);\n return index === -1 ? Number.MAX_SAFE_INTEGER : index;\n}\n\nfunction formatProjectLabel(projectName: string): string {\n const [device, mode] = projectName.split('-');\n if (!device || !mode) {\n return projectName;\n }\n\n const deviceLabel = device === 'desktop' ? 'Desktop' : device === 'mobile' ? 'Mobile' : device;\n const modeLabel = mode === 'light' ? 'Light' : mode === 'dark' ? 'Dark' : mode;\n return `${deviceLabel} / ${modeLabel}`;\n}\n\nfunction sortRunsForVariants(runs: RunRecord[]): RunRecord[] {\n return [...runs].sort((left, right) => {\n const byWeight = projectWeight(left.project) - projectWeight(right.project);\n if (byWeight !== 0) {\n return byWeight;\n }\n\n return left.project.localeCompare(right.project);\n });\n}\n\nfunction findMatchingCheckpoint(run: RunRecord, baseCheckpoint: CheckpointRecord, fallbackIndex: number): CheckpointRecord | null {\n const checkpoints = orderedCheckpoints(run.checkpoints);\n\n if (typeof baseCheckpoint.step === 'number') {\n const byStep = checkpoints.find((entry) => entry.step === baseCheckpoint.step);\n if (byStep) {\n return byStep;\n }\n }\n\n const byName = checkpoints.find((entry) => entry.name === baseCheckpoint.name);\n if (byName) {\n return byName;\n }\n\n return checkpoints[fallbackIndex] ?? null;\n}\n\nasync function materializeScreenshot(args: {\n run: RunRecord;\n checkpoint: CheckpointRecord;\n storySlug: string;\n stepOrder: number;\n outputDir: string;\n mdxFile: string;\n config: MdxReporterConfig;\n writtenFiles: Set<string>;\n}): Promise<string | null> {\n const sourcePath = screenshotSourcePath(args.run, args.checkpoint);\n if (!sourcePath) {\n return null;\n }\n\n const extension = path.extname(sourcePath) || '.png';\n const targetPath = path.join(\n args.outputDir,\n args.config.screenshotsDir ?? 'screenshots',\n args.storySlug,\n `${String(args.stepOrder).padStart(2, '0')}-${slugify(args.run.project)}-${slugify(args.checkpoint.name)}${extension}`,\n );\n\n try {\n if (args.config.copyScreenshots !== false) {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.copyFile(sourcePath, targetPath);\n args.writtenFiles.add(targetPath);\n return rewriteImagePath(args.mdxFile, targetPath, args.outputDir, args.config.imagePathPrefix);\n }\n\n return rewriteImagePath(args.mdxFile, sourcePath, args.outputDir, args.config.imagePathPrefix);\n } catch {\n return null;\n }\n}\n\nasync function buildSteps(args: {\n runs: RunRecord[];\n primaryRun: RunRecord;\n storySlug: string;\n outputDir: string;\n mdxFile: string;\n config: MdxReporterConfig;\n writtenFiles: Set<string>;\n}): Promise<MdxStep[]> {\n const baseCheckpoints = orderedCheckpoints(args.primaryRun.checkpoints);\n const sortedRuns = sortRunsForVariants(args.runs);\n const steps: MdxStep[] = [];\n\n for (const [index, checkpoint] of baseCheckpoints.entries()) {\n const order = typeof checkpoint.step === 'number' ? checkpoint.step : index + 1;\n const variants: MdxVariant[] = [];\n const matchedCheckpoints: CheckpointRecord[] = [];\n\n for (const run of sortedRuns) {\n const variantCheckpoint = findMatchingCheckpoint(run, checkpoint, index);\n if (!variantCheckpoint) {\n continue;\n }\n\n matchedCheckpoints.push(variantCheckpoint);\n variants.push({\n project: run.project,\n projectLabel: formatProjectLabel(run.project),\n imagePath: await materializeScreenshot({\n run,\n checkpoint: variantCheckpoint,\n storySlug: args.storySlug,\n stepOrder: order,\n outputDir: args.outputDir,\n mdxFile: args.mdxFile,\n config: args.config,\n writtenFiles: args.writtenFiles,\n }),\n imageAlt: variantCheckpoint.title || `${checkpoint.name} (${formatProjectLabel(run.project)})`,\n });\n }\n\n const descriptionSource = matchedCheckpoints.find(\n (entry) => typeof entry.description === 'string' && entry.description.trim().length > 0,\n ) ?? checkpoint;\n const stepFocus = matchedCheckpoints.map((entry) => focusNote(entry)).find((value): value is string => Boolean(value)) ?? null;\n\n steps.push({\n checkpoint,\n order,\n title: checkpoint.name,\n description:\n typeof descriptionSource.description === 'string' && descriptionSource.description.trim().length > 0\n ? descriptionSource.description.trim()\n : autoDescription(descriptionSource),\n focusNote: stepFocus,\n variants,\n });\n }\n\n return steps;\n}\n\nfunction renderVariantTabs(variants: MdxVariant[]): string {\n if (variants.length === 0) {\n return '';\n }\n\n if (variants.length === 1) {\n const [variant] = variants;\n if (!variant?.imagePath) {\n return '';\n }\n\n return `<Screenshot src={${quoteJsx(variant.imagePath)}} alt={${quoteJsx(variant.imageAlt)}} />`;\n }\n\n const tabs = variants\n .map((variant) => {\n const lines = [` <DeviceTab label={${quoteJsx(variant.projectLabel)}}>`];\n if (variant.imagePath) {\n lines.push(` <Screenshot src={${quoteJsx(variant.imagePath)}} alt={${quoteJsx(variant.imageAlt)}} />`);\n } else {\n lines.push(` <p>No screenshot captured for ${variant.projectLabel}.</p>`);\n }\n lines.push(' </DeviceTab>');\n return lines.join('\\n');\n })\n .join('\\n');\n\n return `<DeviceTabs>\\n${tabs}\\n</DeviceTabs>`;\n}\n\nfunction renderStep(step: MdxStep): string {\n const lines = [` <Step number={${step.order}} title={${quoteJsx(step.title)}}>`];\n const variantBlock = renderVariantTabs(step.variants);\n if (variantBlock) {\n lines.push(` ${variantBlock.replace(/\\n/g, '\\n ')}`, '');\n }\n\n if (step.focusNote) {\n lines.push(` ${step.focusNote}`, '');\n }\n\n lines.push(` ${step.description}`, ' </Step>');\n return lines.join('\\n');\n}\n\nfunction renderMdx(args: {\n title: string;\n steps: MdxStep[];\n runs: RunRecord[];\n config: MdxReporterConfig;\n generatedAt: string;\n}): string {\n const importNames = new Set(['Screenshot', 'StepList', 'Step']);\n if (args.steps.some((step) => step.variants.length > 1)) {\n importNames.add('DeviceTabs');\n importNames.add('DeviceTab');\n }\n\n const frontmatter = serializeFrontmatter({\n title: args.title,\n tags: frontmatterTags([...new Set(args.runs.flatMap((run) => run.tags))]),\n generatedAt: args.generatedAt,\n projects: [...new Set(args.runs.map((run) => run.project))],\n });\n\n const stepBlocks = args.steps.map(renderStep).join('\\n\\n');\n\n return `${frontmatter}import { ${[...importNames].join(', ')} } from '${args.config.componentImportPath}';\\n\\n<StepList>\\n${stepBlocks}\\n</StepList>\\n`;\n}\n\nexport const mdxReporter: ReportGenerator = {\n name: 'mdx',\n description: 'Generates one MDX help article per captured story.',\n\n validateConfig(config): boolean {\n return config != null && typeof config === 'object' && !Array.isArray(config);\n },\n\n async generate(context) {\n const config = normalizeConfig(context.config);\n const stories = groupByStory(context.runs);\n const generatedAt = new Date().toISOString();\n const writtenFiles = new Set<string>();\n let articleCount = 0;\n\n for (const [storyTitle, runs] of stories) {\n const primaryRun = choosePrimaryRun(runs, config.preferredProject);\n if (!primaryRun || !shouldIncludeRun(primaryRun, config)) {\n continue;\n }\n\n const title = stripTags(storyTitle);\n const storySlug = slugify(title);\n const mdxFile = path.join(context.outputDir, config.storiesDir ?? '.', `${storySlug}.mdx`);\n const steps = await buildSteps({\n runs,\n primaryRun,\n storySlug,\n outputDir: context.outputDir,\n mdxFile,\n config,\n writtenFiles,\n });\n\n await fs.mkdir(path.dirname(mdxFile), { recursive: true });\n await fs.writeFile(\n mdxFile,\n renderMdx({\n title,\n steps,\n runs,\n config,\n generatedAt,\n }),\n 'utf8',\n );\n\n writtenFiles.add(mdxFile);\n articleCount += 1;\n }\n\n return {\n files: [...writtenFiles],\n summary: `Generated ${articleCount} MDX article${articleCount === 1 ? '' : 's'}.`,\n };\n },\n};\n","import { createRequire } from 'node:module';\nimport path from 'node:path';\nimport type { BoundingBox } from '../types';\n\ntype SharpLike = {\n (input: string | Buffer): {\n metadata(): Promise<{ width?: number; height?: number }>;\n composite(items: Array<{ input: Buffer; top?: number; left?: number }>): {\n png(): {\n toFile(filePath: string): Promise<void>;\n };\n };\n };\n};\n\nconst require = (() => {\n try {\n return Function('return require')() as NodeRequire;\n } catch {\n return createRequire(path.join(process.cwd(), 'playwright-checkpoint-annotate-runtime.cjs'));\n }\n})();\n\nasync function loadSharp(): Promise<SharpLike | null> {\n try {\n const loaded = require('sharp') as SharpLike | { default?: SharpLike };\n return typeof loaded === 'function' ? loaded : loaded.default ?? null;\n } catch {\n return null;\n }\n}\n\nfunction buildOverlaySvg(width: number, height: number, bounds: BoundingBox): Buffer {\n const strokeWidth = Math.max(2, Math.round(Math.min(width, height) * 0.005));\n const radius = Math.max(6, Math.round(Math.min(bounds.width, bounds.height) * 0.08));\n\n const svg = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\n <rect\n x=\"${bounds.x}\"\n y=\"${bounds.y}\"\n width=\"${bounds.width}\"\n height=\"${bounds.height}\"\n rx=\"${radius}\"\n ry=\"${radius}\"\n fill=\"rgba(239, 68, 68, 0.10)\"\n stroke=\"rgba(239, 68, 68, 0.95)\"\n stroke-width=\"${strokeWidth}\"\n />\n </svg>\n `.trim();\n\n return Buffer.from(svg, 'utf8');\n}\n\nexport async function annotateScreenshot(\n imagePath: string,\n bounds: BoundingBox,\n outputPath: string,\n): Promise<string | null> {\n const sharp = await loadSharp();\n if (!sharp) {\n return null;\n }\n\n const image = sharp(imagePath);\n const metadata = await image.metadata();\n if (!metadata.width || !metadata.height) {\n return null;\n }\n\n const overlay = buildOverlaySvg(metadata.width, metadata.height, bounds);\n await image.composite([{ input: overlay, top: 0, left: 0 }]).png().toFile(outputPath);\n return outputPath;\n}\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["import_promises","import_node_path","path","fs","import_promises","import_node_path","module","path","fs","import_promises","import_node_path","location","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_node_path","path","import_promises","import_node_path","REDACTED","DEFAULT_REDACT_PATTERNS","EMAIL_LIKE_REGEX","toRegex","path","fs","import_promises","import_node_path","path","fs","builtinCollectors","fs","path","import_promises","import_node_path","require","path","fs","test","import_promises","import_node_path","import_promises","import_node_path","path","fs","import_promises","import_node_path","slugify","resolveArtifactPath","path","screenshotData","location","fs","import_promises","import_node_path","DEFAULT_PROJECT_ORDER","slugify","stripTags","normalizeConfig","normalizeTags","shouldIncludeRun","choosePrimaryRun","orderedCheckpoints","resolveArtifactPath","path","screenshotSourcePath","screenshotData","focusNote","urlLabel","autoDescription","location","markdownRelativePath","rewriteImagePath","yamlScalar","serializeFrontmatter","projectWeight","formatProjectLabel","materializeScreenshot","fs","buildSteps","import_node_module","import_node_path","require","path","fs","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core.ts","../src/collectors/aria-snapshot.ts","../src/collectors/axe.ts","../src/page-utils.ts","../src/collectors/console.ts","../src/collectors/dom-stats.ts","../src/collectors/forms.ts","../src/collectors/html.ts","../src/collectors/metadata.ts","../src/collectors/network.ts","../src/collectors/network-timing.ts","../src/collectors/screenshot.ts","../src/collectors/storage.ts","../src/collectors/web-vitals.ts","../src/collectors/builtin-collectors.ts","../src/collectors/registry.ts","../src/fixture.ts","../src/device-profile.ts","../src/collectors/index.ts","../src/report/index.ts","../src/report/html-reporter.ts","../src/report/story-utils.ts","../src/report/markdown-reporter.ts","../src/report/mdx-reporter.ts","../src/report/annotate.ts"],"sourcesContent":["export type * from './types';\nexport * from './core';\nexport * from './fixture';\nexport { type CheckpointCollector } from './types';\nexport { type ReportGenerator } from './types';\nexport * from './collectors';\nexport * from './report';\n\nexport const VERSION = '0.1.0';\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page, TestInfo } from '@playwright/test';\nimport { builtinCollectors as defaultBuiltinCollectors } from './collectors/builtin-collectors';\nimport { getBuiltinCollectors, registerBuiltinCollector, registerBuiltinCollectors } from './collectors/registry';\nimport { settlePage } from './page-utils';\nimport type {\n CheckpointCollector,\n CheckpointConfig,\n CheckpointManifest,\n CheckpointOptions,\n CheckpointRecord,\n CollectorArtifact,\n CollectorConfig,\n CollectorOptions,\n CollectorResult,\n ResolvedCollectorConfig,\n TestCheckpointConfig,\n} from './types';\n\ntype CollectorInput = boolean | CollectorOptions | CollectorConfig | undefined;\n\ntype MutableCollectorState = {\n enabled: boolean;\n config: ResolvedCollectorConfig;\n};\n\nexport type CheckpointSessionMetadata = Partial<\n Pick<CheckpointManifest, 'environment' | 'project' | 'testId' | 'title' | 'tags'>\n>;\n\nexport type CheckpointSessionOptions = Omit<CheckpointConfig, 'collectors'> & {\n outputDir: string;\n collectors?: Partial<Record<string, boolean | CollectorConfig>>;\n testConfig?: TestCheckpointConfig | null | (() => TestCheckpointConfig | null);\n sessionMetadata?: CheckpointSessionMetadata;\n manifest?: CheckpointManifest;\n manifestPath?: string;\n testInfo?: TestInfo;\n adjustTimeout?: (ms: number) => void;\n};\n\nexport type CaptureCheckpointOptions = CheckpointSessionOptions & CheckpointOptions;\n\nexport type CheckpointSession = {\n outputDir: string;\n manifest: CheckpointManifest;\n checkpoint(name: string, options?: CheckpointOptions): Promise<CheckpointRecord>;\n finalize(): Promise<CheckpointManifest>;\n};\n\nexport type RunCollectorPipelineArgs = {\n page: Page;\n name: string;\n outputDir: string;\n resolvedCollectors: Map<string, ResolvedCollectorConfig>;\n registry: Map<string, CheckpointCollector>;\n options?: CheckpointOptions;\n manifest?: CheckpointManifest;\n slug?: string;\n redact?: string[];\n testInfo?: TestInfo;\n adjustTimeout?: (ms: number) => void;\n};\n\nregisterBuiltinCollectors(defaultBuiltinCollectors);\n\nfunction cloneResolvedConfig(config: ResolvedCollectorConfig): ResolvedCollectorConfig {\n return { ...config };\n}\n\nfunction cloneCollectorState(state: MutableCollectorState | undefined): MutableCollectorState {\n return {\n enabled: state?.enabled ?? false,\n config: cloneResolvedConfig(state?.config ?? {}),\n };\n}\n\nfunction applyCollectorInput(state: MutableCollectorState | undefined, input: CollectorInput): MutableCollectorState {\n const next = cloneCollectorState(state);\n\n if (input === undefined) {\n return next;\n }\n\n if (input === false) {\n return {\n enabled: false,\n config: {},\n };\n }\n\n if (input === true) {\n return {\n enabled: true,\n config: next.config,\n };\n }\n\n return {\n enabled: true,\n config: {\n ...next.config,\n ...input,\n },\n };\n}\n\nfunction collectorRegistryFor(config: CheckpointConfig = {}): Map<string, CheckpointCollector> {\n const registry = getBuiltinCollectors();\n\n for (const collector of config.custom ?? []) {\n registry.set(collector.name, collector);\n }\n\n return registry;\n}\n\nfunction cloneCheckpointOptions(options: CheckpointOptions): CheckpointOptions {\n return {\n ...options,\n ...(options.collectors ? { collectors: { ...options.collectors } } : {}),\n };\n}\n\nfunction defaultManifestEnvironment(): string {\n return process.env.PLAYWRIGHT_CHECKPOINT_ENV || process.env.NODE_ENV || 'test';\n}\n\nfunction createManifest(sessionMetadata: CheckpointSessionMetadata | undefined): CheckpointManifest {\n return {\n environment: sessionMetadata?.environment ?? defaultManifestEnvironment(),\n project: sessionMetadata?.project ?? '',\n testId: sessionMetadata?.testId ?? '',\n title: sessionMetadata?.title ?? '',\n tags: [...(sessionMetadata?.tags ?? [])],\n startedAt: new Date().toISOString(),\n checkpoints: [],\n };\n}\n\nfunction resolveTestConfig(\n testConfig: CheckpointSessionOptions['testConfig'],\n): TestCheckpointConfig | null {\n if (typeof testConfig === 'function') {\n return testConfig();\n }\n\n return testConfig ?? null;\n}\n\nasync function writeManifestFile(manifestPath: string, manifest: CheckpointManifest): Promise<string> {\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n return manifestPath;\n}\n\nexport function warn(message: string, error?: unknown): void {\n if (error instanceof Error) {\n console.warn(`[playwright-checkpoint] ${message}`, error);\n return;\n }\n\n if (error !== undefined) {\n console.warn(`[playwright-checkpoint] ${message}`, String(error));\n return;\n }\n\n console.warn(`[playwright-checkpoint] ${message}`);\n}\n\nexport function sanitizeSegment(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'checkpoint'\n );\n}\n\nexport function checkpointSlug(name: string, existing: CheckpointRecord[]): string {\n const base = sanitizeSegment(name);\n const existingSlugs = new Set(existing.map((record) => record.slug));\n\n if (!existingSlugs.has(base)) {\n return base;\n }\n\n let index = 2;\n let candidate = `${base}-${index}`;\n while (existingSlugs.has(candidate)) {\n index += 1;\n candidate = `${base}-${index}`;\n }\n\n return candidate;\n}\n\nasync function attachArtifacts(\n testInfo: TestInfo | undefined,\n checkpointSlugValue: string,\n collectorName: string,\n artifacts: CollectorArtifact[],\n): Promise<void> {\n const attach = testInfo?.attach;\n if (typeof attach !== 'function') {\n return;\n }\n\n for (const artifact of artifacts) {\n try {\n await attach.call(testInfo, `${checkpointSlugValue}/${collectorName}/${artifact.name}`, {\n path: artifact.path,\n contentType: artifact.contentType,\n });\n } catch (error) {\n warn(`Failed to attach artifact \"${artifact.name}\" from collector \"${collectorName}\".`, error);\n }\n }\n}\n\nexport async function collectPageTitle(page: Page): Promise<string> {\n try {\n return await page.title();\n } catch {\n return '';\n }\n}\n\nexport async function runCollectorSetup(\n collectors: Iterable<CheckpointCollector>,\n page: Page,\n testInfo?: TestInfo,\n): Promise<void> {\n for (const collector of collectors) {\n if (!collector.setup) {\n continue;\n }\n\n try {\n await collector.setup({ page, testInfo });\n } catch (error) {\n warn(`Collector \"${collector.name}\" setup failed.`, error);\n }\n }\n}\n\nexport async function runCollectorTeardown(\n collectors: Iterable<CheckpointCollector>,\n page: Page,\n testInfo?: TestInfo,\n): Promise<void> {\n const collectorList = Array.from(collectors).reverse();\n\n for (const collector of collectorList) {\n if (!collector.teardown) {\n continue;\n }\n\n try {\n await collector.teardown({ page, testInfo });\n } catch (error) {\n warn(`Collector \"${collector.name}\" teardown failed.`, error);\n }\n }\n}\n\nexport function resolveCollectors(\n globalConfig: CheckpointConfig = {},\n testConfig: TestCheckpointConfig | null = null,\n checkpointOptions: CheckpointOptions = {},\n): Map<string, ResolvedCollectorConfig> {\n const registry = collectorRegistryFor(globalConfig);\n const states = new Map<string, MutableCollectorState>();\n\n for (const collector of registry.values()) {\n states.set(collector.name, {\n enabled: collector.defaultEnabled,\n config: {},\n });\n }\n\n const levels = [globalConfig.collectors, testConfig?.collectors, checkpointOptions.collectors];\n\n for (const level of levels) {\n for (const [name, input] of Object.entries(level ?? {})) {\n states.set(name, applyCollectorInput(states.get(name), input));\n }\n }\n\n const resolved = new Map<string, ResolvedCollectorConfig>();\n\n for (const [name, state] of states) {\n if (state.enabled) {\n resolved.set(name, cloneResolvedConfig(state.config));\n }\n }\n\n return resolved;\n}\n\nexport async function runCollectorPipeline(args: RunCollectorPipelineArgs): Promise<CheckpointRecord> {\n const options = cloneCheckpointOptions(args.options ?? {});\n const slug = args.slug ?? checkpointSlug(args.name, args.manifest?.checkpoints ?? []);\n const checkpointDir = path.join(args.outputDir, slug);\n const collectorResults: Record<string, CollectorResult> = {};\n\n await fs.mkdir(checkpointDir, { recursive: true });\n await settlePage(args.page);\n\n for (const [collectorName, collectorConfig] of args.resolvedCollectors) {\n const collector = args.registry.get(collectorName);\n if (!collector) {\n warn(`Collector \"${collectorName}\" is enabled but no implementation is registered.`);\n continue;\n }\n\n try {\n const result = await collector.collect({\n page: args.page,\n testInfo: args.testInfo,\n checkpointDir,\n checkpointName: args.name,\n checkpointSlug: slug,\n redact: [...(args.redact ?? [])],\n config: cloneResolvedConfig(collectorConfig),\n options,\n adjustTimeout: args.adjustTimeout,\n });\n\n collectorResults[collectorName] = result;\n await attachArtifacts(args.testInfo, slug, collectorName, result.artifacts);\n } catch (error) {\n warn(`Collector \"${collectorName}\" failed during checkpoint \"${args.name}\".`, error);\n }\n }\n\n const record: CheckpointRecord = {\n name: args.name,\n slug,\n url: args.page.url(),\n title: await collectPageTitle(args.page),\n timestamp: new Date().toISOString(),\n ...(options.description ? { description: options.description } : {}),\n ...(typeof options.step === 'number' ? { step: options.step } : {}),\n collectors: collectorResults,\n };\n\n args.manifest?.checkpoints.push(record);\n return record;\n}\n\nexport async function captureCheckpoint(\n page: Page,\n name: string,\n options: CaptureCheckpointOptions,\n): Promise<CheckpointRecord> {\n const sessionConfig: CheckpointConfig = {\n collectors: options.collectors,\n custom: options.custom,\n redact: options.redact,\n };\n const registry = collectorRegistryFor(sessionConfig);\n const resolvedCollectors = resolveCollectors(sessionConfig, null, options);\n const enabledCollectors = Array.from(resolvedCollectors.keys())\n .map((collectorName) => registry.get(collectorName))\n .filter((collector): collector is CheckpointCollector => Boolean(collector));\n\n await fs.mkdir(options.outputDir, { recursive: true });\n await runCollectorSetup(enabledCollectors, page, options.testInfo);\n\n try {\n return await runCollectorPipeline({\n page,\n name,\n outputDir: options.outputDir,\n resolvedCollectors,\n registry,\n options,\n redact: options.redact,\n testInfo: options.testInfo,\n adjustTimeout: options.adjustTimeout,\n slug: checkpointSlug(name, []),\n });\n } finally {\n await runCollectorTeardown(enabledCollectors, page, options.testInfo);\n }\n}\n\nexport async function createCheckpointSession(page: Page, options: CheckpointSessionOptions): Promise<CheckpointSession> {\n const sessionConfig: CheckpointConfig = {\n collectors: options.collectors,\n custom: options.custom,\n redact: options.redact,\n };\n const outputDir = options.outputDir;\n const registry = collectorRegistryFor(sessionConfig);\n const manifest = options.manifest ?? createManifest(options.sessionMetadata);\n const setupCollectorNames = new Set<string>();\n const setupCollectors: CheckpointCollector[] = [];\n let finalizePromise: Promise<CheckpointManifest> | null = null;\n\n async function ensureCollectorsSetup(resolvedCollectors: Map<string, ResolvedCollectorConfig>): Promise<void> {\n for (const collectorName of resolvedCollectors.keys()) {\n if (setupCollectorNames.has(collectorName)) {\n continue;\n }\n\n const collector = registry.get(collectorName);\n if (!collector) {\n warn(`Collector \"${collectorName}\" is enabled but no implementation is registered.`);\n continue;\n }\n\n setupCollectorNames.add(collectorName);\n setupCollectors.push(collector);\n await runCollectorSetup([collector], page, options.testInfo);\n }\n }\n\n await fs.mkdir(outputDir, { recursive: true });\n await ensureCollectorsSetup(resolveCollectors(sessionConfig, resolveTestConfig(options.testConfig)));\n\n return {\n outputDir,\n manifest,\n async checkpoint(name, checkpointOptions = {}) {\n if (finalizePromise) {\n throw new Error('Checkpoint session has already been finalized.');\n }\n\n const resolvedCollectors = resolveCollectors(sessionConfig, resolveTestConfig(options.testConfig), checkpointOptions);\n await ensureCollectorsSetup(resolvedCollectors);\n\n return runCollectorPipeline({\n page,\n name,\n outputDir,\n resolvedCollectors,\n registry,\n options: checkpointOptions,\n manifest,\n redact: options.redact,\n testInfo: options.testInfo,\n adjustTimeout: options.adjustTimeout,\n });\n },\n finalize() {\n if (!finalizePromise) {\n finalizePromise = (async () => {\n await runCollectorTeardown(setupCollectors, page, options.testInfo);\n await writeManifestFile(options.manifestPath ?? path.join(outputDir, 'checkpoint-manifest.json'), manifest);\n return manifest;\n })();\n }\n\n return finalizePromise;\n },\n };\n}\n\nexport { registerBuiltinCollector, registerBuiltinCollectors, settlePage };\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointCollector, AriaSnapshotCollectorData } from '../types';\n\nfunction countSnapshotNodes(value: unknown): number {\n if (value == null) {\n return 0;\n }\n\n if (Array.isArray(value)) {\n return value.reduce((total, item) => total + countSnapshotNodes(item), 0);\n }\n\n if (typeof value !== 'object') {\n return 1;\n }\n\n const node = value as { children?: unknown };\n const children = Array.isArray(node.children) ? node.children : [];\n return 1 + children.reduce((total, child) => total + countSnapshotNodes(child), 0);\n}\n\nasync function captureAriaSnapshot(page: {\n locator: (selector: string) => { ariaSnapshot?: () => Promise<unknown> };\n accessibility?: { snapshot?: (options?: { interestingOnly?: boolean }) => Promise<unknown> };\n}): Promise<unknown | null> {\n try {\n const root = page.locator(':root');\n if (typeof root.ariaSnapshot === 'function') {\n const snapshot = await root.ariaSnapshot();\n return snapshot ?? null;\n }\n } catch {\n // Fall through to accessibility.snapshot.\n }\n\n if (typeof page.accessibility?.snapshot === 'function') {\n try {\n const snapshot = await page.accessibility.snapshot({ interestingOnly: false });\n return snapshot ?? null;\n } catch {\n return null;\n }\n }\n\n return null;\n}\n\nexport const ariaSnapshotCollector: CheckpointCollector = {\n name: 'aria-snapshot',\n defaultEnabled: false,\n\n async collect(ctx) {\n const snapshot = await captureAriaSnapshot(ctx.page as unknown as Parameters<typeof captureAriaSnapshot>[0]);\n const nodeCount = countSnapshotNodes(snapshot);\n const outputPath = path.join(ctx.checkpointDir, 'aria-snapshot.json');\n\n const data: AriaSnapshotCollectorData = {\n snapshot,\n nodeCount,\n };\n\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'aria-snapshot',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n nodeCount,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page } from '@playwright/test';\nimport { settlePage } from '../page-utils';\nimport type { AxeCollectorData, CheckpointCollector } from '../types';\n\ntype AxeBuilderInstance = {\n analyze(): Promise<unknown>;\n};\n\ntype AxeBuilderConstructor = new (options: { page: Page }) => AxeBuilderInstance;\n\ntype AxeModule = {\n default?: AxeBuilderConstructor;\n AxeBuilder?: AxeBuilderConstructor;\n};\n\nlet axeLoader: () => Promise<AxeModule> = () => import('@axe-core/playwright');\nlet warnedAboutMissingAxe = false;\n\nfunction warnOnce(message: string, error?: unknown): void {\n if (warnedAboutMissingAxe) {\n return;\n }\n\n warnedAboutMissingAxe = true;\n if (error instanceof Error) {\n console.warn(`[playwright-checkpoint] ${message}`, error);\n return;\n }\n\n if (error !== undefined) {\n console.warn(`[playwright-checkpoint] ${message}`, String(error));\n return;\n }\n\n console.warn(`[playwright-checkpoint] ${message}`);\n}\n\nfunction resolveAxeBuilder(module: AxeModule): AxeBuilderConstructor | null {\n return module.default ?? module.AxeBuilder ?? null;\n}\n\nasync function analyzeAccessibility(page: Page, AxeBuilder: AxeBuilderConstructor): Promise<unknown> {\n try {\n await settlePage(page);\n return await new AxeBuilder({ page }).analyze();\n } catch {\n await page.waitForTimeout(500);\n await settlePage(page);\n return await new AxeBuilder({ page }).analyze();\n }\n}\n\nfunction skippedAxeResult(reason: string): {\n data: AxeCollectorData;\n artifacts: [];\n summary: { violations: number };\n} {\n return {\n data: {\n skipped: true,\n reason,\n violations: 0,\n results: null,\n },\n artifacts: [],\n summary: {\n violations: 0,\n },\n };\n}\n\nexport function setAxeLoaderForTests(loader: (() => Promise<AxeModule>) | null): void {\n axeLoader = loader ?? (() => import('@axe-core/playwright'));\n warnedAboutMissingAxe = false;\n}\n\nexport const axeCollector: CheckpointCollector = {\n name: 'axe',\n defaultEnabled: true,\n\n async collect(ctx) {\n const timeoutBudgetMs = typeof ctx.config.timeoutMs === 'number' ? ctx.config.timeoutMs : 5_000;\n\n if (timeoutBudgetMs > 0) {\n if (typeof ctx.adjustTimeout === 'function') {\n ctx.adjustTimeout(timeoutBudgetMs);\n } else if (ctx.testInfo && typeof ctx.testInfo.setTimeout === 'function') {\n ctx.testInfo.setTimeout(ctx.testInfo.timeout + timeoutBudgetMs);\n }\n }\n\n let module: AxeModule;\n try {\n module = await axeLoader();\n } catch (error) {\n warnOnce('Skipping axe collector because @axe-core/playwright is unavailable.', error);\n return skippedAxeResult('@axe-core/playwright is unavailable');\n }\n\n const AxeBuilder = resolveAxeBuilder(module);\n if (!AxeBuilder) {\n warnOnce('Skipping axe collector because @axe-core/playwright did not expose an AxeBuilder export.');\n return skippedAxeResult('@axe-core/playwright did not expose AxeBuilder');\n }\n\n const results = await analyzeAccessibility(ctx.page, AxeBuilder);\n const violations =\n results &&\n typeof results === 'object' &&\n Array.isArray((results as { violations?: unknown }).violations)\n ? (results as { violations: unknown[] }).violations.length\n : 0;\n const axePath = path.join(ctx.checkpointDir, 'axe.json');\n\n await fs.writeFile(axePath, `${JSON.stringify(results, null, 2)}\\n`, 'utf8');\n\n return {\n data: {\n skipped: false,\n reason: null,\n violations,\n results,\n } satisfies AxeCollectorData,\n artifacts: [\n {\n name: 'axe',\n path: axePath,\n contentType: 'application/json',\n },\n ],\n summary: {\n violations,\n },\n };\n },\n};\n","import type { Page } from '@playwright/test';\n\nexport async function settlePage(page: Page): Promise<void> {\n await page.waitForLoadState('domcontentloaded').catch(() => undefined);\n await page.waitForLoadState('load', { timeout: 3_000 }).catch(() => undefined);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { ConsoleMessage, Page } from '@playwright/test';\nimport type { CheckpointCollector, ConsoleErrorRecord } from '../types';\n\ntype ConsoleCollectorState = {\n entries: ConsoleErrorRecord[];\n offset: number;\n recordConsoleMessage: (message: ConsoleMessage) => void | Promise<void>;\n recordPageError: (error: Error) => void;\n};\n\nconst consoleStates = new WeakMap<Page, ConsoleCollectorState>();\n\nfunction getLocation(message: ConsoleMessage): ConsoleErrorRecord['location'] {\n const location = message.location();\n if (!location.url && location.lineNumber == null && location.columnNumber == null) {\n return null;\n }\n\n return {\n ...(location.url ? { url: location.url } : {}),\n ...(location.lineNumber == null ? {} : { lineNumber: location.lineNumber }),\n ...(location.columnNumber == null ? {} : { columnNumber: location.columnNumber }),\n };\n}\n\nexport const consoleCollector: CheckpointCollector = {\n name: 'console',\n defaultEnabled: true,\n\n async setup({ page }) {\n if (consoleStates.has(page)) {\n return;\n }\n\n const entries: ConsoleErrorRecord[] = [];\n\n const recordConsoleMessage = (message: ConsoleMessage): void => {\n if (message.type() !== 'error') {\n return;\n }\n\n entries.push({\n type: message.type(),\n text: message.text(),\n location: getLocation(message),\n timestamp: new Date().toISOString(),\n });\n };\n\n const recordPageError = (error: Error): void => {\n entries.push({\n type: 'pageerror',\n text: error.message,\n location: null,\n timestamp: new Date().toISOString(),\n });\n };\n\n page.on('console', recordConsoleMessage);\n page.on('pageerror', recordPageError);\n\n consoleStates.set(page, {\n entries,\n offset: 0,\n recordConsoleMessage,\n recordPageError,\n });\n },\n\n async collect(ctx) {\n const state = consoleStates.get(ctx.page);\n const checkpointEntries = state ? state.entries.slice(state.offset) : [];\n\n if (state) {\n state.offset = state.entries.length;\n }\n\n const outputPath = path.join(ctx.checkpointDir, 'console-errors.json');\n await fs.writeFile(outputPath, `${JSON.stringify(checkpointEntries, null, 2)}\\n`, 'utf8');\n\n return {\n data: checkpointEntries,\n artifacts: [\n {\n name: 'console-errors',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n consoleErrorCount: checkpointEntries.length,\n },\n };\n },\n\n async teardown({ page }) {\n const state = consoleStates.get(page);\n if (!state) {\n return;\n }\n\n page.off('console', state.recordConsoleMessage);\n page.off('pageerror', state.recordPageError);\n consoleStates.delete(page);\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointCollector, DomStatsCollectorData } from '../types';\n\nexport const domStatsCollector: CheckpointCollector = {\n name: 'dom-stats',\n defaultEnabled: false,\n\n async collect(ctx) {\n const stats = await ctx.page.evaluate(() => {\n const allNodes = document.querySelectorAll('*');\n\n const maxDepthFrom = (root: Element | null): number => {\n if (!root) {\n return 0;\n }\n\n let maxDepth = 1;\n const queue: Array<{ node: Element; depth: number }> = [{ node: root, depth: 1 }];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n\n maxDepth = Math.max(maxDepth, current.depth);\n for (const child of Array.from(current.node.children)) {\n queue.push({ node: child, depth: current.depth + 1 });\n }\n }\n\n return maxDepth;\n };\n\n const maybeGetEventListeners =\n (globalThis as { getEventListeners?: (target: EventTarget) => Record<string, unknown[]> }).getEventListeners;\n\n let eventListenerCount: number | null = null;\n if (typeof maybeGetEventListeners === 'function') {\n eventListenerCount = 0;\n const targets: EventTarget[] = [window, document, ...Array.from(allNodes)];\n\n for (const target of targets) {\n try {\n const listeners = maybeGetEventListeners(target) ?? {};\n for (const entries of Object.values(listeners)) {\n eventListenerCount += Array.isArray(entries) ? entries.length : 0;\n }\n } catch {\n // Ignore inaccessible targets.\n }\n }\n }\n\n return {\n nodeCount: allNodes.length,\n maxDepth: maxDepthFrom(document.documentElement),\n formCount: document.querySelectorAll('form').length,\n imageCount: document.querySelectorAll('img').length,\n scriptCount: document.querySelectorAll('script').length,\n stylesheetCount: document.styleSheets.length,\n eventListenerCount,\n };\n });\n\n const data: DomStatsCollectorData = {\n nodeCount: stats.nodeCount,\n maxDepth: stats.maxDepth,\n formCount: stats.formCount,\n imageCount: stats.imageCount,\n scriptCount: stats.scriptCount,\n stylesheetCount: stats.stylesheetCount,\n eventListenerCount: stats.eventListenerCount,\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'dom-stats.json');\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'dom-stats',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n nodeCount: data.nodeCount,\n maxDepth: data.maxDepth,\n formCount: data.formCount,\n imageCount: data.imageCount,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n CheckpointCollector,\n FormFieldState,\n FormFieldValue,\n FormsCollectorData,\n} from '../types';\n\nconst REDACTED = '[REDACTED]';\nconst DEFAULT_REDACT_PATTERNS = ['password', 'token', 'secret', 'api[_-]?key', 'authorization', 'bearer'];\nconst EMAIL_LIKE_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\ntype RawFieldState = Omit<FormFieldState, 'redacted'>;\n\nfunction toRegex(pattern: string): RegExp | null {\n const trimmed = pattern.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n return new RegExp(trimmed, 'i');\n } catch {\n return null;\n }\n}\n\nfunction redactionRegexes(ctx: { redact: string[]; config: Record<string, unknown> }): RegExp[] {\n const fromConfig = Array.isArray(ctx.config.redact)\n ? ctx.config.redact.filter((entry): entry is string => typeof entry === 'string')\n : [];\n\n return [...DEFAULT_REDACT_PATTERNS, ...ctx.redact, ...fromConfig]\n .map((pattern) => toRegex(pattern))\n .filter((value): value is RegExp => value instanceof RegExp);\n}\n\nfunction shouldRedactText(value: string, regexes: RegExp[]): boolean {\n if (EMAIL_LIKE_REGEX.test(value.trim())) {\n return true;\n }\n\n return regexes.some((regex) => regex.test(value));\n}\n\nfunction fieldIdentifier(field: RawFieldState): string {\n return [field.type, field.name, field.id, field.label, field.placeholder].filter((value): value is string => !!value).join(' ');\n}\n\nfunction redactValue(value: FormFieldValue): FormFieldValue {\n if (value == null) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(() => REDACTED);\n }\n\n return REDACTED;\n}\n\nfunction fieldNeedsRedaction(field: RawFieldState, regexes: RegExp[]): boolean {\n if (shouldRedactText(fieldIdentifier(field), regexes)) {\n return true;\n }\n\n if (field.value == null) {\n return false;\n }\n\n if (Array.isArray(field.value)) {\n return field.value.some((entry) => shouldRedactText(entry, regexes));\n }\n\n return shouldRedactText(field.value, regexes);\n}\n\nexport const formsCollector: CheckpointCollector = {\n name: 'forms',\n defaultEnabled: false,\n\n async collect(ctx) {\n const rawFields = await ctx.page.evaluate(() => {\n const elements = Array.from(document.querySelectorAll('input, select, textarea'));\n\n const isVisible = (element: Element): boolean => {\n if (!(element instanceof HTMLElement)) {\n return false;\n }\n\n const inputType = element instanceof HTMLInputElement ? element.type.toLowerCase() : null;\n if (inputType === 'hidden') {\n return false;\n }\n\n if (element.hasAttribute('hidden') || element.getAttribute('aria-hidden') === 'true') {\n return false;\n }\n\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden' || Number(style.opacity) === 0) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n };\n\n const readLabel = (element: Element): string | null => {\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n const fromLabels = element.labels && element.labels.length > 0 ? element.labels[0]?.textContent?.trim() : null;\n if (fromLabels) {\n return fromLabels;\n }\n }\n\n return element.getAttribute('aria-label')?.trim() ?? null;\n };\n\n const readValue = (element: Element): { value: string | string[] | null; checked: boolean | null; type: string | null } => {\n if (element instanceof HTMLSelectElement) {\n if (element.multiple) {\n return {\n value: Array.from(element.selectedOptions).map((option) => option.value),\n checked: null,\n type: 'select-multiple',\n };\n }\n\n return {\n value: element.value,\n checked: null,\n type: 'select-one',\n };\n }\n\n if (element instanceof HTMLTextAreaElement) {\n return {\n value: element.value,\n checked: null,\n type: 'textarea',\n };\n }\n\n if (element instanceof HTMLInputElement) {\n const inputType = element.type.toLowerCase();\n if (inputType === 'checkbox' || inputType === 'radio') {\n return {\n value: element.checked ? element.value || 'on' : null,\n checked: element.checked,\n type: inputType,\n };\n }\n\n if (inputType === 'file') {\n return {\n value: element.files ? Array.from(element.files).map((file) => file.name) : [],\n checked: null,\n type: inputType,\n };\n }\n\n return {\n value: element.value,\n checked: null,\n type: inputType || null,\n };\n }\n\n return {\n value: null,\n checked: null,\n type: null,\n };\n };\n\n return elements\n .filter((element) => isVisible(element))\n .map((element) => {\n const { value, checked, type } = readValue(element);\n\n return {\n tagName: element.tagName.toLowerCase() as 'input' | 'select' | 'textarea',\n type,\n name: element.getAttribute('name'),\n id: element.getAttribute('id'),\n label: readLabel(element),\n placeholder: element.getAttribute('placeholder'),\n value,\n checked,\n disabled: (element as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement).disabled,\n required: (element as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement).required,\n };\n });\n });\n\n const regexes = redactionRegexes({ redact: ctx.redact, config: ctx.config });\n let redactedCount = 0;\n\n const fields: FormFieldState[] = (rawFields as RawFieldState[]).map((field) => {\n const redacted = fieldNeedsRedaction(field, regexes);\n if (redacted) {\n redactedCount += 1;\n }\n\n return {\n ...field,\n redacted,\n value: redacted ? redactValue(field.value) : field.value,\n };\n });\n\n const data: FormsCollectorData = {\n fieldCount: fields.length,\n redactedCount,\n fields,\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'form-state.json');\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'form-state',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n fieldCount: data.fieldCount,\n redactedCount: data.redactedCount,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page } from '@playwright/test';\nimport { settlePage } from '../page-utils';\nimport type { CheckpointCollector, HtmlCollectorData } from '../types';\n\nasync function readPageContent(page: Page): Promise<string> {\n try {\n await settlePage(page);\n return await page.content();\n } catch {\n await page.waitForTimeout(500);\n await settlePage(page);\n return await page.content();\n }\n}\n\nexport const htmlCollector: CheckpointCollector = {\n name: 'html',\n defaultEnabled: true,\n\n async collect(ctx) {\n const htmlPath = path.join(ctx.checkpointDir, 'page.html');\n const html = await readPageContent(ctx.page);\n\n await fs.writeFile(htmlPath, html, 'utf8');\n\n return {\n data: {\n contentLength: html.length,\n } satisfies HtmlCollectorData,\n artifacts: [\n {\n name: 'html',\n path: htmlPath,\n contentType: 'text/html',\n },\n ],\n summary: {\n htmlPath: 'page.html',\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointCollector, PageMetadata } from '../types';\n\nfunction normalizeStructuredData(scriptContents: Array<string | null>): unknown[] {\n const values: unknown[] = [];\n\n for (const content of scriptContents) {\n const value = content?.trim();\n if (!value) {\n continue;\n }\n\n try {\n values.push(JSON.parse(value));\n } catch {\n values.push({\n parseError: 'Invalid JSON-LD',\n raw: value,\n });\n }\n }\n\n return values;\n}\n\nexport const metadataCollector: CheckpointCollector = {\n name: 'metadata',\n defaultEnabled: true,\n\n async collect(ctx) {\n const metadata = await ctx.page.evaluate(() => {\n const meta = (selector: string): string | null => document.querySelector(selector)?.getAttribute('content') ?? null;\n const canonicalLink = document.querySelector('link[rel=\"canonical\"]');\n const html = document.documentElement;\n const structuredDataScripts = Array.from(document.querySelectorAll('script[type=\"application/ld+json\"]')).map((script) => script.textContent ?? null);\n\n return {\n url: location.href,\n title: document.title,\n description: meta('meta[name=\"description\"]'),\n openGraph: {\n title: meta('meta[property=\"og:title\"]'),\n description: meta('meta[property=\"og:description\"]'),\n image: meta('meta[property=\"og:image\"]'),\n },\n canonicalUrl: canonicalLink?.getAttribute('href') ?? null,\n lang: html.getAttribute('lang'),\n viewport: meta('meta[name=\"viewport\"]'),\n structuredDataScripts,\n };\n });\n\n const normalizedMetadata: PageMetadata = {\n url: metadata.url,\n title: metadata.title,\n description: metadata.description,\n openGraph: metadata.openGraph,\n canonicalUrl: metadata.canonicalUrl,\n lang: metadata.lang,\n viewport: metadata.viewport,\n structuredData: normalizeStructuredData(metadata.structuredDataScripts),\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'metadata.json');\n await fs.writeFile(outputPath, `${JSON.stringify(normalizedMetadata, null, 2)}\\n`, 'utf8');\n\n return {\n data: normalizedMetadata,\n artifacts: [\n {\n name: 'metadata',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n url: normalizedMetadata.url,\n title: normalizedMetadata.title,\n lang: normalizedMetadata.lang,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page, Request, Response } from '@playwright/test';\nimport type { CheckpointCollector, FailedRequestRecord } from '../types';\n\ntype NetworkCollectorState = {\n entries: FailedRequestRecord[];\n offset: number;\n recordRequestFailure: (request: Request) => void;\n recordHttpError: (response: Response) => void;\n};\n\nconst networkStates = new WeakMap<Page, NetworkCollectorState>();\n\nexport const networkCollector: CheckpointCollector = {\n name: 'network',\n defaultEnabled: true,\n\n async setup({ page }) {\n if (networkStates.has(page)) {\n return;\n }\n\n const entries: FailedRequestRecord[] = [];\n\n const recordRequestFailure = (request: Request): void => {\n entries.push({\n kind: 'requestfailed',\n url: request.url(),\n method: request.method(),\n status: null,\n statusText: null,\n failureText: request.failure()?.errorText ?? null,\n timestamp: new Date().toISOString(),\n });\n };\n\n const recordHttpError = (response: Response): void => {\n if (response.status() < 400) {\n return;\n }\n\n entries.push({\n kind: 'http-error',\n url: response.url(),\n method: response.request().method(),\n status: response.status(),\n statusText: response.statusText(),\n failureText: null,\n timestamp: new Date().toISOString(),\n });\n };\n\n page.on('requestfailed', recordRequestFailure);\n page.on('response', recordHttpError);\n\n networkStates.set(page, {\n entries,\n offset: 0,\n recordRequestFailure,\n recordHttpError,\n });\n },\n\n async collect(ctx) {\n const state = networkStates.get(ctx.page);\n const checkpointEntries = state ? state.entries.slice(state.offset) : [];\n\n if (state) {\n state.offset = state.entries.length;\n }\n\n const outputPath = path.join(ctx.checkpointDir, 'failed-requests.json');\n await fs.writeFile(outputPath, `${JSON.stringify(checkpointEntries, null, 2)}\\n`, 'utf8');\n\n return {\n data: checkpointEntries,\n artifacts: [\n {\n name: 'failed-requests',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n failedRequestCount: checkpointEntries.length,\n },\n };\n },\n\n async teardown({ page }) {\n const state = networkStates.get(page);\n if (!state) {\n return;\n }\n\n page.off('requestfailed', state.recordRequestFailure);\n page.off('response', state.recordHttpError);\n networkStates.delete(page);\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page, Response } from '@playwright/test';\nimport type {\n CheckpointCollector,\n NetworkTimingCollectorData,\n NetworkTimingRecord,\n} from '../types';\n\ntype ResponseEventRecord = {\n url: string;\n status: number | null;\n statusText: string | null;\n resourceType: string | null;\n timestamp: string;\n};\n\ntype ResourceTimingRecord = {\n name: string;\n duration: number;\n transferSize: number;\n encodedBodySize: number;\n decodedBodySize: number;\n nextHopProtocol: string;\n startTime: number;\n redirectStart: number;\n redirectEnd: number;\n domainLookupStart: number;\n domainLookupEnd: number;\n connectStart: number;\n connectEnd: number;\n secureConnectionStart: number;\n requestStart: number;\n responseStart: number;\n responseEnd: number;\n};\n\ntype NetworkTimingCollectorState = {\n responses: ResponseEventRecord[];\n responseOffset: number;\n resourceOffsetByUrl: Map<string, number>;\n recordResponse: (response: Response) => void;\n};\n\nconst timingStates = new WeakMap<Page, NetworkTimingCollectorState>();\n\nfunction maybeDuration(start: number, end: number): number | null {\n if (start <= 0 || end <= 0 || end < start) {\n return null;\n }\n\n return end - start;\n}\n\nfunction toNetworkRecord(response: ResponseEventRecord, timing: ResourceTimingRecord | null): NetworkTimingRecord {\n return {\n url: response.url,\n status: response.status,\n statusText: response.statusText,\n resourceType: response.resourceType,\n timestamp: response.timestamp,\n durationMs: timing ? timing.duration : null,\n transferSize: timing ? timing.transferSize : null,\n encodedBodySize: timing ? timing.encodedBodySize : null,\n decodedBodySize: timing ? timing.decodedBodySize : null,\n nextHopProtocol: timing ? timing.nextHopProtocol || null : null,\n timing: {\n startTimeMs: timing ? timing.startTime : null,\n redirectMs: timing ? maybeDuration(timing.redirectStart, timing.redirectEnd) : null,\n dnsMs: timing ? maybeDuration(timing.domainLookupStart, timing.domainLookupEnd) : null,\n connectMs: timing ? maybeDuration(timing.connectStart, timing.connectEnd) : null,\n tlsMs: timing ? maybeDuration(timing.secureConnectionStart, timing.connectEnd) : null,\n requestMs: timing ? maybeDuration(timing.requestStart, timing.responseStart) : null,\n responseMs: timing ? maybeDuration(timing.responseStart, timing.responseEnd) : null,\n },\n };\n}\n\nexport const networkTimingCollector: CheckpointCollector = {\n name: 'network-timing',\n defaultEnabled: false,\n\n async setup({ page }) {\n if (timingStates.has(page)) {\n return;\n }\n\n const responses: ResponseEventRecord[] = [];\n\n const recordResponse = (response: Response): void => {\n responses.push({\n url: response.url(),\n status: response.status(),\n statusText: response.statusText(),\n resourceType: response.request().resourceType(),\n timestamp: new Date().toISOString(),\n });\n };\n\n page.on('response', recordResponse);\n\n timingStates.set(page, {\n responses,\n responseOffset: 0,\n resourceOffsetByUrl: new Map<string, number>(),\n recordResponse,\n });\n },\n\n async collect(ctx) {\n const state = timingStates.get(ctx.page);\n const recentResponses = state ? state.responses.slice(state.responseOffset) : [];\n\n if (state) {\n state.responseOffset = state.responses.length;\n }\n\n const resourceTimings = (await ctx.page.evaluate(() => {\n const entries = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n return entries.map((entry) => ({\n name: entry.name,\n duration: entry.duration,\n transferSize: entry.transferSize,\n encodedBodySize: entry.encodedBodySize,\n decodedBodySize: entry.decodedBodySize,\n nextHopProtocol: entry.nextHopProtocol,\n startTime: entry.startTime,\n redirectStart: entry.redirectStart,\n redirectEnd: entry.redirectEnd,\n domainLookupStart: entry.domainLookupStart,\n domainLookupEnd: entry.domainLookupEnd,\n connectStart: entry.connectStart,\n connectEnd: entry.connectEnd,\n secureConnectionStart: entry.secureConnectionStart,\n requestStart: entry.requestStart,\n responseStart: entry.responseStart,\n responseEnd: entry.responseEnd,\n }));\n })) as ResourceTimingRecord[];\n\n const timingsByUrl = new Map<string, ResourceTimingRecord[]>();\n for (const timing of resourceTimings) {\n const list = timingsByUrl.get(timing.name);\n if (list) {\n list.push(timing);\n } else {\n timingsByUrl.set(timing.name, [timing]);\n }\n }\n\n const requests: NetworkTimingRecord[] = recentResponses.map((response) => {\n if (!state) {\n return toNetworkRecord(response, null);\n }\n\n const list = timingsByUrl.get(response.url) ?? [];\n const currentOffset = state.resourceOffsetByUrl.get(response.url) ?? 0;\n const match = list[currentOffset] ?? null;\n\n if (match) {\n state.resourceOffsetByUrl.set(response.url, currentOffset + 1);\n }\n\n return toNetworkRecord(response, match);\n });\n\n const totalBytes = requests.reduce((total, request) => {\n if (typeof request.transferSize !== 'number' || request.transferSize < 0) {\n return total;\n }\n\n return total + request.transferSize;\n }, 0);\n\n const slowestRequestMs = requests.reduce((slowest, request) => {\n if (typeof request.durationMs !== 'number') {\n return slowest;\n }\n\n return Math.max(slowest, request.durationMs);\n }, 0);\n\n const data: NetworkTimingCollectorData = {\n requestCount: requests.length,\n totalBytes,\n slowestRequestMs,\n requests,\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'network-timing.json');\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'network-timing',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n requestCount: data.requestCount,\n totalBytes: data.totalBytes,\n slowestRequestMs: data.slowestRequestMs,\n },\n };\n },\n\n async teardown({ page }) {\n const state = timingStates.get(page);\n if (!state) {\n return;\n }\n\n page.off('response', state.recordResponse);\n timingStates.delete(page);\n },\n};\n","import path from 'node:path';\nimport type { CheckpointCollector, ScreenshotCollectorData } from '../types';\n\nconst PNG_SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n\nfunction readPngSize(buffer: Buffer): ScreenshotCollectorData['imageSize'] {\n if (buffer.length < 24 || !buffer.subarray(0, 8).equals(PNG_SIGNATURE)) {\n return null;\n }\n\n if (buffer.toString('ascii', 12, 16) !== 'IHDR') {\n return null;\n }\n\n return {\n width: buffer.readUInt32BE(16),\n height: buffer.readUInt32BE(20),\n };\n}\n\nexport const screenshotCollector: CheckpointCollector = {\n name: 'screenshot',\n defaultEnabled: true,\n\n async collect(ctx) {\n const fullPage = ctx.options.fullPage ?? true;\n const screenshotPath = path.join(ctx.checkpointDir, 'page.png');\n const screenshotBuffer = await ctx.page.screenshot({ path: screenshotPath, fullPage });\n\n let highlightBounds: ScreenshotCollectorData['highlightBounds'] = null;\n if (ctx.options.highlightSelector) {\n highlightBounds = await ctx.page\n .locator(ctx.options.highlightSelector)\n .boundingBox()\n .catch(() => null);\n }\n\n return {\n data: {\n fullPage,\n highlightBounds,\n highlightSelector: ctx.options.highlightSelector ?? null,\n imageSize: Buffer.isBuffer(screenshotBuffer) ? readPngSize(screenshotBuffer) : null,\n } satisfies ScreenshotCollectorData,\n artifacts: [\n {\n name: 'screenshot',\n path: screenshotPath,\n contentType: 'image/png',\n },\n ],\n summary: {\n screenshotPath: 'page.png',\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n CheckpointCollector,\n StorageCollectorData,\n StorageCookieState,\n StorageEntryState,\n} from '../types';\n\nconst REDACTED = '[REDACTED]';\nconst DEFAULT_REDACT_PATTERNS = ['password', 'token', 'secret', 'api[_-]?key', 'authorization', 'session', 'email'];\nconst EMAIL_LIKE_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\ntype RawCookie = {\n name: string;\n domain: string;\n path: string;\n value: string;\n expires: number;\n httpOnly: boolean;\n secure: boolean;\n sameSite: string;\n};\n\ntype RawStorageEntry = {\n key: string;\n value: string;\n};\n\nfunction toRegex(pattern: string): RegExp | null {\n const trimmed = pattern.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n return new RegExp(trimmed, 'i');\n } catch {\n return null;\n }\n}\n\nfunction buildRedactionRegexes(ctx: { redact: string[]; config: Record<string, unknown> }): RegExp[] {\n const fromConfig = Array.isArray(ctx.config.redact)\n ? ctx.config.redact.filter((entry): entry is string => typeof entry === 'string')\n : [];\n\n return [...DEFAULT_REDACT_PATTERNS, ...ctx.redact, ...fromConfig]\n .map((pattern) => toRegex(pattern))\n .filter((value): value is RegExp => value instanceof RegExp);\n}\n\nfunction shouldRedact(identifier: string, value: string | null, regexes: RegExp[]): boolean {\n if (regexes.some((regex) => regex.test(identifier))) {\n return true;\n }\n\n if (!value) {\n return false;\n }\n\n if (EMAIL_LIKE_REGEX.test(value.trim())) {\n return true;\n }\n\n return regexes.some((regex) => regex.test(value));\n}\n\nexport const storageCollector: CheckpointCollector = {\n name: 'storage',\n defaultEnabled: false,\n\n async collect(ctx) {\n const includeCookieValues = ctx.config.includeCookieValues === true;\n const includeLocalStorageValues = ctx.config.includeLocalStorageValues === true;\n const redactValues = ctx.config.redactValues !== false;\n const regexes = buildRedactionRegexes({ redact: ctx.redact, config: ctx.config });\n\n const cookies = (await ctx.page.context().cookies()) as RawCookie[];\n const localStorageEntries = await ctx.page.evaluate(() =>\n Object.keys(localStorage).map((key) => ({\n key,\n value: localStorage.getItem(key) ?? '',\n })),\n );\n\n const normalizedCookies: StorageCookieState[] = cookies.map((cookie) => {\n const rawValue = includeCookieValues ? cookie.value : null;\n const redacted = redactValues && shouldRedact(cookie.name, rawValue, regexes);\n\n return {\n name: cookie.name,\n domain: cookie.domain,\n path: cookie.path,\n value: rawValue == null ? null : redacted ? REDACTED : rawValue,\n redacted,\n expires: cookie.expires,\n httpOnly: cookie.httpOnly,\n secure: cookie.secure,\n sameSite: cookie.sameSite,\n };\n });\n\n const normalizedLocalStorage: StorageEntryState[] = (localStorageEntries as RawStorageEntry[]).map((entry) => {\n const rawValue = includeLocalStorageValues ? entry.value : null;\n const redacted = redactValues && shouldRedact(entry.key, rawValue, regexes);\n\n return {\n key: entry.key,\n value: rawValue == null ? null : redacted ? REDACTED : rawValue,\n redacted,\n };\n });\n\n const data: StorageCollectorData = {\n cookieCount: normalizedCookies.length,\n localStorageKeyCount: normalizedLocalStorage.length,\n cookies: normalizedCookies,\n localStorage: normalizedLocalStorage,\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'storage-state.json');\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'storage-state',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n cookieCount: data.cookieCount,\n localStorageKeyCount: data.localStorageKeyCount,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page } from '@playwright/test';\nimport type {\n CheckpointCollector,\n WebVitalMetric,\n WebVitalRating,\n WebVitalsSnapshot,\n} from '../types';\n\ntype RawWebVitals = {\n cls: number | null;\n fcp: number | null;\n lcp: number | null;\n inp: number | null;\n ttfb: number | null;\n domContentLoaded: number | null;\n loadEvent: number | null;\n url: string;\n};\n\nconst initializedPages = new WeakSet<Page>();\n\nfunction rateMetric(\n value: number | null,\n thresholds: { good: number; needsImprovement: number },\n): WebVitalRating {\n if (value == null || Number.isNaN(value)) {\n return 'unknown';\n }\n if (value <= thresholds.good) {\n return 'good';\n }\n if (value <= thresholds.needsImprovement) {\n return 'needs-improvement';\n }\n return 'poor';\n}\n\nfunction metric(value: number | null, thresholds: { good: number; needsImprovement: number }): WebVitalMetric {\n return {\n value,\n rating: rateMetric(value, thresholds),\n };\n}\n\nasync function captureWebVitals(page: Page): Promise<WebVitalsSnapshot> {\n const raw = await page.evaluate(() => {\n const globalState = globalThis as typeof globalThis & {\n __e2eWebVitals?: {\n cls: number;\n fcp: number | null;\n lcp: number | null;\n inp: number | null;\n };\n };\n\n const state = globalState.__e2eWebVitals ?? {\n cls: 0,\n fcp: null,\n lcp: null,\n inp: null,\n };\n const navigation = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n\n return {\n cls: state.cls,\n fcp: state.fcp,\n lcp: state.lcp,\n inp: state.inp,\n ttfb: navigation ? navigation.responseStart : null,\n domContentLoaded: navigation ? navigation.domContentLoadedEventEnd : null,\n loadEvent: navigation ? navigation.loadEventEnd : null,\n url: location.href,\n } satisfies RawWebVitals;\n });\n\n return {\n url: raw.url,\n capturedAt: new Date().toISOString(),\n cls: metric(raw.cls, { good: 0.1, needsImprovement: 0.25 }),\n fcpMs: metric(raw.fcp, { good: 1800, needsImprovement: 3000 }),\n lcpMs: metric(raw.lcp, { good: 2500, needsImprovement: 4000 }),\n inpMs: metric(raw.inp, { good: 200, needsImprovement: 500 }),\n ttfbMs: metric(raw.ttfb, { good: 800, needsImprovement: 1800 }),\n domContentLoadedMs: raw.domContentLoaded,\n loadEventMs: raw.loadEvent,\n };\n}\n\nexport const webVitalsCollector: CheckpointCollector = {\n name: 'web-vitals',\n defaultEnabled: true,\n\n async setup({ page }) {\n if (initializedPages.has(page)) {\n return;\n }\n\n initializedPages.add(page);\n\n await page.addInitScript(() => {\n const globalState = globalThis as typeof globalThis & {\n __e2eWebVitals?: {\n cls: number;\n fcp: number | null;\n lcp: number | null;\n inp: number | null;\n };\n };\n\n if (!globalState.__e2eWebVitals) {\n globalState.__e2eWebVitals = {\n cls: 0,\n fcp: null,\n lcp: null,\n inp: null,\n };\n }\n\n const state = globalState.__e2eWebVitals;\n\n try {\n const paintObserver = new PerformanceObserver((entryList) => {\n for (const entry of entryList.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n state.fcp = entry.startTime;\n }\n }\n });\n paintObserver.observe({ type: 'paint', buffered: true });\n } catch {\n // Unsupported in this browser context.\n }\n\n try {\n const lcpObserver = new PerformanceObserver((entryList) => {\n const entries = entryList.getEntries();\n const lastEntry = entries[entries.length - 1];\n if (lastEntry) {\n state.lcp = lastEntry.startTime;\n }\n });\n lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n addEventListener('pagehide', () => lcpObserver.disconnect(), { once: true });\n } catch {\n // Unsupported in this browser context.\n }\n\n try {\n const clsObserver = new PerformanceObserver((entryList) => {\n for (const entry of entryList.getEntries() as Array<PerformanceEntry & { hadRecentInput?: boolean; value?: number }>) {\n if (!entry.hadRecentInput) {\n state.cls += entry.value ?? 0;\n }\n }\n });\n clsObserver.observe({ type: 'layout-shift', buffered: true });\n addEventListener('pagehide', () => clsObserver.disconnect(), { once: true });\n } catch {\n // Unsupported in this browser context.\n }\n\n try {\n const inpObserver = new PerformanceObserver((entryList) => {\n for (const entry of entryList.getEntries() as Array<PerformanceEntry & { duration?: number }>) {\n const duration = entry.duration ?? 0;\n if (state.inp == null || duration > state.inp) {\n state.inp = duration;\n }\n }\n });\n inpObserver.observe({ type: 'event', buffered: true, durationThreshold: 40 } as PerformanceObserverInit);\n addEventListener('pagehide', () => inpObserver.disconnect(), { once: true });\n } catch {\n // Unsupported in this browser context.\n }\n });\n },\n\n async collect(ctx) {\n const snapshot = await captureWebVitals(ctx.page);\n const outputPath = path.join(ctx.checkpointDir, 'web-vitals.json');\n\n await fs.writeFile(outputPath, `${JSON.stringify(snapshot, null, 2)}\\n`, 'utf8');\n\n return {\n data: snapshot,\n artifacts: [\n {\n name: 'web-vitals',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n cls: snapshot.cls,\n fcp: snapshot.fcpMs,\n lcp: snapshot.lcpMs,\n inp: snapshot.inpMs,\n ttfb: snapshot.ttfbMs,\n },\n };\n },\n\n async teardown({ page }) {\n initializedPages.delete(page);\n },\n};\n","import { ariaSnapshotCollector } from './aria-snapshot';\nimport { axeCollector } from './axe';\nimport { consoleCollector } from './console';\nimport { domStatsCollector } from './dom-stats';\nimport { formsCollector } from './forms';\nimport { htmlCollector } from './html';\nimport { metadataCollector } from './metadata';\nimport { networkCollector } from './network';\nimport { networkTimingCollector } from './network-timing';\nimport { screenshotCollector } from './screenshot';\nimport { storageCollector } from './storage';\nimport { webVitalsCollector } from './web-vitals';\n\nexport const builtinCollectors = [\n screenshotCollector,\n htmlCollector,\n axeCollector,\n webVitalsCollector,\n consoleCollector,\n networkCollector,\n metadataCollector,\n ariaSnapshotCollector,\n domStatsCollector,\n formsCollector,\n storageCollector,\n networkTimingCollector,\n];\n","import type { CheckpointCollector } from '../types';\n\nconst builtinCollectors = new Map<string, CheckpointCollector>();\nlet builtinsRegistered = false;\n\nexport function registerBuiltinCollector(collector: CheckpointCollector): void {\n builtinCollectors.set(collector.name, collector);\n}\n\nexport function registerBuiltinCollectors(collectors: CheckpointCollector[]): void {\n if (builtinsRegistered) {\n return;\n }\n\n for (const collector of collectors) {\n registerBuiltinCollector(collector);\n }\n\n builtinsRegistered = true;\n}\n\nexport function getBuiltinCollectors(): Map<string, CheckpointCollector> {\n return new Map(builtinCollectors);\n}\n","import fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport type * as PlaywrightModule from '@playwright/test';\nimport type {\n Page,\n PlaywrightTestArgs,\n PlaywrightTestOptions,\n PlaywrightWorkerArgs,\n PlaywrightWorkerOptions,\n TestInfo,\n TestType,\n} from '@playwright/test';\nimport {\n createCheckpointSession,\n registerBuiltinCollector,\n resolveCollectors,\n sanitizeSegment,\n settlePage,\n warn,\n} from './core';\nimport { createDeviceProfile, type DeviceProfile } from './device-profile';\nimport type {\n ArticleDefinition,\n ArticleMetadata,\n CheckpointConfig,\n CheckpointManifest,\n CheckpointOptions,\n CheckpointRecord,\n CollectorConfig,\n CollectorOptions,\n TestCheckpointConfig,\n} from './types';\n\ntype PlaywrightRuntime = typeof PlaywrightModule;\n\ntype TestCheckpointConfigController = {\n set(config: TestCheckpointConfig): void;\n get(): TestCheckpointConfig | null;\n};\n\ntype CheckpointFixtures = {\n checkpoint: (name: string, options?: CheckpointOptions) => Promise<CheckpointRecord>;\n checkpointManifest: CheckpointManifest;\n testCheckpointConfig: TestCheckpointConfigController;\n deviceProfile: DeviceProfile;\n};\n\nconst require = (() => {\n try {\n return Function('return require')() as NodeRequire;\n } catch {\n return createRequire(path.join(process.cwd(), 'playwright-checkpoint-runtime.cjs'));\n }\n})();\n\nfunction loadPlaywright(): PlaywrightRuntime {\n return require('@playwright/test') as PlaywrightRuntime;\n}\n\nfunction mergeCollectorOverrides(\n current: Partial<Record<string, boolean | CollectorOptions>> | undefined,\n updates: Partial<Record<string, boolean | CollectorOptions>> | undefined,\n): Partial<Record<string, boolean | CollectorOptions>> | undefined {\n if (!current && !updates) {\n return undefined;\n }\n\n const merged: Partial<Record<string, boolean | CollectorOptions>> = {\n ...(current ?? {}),\n };\n\n for (const [name, value] of Object.entries(updates ?? {})) {\n const previous = merged[name];\n\n if (value && typeof value === 'object' && !Array.isArray(value) && previous && typeof previous === 'object' && !Array.isArray(previous)) {\n merged[name] = {\n ...previous,\n ...value,\n };\n continue;\n }\n\n merged[name] = value;\n }\n\n return merged;\n}\n\nfunction mergeTestConfig(current: TestCheckpointConfig | null, update: TestCheckpointConfig): TestCheckpointConfig {\n const collectors = mergeCollectorOverrides(current?.collectors, update.collectors);\n const article = mergeArticleMetadata(current?.article, update.article);\n const articles = update.articles ? cloneArticleDefinitions(update.articles) : current?.articles ? cloneArticleDefinitions(current.articles) : undefined;\n\n return {\n description: update.description ?? current?.description,\n ...(article ? { article } : {}),\n ...(articles ? { articles } : {}),\n ...(collectors ? { collectors } : {}),\n };\n}\n\nfunction mergeArticleMetadata(\n current: ArticleMetadata | undefined,\n update: ArticleMetadata | undefined,\n): ArticleMetadata | undefined {\n if (!current && !update) {\n return undefined;\n }\n\n const merged: ArticleMetadata = {\n ...(current ?? {}),\n ...(update ?? {}),\n };\n\n if (current?.frontmatter || update?.frontmatter) {\n merged.frontmatter = {\n ...(current?.frontmatter ?? {}),\n ...(update?.frontmatter ?? {}),\n };\n }\n\n return merged;\n}\n\nfunction cloneArticleMetadata(article: ArticleMetadata): ArticleMetadata {\n return {\n ...article,\n ...(article.frontmatter ? { frontmatter: { ...article.frontmatter } } : {}),\n };\n}\n\nfunction cloneArticleDefinition(article: ArticleDefinition): ArticleDefinition {\n return {\n ...cloneArticleMetadata(article),\n steps: [...article.steps],\n };\n}\n\nfunction cloneArticleDefinitions(articles: ArticleDefinition[]): ArticleDefinition[] {\n return articles.map((article) => cloneArticleDefinition(article));\n}\n\nfunction syncManifestArticle(manifest: CheckpointManifest, testConfig: TestCheckpointConfig | null): void {\n if (testConfig?.article) {\n manifest.article = cloneArticleMetadata(testConfig.article);\n }\n\n if (testConfig?.articles) {\n manifest.articles = cloneArticleDefinitions(testConfig.articles);\n }\n}\n\nfunction manifestEnvironment(): string {\n return process.env.PLAYWRIGHT_CHECKPOINT_ENV || process.env.NODE_ENV || 'test';\n}\n\nfunction explicitTestTags(testInfo: TestInfo): string[] {\n return (((testInfo as TestInfo & { tags?: string[] }).tags ?? []) as string[]).map((tag) => tag.toLowerCase());\n}\n\nexport function titleParts(testInfo: TestInfo): string[] {\n const maybeTitlePath = (testInfo as { titlePath?: unknown }).titlePath;\n return typeof maybeTitlePath === 'function' ? maybeTitlePath.call(testInfo) : [testInfo.title];\n}\n\nexport function collectTags(parts: string[]): Set<string> {\n const tags = new Set<string>();\n\n for (const part of parts) {\n for (const token of part.match(/@[a-z0-9-]+/gi) || []) {\n tags.add(token.toLowerCase());\n }\n }\n\n return tags;\n}\n\nexport function manifestTags(testInfo: TestInfo): string[] {\n return Array.from(new Set([...explicitTestTags(testInfo), ...collectTags(titleParts(testInfo))]));\n}\n\nexport function createCheckpointManifestRecord(testInfo: TestInfo): CheckpointManifest {\n return {\n environment: manifestEnvironment(),\n project: testInfo.project.name,\n testId: testInfo.testId,\n title: testInfo.title,\n tags: manifestTags(testInfo),\n startedAt: new Date().toISOString(),\n checkpoints: [],\n };\n}\n\nexport async function writeCheckpointManifest(testInfo: TestInfo, manifest: CheckpointManifest): Promise<string> {\n const manifestPath = testInfo.outputPath('checkpoint-manifest.json');\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n return manifestPath;\n}\n\nfunction createAdjustTimeout(testInfo: TestInfo): (ms: number) => void {\n return (ms: number) => {\n if (ms > 0 && typeof testInfo.setTimeout === 'function') {\n testInfo.setTimeout(testInfo.timeout + ms);\n }\n };\n}\n\nfunction mergeConfig(\n globalConfig: CheckpointConfig = {},\n testConfig: TestCheckpointConfig | null,\n): Partial<Record<string, boolean | CollectorConfig>> | undefined {\n return mergeCollectorOverrides(\n globalConfig.collectors,\n testConfig?.collectors,\n ) as Partial<Record<string, boolean | CollectorConfig>> | undefined;\n}\n\nexport async function captureCheckpointRecord(args: {\n globalConfig?: CheckpointConfig;\n page: Page;\n testInfo: TestInfo;\n checkpointManifest: CheckpointManifest;\n testConfig?: TestCheckpointConfig | null;\n name: string;\n options?: CheckpointOptions;\n}): Promise<CheckpointRecord> {\n const globalConfig = args.globalConfig ?? {};\n const session = await createCheckpointSession(args.page, {\n outputDir: args.testInfo.outputPath('checkpoints'),\n manifestPath: args.testInfo.outputPath('checkpoint-manifest.json'),\n manifest: args.checkpointManifest,\n collectors: mergeConfig(globalConfig, args.testConfig ?? null),\n custom: globalConfig.custom,\n redact: globalConfig.redact,\n testInfo: args.testInfo,\n adjustTimeout: createAdjustTimeout(args.testInfo),\n });\n\n try {\n return await session.checkpoint(args.name, args.options);\n } finally {\n await session.finalize();\n }\n}\n\nexport function createCheckpoint(globalConfig: CheckpointConfig = {}): {\n test: TestType<PlaywrightTestArgs & PlaywrightTestOptions & CheckpointFixtures, PlaywrightWorkerArgs & PlaywrightWorkerOptions>;\n} {\n const playwright = loadPlaywright();\n const base = playwright.test as TestType<\n PlaywrightTestArgs & PlaywrightTestOptions,\n PlaywrightWorkerArgs & PlaywrightWorkerOptions\n >;\n\n const test = base.extend<CheckpointFixtures>({\n checkpointManifest: [\n // Playwright fixture callbacks must use object destructuring for the first arg.\n // eslint-disable-next-line no-empty-pattern\n async ({}, use, testInfo) => {\n const manifest = createCheckpointManifestRecord(testInfo);\n\n try {\n await use(manifest);\n } finally {\n try {\n await writeCheckpointManifest(testInfo, manifest);\n } catch (error) {\n warn(`Failed to write checkpoint manifest for test \"${testInfo.title}\".`, error);\n }\n }\n },\n { auto: true },\n ],\n\n // Playwright fixture callbacks must use object destructuring for the first arg.\n // eslint-disable-next-line no-empty-pattern\n testCheckpointConfig: async ({}, use) => {\n let current: TestCheckpointConfig | null = null;\n\n const controller: TestCheckpointConfigController = {\n set(config) {\n current = mergeTestConfig(current, config);\n },\n get() {\n return current\n ? {\n ...current,\n ...(current.collectors ? { collectors: mergeCollectorOverrides(undefined, current.collectors) } : {}),\n }\n : null;\n },\n };\n\n await use(controller);\n },\n\n // Playwright fixture callbacks must use object destructuring for the first arg.\n // eslint-disable-next-line no-empty-pattern\n deviceProfile: async ({}, use, testInfo) => {\n await use(createDeviceProfile(testInfo));\n },\n\n checkpoint: async ({ page, checkpointManifest, testCheckpointConfig }, use, testInfo) => {\n const session = await createCheckpointSession(page, {\n outputDir: testInfo.outputPath('checkpoints'),\n manifestPath: testInfo.outputPath('checkpoint-manifest.json'),\n manifest: checkpointManifest,\n collectors: globalConfig.collectors,\n testConfig: () => testCheckpointConfig.get(),\n custom: globalConfig.custom,\n redact: globalConfig.redact,\n testInfo,\n adjustTimeout: createAdjustTimeout(testInfo),\n });\n\n try {\n await use((name, options = {}) => {\n syncManifestArticle(checkpointManifest, testCheckpointConfig.get());\n return session.checkpoint(name, options);\n });\n } finally {\n syncManifestArticle(checkpointManifest, testCheckpointConfig.get());\n await session.finalize();\n }\n },\n });\n\n return { test };\n}\n\nexport const expect = loadPlaywright().expect;\nexport const { test } = createCheckpoint();\nexport { createCheckpointSession, createDeviceProfile, registerBuiltinCollector, resolveCollectors, sanitizeSegment, settlePage, warn };\nexport type { DeviceProfile, TestCheckpointConfigController };\n","import type { TestInfo } from '@playwright/test';\n\nexport type DeviceSurface = 'desktop' | 'mobile';\n\nexport type DeviceProfile = {\n name: string;\n isMobile: boolean;\n surface: DeviceSurface;\n};\n\nexport function createDeviceProfile(testInfo: TestInfo): DeviceProfile {\n const use = testInfo.project.use as { isMobile?: boolean } | undefined;\n const isMobile = Boolean(use?.isMobile);\n\n return {\n name: testInfo.project.name,\n isMobile,\n surface: isMobile ? 'mobile' : 'desktop',\n };\n}\n","import { builtinCollectors } from './builtin-collectors';\nimport { registerBuiltinCollectors } from './registry';\n\nregisterBuiltinCollectors(builtinCollectors);\n\nexport { registerBuiltinCollector, registerBuiltinCollectors, getBuiltinCollectors } from './registry';\nexport { screenshotCollector } from './screenshot';\nexport { htmlCollector } from './html';\nexport { axeCollector, setAxeLoaderForTests } from './axe';\nexport { webVitalsCollector } from './web-vitals';\nexport { consoleCollector } from './console';\nexport { networkCollector } from './network';\nexport { metadataCollector } from './metadata';\nexport { ariaSnapshotCollector } from './aria-snapshot';\nexport { domStatsCollector } from './dom-stats';\nexport { formsCollector } from './forms';\nexport { storageCollector } from './storage';\nexport { networkTimingCollector } from './network-timing';\nexport type { CheckpointCollector } from '../types';\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n CheckpointConfig,\n CheckpointManifest,\n ReportGenerationResults,\n ReportGenerator,\n ReporterConfig,\n RunRecord,\n} from '../types';\nimport { htmlReporter } from './html-reporter';\nimport { markdownReporter } from './markdown-reporter';\nimport { mdxReporter } from './mdx-reporter';\nexport { groupByStory, orderedCheckpointNames } from './story-utils';\n\nconst builtinReporters = new Map<string, ReportGenerator>();\nconst builtinReporterDefaults: Partial<Record<string, ReporterConfig>> = {\n html: true,\n markdown: false,\n mdx: false,\n};\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const dirents = await fs.readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n\n for (const dirent of dirents) {\n const absolutePath = path.join(directory, dirent.name);\n if (dirent.isDirectory()) {\n files.push(...(await walkFiles(absolutePath)));\n continue;\n }\n if (dirent.isFile()) {\n files.push(absolutePath);\n }\n }\n\n return files;\n}\n\nfunction isCheckpointManifestFile(filePath: string): boolean {\n const fileName = path.basename(filePath);\n return fileName === 'checkpoint-manifest.json' || (fileName.startsWith('checkpoint-manifest-') && fileName.endsWith('.json'));\n}\n\nfunction isCheckpointManifest(value: unknown): value is CheckpointManifest {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const manifest = value as Partial<CheckpointManifest>;\n return (\n typeof manifest.project === 'string' &&\n typeof manifest.testId === 'string' &&\n typeof manifest.title === 'string' &&\n typeof manifest.startedAt === 'string' &&\n Array.isArray(manifest.tags) &&\n Array.isArray(manifest.checkpoints)\n );\n}\n\nfunction toRunRecord(manifest: CheckpointManifest, sourceManifestPath: string): RunRecord {\n return {\n key: `${manifest.testId}|${manifest.project}|${manifest.startedAt}`,\n sourceManifestPath,\n environment: manifest.environment || 'unknown',\n project: manifest.project,\n testId: manifest.testId,\n title: manifest.title,\n ...(manifest.article ? { article: manifest.article } : {}),\n ...(manifest.articles ? { articles: manifest.articles } : {}),\n tags: manifest.tags,\n startedAt: manifest.startedAt,\n checkpoints: manifest.checkpoints,\n };\n}\n\nfunction toManifest(run: RunRecord): CheckpointManifest {\n return {\n environment: run.environment,\n project: run.project,\n testId: run.testId,\n title: run.title,\n ...(run.article ? { article: run.article } : {}),\n ...(run.articles ? { articles: run.articles } : {}),\n tags: run.tags,\n startedAt: run.startedAt,\n checkpoints: run.checkpoints,\n };\n}\n\nfunction normalizeReporterConfig(config: ReporterConfig | undefined): Record<string, unknown> | null {\n if (config == null || config === false) {\n return null;\n }\n\n if (config === true) {\n return {};\n }\n\n return { ...config };\n}\n\nexport function registerBuiltinReporter(reporter: ReportGenerator): void {\n builtinReporters.set(reporter.name, reporter);\n}\n\nexport function dedupeRuns(runs: RunRecord[]): RunRecord[] {\n const map = new Map<string, RunRecord>();\n\n for (const run of runs) {\n const existing = map.get(run.key);\n if (!existing) {\n map.set(run.key, run);\n continue;\n }\n\n const existingTime = new Date(existing.startedAt).getTime();\n const currentTime = new Date(run.startedAt).getTime();\n if (currentTime >= existingTime) {\n map.set(run.key, run);\n }\n }\n\n return [...map.values()];\n}\n\nexport async function loadRuns(testResultsDir: string): Promise<RunRecord[]> {\n let manifestFiles: string[];\n try {\n manifestFiles = (await walkFiles(testResultsDir)).filter(isCheckpointManifestFile);\n } catch {\n return [];\n }\n\n const runs: RunRecord[] = [];\n for (const manifestPath of manifestFiles) {\n let rawManifest: unknown;\n try {\n rawManifest = JSON.parse(await fs.readFile(manifestPath, 'utf8'));\n } catch {\n continue;\n }\n\n if (!isCheckpointManifest(rawManifest)) {\n continue;\n }\n\n runs.push(toRunRecord(rawManifest, manifestPath));\n }\n\n return dedupeRuns(runs);\n}\n\nexport async function runReporters(\n config: CheckpointConfig,\n testResultsDir: string,\n outputDir: string,\n): Promise<ReportGenerationResults> {\n const runs = await loadRuns(testResultsDir);\n const manifests = runs.map(toManifest);\n const results: ReportGenerationResults = {};\n const reporterConfigMap: Partial<Record<string, ReporterConfig>> = {\n ...builtinReporterDefaults,\n ...(config.reporters ?? {}),\n };\n\n for (const [name, value] of Object.entries(reporterConfigMap)) {\n const reporterConfig = normalizeReporterConfig(value);\n if (!reporterConfig) {\n continue;\n }\n\n const reporter = builtinReporters.get(name);\n if (!reporter) {\n throw new Error(`Reporter \"${name}\" is enabled but no implementation is registered.`);\n }\n\n if (reporter.validateConfig && !reporter.validateConfig(reporterConfig)) {\n throw new Error(`Reporter \"${name}\" received invalid configuration.`);\n }\n\n results[name] = await reporter.generate({\n runs,\n outputDir,\n config: reporterConfig,\n manifests,\n });\n }\n\n return results;\n}\n\nregisterBuiltinReporter(htmlReporter);\nregisterBuiltinReporter(markdownReporter);\nregisterBuiltinReporter(mdxReporter);\n\nexport { annotateScreenshot } from './annotate';\nexport { htmlReporter, markdownReporter, mdxReporter };\nexport type { ReportGenerator } from '../types';\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointRecord, ReportGenerator, RunRecord, ScreenshotCollectorData } from '../types';\nimport { groupByStory, orderedCheckpointNames } from './story-utils';\n\ntype HtmlReporterConfig = {\n title?: string;\n projectOrder?: string[];\n};\n\nconst DEFAULT_PROJECT_ORDER = ['desktop-light', 'desktop-dark', 'mobile-light', 'mobile-dark'];\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n}\n\nfunction slugify(value: string): string {\n return (\n value\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'story'\n );\n}\n\nfunction formatDateTime(isoDate: string): string {\n const date = new Date(isoDate);\n if (Number.isNaN(date.getTime())) {\n return isoDate;\n }\n\n return new Intl.DateTimeFormat('en-US', {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(date);\n}\n\nfunction projectWeight(projectName: string, projectOrder: string[]): number {\n const index = projectOrder.indexOf(projectName);\n return index === -1 ? Number.MAX_SAFE_INTEGER : index;\n}\n\nfunction formatProjectLabel(projectName: string): string {\n const [device, mode] = projectName.split('-');\n if (!device || !mode) {\n return projectName;\n }\n\n const deviceLabel = device === 'desktop' ? 'Desktop' : device === 'mobile' ? 'Mobile' : device;\n const modeLabel = mode === 'light' ? 'Light' : mode === 'dark' ? 'Dark' : mode;\n return `${deviceLabel} / ${modeLabel}`;\n}\n\nfunction sortByProjectAndTime(a: RunRecord, b: RunRecord, projectOrder: string[]): number {\n const byProject = projectWeight(a.project, projectOrder) - projectWeight(b.project, projectOrder);\n if (byProject !== 0) {\n return byProject;\n }\n\n const byProjectName = a.project.localeCompare(b.project);\n if (byProjectName !== 0) {\n return byProjectName;\n }\n\n return new Date(a.startedAt).getTime() - new Date(b.startedAt).getTime();\n}\n\nfunction getCollectorSummaryNumber(checkpoint: CheckpointRecord, collectorName: string, key: string): number | null {\n const value = checkpoint.collectors[collectorName]?.summary[key];\n return typeof value === 'number' ? value : null;\n}\n\nfunction screenshotData(checkpoint: CheckpointRecord): Partial<ScreenshotCollectorData> | null {\n const data = checkpoint.collectors.screenshot?.data;\n return data && typeof data === 'object' ? (data as Partial<ScreenshotCollectorData>) : null;\n}\n\nfunction highlightOverlayStyle(checkpoint: CheckpointRecord): string | null {\n const data = screenshotData(checkpoint);\n const bounds = data?.highlightBounds;\n const imageSize = data?.imageSize;\n\n if (\n !bounds ||\n !imageSize ||\n typeof bounds.x !== 'number' ||\n typeof bounds.y !== 'number' ||\n typeof bounds.width !== 'number' ||\n typeof bounds.height !== 'number' ||\n typeof imageSize.width !== 'number' ||\n typeof imageSize.height !== 'number' ||\n imageSize.width <= 0 ||\n imageSize.height <= 0\n ) {\n return null;\n }\n\n const left = (bounds.x / imageSize.width) * 100;\n const top = (bounds.y / imageSize.height) * 100;\n const width = (bounds.width / imageSize.width) * 100;\n const height = (bounds.height / imageSize.height) * 100;\n\n return [\n `left:${left.toFixed(4)}%`,\n `top:${top.toFixed(4)}%`,\n `width:${width.toFixed(4)}%`,\n `height:${height.toFixed(4)}%`,\n ].join(';');\n}\n\nfunction highlightLabel(checkpoint: CheckpointRecord): string | null {\n const selector = screenshotData(checkpoint)?.highlightSelector;\n return typeof selector === 'string' && selector.trim().length > 0 ? `Focus: ${selector.trim()}` : null;\n}\n\nfunction resolveArtifactPath(run: RunRecord, artifactPath: string): string {\n return path.isAbsolute(artifactPath) ? artifactPath : path.resolve(path.dirname(run.sourceManifestPath), artifactPath);\n}\n\nfunction toEncodedHref(outputDir: string, filePath: string | null): string | null {\n if (!filePath) {\n return null;\n }\n\n const relativePath = path.relative(outputDir, filePath);\n return relativePath.split(path.sep).map(encodeURIComponent).join('/');\n}\n\nfunction getArtifactHref(\n run: RunRecord,\n checkpoint: CheckpointRecord,\n outputDir: string,\n collectorName: string,\n artifactName?: string,\n): string | null {\n const artifacts = checkpoint.collectors[collectorName]?.artifacts ?? [];\n const artifact = artifactName\n ? artifacts.find((entry) => entry.name === artifactName)\n : artifacts[0];\n\n if (!artifact?.path) {\n return null;\n }\n\n return toEncodedHref(outputDir, resolveArtifactPath(run, artifact.path));\n}\n\nfunction renderArtifactLinks(run: RunRecord, checkpoint: CheckpointRecord, outputDir: string): string {\n const links: Array<{ label: string; href: string | null }> = [\n { label: 'DOM HTML', href: getArtifactHref(run, checkpoint, outputDir, 'html', 'html') },\n { label: 'Axe', href: getArtifactHref(run, checkpoint, outputDir, 'axe', 'axe') },\n { label: 'Web Vitals', href: getArtifactHref(run, checkpoint, outputDir, 'web-vitals', 'web-vitals') },\n { label: 'Console', href: getArtifactHref(run, checkpoint, outputDir, 'console', 'console-errors') },\n { label: 'Failed Requests', href: getArtifactHref(run, checkpoint, outputDir, 'network', 'failed-requests') },\n ];\n\n return links\n .map((link) => {\n if (!link.href) {\n return `<span class=\"artifact disabled\">${escapeHtml(link.label)}</span>`;\n }\n\n return `<a class=\"artifact\" href=\"${link.href}\" target=\"_blank\" rel=\"noreferrer\">${escapeHtml(link.label)}</a>`;\n })\n .join('');\n}\n\nfunction renderCheckpointCard(run: RunRecord, checkpointName: string, outputDir: string): string {\n const checkpoint = run.checkpoints.find((entry) => entry.name === checkpointName);\n if (!checkpoint) {\n return `\n <article class=\"variant-card missing\">\n <header class=\"variant-card-header\">\n <div>\n <h5>${escapeHtml(formatProjectLabel(run.project))}</h5>\n <p>${escapeHtml(run.project)}</p>\n </div>\n <time>${escapeHtml(formatDateTime(run.startedAt))}</time>\n </header>\n <div class=\"empty-card\">No checkpoint captured for this run.</div>\n </article>\n `;\n }\n\n const screenshotHref = getArtifactHref(run, checkpoint, outputDir, 'screenshot', 'screenshot');\n const overlayStyle = highlightOverlayStyle(checkpoint);\n const focus = highlightLabel(checkpoint);\n const axeViolations = getCollectorSummaryNumber(checkpoint, 'axe', 'violations');\n const consoleErrors = getCollectorSummaryNumber(checkpoint, 'console', 'consoleErrorCount') ?? 0;\n const failedRequests = getCollectorSummaryNumber(checkpoint, 'network', 'failedRequestCount') ?? 0;\n\n return `\n <article class=\"variant-card\">\n <header class=\"variant-card-header\">\n <div>\n <h5>${escapeHtml(formatProjectLabel(run.project))}</h5>\n <p>${escapeHtml(run.project)}</p>\n </div>\n <time>${escapeHtml(formatDateTime(checkpoint.timestamp || run.startedAt))}</time>\n </header>\n <p class=\"page-meta\">\n <span>${escapeHtml(checkpoint.title || 'Untitled page')}</span>\n <span class=\"page-url\">${escapeHtml(checkpoint.url)}</span>\n </p>\n ${\n screenshotHref\n ? `<a class=\"thumbnail-link\" href=\"${screenshotHref}\" target=\"_blank\" rel=\"noreferrer\">\n <img src=\"${screenshotHref}\" alt=\"${escapeHtml(`${run.project} — ${checkpoint.name}`)}\" loading=\"lazy\" />\n ${overlayStyle ? `<span class=\"highlight-overlay\" style=\"${overlayStyle}\" aria-hidden=\"true\"></span>` : ''}\n ${focus ? `<span class=\"highlight-label\">${escapeHtml(focus)}</span>` : ''}\n </a>`\n : '<div class=\"empty-card\">Screenshot unavailable.</div>'\n }\n <div class=\"stats-grid\">\n <span><strong>${axeViolations ?? 'n/a'}</strong><small>Axe violations</small></span>\n <span><strong>${consoleErrors}</strong><small>Console errors</small></span>\n <span><strong>${failedRequests}</strong><small>Failed requests</small></span>\n </div>\n <div class=\"artifact-list\">${renderArtifactLinks(run, checkpoint, outputDir)}</div>\n </article>\n `;\n}\n\nfunction renderStorySection(title: string, runs: RunRecord[], outputDir: string): string {\n const checkpointNames = orderedCheckpointNames(runs);\n const environments = [...new Set(runs.map((run) => run.environment))].sort();\n const tags = [...new Set(runs.flatMap((run) => run.tags))].sort();\n\n const checkpointBlocks = checkpointNames\n .map(\n (checkpointName) => `\n <details class=\"accordion checkpoint-block\">\n <summary class=\"checkpoint-summary\">\n <span>${escapeHtml(checkpointName)}</span>\n <span class=\"checkpoint-meta\">${runs.length} variants</span>\n </summary>\n <div class=\"variant-grid\">\n ${runs.map((run) => renderCheckpointCard(run, checkpointName, outputDir)).join('')}\n </div>\n </details>\n `,\n )\n .join('');\n\n return `\n <details class=\"accordion story-block\" id=\"story-${slugify(title)}\" open>\n <summary class=\"story-summary\">\n <span class=\"story-title\">${escapeHtml(title)}</span>\n <span class=\"story-meta-chip\">${runs.length} run${runs.length === 1 ? '' : 's'}</span>\n </summary>\n <div class=\"story-body\">\n <div class=\"story-meta-row\">\n <span><strong>Projects</strong> ${escapeHtml(runs.map((run) => run.project).join(', '))}</span>\n <span><strong>Environments</strong> ${escapeHtml(environments.join(', ') || 'n/a')}</span>\n <span><strong>Tags</strong> ${escapeHtml(tags.join(', ') || 'none')}</span>\n </div>\n ${checkpointBlocks || '<p class=\"empty-state\">No checkpoints captured for this story.</p>'}\n </div>\n </details>\n `;\n}\n\nfunction buildHtmlReport(runs: RunRecord[], outputDir: string, config: HtmlReporterConfig): string {\n const groupedRuns = groupByStory(runs);\n const storyTitles = [...groupedRuns.keys()].sort((a, b) => a.localeCompare(b));\n const projectOrder = Array.isArray(config.projectOrder)\n ? config.projectOrder.filter((value): value is string => typeof value === 'string')\n : DEFAULT_PROJECT_ORDER;\n const generatedAt = new Date().toISOString();\n const reportTitle = typeof config.title === 'string' && config.title.trim() ? config.title.trim() : 'Playwright Checkpoint Report';\n\n for (const title of storyTitles) {\n groupedRuns.get(title)?.sort((a, b) => sortByProjectAndTime(a, b, projectOrder));\n }\n\n const navLinks = storyTitles\n .map((title) => `<a href=\"#story-${slugify(title)}\">${escapeHtml(title)}</a>`)\n .join('');\n\n const storySections = storyTitles\n .map((title) => renderStorySection(title, groupedRuns.get(title) ?? [], outputDir))\n .join('');\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(reportTitle)}</title>\n <style>\n :root {\n color-scheme: dark;\n --bg: #0b1020;\n --panel: rgba(15, 23, 42, 0.88);\n --panel-2: rgba(17, 25, 40, 0.98);\n --text: #e5eefb;\n --muted: #9fb3c8;\n --accent: #60a5fa;\n --accent-2: #22d3ee;\n --border: rgba(148, 163, 184, 0.18);\n --success: #34d399;\n --warning: #fbbf24;\n --danger: #fb7185;\n --shadow: 0 24px 64px rgba(2, 6, 23, 0.45);\n }\n * { box-sizing: border-box; }\n html { scroll-behavior: smooth; }\n body {\n margin: 0;\n min-height: 100vh;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n background:\n radial-gradient(circle at top, rgba(96, 165, 250, 0.14), transparent 30%),\n linear-gradient(180deg, #07101f 0%, #0b1020 100%);\n color: var(--text);\n }\n a { color: inherit; }\n .page {\n width: min(1600px, calc(100vw - 32px));\n margin: 0 auto;\n padding: 28px 0 56px;\n }\n .hero {\n background: linear-gradient(180deg, rgba(15, 23, 42, 0.96), rgba(15, 23, 42, 0.84));\n border: 1px solid var(--border);\n border-radius: 24px;\n padding: 24px;\n box-shadow: var(--shadow);\n backdrop-filter: blur(18px);\n }\n .hero h1 {\n margin: 0;\n font-size: clamp(1.9rem, 2.6vw, 3rem);\n line-height: 1.1;\n }\n .hero p {\n margin: 10px 0 0;\n color: var(--muted);\n max-width: 72ch;\n line-height: 1.6;\n }\n .summary-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n margin-top: 18px;\n }\n .summary-pill {\n display: inline-flex;\n gap: 8px;\n align-items: center;\n padding: 9px 12px;\n border: 1px solid var(--border);\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.72);\n color: var(--muted);\n font-size: 0.92rem;\n }\n .summary-pill strong { color: var(--text); }\n .toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n gap: 16px;\n margin-top: 18px;\n padding-top: 18px;\n border-top: 1px solid var(--border);\n }\n .story-nav {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n }\n .story-nav a,\n .toolbar button,\n .artifact {\n border: 1px solid var(--border);\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.7);\n color: var(--text);\n text-decoration: none;\n padding: 8px 12px;\n font: inherit;\n font-size: 0.86rem;\n transition: transform 140ms ease, border-color 140ms ease, background 140ms ease;\n }\n .toolbar button:hover,\n .story-nav a:hover,\n .artifact:hover {\n transform: translateY(-1px);\n border-color: rgba(96, 165, 250, 0.55);\n background: rgba(30, 41, 59, 0.96);\n cursor: pointer;\n }\n .content {\n display: grid;\n gap: 18px;\n margin-top: 22px;\n }\n .accordion {\n border: 1px solid var(--border);\n border-radius: 22px;\n background: var(--panel);\n box-shadow: var(--shadow);\n overflow: hidden;\n }\n .accordion summary {\n list-style: none;\n cursor: pointer;\n }\n .accordion summary::-webkit-details-marker { display: none; }\n .story-summary,\n .checkpoint-summary {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n }\n .story-summary {\n padding: 20px 22px;\n background: linear-gradient(180deg, rgba(15, 23, 42, 0.92), rgba(15, 23, 42, 0.74));\n }\n .story-title {\n font-size: 1.1rem;\n font-weight: 700;\n }\n .story-meta-chip,\n .checkpoint-meta {\n color: var(--muted);\n font-size: 0.84rem;\n white-space: nowrap;\n }\n .story-body {\n padding: 0 22px 22px;\n }\n .story-meta-row {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n color: var(--muted);\n font-size: 0.92rem;\n line-height: 1.5;\n margin: 4px 0 18px;\n }\n .story-meta-row strong { color: var(--text); margin-right: 6px; }\n .checkpoint-block {\n margin-top: 14px;\n border-radius: 18px;\n background: var(--panel-2);\n border: 1px solid rgba(148, 163, 184, 0.14);\n }\n .checkpoint-summary {\n padding: 16px 18px;\n font-weight: 600;\n background: rgba(15, 23, 42, 0.68);\n }\n .variant-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 14px;\n padding: 0 18px 18px;\n }\n .variant-card {\n display: grid;\n gap: 12px;\n border: 1px solid rgba(148, 163, 184, 0.14);\n border-radius: 18px;\n background: rgba(15, 23, 42, 0.72);\n padding: 16px;\n min-height: 100%;\n }\n .variant-card.missing {\n opacity: 0.72;\n border-style: dashed;\n }\n .variant-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 10px;\n }\n .variant-card-header h5 {\n margin: 0;\n font-size: 1rem;\n }\n .variant-card-header p,\n .variant-card-header time {\n margin: 4px 0 0;\n color: var(--muted);\n font-size: 0.83rem;\n }\n .page-meta {\n display: grid;\n gap: 4px;\n margin: 0;\n color: var(--muted);\n font-size: 0.9rem;\n }\n .page-url {\n overflow-wrap: anywhere;\n font-size: 0.82rem;\n }\n .thumbnail-link {\n position: relative;\n display: block;\n border-radius: 14px;\n overflow: hidden;\n border: 1px solid rgba(148, 163, 184, 0.18);\n background: rgba(2, 6, 23, 0.65);\n }\n .thumbnail-link img {\n display: block;\n width: 100%;\n aspect-ratio: 16 / 10;\n object-fit: cover;\n }\n .highlight-overlay {\n position: absolute;\n border: 2px solid var(--danger);\n border-radius: 12px;\n background: rgba(251, 113, 133, 0.08);\n box-shadow: 0 0 0 999px rgba(251, 113, 133, 0.02);\n pointer-events: none;\n }\n .highlight-label {\n position: absolute;\n left: 12px;\n bottom: 12px;\n max-width: calc(100% - 24px);\n padding: 6px 9px;\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.9);\n border: 1px solid rgba(251, 113, 133, 0.35);\n color: #ffe4e6;\n font-size: 0.74rem;\n line-height: 1.3;\n overflow-wrap: anywhere;\n }\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 10px;\n }\n .stats-grid span {\n display: grid;\n gap: 6px;\n padding: 10px 12px;\n border-radius: 14px;\n background: rgba(2, 6, 23, 0.42);\n border: 1px solid rgba(148, 163, 184, 0.12);\n }\n .stats-grid strong {\n font-size: 1.15rem;\n line-height: 1;\n }\n .stats-grid small {\n color: var(--muted);\n font-size: 0.76rem;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .artifact-list {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n .artifact.disabled {\n opacity: 0.45;\n pointer-events: none;\n }\n .empty-state,\n .empty-card {\n margin: 0;\n color: var(--muted);\n padding: 12px;\n border: 1px dashed rgba(148, 163, 184, 0.2);\n border-radius: 14px;\n background: rgba(2, 6, 23, 0.24);\n }\n @media (max-width: 720px) {\n .page {\n width: min(100vw - 20px, 1600px);\n padding-top: 18px;\n }\n .hero,\n .story-summary,\n .story-body,\n .checkpoint-summary,\n .variant-grid {\n padding-left: 16px;\n padding-right: 16px;\n }\n .variant-card-header,\n .story-summary,\n .checkpoint-summary,\n .toolbar {\n flex-direction: column;\n align-items: flex-start;\n }\n .stats-grid {\n grid-template-columns: 1fr;\n }\n }\n </style>\n</head>\n<body>\n <main class=\"page\">\n <section class=\"hero\">\n <h1>${escapeHtml(reportTitle)}</h1>\n <p>Explore checkpoint runs by story, inspect every project variant side-by-side, and jump directly to screenshots and generated artifacts.</p>\n <div class=\"summary-bar\">\n <span class=\"summary-pill\"><strong>Generated</strong> ${escapeHtml(formatDateTime(generatedAt))}</span>\n <span class=\"summary-pill\"><strong>Stories</strong> ${storyTitles.length}</span>\n <span class=\"summary-pill\"><strong>Runs</strong> ${runs.length}</span>\n <span class=\"summary-pill\"><strong>Output</strong> ${escapeHtml(outputDir)}</span>\n </div>\n <div class=\"toolbar\">\n <nav class=\"story-nav\">${navLinks || '<span class=\"summary-pill\">No stories found</span>'}</nav>\n <div class=\"toolbar-actions\">\n <button type=\"button\" data-action=\"expand-all\">Expand all</button>\n <button type=\"button\" data-action=\"collapse-all\">Collapse all</button>\n </div>\n </div>\n </section>\n <section class=\"content\">\n ${storySections || '<p class=\"empty-state\">No checkpoint manifests found.</p>'}\n </section>\n </main>\n <script>\n (() => {\n const details = Array.from(document.querySelectorAll('details.accordion'));\n const setAll = (open) => {\n details.forEach((entry) => {\n entry.open = open;\n });\n };\n document.querySelector('[data-action=\"expand-all\"]')?.addEventListener('click', () => setAll(true));\n document.querySelector('[data-action=\"collapse-all\"]')?.addEventListener('click', () => setAll(false));\n const revealHash = () => {\n if (!window.location.hash) {\n return;\n }\n const target = document.querySelector(window.location.hash);\n if (!(target instanceof HTMLElement)) {\n return;\n }\n const parentDetails = target.closest('details');\n if (parentDetails instanceof HTMLDetailsElement) {\n parentDetails.open = true;\n }\n target.scrollIntoView({ block: 'start', behavior: 'smooth' });\n };\n window.addEventListener('hashchange', revealHash);\n revealHash();\n })();\n </script>\n</body>\n</html>\n`;\n}\n\nexport const htmlReporter: ReportGenerator = {\n name: 'html',\n description: 'Responsive HTML report for checkpoint manifests.',\n\n validateConfig(config): boolean {\n return config != null && typeof config === 'object' && !Array.isArray(config);\n },\n\n async generate(context) {\n const outputFile = path.join(context.outputDir, 'index.html');\n const html = buildHtmlReport(context.runs, context.outputDir, context.config as HtmlReporterConfig);\n\n await fs.mkdir(context.outputDir, { recursive: true });\n await fs.writeFile(outputFile, html, 'utf8');\n\n const storyCount = new Set(context.runs.map((run) => run.title)).size;\n\n return {\n files: [outputFile],\n summary: `Generated HTML report for ${storyCount} stor${storyCount === 1 ? 'y' : 'ies'} (${context.runs.length} run${context.runs.length === 1 ? '' : 's'}).`,\n };\n },\n};\n","import type { RunRecord } from '../types';\n\nexport function groupByStory(runs: RunRecord[]): Map<string, RunRecord[]> {\n const stories = new Map<string, RunRecord[]>();\n\n for (const run of runs) {\n const existing = stories.get(run.title) ?? [];\n existing.push(run);\n stories.set(run.title, existing);\n }\n\n return stories;\n}\n\nexport function orderedCheckpointNames(runs: RunRecord[]): string[] {\n const names: string[] = [];\n const seen = new Set<string>();\n\n for (const run of runs) {\n for (const checkpoint of run.checkpoints) {\n if (seen.has(checkpoint.name)) {\n continue;\n }\n\n seen.add(checkpoint.name);\n names.push(checkpoint.name);\n }\n }\n\n return names;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { ArticleDefinition, ArticleMetadata, CheckpointRecord, ReportGenerator, RunRecord, ScreenshotCollectorData } from '../types';\nimport { warn } from '../core';\nimport { groupByStory } from './story-utils';\n\ntype MarkdownReporterConfig = {\n storiesDir?: string;\n screenshotsDir?: string;\n includeTags?: string[];\n preferredProject?: string;\n header?: string;\n footer?: string;\n frontmatter?: boolean | Record<string, unknown>;\n imagePathPrefix?: string;\n copyScreenshots?: boolean;\n requireExplicitStep?: boolean;\n};\n\ntype MarkdownStep = {\n checkpoint: CheckpointRecord;\n order: number;\n heading: string;\n description: string;\n imagePath: string | null;\n urlLabel: string;\n breadcrumbLabel: string | null;\n focusNote: string | null;\n};\n\ntype MarkdownArticle = {\n title: string;\n description: string | null;\n slug: string;\n metadata?: ArticleMetadata;\n stepNames?: string[];\n screenshotDirSlug: string;\n};\n\nfunction slugify(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'story'\n );\n}\n\nfunction stripTags(value: string): string {\n const stripped = value.replace(/\\s+@[a-z0-9-]+/gi, ' ').replace(/\\s+/g, ' ').trim();\n return stripped || value.trim() || 'Untitled story';\n}\n\nfunction articleTitle(run: RunRecord): string {\n const override = run.article?.title?.trim();\n return override || stripTags(run.title);\n}\n\nfunction articleDescription(run: RunRecord): string | null {\n const description = run.article?.description?.trim();\n return description ? description : null;\n}\n\nfunction articleSlug(run: RunRecord): string {\n const override = run.article?.slug?.trim();\n return slugify(override || stripTags(run.title));\n}\n\nfunction uniqueArticleSlug(baseSlug: string, usedSlugs: Set<string>): string {\n if (!usedSlugs.has(baseSlug)) {\n return baseSlug;\n }\n\n let index = 1;\n while (usedSlugs.has(`${baseSlug}-${index}`)) {\n index += 1;\n }\n\n return `${baseSlug}-${index}`;\n}\n\nfunction normalizeConfig(config: Record<string, unknown>): MarkdownReporterConfig {\n return {\n storiesDir: typeof config.storiesDir === 'string' ? config.storiesDir : '.',\n screenshotsDir: typeof config.screenshotsDir === 'string' ? config.screenshotsDir : 'screenshots',\n includeTags: Array.isArray(config.includeTags)\n ? config.includeTags.filter((value): value is string => typeof value === 'string')\n : undefined,\n preferredProject: typeof config.preferredProject === 'string' ? config.preferredProject : undefined,\n header: typeof config.header === 'string' ? config.header : undefined,\n footer: typeof config.footer === 'string' ? config.footer : undefined,\n frontmatter:\n config.frontmatter === true ||\n config.frontmatter === false ||\n (config.frontmatter != null && typeof config.frontmatter === 'object' && !Array.isArray(config.frontmatter))\n ? (config.frontmatter as MarkdownReporterConfig['frontmatter'])\n : false,\n imagePathPrefix: typeof config.imagePathPrefix === 'string' ? config.imagePathPrefix : undefined,\n copyScreenshots: typeof config.copyScreenshots === 'boolean' ? config.copyScreenshots : true,\n requireExplicitStep: typeof config.requireExplicitStep === 'boolean' ? config.requireExplicitStep : false,\n };\n}\n\nfunction normalizeTags(tags: string[] | undefined): string[] {\n return (tags ?? []).map((tag) => tag.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction shouldIncludeRun(run: RunRecord, config: MarkdownReporterConfig): boolean {\n const includeTags = normalizeTags(config.includeTags);\n if (includeTags.length > 0) {\n const runTags = new Set(normalizeTags(run.tags));\n return includeTags.some((tag) => runTags.has(tag));\n }\n\n if (run.articles) {\n return true;\n }\n\n return run.checkpoints.some((checkpoint) => {\n const hasDescription = typeof checkpoint.description === 'string' && checkpoint.description.trim().length > 0;\n return hasDescription || typeof checkpoint.step === 'number';\n });\n}\n\nfunction choosePrimaryRun(runs: RunRecord[], preferredProject?: string): RunRecord | null {\n if (runs.length === 0) {\n return null;\n }\n\n return [...runs].sort((left, right) => {\n const leftPreferred = preferredProject && left.project === preferredProject ? 0 : 1;\n const rightPreferred = preferredProject && right.project === preferredProject ? 0 : 1;\n if (leftPreferred !== rightPreferred) {\n return leftPreferred - rightPreferred;\n }\n\n const rightTime = new Date(right.startedAt).getTime();\n const leftTime = new Date(left.startedAt).getTime();\n if (rightTime !== leftTime) {\n return rightTime - leftTime;\n }\n\n return left.project.localeCompare(right.project);\n })[0] ?? null;\n}\n\nfunction resolveArtifactPath(run: RunRecord, artifactPath: string): string {\n return path.isAbsolute(artifactPath) ? artifactPath : path.resolve(path.dirname(run.sourceManifestPath), artifactPath);\n}\n\nfunction screenshotSourcePath(run: RunRecord, checkpoint: CheckpointRecord): string | null {\n const artifacts = checkpoint.collectors.screenshot?.artifacts ?? [];\n const artifact = artifacts.find((entry) => entry.name === 'screenshot') ?? artifacts[0];\n return artifact?.path ? resolveArtifactPath(run, artifact.path) : null;\n}\n\nfunction screenshotData(checkpoint: CheckpointRecord): Partial<ScreenshotCollectorData> | null {\n const data = checkpoint.collectors.screenshot?.data;\n return data && typeof data === 'object' ? (data as Partial<ScreenshotCollectorData>) : null;\n}\n\nfunction focusNote(checkpoint: CheckpointRecord): string | null {\n const data = screenshotData(checkpoint);\n const selector = typeof data?.highlightSelector === 'string' ? data.highlightSelector.trim() : '';\n if (selector) {\n return `Focus: \\`${selector}\\``;\n }\n\n const bounds = data?.highlightBounds;\n if (\n bounds &&\n typeof bounds.x === 'number' &&\n typeof bounds.y === 'number' &&\n typeof bounds.width === 'number' &&\n typeof bounds.height === 'number'\n ) {\n return 'Focus: highlighted UI element.';\n }\n\n return null;\n}\n\nfunction urlLabel(url: string): string {\n try {\n const parsed = new URL(url);\n const value = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n return value || '/';\n } catch {\n return url || '/';\n }\n}\n\nfunction breadcrumbLabel(url: string): string | null {\n const label = urlLabel(url);\n if (!label.startsWith('/')) {\n return null;\n }\n\n const [withoutQuery = label] = label.split('?');\n const [withoutHash = withoutQuery] = withoutQuery.split('#');\n\n const segments = withoutHash\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment).replace(/[-_]+/g, ' '));\n\n return segments.length > 0 ? segments.join(' › ') : 'home';\n}\n\nfunction autoDescription(checkpoint: CheckpointRecord): string {\n const pageTitle = checkpoint.title.trim();\n const location = urlLabel(checkpoint.url);\n\n if (pageTitle) {\n return `This step captures **${pageTitle}** at \\`${location}\\`.`;\n }\n\n return `This step captures **${checkpoint.name}** at \\`${location}\\`.`;\n}\n\nfunction markdownRelativePath(fromFile: string, toFile: string): string {\n const relativePath = path.relative(path.dirname(fromFile), toFile).split(path.sep).join('/');\n if (relativePath.startsWith('.')) {\n return relativePath;\n }\n\n return `./${relativePath}`;\n}\n\nfunction rewriteImagePath(markdownFile: string, imageFile: string, outputDir: string, prefix?: string): string {\n const relativePath = path.relative(outputDir, imageFile).split(path.sep).join('/');\n if (prefix) {\n return `${prefix.replace(/\\/+$/g, '')}/${relativePath.replace(/^\\/+/, '')}`;\n }\n\n return markdownRelativePath(markdownFile, imageFile);\n}\n\nfunction yamlScalar(value: unknown): string {\n return JSON.stringify(value);\n}\n\nfunction serializeFrontmatter(fields: Record<string, unknown>): string {\n const lines = ['---'];\n\n for (const [key, value] of Object.entries(fields)) {\n if (value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n lines.push(`${key}:`);\n if (value.length === 0) {\n lines.push(' []');\n continue;\n }\n\n for (const item of value) {\n lines.push(` - ${yamlScalar(item)}`);\n }\n continue;\n }\n\n lines.push(`${key}: ${yamlScalar(value)}`);\n }\n\n lines.push('---', '');\n return lines.join('\\n');\n}\n\nasync function materializeScreenshot(args: {\n run: RunRecord;\n checkpoint: CheckpointRecord;\n screenshotDirSlug: string;\n screenshotFileSlug: string;\n outputDir: string;\n markdownFile: string;\n config: MarkdownReporterConfig;\n writtenFiles: Set<string>;\n screenshotCopies?: Map<string, string>;\n}): Promise<string | null> {\n const sourcePath = screenshotSourcePath(args.run, args.checkpoint);\n if (!sourcePath) {\n return null;\n }\n\n const cachedTargetPath = args.screenshotCopies?.get(sourcePath);\n if (cachedTargetPath) {\n return rewriteImagePath(args.markdownFile, cachedTargetPath, args.outputDir, args.config.imagePathPrefix);\n }\n\n const extension = path.extname(sourcePath) || '.png';\n const targetPath = path.join(\n args.outputDir,\n args.config.screenshotsDir ?? 'screenshots',\n args.screenshotDirSlug,\n `${args.screenshotFileSlug}${extension}`,\n );\n\n try {\n if (args.config.copyScreenshots !== false) {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.copyFile(sourcePath, targetPath);\n args.screenshotCopies?.set(sourcePath, targetPath);\n args.writtenFiles.add(targetPath);\n return rewriteImagePath(args.markdownFile, targetPath, args.outputDir, args.config.imagePathPrefix);\n }\n\n return rewriteImagePath(args.markdownFile, sourcePath, args.outputDir, args.config.imagePathPrefix);\n } catch {\n return null;\n }\n}\n\nfunction orderedCheckpoints(checkpoints: CheckpointRecord[]): CheckpointRecord[] {\n return [...checkpoints].sort((left, right) => {\n const leftOrder = typeof left.step === 'number' ? left.step : Number.MAX_SAFE_INTEGER;\n const rightOrder = typeof right.step === 'number' ? right.step : Number.MAX_SAFE_INTEGER;\n if (leftOrder !== rightOrder) {\n return leftOrder - rightOrder;\n }\n\n return checkpoints.indexOf(left) - checkpoints.indexOf(right);\n });\n}\n\nasync function buildSteps(args: {\n run: RunRecord;\n stepNames?: string[];\n screenshotDirSlug: string;\n outputDir: string;\n markdownFile: string;\n config: MarkdownReporterConfig;\n writtenFiles: Set<string>;\n screenshotCopies?: Map<string, string>;\n}): Promise<MarkdownStep[]> {\n let checkpoints: CheckpointRecord[];\n if (args.stepNames && args.stepNames.length > 0) {\n const byName = new Map<string, CheckpointRecord>();\n\n for (const checkpoint of args.run.checkpoints) {\n if (byName.has(checkpoint.name)) {\n warn(`Duplicate checkpoint name \"${checkpoint.name}\" in \"${args.run.title}\". Using the latest capture for article generation.`);\n }\n\n byName.set(checkpoint.name, checkpoint);\n }\n\n checkpoints = args.stepNames\n .map((stepName) => {\n const checkpoint = byName.get(stepName);\n if (!checkpoint) {\n warn(`Markdown article step \"${stepName}\" was not captured in \"${args.run.title}\". Skipping step.`);\n return null;\n }\n\n return checkpoint;\n })\n .filter((checkpoint): checkpoint is CheckpointRecord => checkpoint !== null);\n } else {\n checkpoints = orderedCheckpoints(args.run.checkpoints).filter(\n (checkpoint) => !args.config.requireExplicitStep || typeof checkpoint.step === 'number',\n );\n }\n\n const steps: MarkdownStep[] = [];\n\n for (const [index, checkpoint] of checkpoints.entries()) {\n const order = args.stepNames ? index + 1 : typeof checkpoint.step === 'number' ? checkpoint.step : index + 1;\n steps.push({\n checkpoint,\n order,\n heading: checkpoint.name,\n description:\n typeof checkpoint.description === 'string' && checkpoint.description.trim().length > 0\n ? checkpoint.description.trim()\n : autoDescription(checkpoint),\n imagePath: await materializeScreenshot({\n run: args.run,\n checkpoint,\n screenshotDirSlug: args.screenshotDirSlug,\n screenshotFileSlug: args.stepNames ? checkpoint.slug : `${String(order).padStart(2, '0')}-${slugify(checkpoint.name)}`,\n outputDir: args.outputDir,\n markdownFile: args.markdownFile,\n config: args.config,\n writtenFiles: args.writtenFiles,\n screenshotCopies: args.screenshotCopies,\n }),\n urlLabel: urlLabel(checkpoint.url),\n breadcrumbLabel: breadcrumbLabel(checkpoint.url),\n focusNote: focusNote(checkpoint),\n });\n }\n\n return steps;\n}\n\nfunction renderMarkdown(args: {\n title: string;\n description?: string | null;\n steps: MarkdownStep[];\n run: RunRecord;\n article?: ArticleMetadata;\n config: MarkdownReporterConfig;\n generatedAt: string;\n}): string {\n const frontmatterFields =\n args.config.frontmatter === true || typeof args.config.frontmatter === 'object'\n ? {\n project: args.run.project,\n tags: args.run.tags,\n ...(args.config.frontmatter && typeof args.config.frontmatter === 'object' ? args.config.frontmatter : {}),\n ...(args.article?.frontmatter ?? {}),\n testId: args.run.testId,\n startedAt: args.run.startedAt,\n generatedAt: args.generatedAt,\n title: args.title,\n }\n : null;\n\n const sections = args.steps\n .map((step) => {\n const lines = [`## Step ${step.order}: ${step.heading}`, ''];\n\n if (step.imagePath) {\n lines.push(``, '');\n }\n\n lines.push(`**URL:** \\`${step.urlLabel}\\``);\n if (step.breadcrumbLabel) {\n lines.push('', `**Breadcrumb:** ${step.breadcrumbLabel}`);\n }\n\n if (step.focusNote) {\n lines.push('', `> ${step.focusNote}`);\n }\n\n lines.push('', step.description);\n\n return lines.join('\\n');\n })\n .join('\\n\\n');\n\n const parts = [\n frontmatterFields ? serializeFrontmatter(frontmatterFields) : '',\n `# ${args.title}`,\n args.description?.trim() ?? '',\n args.config.header ? args.config.header.trim() : '',\n sections,\n args.config.footer ? args.config.footer.trim() : '',\n ].filter((value) => value.trim().length > 0);\n\n return `${parts.join('\\n\\n')}\\n`;\n}\n\nfunction resolveArticles(run: RunRecord): MarkdownArticle[] {\n const multiArticles = (run.articles ?? []).filter((article): article is ArticleDefinition => Array.isArray(article.steps));\n if (run.articles && multiArticles.length === 0) {\n warn(`Markdown reporter received an empty articles array for \"${run.title}\". Falling back to the default single-article output.`);\n }\n\n if (multiArticles.length === 0) {\n return [\n {\n title: articleTitle(run),\n description: articleDescription(run),\n slug: articleSlug(run),\n metadata: run.article,\n screenshotDirSlug: articleSlug(run),\n },\n ];\n }\n\n const usedSlugs = new Set<string>();\n const screenshotDirSlug = slugify(stripTags(run.title));\n\n return multiArticles.map((article, index) => {\n const fallbackSlug = `${screenshotDirSlug}-${index + 1}`;\n const baseSlug = slugify(article.slug?.trim() || fallbackSlug);\n const uniqueSlug = uniqueArticleSlug(baseSlug, usedSlugs);\n if (uniqueSlug !== baseSlug) {\n warn(`Markdown article slug collision for \"${article.title ?? run.title}\" resolved as \"${uniqueSlug}\".`);\n }\n usedSlugs.add(uniqueSlug);\n\n return {\n title: article.title?.trim() || stripTags(run.title),\n description: article.description?.trim() || null,\n slug: uniqueSlug,\n metadata: article,\n stepNames: [...article.steps],\n screenshotDirSlug,\n };\n });\n}\n\nexport const markdownReporter: ReportGenerator = {\n name: 'markdown',\n description: 'Generates one Markdown help article per captured story.',\n\n validateConfig(config): boolean {\n return config != null && typeof config === 'object' && !Array.isArray(config);\n },\n\n async generate(context) {\n const config = normalizeConfig(context.config);\n const stories = groupByStory(context.runs);\n const generatedAt = new Date().toISOString();\n const writtenFiles = new Set<string>();\n const usedStorySlugs = new Set<string>();\n const screenshotCopies = new Map<string, string>();\n let articleCount = 0;\n\n for (const [storyTitle, runs] of stories) {\n const primaryRun = choosePrimaryRun(runs, config.preferredProject);\n if (!primaryRun || !shouldIncludeRun(primaryRun, config)) {\n continue;\n }\n\n for (const article of resolveArticles(primaryRun)) {\n let storySlug = article.slug;\n if (usedStorySlugs.has(storySlug)) {\n let index = 2;\n while (usedStorySlugs.has(`${article.slug}-${index}`)) {\n index += 1;\n }\n storySlug = `${article.slug}-${index}`;\n warn(`Markdown article slug collision for \"${article.title || storyTitle}\" resolved as \"${storySlug}\".`);\n }\n\n usedStorySlugs.add(storySlug);\n const markdownFile = path.join(context.outputDir, config.storiesDir ?? '.', `${storySlug}.md`);\n const steps = await buildSteps({\n run: primaryRun,\n stepNames: article.stepNames,\n screenshotDirSlug: article.screenshotDirSlug,\n outputDir: context.outputDir,\n markdownFile,\n config,\n writtenFiles,\n screenshotCopies,\n });\n if (steps.length === 0) {\n continue;\n }\n\n await fs.mkdir(path.dirname(markdownFile), { recursive: true });\n await fs.writeFile(\n markdownFile,\n renderMarkdown({\n title: article.title,\n description: article.description,\n steps,\n run: primaryRun,\n article: article.metadata,\n config,\n generatedAt,\n }),\n 'utf8',\n );\n\n writtenFiles.add(markdownFile);\n articleCount += 1;\n }\n }\n\n return {\n files: [...writtenFiles],\n summary: `Generated ${articleCount} Markdown article${articleCount === 1 ? '' : 's'}.`,\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointRecord, ReportGenerator, RunRecord, ScreenshotCollectorData } from '../types';\nimport { groupByStory } from './story-utils';\n\ntype MdxReporterConfig = {\n storiesDir?: string;\n screenshotsDir?: string;\n includeTags?: string[];\n preferredProject?: string;\n imagePathPrefix?: string;\n copyScreenshots?: boolean;\n componentImportPath?: string;\n};\n\ntype MdxVariant = {\n project: string;\n projectLabel: string;\n imagePath: string | null;\n imageAlt: string;\n};\n\ntype MdxStep = {\n checkpoint: CheckpointRecord;\n order: number;\n title: string;\n description: string;\n focusNote: string | null;\n variants: MdxVariant[];\n};\n\nconst DEFAULT_PROJECT_ORDER = ['desktop-light', 'desktop-dark', 'mobile-light', 'mobile-dark'];\n\nfunction slugify(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'story'\n );\n}\n\nfunction stripTags(value: string): string {\n const stripped = value.replace(/\\s+@[a-z0-9-]+/gi, ' ').replace(/\\s+/g, ' ').trim();\n return stripped || value.trim() || 'Untitled story';\n}\n\nfunction normalizeConfig(config: Record<string, unknown>): MdxReporterConfig {\n return {\n storiesDir: typeof config.storiesDir === 'string' ? config.storiesDir : '.',\n screenshotsDir: typeof config.screenshotsDir === 'string' ? config.screenshotsDir : 'screenshots',\n includeTags: Array.isArray(config.includeTags)\n ? config.includeTags.filter((value): value is string => typeof value === 'string')\n : undefined,\n preferredProject: typeof config.preferredProject === 'string' ? config.preferredProject : undefined,\n imagePathPrefix: typeof config.imagePathPrefix === 'string' ? config.imagePathPrefix : undefined,\n copyScreenshots: typeof config.copyScreenshots === 'boolean' ? config.copyScreenshots : true,\n componentImportPath:\n typeof config.componentImportPath === 'string' ? config.componentImportPath : 'playwright-checkpoint/components',\n };\n}\n\nfunction normalizeTags(tags: string[] | undefined): string[] {\n return (tags ?? []).map((tag) => tag.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction frontmatterTags(tags: string[]): string[] {\n return normalizeTags(tags).map((tag) => tag.replace(/^@+/, '')).filter(Boolean);\n}\n\nfunction shouldIncludeRun(run: RunRecord, config: MdxReporterConfig): boolean {\n const includeTags = normalizeTags(config.includeTags);\n if (includeTags.length > 0) {\n const runTags = new Set(normalizeTags(run.tags));\n return includeTags.some((tag) => runTags.has(tag));\n }\n\n return run.checkpoints.some((checkpoint) => {\n const hasDescription = typeof checkpoint.description === 'string' && checkpoint.description.trim().length > 0;\n return hasDescription || typeof checkpoint.step === 'number';\n });\n}\n\nfunction choosePrimaryRun(runs: RunRecord[], preferredProject?: string): RunRecord | null {\n if (runs.length === 0) {\n return null;\n }\n\n return [...runs].sort((left, right) => {\n const leftPreferred = preferredProject && left.project === preferredProject ? 0 : 1;\n const rightPreferred = preferredProject && right.project === preferredProject ? 0 : 1;\n if (leftPreferred !== rightPreferred) {\n return leftPreferred - rightPreferred;\n }\n\n const rightTime = new Date(right.startedAt).getTime();\n const leftTime = new Date(left.startedAt).getTime();\n if (rightTime !== leftTime) {\n return rightTime - leftTime;\n }\n\n return left.project.localeCompare(right.project);\n })[0] ?? null;\n}\n\nfunction orderedCheckpoints(checkpoints: CheckpointRecord[]): CheckpointRecord[] {\n return [...checkpoints].sort((left, right) => {\n const leftOrder = typeof left.step === 'number' ? left.step : Number.MAX_SAFE_INTEGER;\n const rightOrder = typeof right.step === 'number' ? right.step : Number.MAX_SAFE_INTEGER;\n if (leftOrder !== rightOrder) {\n return leftOrder - rightOrder;\n }\n\n return checkpoints.indexOf(left) - checkpoints.indexOf(right);\n });\n}\n\nfunction resolveArtifactPath(run: RunRecord, artifactPath: string): string {\n return path.isAbsolute(artifactPath) ? artifactPath : path.resolve(path.dirname(run.sourceManifestPath), artifactPath);\n}\n\nfunction screenshotSourcePath(run: RunRecord, checkpoint: CheckpointRecord): string | null {\n const artifacts = checkpoint.collectors.screenshot?.artifacts ?? [];\n const artifact = artifacts.find((entry) => entry.name === 'screenshot') ?? artifacts[0];\n return artifact?.path ? resolveArtifactPath(run, artifact.path) : null;\n}\n\nfunction screenshotData(checkpoint: CheckpointRecord): Partial<ScreenshotCollectorData> | null {\n const data = checkpoint.collectors.screenshot?.data;\n return data && typeof data === 'object' ? (data as Partial<ScreenshotCollectorData>) : null;\n}\n\nfunction focusNote(checkpoint: CheckpointRecord): string | null {\n const data = screenshotData(checkpoint);\n const selector = typeof data?.highlightSelector === 'string' ? data.highlightSelector.trim() : '';\n if (selector) {\n return `Focus: \\`${selector}\\``;\n }\n\n const bounds = data?.highlightBounds;\n if (\n bounds &&\n typeof bounds.x === 'number' &&\n typeof bounds.y === 'number' &&\n typeof bounds.width === 'number' &&\n typeof bounds.height === 'number'\n ) {\n return 'Focus: highlighted UI element.';\n }\n\n return null;\n}\n\nfunction urlLabel(url: string): string {\n try {\n const parsed = new URL(url);\n const value = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n return value || '/';\n } catch {\n return url || '/';\n }\n}\n\nfunction autoDescription(checkpoint: CheckpointRecord): string {\n const pageTitle = checkpoint.title.trim();\n const location = urlLabel(checkpoint.url);\n\n if (pageTitle) {\n return `This step captures **${pageTitle}** at \\`${location}\\`.`;\n }\n\n return `This step captures **${checkpoint.name}** at \\`${location}\\`.`;\n}\n\nfunction markdownRelativePath(fromFile: string, toFile: string): string {\n const relativePath = path.relative(path.dirname(fromFile), toFile).split(path.sep).join('/');\n if (relativePath.startsWith('.')) {\n return relativePath;\n }\n\n return `./${relativePath}`;\n}\n\nfunction rewriteImagePath(mdxFile: string, imageFile: string, outputDir: string, prefix?: string): string {\n const relativePath = path.relative(outputDir, imageFile).split(path.sep).join('/');\n if (prefix) {\n return `${prefix.replace(/\\/+$/g, '')}/${relativePath.replace(/^\\/+/, '')}`;\n }\n\n return markdownRelativePath(mdxFile, imageFile);\n}\n\nfunction yamlScalar(value: unknown): string {\n return JSON.stringify(value);\n}\n\nfunction serializeFrontmatter(fields: Record<string, unknown>): string {\n const lines = ['---'];\n\n for (const [key, value] of Object.entries(fields)) {\n if (value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n lines.push(`${key}:`);\n if (value.length === 0) {\n lines.push(' []');\n continue;\n }\n\n for (const item of value) {\n lines.push(` - ${yamlScalar(item)}`);\n }\n continue;\n }\n\n lines.push(`${key}: ${yamlScalar(value)}`);\n }\n\n lines.push('---', '');\n return lines.join('\\n');\n}\n\nfunction quoteJsx(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction projectWeight(projectName: string): number {\n const index = DEFAULT_PROJECT_ORDER.indexOf(projectName);\n return index === -1 ? Number.MAX_SAFE_INTEGER : index;\n}\n\nfunction formatProjectLabel(projectName: string): string {\n const [device, mode] = projectName.split('-');\n if (!device || !mode) {\n return projectName;\n }\n\n const deviceLabel = device === 'desktop' ? 'Desktop' : device === 'mobile' ? 'Mobile' : device;\n const modeLabel = mode === 'light' ? 'Light' : mode === 'dark' ? 'Dark' : mode;\n return `${deviceLabel} / ${modeLabel}`;\n}\n\nfunction sortRunsForVariants(runs: RunRecord[]): RunRecord[] {\n return [...runs].sort((left, right) => {\n const byWeight = projectWeight(left.project) - projectWeight(right.project);\n if (byWeight !== 0) {\n return byWeight;\n }\n\n return left.project.localeCompare(right.project);\n });\n}\n\nfunction findMatchingCheckpoint(run: RunRecord, baseCheckpoint: CheckpointRecord, fallbackIndex: number): CheckpointRecord | null {\n const checkpoints = orderedCheckpoints(run.checkpoints);\n\n if (typeof baseCheckpoint.step === 'number') {\n const byStep = checkpoints.find((entry) => entry.step === baseCheckpoint.step);\n if (byStep) {\n return byStep;\n }\n }\n\n const byName = checkpoints.find((entry) => entry.name === baseCheckpoint.name);\n if (byName) {\n return byName;\n }\n\n return checkpoints[fallbackIndex] ?? null;\n}\n\nasync function materializeScreenshot(args: {\n run: RunRecord;\n checkpoint: CheckpointRecord;\n storySlug: string;\n stepOrder: number;\n outputDir: string;\n mdxFile: string;\n config: MdxReporterConfig;\n writtenFiles: Set<string>;\n}): Promise<string | null> {\n const sourcePath = screenshotSourcePath(args.run, args.checkpoint);\n if (!sourcePath) {\n return null;\n }\n\n const extension = path.extname(sourcePath) || '.png';\n const targetPath = path.join(\n args.outputDir,\n args.config.screenshotsDir ?? 'screenshots',\n args.storySlug,\n `${String(args.stepOrder).padStart(2, '0')}-${slugify(args.run.project)}-${slugify(args.checkpoint.name)}${extension}`,\n );\n\n try {\n if (args.config.copyScreenshots !== false) {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.copyFile(sourcePath, targetPath);\n args.writtenFiles.add(targetPath);\n return rewriteImagePath(args.mdxFile, targetPath, args.outputDir, args.config.imagePathPrefix);\n }\n\n return rewriteImagePath(args.mdxFile, sourcePath, args.outputDir, args.config.imagePathPrefix);\n } catch {\n return null;\n }\n}\n\nasync function buildSteps(args: {\n runs: RunRecord[];\n primaryRun: RunRecord;\n storySlug: string;\n outputDir: string;\n mdxFile: string;\n config: MdxReporterConfig;\n writtenFiles: Set<string>;\n}): Promise<MdxStep[]> {\n const baseCheckpoints = orderedCheckpoints(args.primaryRun.checkpoints);\n const sortedRuns = sortRunsForVariants(args.runs);\n const steps: MdxStep[] = [];\n\n for (const [index, checkpoint] of baseCheckpoints.entries()) {\n const order = typeof checkpoint.step === 'number' ? checkpoint.step : index + 1;\n const variants: MdxVariant[] = [];\n const matchedCheckpoints: CheckpointRecord[] = [];\n\n for (const run of sortedRuns) {\n const variantCheckpoint = findMatchingCheckpoint(run, checkpoint, index);\n if (!variantCheckpoint) {\n continue;\n }\n\n matchedCheckpoints.push(variantCheckpoint);\n variants.push({\n project: run.project,\n projectLabel: formatProjectLabel(run.project),\n imagePath: await materializeScreenshot({\n run,\n checkpoint: variantCheckpoint,\n storySlug: args.storySlug,\n stepOrder: order,\n outputDir: args.outputDir,\n mdxFile: args.mdxFile,\n config: args.config,\n writtenFiles: args.writtenFiles,\n }),\n imageAlt: variantCheckpoint.title || `${checkpoint.name} (${formatProjectLabel(run.project)})`,\n });\n }\n\n const descriptionSource = matchedCheckpoints.find(\n (entry) => typeof entry.description === 'string' && entry.description.trim().length > 0,\n ) ?? checkpoint;\n const stepFocus = matchedCheckpoints.map((entry) => focusNote(entry)).find((value): value is string => Boolean(value)) ?? null;\n\n steps.push({\n checkpoint,\n order,\n title: checkpoint.name,\n description:\n typeof descriptionSource.description === 'string' && descriptionSource.description.trim().length > 0\n ? descriptionSource.description.trim()\n : autoDescription(descriptionSource),\n focusNote: stepFocus,\n variants,\n });\n }\n\n return steps;\n}\n\nfunction renderVariantTabs(variants: MdxVariant[]): string {\n if (variants.length === 0) {\n return '';\n }\n\n if (variants.length === 1) {\n const [variant] = variants;\n if (!variant?.imagePath) {\n return '';\n }\n\n return `<Screenshot src={${quoteJsx(variant.imagePath)}} alt={${quoteJsx(variant.imageAlt)}} />`;\n }\n\n const tabs = variants\n .map((variant) => {\n const lines = [` <DeviceTab label={${quoteJsx(variant.projectLabel)}}>`];\n if (variant.imagePath) {\n lines.push(` <Screenshot src={${quoteJsx(variant.imagePath)}} alt={${quoteJsx(variant.imageAlt)}} />`);\n } else {\n lines.push(` <p>No screenshot captured for ${variant.projectLabel}.</p>`);\n }\n lines.push(' </DeviceTab>');\n return lines.join('\\n');\n })\n .join('\\n');\n\n return `<DeviceTabs>\\n${tabs}\\n</DeviceTabs>`;\n}\n\nfunction renderStep(step: MdxStep): string {\n const lines = [` <Step number={${step.order}} title={${quoteJsx(step.title)}}>`];\n const variantBlock = renderVariantTabs(step.variants);\n if (variantBlock) {\n lines.push(` ${variantBlock.replace(/\\n/g, '\\n ')}`, '');\n }\n\n if (step.focusNote) {\n lines.push(` ${step.focusNote}`, '');\n }\n\n lines.push(` ${step.description}`, ' </Step>');\n return lines.join('\\n');\n}\n\nfunction renderMdx(args: {\n title: string;\n steps: MdxStep[];\n runs: RunRecord[];\n config: MdxReporterConfig;\n generatedAt: string;\n}): string {\n const importNames = new Set(['Screenshot', 'StepList', 'Step']);\n if (args.steps.some((step) => step.variants.length > 1)) {\n importNames.add('DeviceTabs');\n importNames.add('DeviceTab');\n }\n\n const frontmatter = serializeFrontmatter({\n title: args.title,\n tags: frontmatterTags([...new Set(args.runs.flatMap((run) => run.tags))]),\n generatedAt: args.generatedAt,\n projects: [...new Set(args.runs.map((run) => run.project))],\n });\n\n const stepBlocks = args.steps.map(renderStep).join('\\n\\n');\n\n return `${frontmatter}import { ${[...importNames].join(', ')} } from '${args.config.componentImportPath}';\\n\\n<StepList>\\n${stepBlocks}\\n</StepList>\\n`;\n}\n\nexport const mdxReporter: ReportGenerator = {\n name: 'mdx',\n description: 'Generates one MDX help article per captured story.',\n\n validateConfig(config): boolean {\n return config != null && typeof config === 'object' && !Array.isArray(config);\n },\n\n async generate(context) {\n const config = normalizeConfig(context.config);\n const stories = groupByStory(context.runs);\n const generatedAt = new Date().toISOString();\n const writtenFiles = new Set<string>();\n let articleCount = 0;\n\n for (const [storyTitle, runs] of stories) {\n const primaryRun = choosePrimaryRun(runs, config.preferredProject);\n if (!primaryRun || !shouldIncludeRun(primaryRun, config)) {\n continue;\n }\n\n const title = stripTags(storyTitle);\n const storySlug = slugify(title);\n const mdxFile = path.join(context.outputDir, config.storiesDir ?? '.', `${storySlug}.mdx`);\n const steps = await buildSteps({\n runs,\n primaryRun,\n storySlug,\n outputDir: context.outputDir,\n mdxFile,\n config,\n writtenFiles,\n });\n\n await fs.mkdir(path.dirname(mdxFile), { recursive: true });\n await fs.writeFile(\n mdxFile,\n renderMdx({\n title,\n steps,\n runs,\n config,\n generatedAt,\n }),\n 'utf8',\n );\n\n writtenFiles.add(mdxFile);\n articleCount += 1;\n }\n\n return {\n files: [...writtenFiles],\n summary: `Generated ${articleCount} MDX article${articleCount === 1 ? '' : 's'}.`,\n };\n },\n};\n","import { createRequire } from 'node:module';\nimport path from 'node:path';\nimport type { BoundingBox } from '../types';\n\ntype SharpLike = {\n (input: string | Buffer): {\n metadata(): Promise<{ width?: number; height?: number }>;\n composite(items: Array<{ input: Buffer; top?: number; left?: number }>): {\n png(): {\n toFile(filePath: string): Promise<void>;\n };\n };\n };\n};\n\nconst require = (() => {\n try {\n return Function('return require')() as NodeRequire;\n } catch {\n return createRequire(path.join(process.cwd(), 'playwright-checkpoint-annotate-runtime.cjs'));\n }\n})();\n\nasync function loadSharp(): Promise<SharpLike | null> {\n try {\n const loaded = require('sharp') as SharpLike | { default?: SharpLike };\n return typeof loaded === 'function' ? loaded : loaded.default ?? null;\n } catch {\n return null;\n }\n}\n\nfunction buildOverlaySvg(width: number, height: number, bounds: BoundingBox): Buffer {\n const strokeWidth = Math.max(2, Math.round(Math.min(width, height) * 0.005));\n const radius = Math.max(6, Math.round(Math.min(bounds.width, bounds.height) * 0.08));\n\n const svg = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\n <rect\n x=\"${bounds.x}\"\n y=\"${bounds.y}\"\n width=\"${bounds.width}\"\n height=\"${bounds.height}\"\n rx=\"${radius}\"\n ry=\"${radius}\"\n fill=\"rgba(239, 68, 68, 0.10)\"\n stroke=\"rgba(239, 68, 68, 0.95)\"\n stroke-width=\"${strokeWidth}\"\n />\n </svg>\n `.trim();\n\n return Buffer.from(svg, 'utf8');\n}\n\nexport async function annotateScreenshot(\n imagePath: string,\n bounds: BoundingBox,\n outputPath: string,\n): Promise<string | null> {\n const sharp = await loadSharp();\n if (!sharp) {\n return null;\n }\n\n const image = sharp(imagePath);\n const metadata = await image.metadata();\n if (!metadata.width || !metadata.height) {\n return null;\n }\n\n const overlay = buildOverlaySvg(metadata.width, metadata.height, bounds);\n await image.composite([{ input: overlay, top: 0, left: 0 }]).png().toFile(outputPath);\n return outputPath;\n}\n"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA,WAKE,WAAW,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["import_promises","import_node_path","path","fs","import_promises","import_node_path","module","path","fs","import_promises","import_node_path","location","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_node_path","path","import_promises","import_node_path","REDACTED","DEFAULT_REDACT_PATTERNS","EMAIL_LIKE_REGEX","toRegex","path","fs","import_promises","import_node_path","path","fs","builtinCollectors","fs","path","import_promises","import_node_path","require","path","fs","test","import_promises","import_node_path","import_promises","import_node_path","path","fs","import_promises","import_node_path","slugify","resolveArtifactPath","path","screenshotData","location","fs","import_promises","import_node_path","DEFAULT_PROJECT_ORDER","slugify","stripTags","normalizeConfig","normalizeTags","shouldIncludeRun","choosePrimaryRun","orderedCheckpoints","resolveArtifactPath","path","screenshotSourcePath","screenshotData","focusNote","urlLabel","autoDescription","location","markdownRelativePath","rewriteImagePath","yamlScalar","serializeFrontmatter","projectWeight","formatProjectLabel","materializeScreenshot","fs","buildSteps","import_node_module","import_node_path","require","path","fs","path"]}
|