@@ -29,58 +29,68 @@ module.exports = {
29
29
} ,
30
30
31
31
create ( context ) {
32
- const options = context . options [ 0 ]
33
- const optSpaces = options !== 'never'
34
- const template = context . parserServices . getTemplateBodyTokenStore && context . parserServices . getTemplateBodyTokenStore ( )
35
-
36
- // ----------------------------------------------------------------------
37
- // Helpers
38
- // ----------------------------------------------------------------------
39
-
40
- function checkTokens ( leftToken , rightToken ) {
41
- if ( leftToken . loc . end . line === rightToken . loc . start . line ) {
42
- const spaces = rightToken . loc . start . column - leftToken . loc . end . column
43
- const noSpacesFound = spaces === 0
44
-
45
- if ( optSpaces === noSpacesFound ) {
46
- context . report ( {
47
- node : rightToken ,
48
- loc : {
49
- start : leftToken . loc . end ,
50
- end : rightToken . loc . start
51
- } ,
52
- message : 'Found {{spaces}} whitespaces, {{type}} expected.' ,
53
- data : {
54
- spaces : spaces === 0 ? 'none' : spaces ,
55
- type : optSpaces ? '1' : 'none'
56
- } ,
57
- fix : ( fixer ) => fixer . replaceTextRange ( [ leftToken . range [ 1 ] , rightToken . range [ 0 ] ] , optSpaces ? ' ' : '' )
58
- } )
59
- }
60
- }
61
- }
32
+ const options = context . options [ 0 ] || 'always'
33
+ const template =
34
+ context . parserServices . getTemplateBodyTokenStore &&
35
+ context . parserServices . getTemplateBodyTokenStore ( )
62
36
63
37
// ----------------------------------------------------------------------
64
38
// Public
65
39
// ----------------------------------------------------------------------
66
40
67
41
return utils . defineTemplateBodyVisitor ( context , {
68
42
'VExpressionContainer[expression!=null]' ( node ) {
69
- const tokens = template . getTokens ( node , {
70
- includeComments : true ,
71
- filter : token => token . type !== 'HTMLWhitespace' // When there is only whitespace between ignore it
72
- } )
43
+ const openBrace = template . getFirstToken ( node )
44
+ const closeBrace = template . getLastToken ( node )
45
+
46
+ if (
47
+ ! openBrace ||
48
+ ! closeBrace ||
49
+ openBrace . type !== 'VExpressionStart' ||
50
+ closeBrace . type !== 'VExpressionEnd'
51
+ ) {
52
+ return
53
+ }
73
54
74
- const startToken = tokens . shift ( )
75
- if ( ! startToken || startToken . type !== 'VExpressionStart' ) return
76
- const endToken = tokens . pop ( )
77
- if ( ! endToken || endToken . type !== 'VExpressionEnd' ) return
55
+ const firstToken = template . getTokenAfter ( openBrace , { includeComments : true } )
56
+ const lastToken = template . getTokenBefore ( closeBrace , { includeComments : true } )
78
57
79
- if ( tokens . length > 0 ) {
80
- checkTokens ( startToken , tokens [ 0 ] )
81
- checkTokens ( tokens [ tokens . length - 1 ] , endToken )
58
+ if ( options === 'always' ) {
59
+ if ( openBrace . range [ 1 ] === firstToken . range [ 0 ] ) {
60
+ context . report ( {
61
+ node : openBrace ,
62
+ message : "Expected 1 space after '{{', but not found." ,
63
+ fix : ( fixer ) => fixer . insertTextAfter ( openBrace , ' ' )
64
+ } )
65
+ }
66
+ if ( closeBrace . range [ 0 ] === lastToken . range [ 1 ] ) {
67
+ context . report ( {
68
+ node : closeBrace ,
69
+ message : "Expected 1 space before '}}', but not found." ,
70
+ fix : ( fixer ) => fixer . insertTextBefore ( closeBrace , ' ' )
71
+ } )
72
+ }
82
73
} else {
83
- checkTokens ( startToken , endToken )
74
+ if ( openBrace . range [ 1 ] !== firstToken . range [ 0] ) {
75
+ context . report ( {
76
+ loc : {
77
+ start : openBrace . loc . start ,
78
+ end : firstToken . loc . start
79
+ } ,
80
+ message : "Expected no space after '{{', but found." ,
81
+ fix : ( fixer ) => fixer . removeRange ( [ openBrace . range [ 1 ] , firstToken . range [ 0 ] ] )
82
+ } )
83
+ }
84
+ if ( closeBrace . range [ 0 ] !== lastToken . range [ 1 ] ) {
85
+ context . report ( {
86
+ loc : {
87
+ start : lastToken . loc . end ,
88
+ end : closeBrace . loc . end
89
+ } ,
90
+ message : "Expected no space before '}}', but found." ,
91
+ fix : ( fixer ) => fixer . removeRange ( [ lastToken . range [ 1 ] , closeBrace . range [ 0 ] ] )
92
+ } )
93
+ }
84
94
}
85
95
}
86
96
} )
0 commit comments