1
- import { QualifiedRules , RuleConfigSeverity } from '@commitlint/types' ;
1
+ import {
2
+ QualifiedRules ,
3
+ RuleConfigSeverity ,
4
+ EnumRuleOptions ,
5
+ EnumRuleExtendableOptions ,
6
+ } from '@commitlint/types' ;
2
7
import { RuleEntry } from './types' ;
3
8
4
9
/**
@@ -25,7 +30,7 @@ export function getRulePrefix(id: string): string | null {
25
30
* Get a predicate matching rule definitions with a given name
26
31
*/
27
32
export function getHasName ( name : string ) {
28
- return < T extends RuleEntry > (
33
+ return < C = unknown , T extends RuleEntry < C > = RuleEntry < C > > (
29
34
rule : RuleEntry
30
35
) : rule is Exclude < T , [ string , undefined ] > => getRuleName ( rule [ 0 ] ) === name ;
31
36
}
@@ -35,7 +40,10 @@ export function getHasName(name: string) {
35
40
* @param rule to check
36
41
* @return if the rule definition is active
37
42
*/
38
- export function ruleIsActive < T extends RuleEntry > (
43
+ export function ruleIsActive <
44
+ C = unknown ,
45
+ T extends RuleEntry < C > = RuleEntry < C >
46
+ > (
39
47
rule : T
40
48
) : rule is Exclude < T , [ string , Readonly < [ RuleConfigSeverity . Disabled ] > ] > {
41
49
const [ , value ] = rule ;
@@ -50,11 +58,11 @@ export function ruleIsActive<T extends RuleEntry>(
50
58
* @param rule to check
51
59
* @return if the rule definition is applicable
52
60
*/
53
- export function ruleIsApplicable (
54
- rule : RuleEntry
61
+ export function ruleIsApplicable < C > (
62
+ rule : RuleEntry < C >
55
63
) : rule is
56
64
| [ string , Readonly < [ RuleConfigSeverity , 'always' ] > ]
57
- | [ string , Readonly < [ RuleConfigSeverity , 'always' , unknown ] > ] {
65
+ | [ string , Readonly < [ RuleConfigSeverity , 'always' , C ] > ] {
58
66
const [ , value ] = rule ;
59
67
if ( value && Array . isArray ( value ) ) {
60
68
return value [ 1 ] === 'always' ;
@@ -79,19 +87,32 @@ export function ruleIsNotApplicable(
79
87
return false ;
80
88
}
81
89
90
+ function enumConfigIsExtendable (
91
+ config ?: EnumRuleOptions
92
+ ) : config is EnumRuleExtendableOptions {
93
+ return ! Array . isArray ( config ) ;
94
+ }
95
+
82
96
export function enumRuleIsActive (
83
- rule : RuleEntry
97
+ rule : RuleEntry < EnumRuleOptions >
84
98
) : rule is [
85
99
string ,
86
100
Readonly <
87
- [ RuleConfigSeverity . Warning | RuleConfigSeverity . Error , 'always' , string [ ] ]
101
+ [
102
+ RuleConfigSeverity . Warning | RuleConfigSeverity . Error ,
103
+ 'always' ,
104
+ EnumRuleOptions
105
+ ]
88
106
>
89
107
] {
108
+ let config : EnumRuleOptions | undefined ;
90
109
return (
91
110
ruleIsActive ( rule ) &&
92
111
ruleIsApplicable ( rule ) &&
93
- Array . isArray ( rule [ 1 ] [ 2 ] ) &&
94
- rule [ 1 ] [ 2 ] . length > 0
112
+ ! ! ( config = rule [ 1 ] [ 2 ] ) &&
113
+ ( ! enumConfigIsExtendable ( config )
114
+ ? config . length > 0
115
+ : Array . isArray ( config . values ) && config . values . length > 0 )
95
116
) ;
96
117
}
97
118
@@ -101,9 +122,12 @@ export function enumRuleIsActive(
101
122
* @param rules rules to search in
102
123
* @return rules matching the prefix search
103
124
*/
104
- export function getRules ( prefix : string , rules : QualifiedRules ) : RuleEntry [ ] {
125
+ export function getRules < C = unknown > (
126
+ prefix : string ,
127
+ rules : QualifiedRules
128
+ ) : RuleEntry < C > [ ] {
105
129
return Object . entries ( rules ) . filter (
106
- ( rule ) : rule is RuleEntry => getRulePrefix ( rule [ 0 ] ) === prefix
130
+ ( rule ) : rule is RuleEntry < C > => getRulePrefix ( rule [ 0 ] ) === prefix
107
131
) ;
108
132
}
109
133
0 commit comments