import path from "node:path"; import { fileURLToPath } from "node:url"; import { defineConfig, devices } from "@playwright/experimental-ct-vue"; const projectRoot = fileURLToPath(new URL(".", import.meta.url)); const artifactNamespace = (process.env.PLAYWRIGHT_ARTIFACT_NAMESPACE || "ct").trim(); const artifactRoot = path.join("output", "playwright", artifactNamespace); const reporterMode = (process.env.PLAYWRIGHT_REPORTER_MODE || "").trim(); const reporter = reporterMode === "line-html" ? [["line"], ["html", { open: "never", outputFolder: path.join(artifactRoot, "report") }]] : [["list"], ["html", { open: "never", outputFolder: path.join(artifactRoot, "report") }]]; const configuredWorkers = Number(process.env.PLAYWRIGHT_WORKERS || 2); const workers = Number.isFinite(configuredWorkers) && configuredWorkers > 0 ? configuredWorkers : 2; export default defineConfig({ testDir: "./tests/ct", timeout: 45_000, fullyParallel: true, forbidOnly: !!process.env.CI, retries: process.env.CI ? 1 : 0, workers, reporter, outputDir: path.join(artifactRoot, "test-results"), use: { trace: "retain-on-failure", screenshot: "only-on-failure", video: "retain-on-failure", ctViteConfig: { resolve: { alias: { "@": path.resolve(projectRoot, "src"), }, preserveSymlinks: true, dedupe: ["vue", "vue-router", "vue-i18n", "@vueuse/core", "@vueuse/head", "@unhead/vue"], }, }, }, projects: [ { name: "chromium-desktop", use: { ...devices["Desktop Chrome"], }, }, { name: "chromium-mobile", use: { ...devices["Pixel 5"], }, }, ], });