11import type { Audit , CategoryRef , Group } from '@code-pushup/models' ;
2- import { filterItemRefsBy , toArray } from '@code-pushup/utils' ;
2+ import { toArray } from '@code-pushup/utils' ;
33import { LIGHTHOUSE_PLUGIN_SLUG } from './constants.js' ;
44import type { LighthouseCliFlags } from './runner/types.js' ;
55
@@ -70,7 +70,8 @@ export type FilterOptions = Partial<
7070 Pick < LighthouseCliFlags , 'onlyAudits' | 'onlyCategories' | 'skipAudits' >
7171> ;
7272
73- export function filterAuditsAndGroupsByOnlyOptions (
73+ // eslint-disable-next-line max-lines-per-function
74+ export function markSkippedAuditsAndGroups (
7475 audits : Audit [ ] ,
7576 groups : Group [ ] ,
7677 options ?: FilterOptions ,
@@ -84,45 +85,57 @@ export function filterAuditsAndGroupsByOnlyOptions(
8485 onlyCategories = [ ] ,
8586 } = options ?? { } ;
8687
87- // category wins over audits
88+ if (
89+ onlyCategories . length === 0 &&
90+ onlyAudits . length === 0 &&
91+ skipAudits . length === 0
92+ ) {
93+ return { audits, groups } ;
94+ }
95+
8896 if ( onlyCategories . length > 0 ) {
8997 validateOnlyCategories ( groups , onlyCategories ) ;
98+ }
9099
91- const categorySlugs = new Set ( onlyCategories ) ;
92- const filteredGroups : Group [ ] = groups . filter ( ( { slug } ) =>
93- categorySlugs . has ( slug ) ,
94- ) ;
95- const auditSlugsFromRemainingGroups = new Set (
96- filteredGroups . flatMap ( ( { refs } ) => refs . map ( ( { slug } ) => slug ) ) ,
97- ) ;
98- return {
99- audits : audits . filter ( ( { slug } ) =>
100- auditSlugsFromRemainingGroups . has ( slug ) ,
101- ) ,
102- groups : filteredGroups ,
103- } ;
104- } else if ( onlyAudits . length > 0 || skipAudits . length > 0 ) {
100+ if ( onlyAudits . length > 0 || skipAudits . length > 0 ) {
105101 validateAudits ( audits , onlyAudits ) ;
106102 validateAudits ( audits , skipAudits ) ;
107- const onlyAuditSlugs = new Set ( onlyAudits ) ;
108- const skipAuditSlugs = new Set ( skipAudits ) ;
109- const filterAudits = ( { slug } : Pick < Audit , 'slug' > ) =>
110- ! (
111- // audit is NOT in given onlyAuditSlugs
112- (
113- ( onlyAudits . length > 0 && ! onlyAuditSlugs . has ( slug ) ) ||
114- // audit IS in given skipAuditSlugs
115- ( skipAudits . length > 0 && skipAuditSlugs . has ( slug ) )
116- )
117- ) ;
118- return {
119- audits : audits . filter ( filterAudits ) ,
120- groups : filterItemRefsBy ( groups , filterAudits ) ,
121- } ;
122103 }
123- // return unchanged
104+
105+ const onlyGroupSlugs = new Set ( onlyCategories ) ;
106+ const onlyAuditSlugs = new Set ( onlyAudits ) ;
107+ const skipAuditSlugs = new Set ( skipAudits ) ;
108+
109+ const markedGroups : Group [ ] = groups . map ( group => ( {
110+ ...group ,
111+ isSkipped : onlyCategories . length > 0 && ! onlyGroupSlugs . has ( group . slug ) ,
112+ } ) ) ;
113+
114+ const validGroupAuditSlugs = new Set (
115+ markedGroups
116+ . filter ( group => ! group . isSkipped )
117+ . flatMap ( group => group . refs . map ( ref => ref . slug ) ) ,
118+ ) ;
119+
120+ const markedAudits = audits . map ( audit => ( {
121+ ...audit ,
122+ isSkipped :
123+ ( onlyAudits . length > 0 && ! onlyAuditSlugs . has ( audit . slug ) ) ||
124+ ( skipAudits . length > 0 && skipAuditSlugs . has ( audit . slug ) ) ||
125+ ( validGroupAuditSlugs . size > 0 && ! validGroupAuditSlugs . has ( audit . slug ) ) ,
126+ } ) ) ;
127+
128+ const fullyMarkedGroups = markedGroups . map ( group => ( {
129+ ...group ,
130+ isSkipped :
131+ group . isSkipped ||
132+ group . refs . every ( ref =>
133+ markedAudits . some ( audit => audit . slug === ref . slug && audit . isSkipped ) ,
134+ ) ,
135+ } ) ) ;
136+
124137 return {
125- audits,
126- groups,
138+ audits : markedAudits ,
139+ groups : fullyMarkedGroups ,
127140 } ;
128141}
0 commit comments