1- import { ESLintUtils , TSESTree } from '@typescript-eslint/experimental-utils' ;
2- import { getDocsUrl , hasTestingLibraryImportModule } from '../utils ' ;
1+ import { TSESTree } from '@typescript-eslint/experimental-utils' ;
2+ import { createTestingLibraryRule } from '../create-testing-library-rule ' ;
33import {
4- isImportSpecifier ,
54 isIdentifier ,
65 isMemberExpression ,
6+ getSpecifierFromImport ,
77} from '../node-utils' ;
88
99export const RULE_NAME = 'prefer-user-event' ;
@@ -65,7 +65,7 @@ function buildErrorMessage(fireEventMethod: string) {
6565
6666const fireEventMappedMethods = Object . keys ( MappingToUserEvent ) ;
6767
68- export default ESLintUtils . RuleCreator ( getDocsUrl ) < Options , MessageIds > ( {
68+ export default createTestingLibraryRule < Options , MessageIds > ( {
6969 name : RULE_NAME ,
7070 meta : {
7171 type : 'suggestion' ,
@@ -90,59 +90,38 @@ export default ESLintUtils.RuleCreator(getDocsUrl)<Options, MessageIds>({
9090 } ,
9191 defaultOptions : [ { allowedMethods : [ ] } ] ,
9292
93- create ( context , [ options ] ) {
93+ create ( context , [ options ] , helpers ) {
9494 const { allowedMethods } = options ;
9595 const sourceCode = context . getSourceCode ( ) ;
96- let hasNamedImportedFireEvent = false ;
97- let hasImportedFireEvent = false ;
98- let fireEventAlias : string | undefined ;
99- let wildcardImportName : string | undefined ;
10096
10197 return {
102- // checks if import has shape:
103- // import { fireEvent } from '@testing-library/dom';
104- ImportDeclaration ( node : TSESTree . ImportDeclaration ) {
105- if ( ! hasTestingLibraryImportModule ( node ) ) {
106- return ;
107- }
108- const fireEventImport = node . specifiers . find (
109- ( node ) =>
110- isImportSpecifier ( node ) && node . imported . name === 'fireEvent'
111- ) ;
112- hasNamedImportedFireEvent = ! ! fireEventImport ;
113- if ( ! hasNamedImportedFireEvent ) {
98+ [ 'CallExpression > MemberExpression' ] ( node : TSESTree . MemberExpression ) {
99+ if ( ! helpers . getIsTestingLibraryImported ( ) ) {
114100 return ;
115101 }
116- fireEventAlias = fireEventImport . local . name ;
117- } ,
102+ const testingLibraryImportNode = helpers . getTestingLibraryImportNode ( ) ;
103+ const fireEventAliasOrWildcard = getSpecifierFromImport (
104+ testingLibraryImportNode ,
105+ 'fireEvent'
106+ ) ?. local . name ;
118107
119- // checks if import has shape:
120- // import * as dom from '@testing-library/dom';
121- 'ImportDeclaration ImportNamespaceSpecifier' (
122- node : TSESTree . ImportNamespaceSpecifier
123- ) {
124- const importDeclarationNode = node . parent as TSESTree . ImportDeclaration ;
125- if ( ! hasTestingLibraryImportModule ( importDeclarationNode ) ) {
108+ if ( ! fireEventAliasOrWildcard ) {
109+ // testing library was imported, but fireEvent was not imported
126110 return ;
127111 }
128- hasImportedFireEvent = ! ! node . local . name ;
129- wildcardImportName = node . local . name ;
130- } ,
131- [ 'CallExpression > MemberExpression' ] ( node : TSESTree . MemberExpression ) {
132- if ( ! hasImportedFireEvent && ! hasNamedImportedFireEvent ) {
133- return ;
134- }
135- // check node is fireEvent or it's alias from the named import
136112 const fireEventUsed =
137- isIdentifier ( node . object ) && node . object . name === fireEventAlias ;
113+ isIdentifier ( node . object ) &&
114+ node . object . name === fireEventAliasOrWildcard ;
115+
138116 const fireEventFromWildcardUsed =
139117 isMemberExpression ( node . object ) &&
140118 isIdentifier ( node . object . object ) &&
141- node . object . object . name === wildcardImportName &&
119+ node . object . object . name === fireEventAliasOrWildcard &&
142120 isIdentifier ( node . object . property ) &&
143121 node . object . property . name === 'fireEvent' ;
144122
145123 if ( ! fireEventUsed && ! fireEventFromWildcardUsed ) {
124+ // fireEvent was imported but it was not used
146125 return ;
147126 }
148127
0 commit comments