Skip to content

Commit c723c6e

Browse files
fix(betterer 🐛): improve reporter implementation (#775)
1 parent ed18d76 commit c723c6e

23 files changed

+227
-325
lines changed

packages/cli/src/init/init.tsx

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { BettererTasksLogger, BettererTasksState } from '@betterer/tasks';
1+
import { BettererTaskLogger, BettererTasksLogger, BettererTasksState } from '@betterer/tasks';
22
import { workerRequire, WorkerModule } from '@phenomnomnominal/worker-require';
33
import * as path from 'path';
4-
import React, { FC } from 'react';
4+
import React, { FC, useCallback } from 'react';
55

66
const createTestFile = workerRequire<WorkerModule<typeof import('./create-test-file')>>('./create-test-file');
77
const updatePackageJSON = workerRequire<WorkerModule<typeof import('./update-package-json')>>('./update-package-json');
@@ -13,27 +13,26 @@ export type InitProps = {
1313
};
1414

1515
export const Init: FC<InitProps> = function Init({ cwd, config, ts }) {
16+
const runCreateTestFile = useCallback(
17+
async (logger) => {
18+
await createTestFile.run(logger, path.resolve(cwd, config), ts);
19+
createTestFile.destroy();
20+
},
21+
[createTestFile, cwd, config, ts]
22+
);
23+
const runUpdagePackageJSON = useCallback(
24+
async (logger) => {
25+
await updatePackageJSON.run(logger, cwd, ts);
26+
updatePackageJSON.destroy();
27+
},
28+
[updatePackageJSON, cwd, config, ts]
29+
);
30+
1631
return (
17-
<BettererTasksLogger
18-
name="Initialising Betterer"
19-
update={update}
20-
tasks={[
21-
{
22-
name: 'Create test file',
23-
run: async (logger) => {
24-
await createTestFile.run(logger, path.resolve(cwd, config), ts);
25-
createTestFile.destroy();
26-
}
27-
},
28-
{
29-
name: 'Update package.json',
30-
run: async (logger) => {
31-
await updatePackageJSON.run(logger, cwd, ts);
32-
updatePackageJSON.destroy();
33-
}
34-
}
35-
]}
36-
/>
32+
<BettererTasksLogger name="Initialising Betterer" update={update}>
33+
<BettererTaskLogger name="Create test file" run={runCreateTestFile}></BettererTaskLogger>
34+
<BettererTaskLogger name="Update package.json" run={runUpdagePackageJSON}></BettererTaskLogger>
35+
</BettererTasksLogger>
3736
);
3837
};
3938

packages/reporter/src/components/default/DefaultEnding.tsx

Lines changed: 0 additions & 21 deletions
This file was deleted.

packages/reporter/src/components/default/DefaultReporter.tsx

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import React, { FC, memo } from 'react';
22

33
import { BettererContext, BettererRuns, BettererSummary } from '@betterer/betterer';
44

5-
import { DefaultEnding } from './DefaultEnding';
6-
import { DefaultRunning } from './DefaultRunning';
5+
import { Runs, RunSummary } from '../runs';
76

87
export type DefaultReporterProps = {
98
context: BettererContext;
@@ -14,11 +13,10 @@ export type DefaultReporterProps = {
1413
export const DefaultReporter: FC<DefaultReporterProps> = memo(function DefaultReporter(props: DefaultReporterProps) {
1514
const { context, runs, summary } = props;
1615

17-
if (runs && !summary) {
18-
return <DefaultRunning runs={runs} />;
19-
}
20-
if (runs && summary) {
21-
return <DefaultEnding context={context} runs={runs} summary={summary} />;
22-
}
23-
return null;
16+
return (
17+
<>
18+
{runs && <Runs runs={runs} />}
19+
{summary && <RunSummary context={context} summary={summary} />}
20+
</>
21+
);
2422
});

packages/reporter/src/components/default/DefaultRunning.tsx

Lines changed: 0 additions & 14 deletions
This file was deleted.

packages/reporter/src/components/runs/Runs.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import React, { FC, memo } from 'react';
22

33
import { BettererRuns } from '@betterer/betterer';
4-
import { BettererTasksLogger, BettererTasksState } from '@betterer/tasks';
4+
import { BettererTaskLogger, BettererTasksLogger, BettererTasksState } from '@betterer/tasks';
55
import { Box } from 'ink';
66

7-
import { getTasks } from './tasks';
7+
import { useTask } from './tasks';
88

99
export type RunsProps = {
1010
runs: BettererRuns;
@@ -13,7 +13,11 @@ export type RunsProps = {
1313
export const Runs: FC<RunsProps> = memo(function Runs({ runs }) {
1414
return (
1515
<Box flexDirection="column" paddingBottom={1}>
16-
<BettererTasksLogger name="Betterer" update={update} tasks={getTasks(runs)} exit={false} />
16+
<BettererTasksLogger name="Betterer" update={update} exit={false}>
17+
{runs.map((run) => (
18+
<BettererTaskLogger key={run.name} name={run.name} run={useTask(run)}></BettererTaskLogger>
19+
))}
20+
</BettererTasksLogger>
1721
</Box>
1822
);
1923
});
Lines changed: 44 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { BettererRuns } from '@betterer/betterer';
1+
import { BettererRun } from '@betterer/betterer';
22
import { BettererError } from '@betterer/errors';
33
import { BettererLogger } from '@betterer/logger';
4-
import { BettererTasks } from '@betterer/tasks';
4+
import { BettererTaskRun, getTask } from '@betterer/tasks';
55

66
import {
77
testBetter,
@@ -18,55 +18,50 @@ import {
1818
import { quote } from '../../utils';
1919
import { getDelta } from './deltas';
2020

21-
const TASK_RUNNER_CACHE = new Map<BettererRuns, BettererTasks>();
21+
export function useTask(run: BettererRun): BettererTaskRun {
22+
const task = getTask(run.name);
23+
return (
24+
task ||
25+
(async (logger: BettererLogger) => {
26+
const name = quote(run.name);
27+
await logger.progress(testRunning(name));
2228

23-
export function getTasks(runs: BettererRuns): BettererTasks {
24-
if (!TASK_RUNNER_CACHE.has(runs)) {
25-
TASK_RUNNER_CACHE.set(
26-
runs,
27-
runs.map((run) => ({
28-
name: run.name,
29-
run: async (logger: BettererLogger) => {
30-
const name = quote(run.name);
31-
if (run.isExpired) {
32-
await logger.warn(testExpired(name));
33-
}
34-
await logger.progress(testRunning(name));
29+
await run.lifecycle;
30+
const runSummary = run;
3531

36-
await run.lifecycle;
32+
if (runSummary.isExpired) {
33+
await logger.warn(testExpired(name));
34+
}
3735

38-
const delta = getDelta(run);
36+
const delta = getDelta(runSummary);
3937

40-
if (run.isComplete) {
41-
return testComplete(name, run.isNew);
42-
}
43-
if (run.isBetter) {
44-
return testBetter(name, delta);
45-
}
46-
if (run.isFailed) {
47-
throw new BettererError(testFailed(name));
48-
}
49-
if (run.isNew) {
50-
return testNew(name, delta);
51-
}
52-
if (run.isSkipped) {
53-
return testSkipped(name, delta);
54-
}
55-
if (run.isSame) {
56-
return testSame(name, delta);
57-
}
58-
if (run.isUpdated) {
59-
await run.diff.log(logger);
60-
return testUpdated(name, delta);
61-
}
62-
if (run.isWorse) {
63-
await run.diff.log(logger);
64-
throw new BettererError(testWorse(name, delta));
65-
}
66-
return;
67-
}
68-
}))
69-
);
70-
}
71-
return TASK_RUNNER_CACHE.get(runs) as BettererTasks;
38+
if (runSummary.isComplete) {
39+
return testComplete(name, runSummary.isNew);
40+
}
41+
if (runSummary.isBetter) {
42+
return testBetter(name, delta);
43+
}
44+
if (runSummary.isFailed) {
45+
throw new BettererError(testFailed(name));
46+
}
47+
if (runSummary.isNew) {
48+
return testNew(name, delta);
49+
}
50+
if (runSummary.isSkipped) {
51+
return testSkipped(name, delta);
52+
}
53+
if (runSummary.isSame) {
54+
return testSame(name, delta);
55+
}
56+
if (runSummary.isUpdated) {
57+
await runSummary.diff.log(logger);
58+
return testUpdated(name, delta);
59+
}
60+
if (runSummary.isWorse) {
61+
await runSummary.diff.log(logger);
62+
throw new BettererError(testWorse(name, delta));
63+
}
64+
return;
65+
})
66+
);
7267
}
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,28 @@
11
import React, { FC, memo } from 'react';
22

3-
import { BettererContext, BettererFilePaths, BettererRuns } from '@betterer/betterer';
3+
import { BettererContext, BettererFilePaths } from '@betterer/betterer';
44
import { Box, Text } from 'ink';
55

6-
import { filesChecking } from '../../messages';
6+
import { filesChecked, filesChecking } from '../../messages';
77
import { Config, ConfigEditField } from '../config';
8-
import { Runs } from '../runs';
98

10-
import { WatchInstructions } from './WatchInstructions';
11-
12-
export type WatchRunningProps = {
9+
export type WatchFilesProps = {
1310
context: BettererContext;
1411
editField: ConfigEditField;
1512
filePaths: BettererFilePaths;
16-
runs: BettererRuns;
13+
running: boolean;
1714
};
1815

19-
export const WatchRunning: FC<WatchRunningProps> = memo(function WatchRunning(props) {
20-
const { context, editField, filePaths, runs } = props;
16+
export const WatchFiles: FC<WatchFilesProps> = memo(function WatchFiles(props) {
17+
const { context, editField, filePaths, running } = props;
2118

2219
return (
2320
<>
2421
<Config context={context} editField={editField} />
2522
{filePaths.length ? (
2623
<>
2724
<Box paddingBottom={1}>
28-
<Text>{filesChecking(filePaths.length)}</Text>
25+
<Text>{running ? filesChecking(filePaths.length) : filesChecked(filePaths.length)}</Text>
2926
</Box>
3027
<Box flexDirection="column" paddingBottom={1}>
3128
{filePaths.map((filePath) => (
@@ -34,8 +31,6 @@ export const WatchRunning: FC<WatchRunningProps> = memo(function WatchRunning(pr
3431
</Box>
3532
</>
3633
) : null}
37-
<Runs runs={runs} />
38-
<WatchInstructions />
3934
</>
4035
);
4136
});

packages/reporter/src/components/watch/WatchReporter.tsx

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ import { useApp, useInput, useStdin } from 'ink';
1111

1212
import { BettererReporterApp } from '../../types';
1313
import { ConfigEditField } from '../config';
14+
import { Runs, RunSummary } from '../runs';
1415

1516
import { WatchEnding } from './WatchEnding';
16-
import { WatchRunning } from './WatchRunning';
17+
import { WatchFiles } from './WatchFiles';
18+
import { WatchInstructions } from './WatchInstructions';
1719
import { WatchStarting } from './WatchStarting';
18-
import { WatchWatching } from './WatchWatching';
1920

2021
export type WatchReporterProps = {
2122
context: BettererContext;
@@ -68,15 +69,19 @@ export const WatchReporter: FC<WatchReporterProps> = memo(function WatchReporter
6869

6970
if (summaries) {
7071
return <WatchEnding />;
71-
} else if (runs && summary) {
72+
}
73+
if (runs) {
74+
const running = !summary;
7275
return (
73-
<WatchWatching context={context} editField={editField} filePaths={filePaths} runs={runs} summary={summary} />
76+
<>
77+
<WatchFiles context={context} editField={editField} filePaths={filePaths} running={running} />
78+
<Runs runs={runs} />
79+
{summary && <RunSummary context={context} summary={summary} />}
80+
<WatchInstructions />
81+
</>
7482
);
75-
} else if (runs) {
76-
return <WatchRunning context={context} editField={editField} filePaths={filePaths} runs={runs} />;
77-
} else {
78-
return <WatchStarting context={context} editField={editField} />;
7983
}
84+
return <WatchStarting context={context} editField={editField} />;
8085
});
8186

8287
function quit(app: BettererReporterApp): void {

packages/reporter/src/components/watch/WatchStarting.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export type WatchStartingProps = {
1515
export const WatchStarting: FC<WatchStartingProps> = memo(function WatchStarting(props) {
1616
const { context, editField } = props;
1717
return (
18-
<Box flexDirection="column" paddingBottom={1}>
18+
<Box flexDirection="column">
1919
<Config context={context} editField={editField} />
2020
<Box paddingBottom={1}>
2121
<Text>{watchStart()}</Text>

packages/reporter/src/components/watch/WatchWatching.tsx

Lines changed: 0 additions & 42 deletions
This file was deleted.

0 commit comments

Comments
 (0)