Skip to content

Commit 1f17b67

Browse files
committed
wip
1 parent 05b2504 commit 1f17b67

File tree

6 files changed

+111
-51
lines changed

6 files changed

+111
-51
lines changed

code-pushup.preset.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,13 @@ import {
1818
typescriptPlugin,
1919
} from './packages/plugin-typescript/src/index.js';
2020
import {AUDITS, GROUPS} from './packages/plugin-typescript/src/lib/constants';
21-
import {filterGroupsByAuditSlug, getFinalAuditSlugs} from './packages/plugin-typescript/src/lib/utils.js';
21+
import {
22+
filterGroupsByAuditSlug,
23+
filterGroupsByTsOptions, getCategorieReferences, getCategoryReferences, getCompilerOptionsToDetermineListedAudits,
24+
getFinalAuditSlugs, loadTargetConfig, getCategoryRefsFromGroups
25+
} from './packages/plugin-typescript/src/lib/utils.js';
2226
import {a} from "vitest/dist/suite-UrZdHRff";
27+
import {loadTsConfig} from "bundle-require";
2328

2429
export const jsPackagesCategories: CategoryConfig[] = [
2530
{
@@ -78,14 +83,14 @@ export const eslintCategories: CategoryConfig[] = [
7883
slug: 'bug-prevention',
7984
title: 'Bug prevention',
8085
description: 'Lint rules that find **potential bugs** in your code.',
81-
refs: [{ type: 'group', plugin: 'eslint', slug: 'problems', weight: 1 }],
86+
refs: [{type: 'group', plugin: 'eslint', slug: 'problems', weight: 1}],
8287
},
8388
{
8489
slug: 'code-style',
8590
title: 'Code style',
8691
description:
8792
'Lint rules that promote **good practices** and consistency in your code.',
88-
refs: [{ type: 'group', plugin: 'eslint', slug: 'suggestions', weight: 1 }],
93+
refs: [{type: 'group', plugin: 'eslint', slug: 'suggestions', weight: 1}],
8994
},
9095
];
9196

@@ -142,21 +147,14 @@ export const typescriptPluginConfigNx = async (
142147
const opt: TypescriptPluginOptions = {
143148
...options,
144149
};
145-
146-
147150
return {
148151
plugins: [await typescriptPlugin(opt)],
149152
categories: [
150-
/* {
153+
{
151154
slug: 'typescript',
152155
title: 'Typescript',
153-
refs: AUDITS.filter(filterGroupsByAuditSlug(await getFinalAuditSlugs(opt))).map( ({slug}) => ({
154-
type: 'audit',
155-
plugin: 'typescript',
156-
slug,
157-
weight: 1,
158-
}))
159-
},*/
156+
refs: (await getCategoryRefsFromGroups(opt))
157+
},
160158
],
161159
};
162160
};

packages/plugin-typescript/mocks/fixtures/basic-setup/tsconfig-with-exclude.json

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,7 @@
33
"rootDir": "./src",
44
"strict": true,
55
"target": "ES6",
6-
"module": "CommonJS",
7-
"noImplicitAny": true,
8-
"strictNullChecks": true,
9-
"strictFunctionTypes": true,
10-
"strictBindCallApply": true,
11-
"strictPropertyInitialization": true,
12-
"alwaysStrict": true
6+
"module": "CommonJS"
137
},
148
"exclude": ["src/**/*.ts", "src/**/*.js"]
159
}

packages/plugin-typescript/mocks/fixtures/basic-setup/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"rootDir": "./src",
44
"strict": true,
55
"target": "ES6",
6-
"module": "CommonJS"
6+
"module": "CommonJSsss"
77
},
88
"include": ["src/**/*.ts", "src/**/*.js"],
99
}

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import {name as packageName, version} from '../../package.json';
33
import {AUDITS, DEFAULT_TS_CONFIG, TYPESCRIPT_PLUGIN_SLUG,} from './constants.js';
44
import {createRunnerFunction} from './runner/runner.js';
55
import type {TypescriptPluginOptions} from './types.js';
6-
import {filterAuditsByTsOptions, getCompilerOptionsToDetermineListedAudits} from './utils.js';
6+
import {filterAuditsByTsOptions, getCompilerOptionsToDetermineListedAudits, getGroups} from './utils.js';
7+
import {kebabCaseToCamelCase} from "@code-pushup/utils";
78

89
export async function typescriptPlugin(
910
options?: TypescriptPluginOptions,
@@ -15,20 +16,20 @@ export async function typescriptPlugin(
1516
const filteredAudits = AUDITS
1617
.filter(filterAuditsByTsOptions(definitive, options?.onlyAudits));
1718

18-
const filteredSlugs = filteredAudits.map(audit => audit.slug);
19+
const skippedAudits = AUDITS
20+
.filter(audit => !filteredAudits.some(filtered => filtered.slug === audit.slug))
21+
.map(audit => kebabCaseToCamelCase(audit.slug));
1922

20-
const originalSlugs = AUDITS.map(audit => audit.slug);
21-
22-
const notThere = originalSlugs.filter(slug => !filteredSlugs.includes(slug));
23-
console.info(notThere);
24-
if(notThere.length > 0){
25-
console.warn(`Some audits were skipped: [${notThere.join(', ')}]`);
23+
if(skippedAudits.length > 0){
24+
console.warn(`Some audits were skipped: [${skippedAudits.join(', ')}]`);
2625
}
2726

2827
console.info('filteredAudits', Object.keys(filteredAudits).length);
2928
console.info('AUDITS', Object.keys(AUDITS).length);
29+
console.info('audits', AUDITS.map(audit => audit.slug));
3030

31-
//const filteredGroups = GROUPS.filter(filterGroupsByAuditSlug(filteredAudits));
31+
const filteredGroups = getGroups(definitive, options?.onlyAudits);
32+
console.log(filteredGroups.length, 'CANTIDAD');
3233
return {
3334
slug: TYPESCRIPT_PLUGIN_SLUG,
3435
packageName,
@@ -38,7 +39,7 @@ export async function typescriptPlugin(
3839
docsUrl: 'https://www.npmjs.com/package/@code-pushup/typescript-plugin/',
3940
icon: 'typescript',
4041
audits: filteredAudits,
41-
// groups: filteredGroups,
42+
groups: filteredGroups,
4243
runner: createRunnerFunction({
4344
tsConfigPath,
4445
filteredAudits

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

Lines changed: 69 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
1-
import {access, readFile} from 'node:fs/promises';
1+
import {access} from 'node:fs/promises';
22
import {dirname} from 'node:path';
33
import {
44
type CompilerOptions,
5-
type TsConfigSourceFile,
5+
parseConfigFileTextToJson,
6+
type ParsedCommandLine,
67
parseJsonConfigFileContent,
7-
sys, readConfigFile, parseConfigFileTextToJson, type ParsedCommandLine,
8+
sys,
89
} from 'typescript';
9-
import type {Audit, CategoryRef, Group} from '@code-pushup/models';
10-
import {
11-
camelCaseToKebabCase,
12-
executeProcess,
13-
kebabCaseToCamelCase,
14-
readJsonFile,
15-
readTextFile
16-
} from '@code-pushup/utils';
17-
import type {AuditSlug, CompilerOptionName, SemVerString, TypescriptPluginOptions} from './types.js';
10+
import type {CategoryRef, CategoryRef, CategoryRef, Group} from '@code-pushup/models';
11+
import {camelCaseToKebabCase, executeProcess, kebabCaseToCamelCase, readTextFile} from '@code-pushup/utils';
12+
import type {AuditSlug, SemVerString, TypescriptPluginOptions} from './types.js';
1813
import {TS_ERROR_CODES} from "./runner/ts-error-codes.js";
19-
import {AUDITS, DEFAULT_TS_CONFIG} from "./constants";
20-
import {getTsConfigurationFromPath} from "./runner/typescript-runner";
14+
import {DEFAULT_TS_CONFIG, GROUPS, TYPESCRIPT_PLUGIN_SLUG} from "./constants.js";
2115

2216

2317
export function filterAuditsBySlug(slugs?: string[]) {
@@ -29,11 +23,30 @@ export function filterAuditsBySlug(slugs?: string[]) {
2923
};
3024
}
3125

26+
/**
27+
* It transforms a slug code to a compiler option format
28+
* By default, kebabCabeToCamelCase.
29+
* It will handle also cases like emit-bom that it should be emit-BOM
30+
* @param slug Slug to be transformed
31+
* @returns The slug as compilerOption key
32+
*/
33+
export function auditSlugToCompilerOption(slug: string): string {
34+
switch (slug) {
35+
case 'emit-bom':
36+
return 'emitBOM';
37+
default:
38+
return kebabCaseToCamelCase(slug);
39+
}
40+
}
41+
3242
export function filterAuditsByTsOptions(compilerOptions: CompilerOptions, onlyAudits?: string[]) {
3343
return ({slug}: { slug: string }) => {
34-
35-
const compilerOptionName = slug === 'emit-bom' ? 'emitBOM' : kebabCaseToCamelCase(slug) as CompilerOptionName;
36-
const option = compilerOptions[compilerOptionName];
44+
const option = compilerOptions[auditSlugToCompilerOption(slug)];
45+
if (slug === 'emit-bom') {
46+
console.log('-----------------------')
47+
console.log(option, slug)
48+
console.log((option !== false && option !== undefined) && filterAuditsBySlug(onlyAudits))
49+
}
3750
return (option !== false && option !== undefined) && filterAuditsBySlug(onlyAudits);
3851
};
3952
}
@@ -42,8 +55,45 @@ export function filterGroupsByAuditSlug(slugs?: string[]) {
4255
return ({refs}: Group) => refs.some(filterAuditsBySlug(slugs));
4356
}
4457

45-
export function filterGroupsByByTsOptions(compilerOptions: CompilerOptions, onlyAudits?: string[]) {
46-
return ({refs}: Group) => refs.some(filterAuditsByTsOptions(compilerOptions, onlyAudits));
58+
export function filterGroupsByTsOptions(compilerOptions: CompilerOptions, onlyAudits?: string[]) {
59+
console.log(compilerOptions.emitBOM);
60+
console.log(filterAuditsByTsOptions(compilerOptions, onlyAudits), 'filtered')
61+
console.log('nuevoo')
62+
return ({refs}: Group) => refs.filter(filterAuditsByTsOptions(compilerOptions, onlyAudits));
63+
}
64+
65+
66+
export function getGroups(compilerOptions: CompilerOptions, onlyAudits?: string[]) {
67+
return GROUPS
68+
.map(group => ({
69+
...group,
70+
refs: group.refs.filter(filterAuditsByTsOptions(compilerOptions, onlyAudits))
71+
}))
72+
.filter(group => group.refs.length > 0);
73+
}
74+
75+
/**
76+
* Retrieve the category references from the groups (already processed from the audits).
77+
* Used in the code-pushup preset
78+
* @param opt TSPluginOptions
79+
* @returns The array of category references
80+
*/
81+
export async function getCategoryRefsFromGroups(opt?: TypescriptPluginOptions): Promise<CategoryRef[]> {
82+
83+
const definitive = await getCompilerOptionsToDetermineListedAudits(opt);
84+
85+
return GROUPS
86+
.map(group => ({
87+
...group,
88+
refs: group.refs.filter(filterAuditsByTsOptions(definitive, opt?.onlyAudits))
89+
}))
90+
.filter(group => group.refs.length > 0)
91+
.map(({slug}) => ({
92+
plugin: TYPESCRIPT_PLUGIN_SLUG,
93+
slug,
94+
weight: 1,
95+
type: 'group',
96+
}));
4797
}
4898

4999
export async function getCurrentTsVersion(): Promise<SemVerString> {

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import { describe, expect, it } from 'vitest';
22
import type { Audit, Group } from '@code-pushup/models';
3-
import { filterAuditsBySlug, filterGroupsByAuditSlug, handleCompilerOptionStrict } from './utils.js';
3+
import {
4+
filterAuditsBySlug,
5+
filterGroupsByAuditSlug,
6+
filterGroupsByTsOptions,
7+
handleCompilerOptionStrict
8+
} from './utils.js';
49
import type { CompilerOptions } from 'typescript';
10+
import {GROUPS} from "./constants";
511

612
describe('filterAuditsBySlug', () => {
713
const mockAudits: Audit[] = [
@@ -124,3 +130,14 @@ describe('handleCompilerOptionStrict', () => {
124130
expect(result.noImplicitAny).toBe(true);
125131
});
126132
});
133+
134+
describe('filterGroupsByTsOptions', () => {
135+
it('should filter the groups correctly', () => {
136+
expect(GROUPS.filter(filterGroupsByTsOptions({strict: false}, []))).toStrictEqual(expect.arrayContaining([expect.objectContaining({
137+
strict: expect.objectContaining({
138+
"slug": "strict-null-checks",
139+
"weight": 1,
140+
})
141+
})]));
142+
});
143+
})

0 commit comments

Comments
 (0)