/** * Copy trace viewer to the report folder. */ import path from 'node:path'; import fs from 'node:fs'; import * as messages from '@cucumber/messages'; import { copyFileAndMakeWritable } from '../../../utils/paths'; import { createLogAttachment } from '../attachments/helpers'; function getTraceViewerFolder() { const pwCorePath = require.resolve('playwright-core'); // See: https://github.com/microsoft/playwright/blob/94321fef1c94f9851b6fcc4304d3844760e986cb/packages/playwright/src/reporters/html.ts#L314 return path.join(pwCorePath, '..', 'lib', 'vite', 'traceViewer'); } // eslint-disable-next-line visual/complexity export async function copyTraceViewer(reportDir: string) { const traceViewerFolder = getTraceViewerFolder(); const traceViewerTargetFolder = path.join(reportDir, 'trace'); const traceViewerAssetsTargetFolder = path.join(traceViewerTargetFolder, 'assets'); fs.mkdirSync(traceViewerAssetsTargetFolder, { recursive: true }); for (const file of fs.readdirSync(traceViewerFolder)) { if (file.endsWith('.map') || file.includes('watch') || file.includes('assets')) continue; await copyFileAndMakeWritable( path.join(traceViewerFolder, file), path.join(traceViewerTargetFolder, file), ); } for (const file of fs.readdirSync(path.join(traceViewerFolder, 'assets'))) { if (file.endsWith('.map') || file.includes('xtermModule')) continue; await copyFileAndMakeWritable( path.join(traceViewerFolder, 'assets', file), path.join(traceViewerAssetsTargetFolder, file), ); } } export function isTraceAttachment(attachment: messages.Attachment) { return attachment.fileName === 'trace'; } export function generateTraceUrl(attachment: messages.Attachment) { // In PW trace url is generated dynamically in JS with location.href: // https://github.com/microsoft/playwright/blob/8f3353865d8d98e9b40c15497e60d5e2583410b6/packages/html-reporter/src/links.tsx#L102 return `trace/index.html?trace=${attachment.url}`; } export function createViewTraceLinkAttachment( testCaseStartedId: string | undefined, testStepId: string | undefined, href: string, ) { // eslint-disable-next-line max-len const html = `🔍 View trace`; return createLogAttachment(testCaseStartedId, testStepId, html); } /** * Custom css and script for 'View trace' links. * Update link href to pass full trace URL. * Use 'onmousedown' to update href for right-click + open in new tab. * Maybe it will be implemented in Playwright: * https://github.com/microsoft/playwright/issues/34493 */ export const assetsViewTraceLinks = ` `;