1
- import type { RuleModule , PartialRuleModule } from '../types.js' ;
1
+ import type { RuleModule , PartialRuleModule , PartialRuleMetaData , RuleContext } from '../types.js' ;
2
+ import { getSvelteContext , type SvelteContext } from '../utils/svelte-context.js' ;
3
+
4
+ function doesNotSatisfy < T > ( actual : T , expected ?: T [ ] ) : boolean {
5
+ if ( expected == null || expected . length === 0 ) {
6
+ return false ;
7
+ }
8
+
9
+ return ! expected . includes ( actual ) ;
10
+ }
11
+
12
+ function satisfiesCondition (
13
+ condition : NonNullable < PartialRuleMetaData [ 'conditions' ] > [ number ] ,
14
+ svelteContext : SvelteContext
15
+ ) : boolean {
16
+ if (
17
+ doesNotSatisfy ( svelteContext . svelteVersion , condition . svelteVersions ) ||
18
+ doesNotSatisfy ( svelteContext . svelteFileType , condition . svelteFileTypes ) ||
19
+ doesNotSatisfy ( svelteContext . runes , condition . runes ) ||
20
+ doesNotSatisfy ( svelteContext . svelteKitVersion , condition . svelteKitVersions ) ||
21
+ doesNotSatisfy ( svelteContext . svelteKitFileType , condition . svelteKitFileTypes )
22
+ ) {
23
+ return false ;
24
+ }
25
+
26
+ return true ;
27
+ }
28
+
29
+ // export for testing
30
+ export function shouldRun (
31
+ svelteContext : SvelteContext | null ,
32
+ conditions : PartialRuleMetaData [ 'conditions' ]
33
+ ) : boolean {
34
+ // If svelteContext is null, it means the rule might be executed based on the analysis result of a different parser.
35
+ // In this case, always execute the rule.
36
+ if ( svelteContext == null || conditions == null || conditions . length === 0 ) {
37
+ return true ;
38
+ }
39
+
40
+ for ( const condition of conditions ) {
41
+ if ( satisfiesCondition ( condition , svelteContext ) ) {
42
+ return true ;
43
+ }
44
+ }
45
+
46
+ return false ;
47
+ }
2
48
3
49
/**
4
50
* Define the rule.
@@ -16,6 +62,14 @@ export function createRule(ruleName: string, rule: PartialRuleModule): RuleModul
16
62
ruleName
17
63
}
18
64
} ,
19
- create : rule . create as never
65
+ create ( context : RuleContext ) {
66
+ const { conditions } = rule . meta ;
67
+ const svelteContext = getSvelteContext ( context ) ;
68
+ if ( ! shouldRun ( svelteContext , conditions ) ) {
69
+ return { } ;
70
+ }
71
+
72
+ return rule . create ( context ) ;
73
+ }
20
74
} ;
21
75
}
0 commit comments