1
1
import type { TSESTree } from "@typescript-eslint/types"
2
+ import type { AST } from "svelte-eslint-parser"
2
3
import { createRule } from "../utils"
3
4
4
5
export default createRule ( "prefer-destructured-store-props" , {
5
6
meta : {
6
7
docs : {
7
- description : "" ,
8
+ description :
9
+ "Destructure values from object stores for better change tracking & fewer redraws" ,
8
10
category : "Best Practices" ,
9
11
recommended : false ,
10
12
} ,
@@ -17,43 +19,60 @@ export default createRule("prefer-destructured-store-props", {
17
19
type : "suggestion" ,
18
20
} ,
19
21
create ( context ) {
22
+ let script : AST . SvelteScriptElement
23
+ const reports : TSESTree . MemberExpression [ ] = [ ]
24
+
20
25
return {
26
+ [ `SvelteScriptElement` ] ( node : AST . SvelteScriptElement ) {
27
+ script = node
28
+ } ,
29
+
21
30
// {$foo.bar + baz}
22
31
// should be
23
32
// $: ({ bar } = $foo);
24
33
// {bar + baz}
25
34
[ `MemberExpression[object.name=/^\\$/][property.type="Identifier"]` ] (
26
35
node : TSESTree . MemberExpression ,
27
36
) {
28
- const store = ( node . object as TSESTree . Identifier ) . name
29
- const prop = ( node . property as TSESTree . Identifier ) . name
37
+ reports . push ( node )
38
+ } ,
30
39
31
- return context . report ( {
32
- node,
33
- messageId : "useDestructuring" ,
34
- data : {
35
- store,
36
- prop,
37
- } ,
38
- suggest : [
39
- {
40
- messageId : "fixUseDestructuring" ,
41
- data : {
42
- store,
43
- prop,
44
- } ,
40
+ [ `Program:exit` ] ( ) {
41
+ reports . forEach ( ( node ) => {
42
+ const store = ( node . object as TSESTree . Identifier ) . name
43
+ const prop = ( node . property as TSESTree . Identifier ) . name
45
44
46
- fix ( fixer ) {
47
- return [
48
- fixer . insertTextBefore (
49
- node ,
50
- `$: ({ ${ prop } } = ${ store } );\n` ,
51
- ) ,
52
- fixer . replaceText ( node , prop ) ,
53
- ]
54
- } ,
45
+ context . report ( {
46
+ node,
47
+ messageId : "useDestructuring" ,
48
+ data : {
49
+ store,
50
+ prop,
55
51
} ,
56
- ] ,
52
+ suggest : [
53
+ {
54
+ messageId : "fixUseDestructuring" ,
55
+ data : {
56
+ store,
57
+ prop,
58
+ } ,
59
+
60
+ fix ( fixer ) {
61
+ if ( ! script || ! script . endTag ) {
62
+ return [ ]
63
+ }
64
+
65
+ return [
66
+ fixer . insertTextAfterRange (
67
+ [ script . endTag . range [ 0 ] , script . endTag . range [ 0 ] ] ,
68
+ `$: ({ ${ prop } } = ${ store } );\n` ,
69
+ ) ,
70
+ fixer . replaceText ( node , prop ) ,
71
+ ]
72
+ } ,
73
+ } ,
74
+ ] ,
75
+ } )
57
76
} )
58
77
} ,
59
78
}
0 commit comments