Skip to content

Commit bea7105

Browse files
committed
wip
1 parent 039ed97 commit bea7105

File tree

9 files changed

+76
-51
lines changed

9 files changed

+76
-51
lines changed

code-pushup.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ const config: CoreConfig = {
3434

3535
export default mergeConfigs(
3636
config,
37-
await coverageCoreConfigNx(),
37+
/* await coverageCoreConfigNx(),
3838
await jsPackagesCoreConfig(),
3939
await lighthouseCoreConfig(
4040
'https://github.com/code-pushup/cli?tab=readme-ov-file#code-pushup-cli/',
4141
),
42-
await eslintCoreConfigNx(),
42+
await eslintCoreConfigNx(),*/
4343
await typescriptPluginConfigNx({
4444
tsConfigPath: 'packages/plugin-typescript/tsconfig.lib.json',
4545
// onlyAudits: ['verbatim-module-syntax-typescript']

code-pushup.preset.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ export const typescriptPluginConfigNx = async (
144144

145145
return {
146146
plugins: [await typescriptPlugin(opt)],
147-
categories: [
147+
/*categories: [
148148
{
149149
slug: 'typescript',
150150
title: 'Typescript',
@@ -157,7 +157,7 @@ export const typescriptPluginConfigNx = async (
157157
}),
158158
),
159159
},
160-
],
160+
],*/
161161
};
162162
};
163163

packages/plugin-typescript/src/lib/constants.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ import {
44
GROUPS_DESCRIPTIONS,
55
TS_ERROR_CODES,
66
} from './runner/ts-error-codes.js';
7-
import type { AuditSlug } from './types.js';
7+
import type { CompilerOptionName } from './types.js';
88

99
export const TYPESCRIPT_PLUGIN_SLUG = 'typescript';
1010
export const DEFAULT_TS_CONFIG = 'tsconfig.json';
1111

1212
export const AUDITS = Object.values(TS_ERROR_CODES)
1313
.flatMap(i => Object.entries(i))
1414
.reduce<Audit[]>((audits, [name]) => {
15-
const slug = camelCaseToKebabCase(name) as AuditSlug;
15+
const slug = camelCaseToKebabCase(name) as CompilerOptionName;
1616
const title = kebabCaseToSentence(name);
1717
return [
1818
...audits,

packages/plugin-typescript/src/lib/runner/runner.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type {
66
Issue,
77
RunnerFunction,
88
} from '@code-pushup/models';
9-
import type { AuditSlug } from '../types.js';
9+
import type { CompilerOptionName } from '../types.js';
1010
import { mergeTsConfigs } from '../typescript-plugin';
1111
import {
1212
type DiagnosticsOptions,
@@ -29,7 +29,7 @@ export function createRunnerFunction(options: RunnerOptions): RunnerFunction {
2929
const diagnostics = await getDiagnostics({ fileNames, compilerOptions });
3030

3131
const result: Record<
32-
AuditSlug,
32+
CompilerOptionName,
3333
Pick<AuditReport, 'slug' | 'details'>
3434
> = diagnostics
3535
// filter out unsupported errors
@@ -50,13 +50,13 @@ export function createRunnerFunction(options: RunnerOptions): RunnerFunction {
5050
};
5151
},
5252
{} as unknown as Record<
53-
AuditSlug,
53+
CompilerOptionName,
5454
Pick<AuditReport, 'slug' | 'details'>
5555
>,
5656
);
5757

5858
return filteredAudits.map(audit => {
59-
const { details } = result[audit.slug as AuditSlug] ?? {};
59+
const { details } = result[audit.slug as CompilerOptionName] ?? {};
6060
const issues = details?.issues ?? [];
6161
return {
6262
...audit,

packages/plugin-typescript/src/lib/runner/utils.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,26 @@ import {
55
} from 'typescript';
66
import type { Issue } from '@code-pushup/models';
77
import { camelCaseToKebabCase } from '@code-pushup/utils';
8-
import type { AuditSlug } from '../types.js';
8+
import type { CompilerOptionName } from '../types.js';
99
import { TS_ERROR_CODES } from './ts-error-codes.js';
1010

1111
/** Build Reverse Lookup Map. It will a map with key as the error code and value as the audit slug. */
1212
export const AUDIT_LOOKUP = Object.values(TS_ERROR_CODES)
1313
.flatMap(v => Object.entries(v))
14-
.reduce<Map<number, AuditSlug>>((lookup, [name, codes]) => {
14+
.reduce<Map<number, CompilerOptionName>>((lookup, [name, codes]) => {
1515
codes.forEach((code: number) =>
16-
lookup.set(code, camelCaseToKebabCase(name) as AuditSlug),
16+
lookup.set(code, camelCaseToKebabCase(name) as CompilerOptionName),
1717
);
1818
return lookup;
19-
}, new Map<number, AuditSlug>());
19+
}, new Map<number, CompilerOptionName>());
2020

2121
/**
2222
* Transform the TypeScript error code to the audit slug.
2323
* @param code - The TypeScript error code.
2424
* @returns The audit slug.
2525
* @throws Error if the code is not supported.
2626
*/
27-
export function tSCodeToAuditSlug(code: number): AuditSlug {
27+
export function tSCodeToAuditSlug(code: number): CompilerOptionName {
2828
const knownCode = AUDIT_LOOKUP.get(code);
2929
if (knownCode === undefined) {
3030
throw new Error(`Code ${code} not supported.`);

packages/plugin-typescript/src/lib/schema.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { z } from 'zod';
22
import { AUDITS, DEFAULT_TS_CONFIG } from './constants.js';
3-
import type { AuditSlug } from './types.js';
3+
import type { CompilerOptionName } from './types.js';
44

55
const auditSlugs = AUDITS.map(({ slug }) => slug) as [string, ...string[]];
66
export const typescriptPluginConfigSchema = z.object({
@@ -18,4 +18,4 @@ export const typescriptPluginConfigSchema = z.object({
1818

1919
export type TypescriptPluginOptions = z.infer<
2020
typeof typescriptPluginConfigSchema
21-
> & { onlyAudits?: (string | AuditSlug)[] | undefined };
21+
> & { onlyAudits?: (string | CompilerOptionName)[] | undefined };
Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
1-
import { z } from 'zod';
2-
import { TS_ERROR_CODES } from './runner/ts-error-codes.js';
3-
import { typescriptPluginConfigSchema } from './schema.js';
1+
import {z} from 'zod';
2+
import {TS_ERROR_CODES} from './runner/ts-error-codes.js';
3+
import {typescriptPluginConfigSchema} from './schema.js';
4+
5+
type CamelCaseToKebabCase<S extends string> = S extends `${infer First}${infer Rest}`
6+
? Rest extends Uncapitalize<Rest>
7+
? `${Lowercase<First>}${CamelCaseToKebabCase<Rest>}`
8+
: `${Lowercase<First>}-${CamelCaseToKebabCase<Rest>}`
9+
: S;
410

511
export type SemVerString = `${number}.${number}.${number}`;
612

713
type ErrorCodes = typeof TS_ERROR_CODES;
8-
export type AuditSlug = {
14+
15+
export type CompilerOptionName = {
916
[K in keyof ErrorCodes]: keyof ErrorCodes[K];
1017
}[keyof ErrorCodes];
1118

19+
export type AuditSlug = CamelCaseToKebabCase<CompilerOptionName>;
20+
21+
1222
export type TypescriptPluginOptions = z.infer<
1323
typeof typescriptPluginConfigSchema
1424
> & { onlyAudits?: (string | AuditSlug)[] | undefined };

packages/plugin-typescript/src/lib/typescript-plugin.ts

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
11
import type {PluginConfig} from '@code-pushup/models';
22
import {name as packageName, version} from '../../package.json';
3-
import {
4-
AUDITS,
5-
DEFAULT_TS_CONFIG,
6-
GROUPS,
7-
TYPESCRIPT_PLUGIN_SLUG,
8-
} from './constants.js';
3+
import {AUDITS, DEFAULT_TS_CONFIG, GROUPS, TYPESCRIPT_PLUGIN_SLUG,} from './constants.js';
94
import {createRunnerFunction} from './runner/runner.js';
10-
import type {TypescriptPluginOptions} from './types.js';
5+
import type {AuditSlug, CompilerOptionName, TypescriptPluginOptions} from './types.js';
116
import {
12-
filterAuditsBySlug,
7+
filterAuditsByTsOptions,
138
filterGroupsByAuditSlug,
9+
filterGroupsByByTsOptions,
1410
getCurrentTsVersion,
15-
loadDefaultTsConfig,
16-
mergeTsConfigs
11+
loadDefaultTsConfig
1712
} from './utils.js';
1813
import {getTsConfigurationFromPath} from "./runner/typescript-runner.ts";
19-
import {join, resolve} from "node:path";
20-
import {formatDiagnosticsWithColorAndContext, parseJsonConfigFileContent, readConfigFile, sys} from "typescript";
14+
import {resolve} from "node:path";
15+
import {
16+
type CompilerOptions,
17+
formatDiagnosticsWithColorAndContext,
18+
parseJsonConfigFileContent,
19+
readConfigFile,
20+
sys,
21+
} from "typescript";
22+
import {kebabCaseToCamelCase} from "@code-pushup/utils";
23+
import {filterAuditsBySlug} from './utils.js';
2124

2225
export function mergeTsConfigs(baseConfigPath: string, overrideConfigPath: string) {
2326
// Read and parse the base configuration
@@ -66,13 +69,15 @@ export async function typescriptPlugin(
6669
existingConfig: defaultCompilerOptions
6770
});
6871

69-
const compilerOptions = {...defaultCompilerOptions, ...desiredCompilerOptions};
72+
// merges the defaultCompilerOptions of that TS Version with the compilerOptions configured by the user. EX: user vermatin could be undefined, but the default could be true
73+
const compilerOptions: CompilerOptions = {...defaultCompilerOptions, ...desiredCompilerOptions};
74+
75+
7076

71-
const filteredAudits = AUDITS//.filter(filterAuditsBySlug(onlyAudits))
72-
// filter by active compilerOptions
73-
// .filter();
77+
const filteredAudits = AUDITS
78+
.filter(filterAuditsByTsOptions(compilerOptions, onlyAudits))
7479

75-
const filteredGroups = GROUPS.filter(filterGroupsByAuditSlug(onlyAudits));
80+
const filteredGroups = GROUPS.filter(filterGroupsByByTsOptions(compilerOptions, onlyAudits));
7681
return {
7782
slug: TYPESCRIPT_PLUGIN_SLUG,
7883
packageName,
@@ -82,7 +87,7 @@ export async function typescriptPlugin(
8287
docsUrl: 'https://www.npmjs.com/package/@code-pushup/typescript-plugin/',
8388
icon: 'typescript',
8489
audits: filteredAudits,
85-
groups: filteredGroups,
90+
// groups: filteredGroups,
8691
runner: createRunnerFunction({
8792
fileNames,
8893
compilerOptions,

packages/plugin-typescript/src/lib/utils.ts

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,45 @@
1-
import { access } from 'node:fs/promises';
2-
import { dirname } from 'node:path';
1+
import {access} from 'node:fs/promises';
2+
import {dirname} from 'node:path';
33
import {
44
type CompilerOptions,
55
type TsConfigSourceFile,
66
parseJsonConfigFileContent,
77
sys,
88
} from 'typescript';
9-
import type { Audit, Group } from '@code-pushup/models';
10-
import { executeProcess } from '@code-pushup/utils';
11-
import type { SemVerString } from './types.js';
9+
import type {Audit, Group} from '@code-pushup/models';
10+
import {executeProcess, kebabCaseToCamelCase} from '@code-pushup/utils';
11+
import type {CompilerOptionName, SemVerString} from './types.js';
1212

1313
export function filterAuditsBySlug(slugs?: string[]) {
14-
return ({ slug }: Audit) => {
14+
return ({slug}: { slug: string }) => {
1515
if (slugs && slugs.length > 0) {
1616
return slugs.includes(slug);
1717
}
1818
return true;
1919
};
2020
}
2121

22+
export function filterAuditsByTsOptions(compilerOptions: CompilerOptions, onlyAudits?: string[]) {
23+
return ({slug}: { slug: string }) => {
24+
const compilerOptionName = kebabCaseToCamelCase(slug) as CompilerOptionName;
25+
return compilerOptions[compilerOptionName] === true && filterAuditsBySlug(onlyAudits);
26+
};
27+
}
28+
2229
export function filterGroupsByAuditSlug(slugs?: string[]) {
23-
return ({ refs }: Group) => {
24-
if (slugs && slugs.length > 0) {
25-
return refs.some(({ slug }) => slugs.includes(slug));
26-
}
27-
return true;
30+
return ({refs}: Group) => {
31+
return refs.some(filterAuditsBySlug(slugs));
32+
};
33+
}
34+
35+
export function filterGroupsByByTsOptions(compilerOptions: CompilerOptions, onlyAudits?: string[]) {
36+
return ({refs}: Group) => {
37+
return refs.some(filterAuditsByTsOptions(compilerOptions, onlyAudits));
2838
};
2939
}
3040

3141
export async function getCurrentTsVersion(): Promise<SemVerString> {
32-
const { stdout } = await executeProcess({
42+
const {stdout} = await executeProcess({
3343
command: 'npx',
3444
args: ['tsc', '--version'],
3545
});

0 commit comments

Comments
 (0)