5
5
6
6
'use strict' ;
7
7
8
- const { default : traverse } = require ( '@babel/traverse' ) ;
9
-
10
- const elementName = ( node , scope ) => {
11
- const identifiers = [ ] ;
12
-
13
- traverse ( node , {
14
- JSXOpeningElement ( { node : element } ) {
15
- traverse ( element , {
16
- JSXIdentifier ( { node : identifier } ) {
17
- if ( identifier . parent . type === 'JSXOpeningElement'
18
- || identifier . parent . type === 'JSXMemberExpression' ) {
19
- identifiers . push ( identifier . name ) ;
20
- }
21
- } ,
22
- } , scope ) ;
23
- } ,
24
- } , scope ) ;
8
+ const elementName = ( node ) => {
9
+ const reversedIdentifiers = [ ] ;
10
+ if (
11
+ node . type === 'JSXElement'
12
+ && node . openingElement . type === 'JSXOpeningElement'
13
+ ) {
14
+ let object = node . openingElement . name ;
15
+ while ( object . type === 'JSXMemberExpression' ) {
16
+ if ( object . property . type === 'JSXIdentifier' ) {
17
+ reversedIdentifiers . push ( object . property . name ) ;
18
+ }
19
+ object = object . object ;
20
+ }
21
+
22
+ if ( object . type === 'JSXIdentifier' ) {
23
+ reversedIdentifiers . push ( object . name ) ;
24
+ }
25
+ }
26
+
27
+ return reversedIdentifiers . reverse ( ) . join ( '.' ) ;
28
+ } ;
29
+
30
+ const hasAllowedParent = ( parent , allowedElements ) => {
31
+ let curNode = parent ;
32
+
33
+ while ( curNode ) {
34
+ if ( curNode . type === 'JSXElement' ) {
35
+ const name = elementName ( curNode ) ;
36
+ if ( allowedElements . includes ( name ) ) {
37
+ return true ;
38
+ }
39
+ }
40
+ curNode = curNode . parent ;
41
+ }
25
42
26
- return identifiers . join ( '.' ) ;
43
+ return false ;
27
44
} ;
28
45
29
46
function create ( context ) {
@@ -49,8 +66,7 @@ function create(context) {
49
66
50
67
const hasOnlyLineBreak = ( value ) => / ^ [ \r \n \t \f \v ] + $ / . test ( value . replace ( / / g, '' ) ) ;
51
68
52
- const scope = context . getScope ( ) ;
53
- const getValidation = ( node ) => ! allowedElements . includes ( elementName ( node . parent , scope ) ) ;
69
+ const getValidation = ( node ) => ! hasAllowedParent ( node . parent , allowedElements ) ;
54
70
55
71
return {
56
72
Literal ( node ) {
0 commit comments