@@ -8,22 +8,8 @@ import {
88import { allRules } from './rules/index.js' ;
99import { resolvePreset , getPresetNames } from './presets.js' ;
1010
11- const ALL_RULE_IDS = [
12- 'unused-imports' ,
13- 'complexity-hotspot' ,
14- 'optional-chaining' ,
15- 'boolean-simplification' ,
16- 'early-return' ,
17- 'no-debugger' ,
18- 'no-empty-catch' ,
19- 'no-useless-return' ,
20- 'ts-diagnostics' ,
21- 'no-console' ,
22- 'no-empty-function' ,
23- 'duplicate-imports' ,
24- 'no-unreachable-after-return' ,
25- 'no-throw-literal' ,
26- ] ;
11+ // Canonical rule ID list — add new rule IDs here when adding rules
12+ const ALL_RULE_IDS = allRules . map ( ( r ) => r . id ) . sort ( ) ;
2713
2814describe ( 'parseConfig' , ( ) => {
2915 it ( 'parses a valid config' , ( ) => {
@@ -168,3 +154,63 @@ describe('cliRulesToConfig', () => {
168154 expect ( config [ 'no-debugger' ] ) . toBe ( 'warn' ) ;
169155 } ) ;
170156} ) ;
157+
158+ describe ( 'rule-system alignment' , ( ) => {
159+ it ( 'every rule in allRules is present in DEFAULT_CONFIG' , ( ) => {
160+ const defaults = mergeConfig ( null ) ;
161+ for ( const rule of allRules ) {
162+ expect ( defaults , `rule "${ rule . id } " missing from DEFAULT_CONFIG` ) . toHaveProperty ( rule . id ) ;
163+ }
164+ } ) ;
165+
166+ it ( 'DEFAULT_CONFIG has no entries for unknown rules' , ( ) => {
167+ const defaults = mergeConfig ( null ) ;
168+ const ruleIdSet = new Set ( allRules . map ( ( r ) => r . id ) ) ;
169+ for ( const key of Object . keys ( defaults ) ) {
170+ expect ( ruleIdSet . has ( key ) , `DEFAULT_CONFIG contains unknown rule "${ key } "` ) . toBe ( true ) ;
171+ }
172+ } ) ;
173+
174+ it ( 'every preset references only known rule IDs' , ( ) => {
175+ const ruleIdSet = new Set ( allRules . map ( ( r ) => r . id ) ) ;
176+ for ( const presetName of getPresetNames ( ) ) {
177+ const config = resolvePreset ( presetName ) ! ;
178+ for ( const key of Object . keys ( config ) ) {
179+ expect ( ruleIdSet . has ( key ) , `preset "${ presetName } " references unknown rule "${ key } "` ) . toBe ( true ) ;
180+ }
181+ }
182+ } ) ;
183+
184+ it ( 'every preset covers every rule' , ( ) => {
185+ for ( const presetName of getPresetNames ( ) ) {
186+ const config = resolvePreset ( presetName ) ! ;
187+ for ( const id of ALL_RULE_IDS ) {
188+ expect ( config , `preset "${ presetName } " missing rule "${ id } "` ) . toHaveProperty ( id ) ;
189+ }
190+ }
191+ } ) ;
192+
193+ it ( 'filterRulesByConfig returns consistent results with DEFAULT_CONFIG' , ( ) => {
194+ const defaults = mergeConfig ( null ) ;
195+ const filtered = filterRulesByConfig ( allRules , defaults ) ;
196+ const filteredIds = new Set ( filtered . map ( ( r ) => r . id ) ) ;
197+
198+ for ( const [ id , setting ] of Object . entries ( defaults ) ) {
199+ if ( setting === 'off' ) {
200+ expect ( filteredIds . has ( id ) , `rule "${ id } " is off but still active` ) . toBe ( false ) ;
201+ } else {
202+ expect ( filteredIds . has ( id ) , `rule "${ id } " is ${ setting } but not active` ) . toBe ( true ) ;
203+ }
204+ }
205+ } ) ;
206+
207+ it ( 'allRules has no duplicate IDs' , ( ) => {
208+ const ids = allRules . map ( ( r ) => r . id ) ;
209+ expect ( new Set ( ids ) . size ) . toBe ( ids . length ) ;
210+ } ) ;
211+
212+ it ( 'allRules count matches DEFAULT_CONFIG key count' , ( ) => {
213+ const defaults = mergeConfig ( null ) ;
214+ expect ( Object . keys ( defaults ) . length ) . toBe ( allRules . length ) ;
215+ } ) ;
216+ } ) ;
0 commit comments