pulse-dashboard
Version:
A Next.js Dashboard application for real-time monitoring and historical analysis of Playwright test executions, based on playwright-pulse-report. This component provides the UI for visualizing Playwright test results and can be run as a standalone CLI too
98 lines • 4.04 kB
JavaScript
import * as fs from "fs";
import * as path from "path";
import { pathToFileURL } from "url";
import { dirname } from "path";
const DEFAULT_OUTPUT_DIR = "pulse-report";
async function findPlaywrightConfig() {
const possibleConfigs = [
"playwright.config.ts",
"playwright.config.js",
"playwright.config.mjs",
];
for (const configFile of possibleConfigs) {
const configPath = path.resolve(process.cwd(), configFile);
if (fs.existsSync(configPath)) {
return { path: configPath, exists: true };
}
}
return { path: null, exists: false };
}
async function extractOutputDirFromConfig(configPath) {
try {
let config;
const configDir = dirname(configPath);
const originalDirname = global.__dirname;
const originalFilename = global.__filename;
try {
global.__dirname = configDir;
global.__filename = configPath;
if (configPath.endsWith(".ts")) {
try {
const { register } = await import("node:module");
const { pathToFileURL } = await import("node:url");
register("ts-node/esm", pathToFileURL("./"));
config = await import(pathToFileURL(configPath).href);
}
catch (tsError) {
return null;
}
}
else {
config = await import(pathToFileURL(configPath).href);
}
}
finally {
if (originalDirname !== undefined) {
global.__dirname = originalDirname;
}
if (originalFilename !== undefined) {
global.__filename = originalFilename;
}
}
const playwrightConfig = config.default || config;
if (playwrightConfig && Array.isArray(playwrightConfig.reporter)) {
for (const reporterConfig of playwrightConfig.reporter) {
if (Array.isArray(reporterConfig)) {
const [reporterPath, options] = reporterConfig;
if (typeof reporterPath === "string" &&
(reporterPath.includes("playwright-pulse-report") ||
reporterPath.includes("@arghajit/playwright-pulse-report") ||
reporterPath.includes("@arghajit/dummy"))) {
if (options && options.outputDir) {
const resolvedPath = typeof options.outputDir === "string"
? options.outputDir
: options.outputDir;
console.log(`Found outputDir in config: ${resolvedPath}`);
return path.resolve(process.cwd(), resolvedPath);
}
}
}
}
}
console.log("No matching reporter config found with outputDir");
return null;
}
catch (error) {
console.error("Error extracting outputDir from config:", error);
return null;
}
}
export async function getOutputDir(customOutputDirFromArgs = null) {
if (customOutputDirFromArgs) {
console.log(`Using custom outputDir from CLI: ${customOutputDirFromArgs}`);
return path.resolve(process.cwd(), customOutputDirFromArgs);
}
const { path: configPath, exists } = await findPlaywrightConfig();
console.log(`Config file search result: ${exists ? configPath : "not found"}`);
if (exists && configPath) {
const outputDirFromConfig = await extractOutputDirFromConfig(configPath);
if (outputDirFromConfig) {
console.log(`Using outputDir from config: ${outputDirFromConfig}`);
return outputDirFromConfig;
}
}
console.log(`Using default outputDir: ${DEFAULT_OUTPUT_DIR}`);
return path.resolve(process.cwd(), DEFAULT_OUTPUT_DIR);
}
//# sourceMappingURL=getOutputDir.js.map