diff --git a/packages/playwright-ct-core/src/devServer.ts b/packages/playwright-ct-core/src/devServer.ts index 88d21fbf5d..eec7f9c0d7 100644 --- a/packages/playwright-ct-core/src/devServer.ts +++ b/packages/playwright-ct-core/src/devServer.ts @@ -26,11 +26,11 @@ import { source as injectedSource } from './generated/indexSource'; import { createConfig, populateComponentsFromTests, resolveDirs, transformIndexFile } from './viteUtils'; import type { ComponentRegistry } from './viteUtils'; -export async function runDevServer(configFile: string, registerSourceFile: string, frameworkPluginFactory: () => Promise) { +export async function loadConfig(configFile: string): Promise { const configFileOrDirectory = configFile ? path.resolve(process.cwd(), configFile) : process.cwd(); const resolvedConfigFile = resolveConfigFile(configFileOrDirectory); if (restartWithExperimentalTsEsm(resolvedConfigFile)) - return; + return null; const configLoader = new ConfigLoader(); let config: FullConfigInternal; @@ -38,6 +38,13 @@ export async function runDevServer(configFile: string, registerSourceFile: strin config = await configLoader.loadConfigFile(resolvedConfigFile); else config = await configLoader.loadEmptyConfig(configFileOrDirectory); + return config; +} + +export async function runDevServer(configFile: string, registerSourceFile: string, frameworkPluginFactory: () => Promise) { + const config = await loadConfig(configFile); + if (!config) + return; const runner = new Runner(config); await runner.loadAllTests(true); diff --git a/packages/playwright-ct-core/src/program.ts b/packages/playwright-ct-core/src/program.ts index fa4eeb4ccd..d934324052 100644 --- a/packages/playwright-ct-core/src/program.ts +++ b/packages/playwright-ct-core/src/program.ts @@ -16,8 +16,11 @@ import type { Command } from 'playwright-core/lib/utilsBundle'; +import fs from 'fs'; import { program } from 'playwright/lib/program'; -import { runDevServer } from './devServer'; +import { loadConfig, runDevServer } from './devServer'; +import { resolveDirs } from './viteUtils'; +import { cacheDir } from 'playwright/lib/transform/compilationCache'; export { program } from 'playwright/lib/program'; let registerSourceFile: string; @@ -31,10 +34,37 @@ export function initializePlugin(registerSource: string, factory: () => Promise< function addDevServerCommand(program: Command) { const command = program.command('dev-server'); command.description('start dev server'); - command.option('-c, --config ', `Configuration file. Can be used to specify additional configuration for the output report.`); + command.option('-c, --config ', `Configuration file.`); command.action(options => { runDevServer(options.config, registerSourceFile, frameworkPluginFactory); }); } +function addClearCacheCommand(program: Command) { + const command = program.command('clear-caches'); + command.description('clears build and test caches'); + command.option('-c, --config ', `Configuration file.`); + command.action(async options => { + const configFile = options.config; + const config = await loadConfig(configFile); + if (!config) + return; + const { outDir } = await resolveDirs(config.configDir, config.config); + await removeFolder(outDir); + await removeFolder(cacheDir); + }); +} + +async function removeFolder(folder: string) { + try { + if (!fs.existsSync(folder)) + return; + // eslint-disable-next-line no-console + console.log(`Removing ${await fs.promises.realpath(folder)}`); + await fs.promises.rm(folder, { recursive: true, force: true }); + } catch { + } +} + addDevServerCommand(program); +addClearCacheCommand(program); diff --git a/packages/playwright/src/transform/compilationCache.ts b/packages/playwright/src/transform/compilationCache.ts index 97163cf7d9..f840e13080 100644 --- a/packages/playwright/src/transform/compilationCache.ts +++ b/packages/playwright/src/transform/compilationCache.ts @@ -47,7 +47,7 @@ type SerializedCompilationCache = { // - For workers-only dynamic imports or some cache problems, we will re-transpile files in // each worker anew. -const cacheDir = process.env.PWTEST_CACHE_DIR || (() => { +export const cacheDir = process.env.PWTEST_CACHE_DIR || (() => { if (process.platform === 'win32') return path.join(os.tmpdir(), `playwright-transform-cache`); // Use `geteuid()` instead of more natural `os.userInfo().username`