1+ function isComponentWithStringLiteral ( node ) {
2+ return (
3+ node . path &&
4+ node . path . type === 'GlimmerPathExpression' &&
5+ node . path . original === 'component' &&
6+ node . params &&
7+ node . params . length > 0 &&
8+ node . params [ 0 ] . type === 'GlimmerStringLiteral' &&
9+ ! ( node . params [ 0 ] . value || '' ) . includes ( '@' )
10+ ) ;
11+ }
12+
113/** @type {import('eslint').Rule.RuleModule } */
214module . exports = {
315 meta : {
@@ -24,88 +36,88 @@ module.exports = {
2436
2537 create ( context ) {
2638 const sourceCode = context . sourceCode || context . getSourceCode ( ) ;
39+ let inAttribute = 0 ;
2740
2841 return {
42+ GlimmerAttrNode ( ) {
43+ inAttribute ++ ;
44+ } ,
45+ 'GlimmerAttrNode:exit' ( ) {
46+ inAttribute -- ;
47+ } ,
48+
2949 GlimmerMustacheStatement ( node ) {
30- if (
31- node . path &&
32- node . path . type === 'GlimmerPathExpression' &&
33- node . path . original === 'component' &&
34- node . params &&
35- node . params . length > 0 &&
36- node . params [ 0 ] . type === 'GlimmerStringLiteral'
37- ) {
38- const componentName = node . params [ 0 ] . value || node . params [ 0 ] . original ;
39- context . report ( {
40- node,
41- messageId : 'noUnnecessaryComponent' ,
42- fix ( fixer ) {
43- const text = sourceCode . getText ( node ) ;
44- // Replace {{component "name" ...rest}} with {{name ...rest}}
45- const restParams = node . params . slice ( 1 ) ;
46- const hashPairs = node . hash ?. pairs || [ ] ;
50+ if ( inAttribute > 0 ) {
51+ return ;
52+ }
53+ if ( ! isComponentWithStringLiteral ( node ) ) {
54+ return ;
55+ }
4756
48- let replacement = `{{${ componentName } ` ;
49- for ( const param of restParams ) {
50- replacement += ` ${ sourceCode . getText ( param ) } ` ;
51- }
52- for ( const pair of hashPairs ) {
53- replacement += ` ${ sourceCode . getText ( pair ) } ` ;
54- }
55- replacement += '}}' ;
57+ const componentName = node . params [ 0 ] . value || node . params [ 0 ] . original ;
58+ context . report ( {
59+ node,
60+ messageId : 'noUnnecessaryComponent' ,
61+ fix ( fixer ) {
62+ const restParams = node . params . slice ( 1 ) ;
63+ const hashPairs = node . hash ?. pairs || [ ] ;
5664
57- return fixer . replaceText ( node , replacement ) ;
58- } ,
59- } ) ;
60- }
65+ let replacement = `{{${ componentName } ` ;
66+ for ( const param of restParams ) {
67+ replacement += ` ${ sourceCode . getText ( param ) } ` ;
68+ }
69+ for ( const pair of hashPairs ) {
70+ replacement += ` ${ sourceCode . getText ( pair ) } ` ;
71+ }
72+ replacement += '}}' ;
73+
74+ return fixer . replaceText ( node , replacement ) ;
75+ } ,
76+ } ) ;
6177 } ,
6278
6379 GlimmerBlockStatement ( node ) {
64- if (
65- node . path &&
66- node . path . type === 'GlimmerPathExpression' &&
67- node . path . original === 'component' &&
68- node . params &&
69- node . params . length > 0 &&
70- node . params [ 0 ] . type === 'GlimmerStringLiteral'
71- ) {
72- context . report ( {
73- node,
74- messageId : 'noUnnecessaryComponent' ,
75- } ) ;
80+ if ( inAttribute > 0 ) {
81+ return ;
82+ }
83+ if ( ! isComponentWithStringLiteral ( node ) ) {
84+ return ;
7685 }
86+
87+ context . report ( {
88+ node,
89+ messageId : 'noUnnecessaryComponent' ,
90+ } ) ;
7791 } ,
7892
7993 GlimmerSubExpression ( node ) {
80- if (
81- node . path &&
82- node . path . type === 'GlimmerPathExpression' &&
83- node . path . original === 'component' &&
84- node . params &&
85- node . params . length > 0 &&
86- node . params [ 0 ] . type === 'GlimmerStringLiteral'
87- ) {
88- const componentName = node . params [ 0 ] . value || node . params [ 0 ] . original ;
89- context . report ( {
90- node,
91- messageId : 'noUnnecessaryComponent' ,
92- fix ( fixer ) {
93- const restParams = node . params . slice ( 1 ) ;
94- const hashPairs = node . hash ?. pairs || [ ] ;
94+ if ( inAttribute > 0 ) {
95+ return ;
96+ }
97+ if ( ! isComponentWithStringLiteral ( node ) ) {
98+ return ;
99+ }
95100
96- let replacement = `(${ componentName } ` ;
97- for ( const param of restParams ) {
98- replacement += ` ${ sourceCode . getText ( param ) } ` ;
99- }
100- for ( const pair of hashPairs ) {
101- replacement += ` ${ sourceCode . getText ( pair ) } ` ;
102- }
103- replacement += ')' ;
101+ const componentName = node . params [ 0 ] . value || node . params [ 0 ] . original ;
102+ context . report ( {
103+ node,
104+ messageId : 'noUnnecessaryComponent' ,
105+ fix ( fixer ) {
106+ const restParams = node . params . slice ( 1 ) ;
107+ const hashPairs = node . hash ?. pairs || [ ] ;
104108
105- return fixer . replaceText ( node , replacement ) ;
106- } ,
107- } ) ;
108- }
109+ let replacement = `(${ componentName } ` ;
110+ for ( const param of restParams ) {
111+ replacement += ` ${ sourceCode . getText ( param ) } ` ;
112+ }
113+ for ( const pair of hashPairs ) {
114+ replacement += ` ${ sourceCode . getText ( pair ) } ` ;
115+ }
116+ replacement += ')' ;
117+
118+ return fixer . replaceText ( node , replacement ) ;
119+ } ,
120+ } ) ;
109121 } ,
110122 } ;
111123 } ,
0 commit comments