Skip to content

Commit 6c2dc36

Browse files
committed
refactor: create verbosity middleware
1 parent d74f7e3 commit 6c2dc36

File tree

4 files changed

+136
-0
lines changed

4 files changed

+136
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { describe, expect, it, vi } from 'vitest';
2+
import { isVerbose } from '@code-pushup/utils';
3+
import { setVerboseMiddleware } from './set-verbose.middleware.js';
4+
5+
describe('setVerboseMiddleware', () => {
6+
it.each([
7+
[true, undefined, true],
8+
[false, undefined, false],
9+
[undefined, undefined, false],
10+
[undefined, true, true],
11+
[true, true, true],
12+
[false, true, true],
13+
[true, false, false],
14+
[false, false, false],
15+
['True', undefined, true],
16+
['TRUE', undefined, true],
17+
[42, undefined, false],
18+
[undefined, 'true', true],
19+
[true, 'False', false],
20+
])(
21+
'should set CP_VERBOSE based on env variable `%j` and cli argument `%j` and return `%j` from isVerbose() function',
22+
(envValue, cliFlag, expected) => {
23+
vi.stubEnv('CP_VERBOSE', `${envValue}`);
24+
25+
setVerboseMiddleware({ verbose: cliFlag } as any);
26+
expect(process.env['CP_VERBOSE']).toBe(`${expected}`);
27+
expect(isVerbose()).toBe(expected);
28+
},
29+
);
30+
});
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import type { GlobalOptions } from '@code-pushup/core';
2+
import type { CoreConfig } from '@code-pushup/models';
3+
import type { FilterOptions } from './filter.model.js';
4+
import type { GeneralCliOptions } from './global.model';
5+
6+
/**
7+
*
8+
* | CP_VERBOSE value | CLI `--verbose` flag | Effect |
9+
* |------------------|-----------------------------|------------|
10+
* | true | Not provided | enabled |
11+
* | false | Not provided | disabled |
12+
* | Not provided | Not provided | disabled |
13+
* | Not provided | Explicitly set (true) | enabled |
14+
* | true | Explicitly set (true) | enabled |
15+
* | false | Explicitly set (true) | enabled |
16+
* | true | Explicitly negated (false) | disabled |
17+
* | false | Explicitly negated (false) | disabled |
18+
*
19+
* @param originalProcessArgs
20+
*/
21+
export function setVerboseMiddleware<
22+
T extends GeneralCliOptions & CoreConfig & FilterOptions & GlobalOptions,
23+
>(originalProcessArgs: T): T {
24+
const envVerbose = getNormalizedOptionValue(process.env['CP_VERBOSE']);
25+
const cliVerbose = getNormalizedOptionValue(originalProcessArgs.verbose);
26+
const verboseEffect = cliVerbose ?? envVerbose ?? false;
27+
28+
// eslint-disable-next-line functional/immutable-data
29+
process.env['CP_VERBOSE'] = `${verboseEffect}`;
30+
31+
return {
32+
...originalProcessArgs,
33+
verbose: verboseEffect,
34+
};
35+
}
36+
37+
export function getNormalizedOptionValue(value: unknown): boolean | undefined {
38+
if (typeof value === 'boolean') {
39+
return value;
40+
}
41+
if (typeof value === 'string') {
42+
const lowerCaseValue = value.toLowerCase();
43+
if (lowerCaseValue === 'true') {
44+
return true;
45+
}
46+
if (lowerCaseValue === 'false') {
47+
return false;
48+
}
49+
}
50+
51+
return undefined;
52+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { describe, expect, it, vi } from 'vitest';
2+
import {
3+
getNormalizedOptionValue,
4+
setVerboseMiddleware,
5+
} from './set-verbose.middleware.js';
6+
7+
describe('setVerboseMiddleware', () => {
8+
it.each([
9+
[true, true],
10+
['true', true],
11+
['True', true],
12+
['TRUE', true],
13+
[false, false],
14+
['false', false],
15+
['False', false],
16+
['FALSE', false],
17+
[undefined, undefined],
18+
['undefined', undefined],
19+
['Whatever else', undefined],
20+
[0, undefined],
21+
[1, undefined],
22+
[null, undefined],
23+
])(
24+
'should return normalize value of `%j` option set as `%j`',
25+
(value, expected) => {
26+
expect(getNormalizedOptionValue(value)).toBe(expected);
27+
},
28+
);
29+
30+
it.each([
31+
[true, undefined, true],
32+
[false, undefined, false],
33+
[undefined, undefined, false],
34+
[undefined, true, true],
35+
[true, true, true],
36+
[false, true, true],
37+
[true, false, false],
38+
[false, false, false],
39+
])(
40+
'should set verbosity based on env variable `%j` and cli argument `%j` to perform verbose effect as `%j`',
41+
(envValue, cliFlag, expected) => {
42+
vi.stubEnv('CP_VERBOSE', `${envValue}`);
43+
44+
expect(setVerboseMiddleware({ verbose: cliFlag } as any).verbose).toBe(
45+
expected,
46+
);
47+
},
48+
);
49+
});

packages/cli/src/lib/middlewares.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import type { MiddlewareFunction } from 'yargs';
22
import { coreConfigMiddleware } from './implementation/core-config.middleware.js';
33
import { filterMiddleware } from './implementation/filter.middleware.js';
4+
import { setVerboseMiddleware } from './implementation/set-verbose.middleware.js';
45

56
export const middlewares = [
7+
{
8+
middlewareFunction: setVerboseMiddleware as unknown as MiddlewareFunction,
9+
applyBeforeValidation: false,
10+
},
611
{
712
middlewareFunction: coreConfigMiddleware as unknown as MiddlewareFunction,
813
applyBeforeValidation: false,

0 commit comments

Comments
 (0)