Skip to content

Commit 85043f3

Browse files
committed
feat: use ReferenceTracker
1 parent ce2d8d5 commit 85043f3

File tree

2 files changed

+77
-57
lines changed

2 files changed

+77
-57
lines changed

lib/rules/no-deprecated-delete-set.js

+52-56
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,22 @@
55
'use strict'
66

77
const utils = require('../utils')
8-
const { findVariable } = require('@eslint-community/eslint-utils')
8+
const { ReferenceTracker } = require('@eslint-community/eslint-utils')
99

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+
}
1023
const deprecatedApis = new Set(['set', 'delete'])
11-
const deprecatedImportApis = new Set(['set', 'del'])
1224
const deprecatedDollarApis = new Set(['$set', '$delete'])
1325

1426
/**
@@ -63,59 +75,6 @@ module.exports = {
6375
return identifier.parent.parent
6476
}
6577

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-
11978
return undefined
12079
}
12180

@@ -136,7 +95,44 @@ module.exports = {
13695

13796
return utils.compositingVisitors(
13897
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+
}
140136
)
141137
}
142138
}

tests/lib/rules/no-deprecated-delete-set.js

+25-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ const tester = new RuleTester({
1111
languageOptions: {
1212
parser: require('vue-eslint-parser'),
1313
ecmaVersion: 2020,
14-
sourceType: 'module'
14+
sourceType: 'module',
15+
globals: {
16+
require: 'readonly'
17+
}
1518
}
1619
})
1720

@@ -350,6 +353,27 @@ tester.run('no-deprecated-delete-set', rule, {
350353
line: 6
351354
}
352355
]
356+
},
357+
{
358+
filename: 'test.vue',
359+
code: `
360+
<script setup>
361+
const v = require('vue')
362+
363+
v.set(obj, key, value)
364+
v.del(obj, key)
365+
</script>
366+
`,
367+
errors: [
368+
{
369+
messageId: 'deprecated',
370+
line: 5
371+
},
372+
{
373+
messageId: 'deprecated',
374+
line: 6
375+
}
376+
]
353377
}
354378
]
355379
})

0 commit comments

Comments
 (0)