From 3cea258a9c3f8b9262b91029c55164e6346e2e5e Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Fri, 5 Apr 2024 09:31:34 -0700 Subject: [PATCH] chore: expose clear cache to test server (#30268) --- .../playwright-ct-core/src/cliOverrides.ts | 16 +++++------ .../src/isomorphic/testServerConnection.ts | 4 +++ .../src/isomorphic/testServerInterface.ts | 2 ++ packages/playwright/src/program.ts | 20 ++------------ packages/playwright/src/runner/runner.ts | 2 +- packages/playwright/src/runner/testServer.ts | 27 +++++++++++++++++++ 6 files changed, 44 insertions(+), 27 deletions(-) diff --git a/packages/playwright-ct-core/src/cliOverrides.ts b/packages/playwright-ct-core/src/cliOverrides.ts index ccf5cf62f9..156fd720c7 100644 --- a/packages/playwright-ct-core/src/cliOverrides.ts +++ b/packages/playwright-ct-core/src/cliOverrides.ts @@ -15,23 +15,23 @@ * limitations under the License. */ -import { removeFolder } from 'playwright/lib/program'; import { affectedTestFiles, cacheDir } from 'playwright/lib/transform/compilationCache'; import { buildBundle } from './vitePlugin'; import { resolveDirs } from './viteUtils'; -import type { FullConfig, Suite } from 'playwright/types/testReporter'; +import type { Suite } from 'playwright/types/testReporter'; import { runDevServer } from './devServer'; import type { FullConfigInternal } from 'playwright/lib/common/config'; +import { removeFolderAndLogToConsole } from 'playwright/lib/runner/testServer'; -export async function clearCacheCommand(config: FullConfig, configDir: string) { - const dirs = await resolveDirs(configDir, config); +export async function clearCacheCommand(config: FullConfigInternal) { + const dirs = await resolveDirs(config.configDir, config.config); if (dirs) - await removeFolder(dirs.outDir); - await removeFolder(cacheDir); + await removeFolderAndLogToConsole(dirs.outDir); + await removeFolderAndLogToConsole(cacheDir); } -export async function findRelatedTestFilesCommand(files: string[], config: FullConfig, configDir: string, suite: Suite) { - await buildBundle(config, configDir, suite); +export async function findRelatedTestFilesCommand(files: string[], config: FullConfigInternal, suite: Suite) { + await buildBundle(config.config, config.configDir, suite); return { testFiles: affectedTestFiles(files) }; } diff --git a/packages/playwright/src/isomorphic/testServerConnection.ts b/packages/playwright/src/isomorphic/testServerConnection.ts index ab1810fd0e..aeda824429 100644 --- a/packages/playwright/src/isomorphic/testServerConnection.ts +++ b/packages/playwright/src/isomorphic/testServerConnection.ts @@ -165,6 +165,10 @@ export class TestServerConnection implements TestServerInterface, TestServerInte return await this._sendMessage('stopDevServer', params); } + async clearCache(params: Parameters[0]): ReturnType { + return await this._sendMessage('clearCache', params); + } + async listFiles(params: Parameters[0]): ReturnType { return await this._sendMessage('listFiles', params); } diff --git a/packages/playwright/src/isomorphic/testServerInterface.ts b/packages/playwright/src/isomorphic/testServerInterface.ts index d17127ad04..56cac53f5b 100644 --- a/packages/playwright/src/isomorphic/testServerInterface.ts +++ b/packages/playwright/src/isomorphic/testServerInterface.ts @@ -64,6 +64,8 @@ export interface TestServerInterface { status: reporterTypes.FullResult['status'] }>; + clearCache(params: {}): Promise; + listFiles(params: { projects?: string[]; }): Promise<{ diff --git a/packages/playwright/src/program.ts b/packages/playwright/src/program.ts index 0502dc1563..018eb5660d 100644 --- a/packages/playwright/src/program.ts +++ b/packages/playwright/src/program.ts @@ -33,8 +33,8 @@ import { program } from 'playwright-core/lib/cli/program'; export { program } from 'playwright-core/lib/cli/program'; import type { ReporterDescription } from '../types/test'; import { prepareErrorStack } from './reporters/base'; -import { cacheDir } from './transform/compilationCache'; import * as testServer from './runner/testServer'; +import { clearCacheAndLogToConsole } from './runner/testServer'; function addTestCommand(program: Command) { const command = program.command('test [test-filter...]'); @@ -76,26 +76,10 @@ function addClearCacheCommand(program: Command) { const configInternal = await loadConfigFromFileRestartIfNeeded(opts.config); if (!configInternal) return; - const { config, configDir } = configInternal; - const override = (config as any)['@playwright/test']?.['cli']?.['clear-cache']; - if (override) { - await override(config, configDir); - return; - } - await removeFolder(cacheDir); + await clearCacheAndLogToConsole(configInternal); }); } -export async function removeFolder(folder: string) { - try { - if (!fs.existsSync(folder)) - return; - console.log(`Removing ${await fs.promises.realpath(folder)}`); - await fs.promises.rm(folder, { recursive: true, force: true }); - } catch { - } -} - function addFindRelatedTestFilesCommand(program: Command) { const command = program.command('find-related-test-files [source-files...]', { hidden: true }); command.description('Returns the list of related tests to the given files'); diff --git a/packages/playwright/src/runner/runner.ts b/packages/playwright/src/runner/runner.ts index 68110bd5ec..af24c5f162 100644 --- a/packages/playwright/src/runner/runner.ts +++ b/packages/playwright/src/runner/runner.ts @@ -150,7 +150,7 @@ export class Runner { const resolvedFiles = (files as string[]).map(file => path.resolve(process.cwd(), file)); const override = (this._config.config as any)['@playwright/test']?.['cli']?.['find-related-test-files']; if (override) - return await override(resolvedFiles, this._config.config, this._config.configDir, result.suite); + return await override(resolvedFiles, this._config, result.suite); return { testFiles: affectedTestFiles(resolvedFiles) }; } } diff --git a/packages/playwright/src/runner/testServer.ts b/packages/playwright/src/runner/testServer.ts index 762741d5ce..da1584de96 100644 --- a/packages/playwright/src/runner/testServer.ts +++ b/packages/playwright/src/runner/testServer.ts @@ -38,6 +38,7 @@ import { webServerPluginsForConfig } from '../plugins/webServerPlugin'; import type { TraceViewerRedirectOptions, TraceViewerServerOptions } from 'playwright-core/lib/server/trace/viewer/traceViewer'; import type { TestRunnerPluginRegistration } from '../plugins'; import { serializeError } from '../util'; +import { cacheDir } from '../transform/compilationCache'; const originalStdoutWrite = process.stdout.write; const originalStderrWrite = process.stderr.write; @@ -210,6 +211,12 @@ class TestServerDispatcher implements TestServerInterface { } } + async clearCache(params: Parameters[0]): ReturnType { + const { config } = await this._loadConfig(this._configFile); + if (config) + await clearCacheAndLogToConsole(config); + } + async listFiles(params: Parameters[0]): ReturnType { const { reporter, report } = await this._collectingReporter(); const { config, error } = await this._loadConfig(this._configFile); @@ -492,3 +499,23 @@ export async function resolveCtDirs(config: FullConfigInternal) { templateDir }; } + +export async function clearCacheAndLogToConsole(config: FullConfigInternal) { + const override = (config.config as any)['@playwright/test']?.['cli']?.['clear-cache']; + if (override) { + await override(config); + return; + } + await removeFolderAndLogToConsole(cacheDir); +} + +export async function removeFolderAndLogToConsole(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 { + } +}