From 45764b9ba0b672e0a15ab94ad9d4963c17c1d9ec Mon Sep 17 00:00:00 2001 From: Craig Spence Date: Sun, 15 Sep 2024 17:21:53 +1200 Subject: [PATCH] =?UTF-8?q?refactor(betterer=20=F0=9F=94=A7):=20remove=20r?= =?UTF-8?q?eporter=20from=20config=20so=20it=20can=20be=20passed=20to=20wo?= =?UTF-8?q?rkers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- goldens/api/betterer.api.md | 1 - packages/betterer/src/globals.ts | 23 ++++++++++++------- packages/betterer/src/reporters/config.ts | 11 ++++----- packages/betterer/src/reporters/types.ts | 4 ---- .../betterer/src/results/results-summary.ts | 8 +++---- packages/betterer/src/run/run.ts | 5 ---- packages/betterer/src/run/worker-run.ts | 2 +- 7 files changed, 24 insertions(+), 30 deletions(-) diff --git a/goldens/api/betterer.api.md b/goldens/api/betterer.api.md index bfa6b480b..2f970e38f 100644 --- a/goldens/api/betterer.api.md +++ b/goldens/api/betterer.api.md @@ -64,7 +64,6 @@ export type BettererConfigPaths = ReadonlyArray; // @public export interface BettererConfigReporter { logo: boolean; - reporter: BettererReporter; } // @public diff --git a/packages/betterer/src/globals.ts b/packages/betterer/src/globals.ts index 7baf6304d..bcc8c241f 100644 --- a/packages/betterer/src/globals.ts +++ b/packages/betterer/src/globals.ts @@ -25,17 +25,22 @@ class BettererGlobalResolvers { } class BettererGlobals { - public readonly reporter: BettererReporter = this.config.reporter; public readonly resolvers: BettererGlobalResolvers = new BettererGlobalResolvers(this.config); constructor( public readonly config: BettererConfig, + public readonly _reporter: BettererReporter | null, public readonly results: BettererResultsWorker, - private _runWorkerPool: BettererRunWorkerPool | null, - private _testMetaLoader: BettererTestMetaLoaderWorker | null, + private readonly _runWorkerPool: BettererRunWorkerPool | null, + private readonly _testMetaLoader: BettererTestMetaLoaderWorker | null, public readonly versionControl: BettererVersionControlWorker ) {} + public get reporter(): BettererReporter { + invariantΔ(this._reporter, `\`reporter\` should only be accessed on the main thread!`); + return this._reporter; + } + public get runWorkerPool(): BettererRunWorkerPool { invariantΔ(this._runWorkerPool, `\`runWorkerPool\` should only be accessed on the main thread!`); return this._runWorkerPool; @@ -53,12 +58,15 @@ export async function createGlobals( options: BettererOptions, optionsWatch: BettererOptionsWatcher = {} ): Promise { - let reporter = await loadDefaultReporter(); + let errorReporter = await loadDefaultReporter(); try { const configContext = await createContextConfig(options); const configFS = await createFSConfig(options); - const configReporter = await createReporterConfig(configFS, options); + + const [configReporter, reporter] = await createReporterConfig(configFS, options); + errorReporter = reporter; + const configWatcher = createWatcherConfig(configFS, optionsWatch); const { cache, cachePath, configPaths, cwd, resultsPath } = configFS; @@ -80,17 +88,16 @@ export async function createGlobals( ...configWatcher, versionControlPath }); - reporter = config.reporter; const runWorkerPool = await createRunWorkerPool(config.workers); - setGlobals(config, results, runWorkerPool, testMetaLoader, versionControl); + setGlobals(config, reporter, results, runWorkerPool, testMetaLoader, versionControl); } catch (error) { await Promise.all([results.destroy(), testMetaLoader.destroy(), versionControl.destroy()]); throw error; } } catch (error) { - const reporterΩ = reporter as BettererReporterΩ; + const reporterΩ = errorReporter as BettererReporterΩ; await reporterΩ.configError(options, error as BettererError); throw error; } diff --git a/packages/betterer/src/reporters/config.ts b/packages/betterer/src/reporters/config.ts index 71741a098..99d1ef19e 100644 --- a/packages/betterer/src/reporters/config.ts +++ b/packages/betterer/src/reporters/config.ts @@ -13,7 +13,7 @@ import { loadReporters, loadSilentReporter } from './loader.js'; export async function createReporterConfig( configBase: BettererConfigFS, options: BettererOptionsReporter -): Promise { +): Promise<[BettererConfigReporter, BettererReporter]> { const { cwd } = configBase; const logo = options.logo ?? false; @@ -26,17 +26,14 @@ export async function createReporterConfig( const reporter = silent ? loadSilentReporter() : await loadReporters(reporters, cwd); - return { - logo, - reporter - }; + return [{ logo }, reporter]; } export async function overrideReporterConfig(optionsOverride: BettererOptionsReporterOverride): Promise { if (optionsOverride.reporters) { const { config, results, runWorkerPool, testMetaLoader, versionControl } = getGlobals(); const reporters = toArray(optionsOverride.reporters); - config.reporter = await loadReporters(reporters, config.cwd); - setGlobals(config, results, runWorkerPool, testMetaLoader, versionControl); + const reporter = await loadReporters(reporters, config.cwd); + setGlobals(config, reporter, results, runWorkerPool, testMetaLoader, versionControl); } } diff --git a/packages/betterer/src/reporters/types.ts b/packages/betterer/src/reporters/types.ts index 32c642e62..603fee606 100644 --- a/packages/betterer/src/reporters/types.ts +++ b/packages/betterer/src/reporters/types.ts @@ -59,10 +59,6 @@ export interface BettererConfigReporter { * When `true`, the default reporter will render the Betterer logo. */ logo: boolean; - /** - * The reporter instance. All reporter hooks will be a noop if `silent` is `true`. - */ - reporter: BettererReporter; } /** diff --git a/packages/betterer/src/results/results-summary.ts b/packages/betterer/src/results/results-summary.ts index 865c4a354..71eb8a191 100644 --- a/packages/betterer/src/results/results-summary.ts +++ b/packages/betterer/src/results/results-summary.ts @@ -17,7 +17,7 @@ export class BettererResultsSummaryΩ implements BettererResultsSummary { } public static async create(): Promise { - const { config, resolvers, results, testMetaLoader, versionControl } = getGlobals(); + const { config, reporter, resolvers, results, testMetaLoader, versionControl } = getGlobals(); const { configPaths, filters, includes, excludes, resultsPath } = config; try { @@ -75,9 +75,9 @@ export class BettererResultsSummaryΩ implements BettererResultsSummary { ); return new BettererResultsSummaryΩ(testStatuses, onlyFileTests); - } catch (e) { - await config.reporter.configError?.(config, e as BettererError); - throw e; + } catch (error) { + await reporter.configError?.(config, error as BettererError); + throw error; } finally { await versionControl.destroy(); } diff --git a/packages/betterer/src/run/run.ts b/packages/betterer/src/run/run.ts index e2ba4fb10..c0419f668 100644 --- a/packages/betterer/src/run/run.ts +++ b/packages/betterer/src/run/run.ts @@ -1,6 +1,5 @@ import type { BettererError } from '@betterer/errors'; -import type { BettererConfig } from '../config/types.js'; import type { BettererFilePaths } from '../fs/index.js'; import type { BettererTestMeta } from '../test/index.js'; import type { BettererRunMeta } from './meta/types.js'; @@ -51,10 +50,6 @@ export class BettererRunΩ implements BettererRun { workers: 1 }; - // `BettererReporter` instance can't be passed to the worker_thread, but - // the worker doesn't actually need the it, so just ignore it. - delete (workerConfig as Partial).reporter; - const runMeta = await worker.api.init(testMeta, workerConfig, results, versionControl); workerHandle.release(); diff --git a/packages/betterer/src/run/worker-run.ts b/packages/betterer/src/run/worker-run.ts index 7a35e1525..e18f8bc33 100644 --- a/packages/betterer/src/run/worker-run.ts +++ b/packages/betterer/src/run/worker-run.ts @@ -67,7 +67,7 @@ export class BettererWorkerRunΩ implements BettererRun { // If we're in a worker, we need to populate the globals: if (process.env.BETTERER_WORKER !== 'false') { - setGlobals(config, results, null, null, versionControl); + setGlobals(config, null, results, null, null, versionControl); } const isNew = !(await results.api.hasBaseline(name));