5
5
'use strict'
6
6
7
7
const utils = require ( '../utils' )
8
- const { findVariable } = require ( '@eslint-community/eslint-utils' )
8
+ const { ReferenceTracker } = require ( '@eslint-community/eslint-utils' )
9
9
10
+ /**
11
+ * @typedef {import('@eslint-community/eslint-utils').TYPES.TraceMap } TraceMap
12
+ */
13
+
14
+ /** @type {TraceMap } */
15
+ const deletedImportApisMap = {
16
+ set : {
17
+ [ ReferenceTracker . CALL ] : true
18
+ } ,
19
+ del : {
20
+ [ ReferenceTracker . CALL ] : true
21
+ }
22
+ }
10
23
const deprecatedApis = new Set ( [ 'set' , 'delete' ] )
11
- const deprecatedImportApis = new Set ( [ 'set' , 'del' ] )
12
24
const deprecatedDollarApis = new Set ( [ '$set' , '$delete' ] )
13
25
14
26
/**
@@ -63,59 +75,6 @@ module.exports = {
63
75
return identifier . parent . parent
64
76
}
65
77
66
- // Vue 3 Global API
67
- if (
68
- identifier . parent . type === 'CallExpression' &&
69
- identifier . parent . callee === identifier
70
- ) {
71
- const variable = findVariable (
72
- utils . getScope ( context , identifier ) ,
73
- identifier
74
- )
75
-
76
- if ( variable != null && variable . defs . length === 1 ) {
77
- const def = variable . defs [ 0 ]
78
-
79
- // import { set as st } from 'vue'; st()
80
- if (
81
- def . type === 'ImportBinding' &&
82
- def . node . type === 'ImportSpecifier' &&
83
- def . node . imported . type === 'Identifier' &&
84
- deprecatedImportApis . has ( def . node . imported . name ) &&
85
- def . node . parent . type === 'ImportDeclaration' &&
86
- def . node . parent . source . value === 'vue'
87
- ) {
88
- return identifier . parent
89
- }
90
-
91
- // const { set, delete } = require('vue'); set()
92
- if (
93
- def . type === 'Variable' &&
94
- def . node . type === 'VariableDeclarator' &&
95
- def . node . id . type === 'ObjectPattern' &&
96
- def . node . init ?. type === 'CallExpression' &&
97
- def . node . init . callee . type === 'Identifier' &&
98
- def . node . init . callee . name === 'require' &&
99
- def . node . init . arguments . length === 1 &&
100
- def . node . init . arguments [ 0 ] . type === 'Literal' &&
101
- def . node . init . arguments [ 0 ] . value === 'vue'
102
- ) {
103
- const properties = def . node . id . properties
104
- for ( const prop of properties ) {
105
- if (
106
- prop . type === 'Property' &&
107
- prop . key . type === 'Identifier' &&
108
- deprecatedImportApis . has ( prop . key . name ) &&
109
- prop . value . type === 'Identifier' &&
110
- prop . value . name === identifier . name
111
- ) {
112
- return identifier . parent
113
- }
114
- }
115
- }
116
- }
117
- }
118
-
119
78
return undefined
120
79
}
121
80
@@ -136,7 +95,44 @@ module.exports = {
136
95
137
96
return utils . compositingVisitors (
138
97
utils . defineVueVisitor ( context , nodeVisitor ) ,
139
- utils . defineScriptSetupVisitor ( context , nodeVisitor )
98
+ utils . defineScriptSetupVisitor ( context , nodeVisitor ) ,
99
+ {
100
+ /** @param {Program } node */
101
+ Program ( node ) {
102
+ const tracker = new ReferenceTracker ( utils . getScope ( context , node ) )
103
+
104
+ // import { set } from 'vue'; set()
105
+ const esmTraceMap = {
106
+ vue : {
107
+ [ ReferenceTracker . ESM ] : true ,
108
+ ...deletedImportApisMap
109
+ }
110
+ }
111
+
112
+ for ( const { node } of tracker . iterateEsmReferences ( esmTraceMap ) ) {
113
+ const refNode = /** @type {CallExpression } */ ( node )
114
+ context . report ( {
115
+ node : refNode . callee ,
116
+ messageId : 'deprecated'
117
+ } )
118
+ }
119
+
120
+ // const { set } = require('vue'); set()
121
+ const cjsTraceMap = {
122
+ vue : {
123
+ ...deletedImportApisMap
124
+ }
125
+ }
126
+
127
+ for ( const { node } of tracker . iterateCjsReferences ( cjsTraceMap ) ) {
128
+ const refNode = /** @type {CallExpression } */ ( node )
129
+ context . report ( {
130
+ node : refNode . callee ,
131
+ messageId : 'deprecated'
132
+ } )
133
+ }
134
+ }
135
+ }
140
136
)
141
137
}
142
138
}
0 commit comments