-
-
Notifications
You must be signed in to change notification settings - Fork 681
/
Copy pathno-deprecated-model-definition.js
112 lines (103 loc) · 2.69 KB
/
no-deprecated-model-definition.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/**
* @author Flo Edelmann
* See LICENSE file in root directory for full license.
*/
'use strict'
const utils = require('../utils')
/**
* @param {RuleContext} context
* @param {ASTNode} node
*/
function reportWithoutSuggestion(context, node) {
context.report({
node,
messageId: 'deprecatedModel'
})
}
/**
* @param {ObjectExpression} node
* @param {string} key
* @returns {Literal | undefined}
*/
function findPropertyValue(node, key) {
const property = node.properties.find(
(property) =>
property.type === 'Property' &&
property.key.type === 'Identifier' &&
property.key.name === key
)
if (
!property ||
property.type !== 'Property' ||
property.value.type !== 'Literal'
) {
return undefined
}
return property.value
}
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'disallow deprecated `model` definition (in Vue.js 3.0.0+)',
categories: undefined,
url: 'https://eslint.vuejs.org/rules/no-deprecated-model-definition.html'
},
fixable: null,
hasSuggestions: true,
schema: [
{
type: 'object',
additionalProperties: false,
properties: {
allowVue3Compat: {
type: 'boolean'
}
}
}
],
messages: {
deprecatedModel: '`model` definition is deprecated.',
renameEvent: 'Rename event to `{{expectedEventName}}`.'
}
},
/** @param {RuleContext} context */
create(context) {
const allowVue3Compat = Boolean(context.options[0]?.allowVue3Compat)
return utils.executeOnVue(context, (obj) => {
const modelProperty = utils.findProperty(obj, 'model')
if (!modelProperty || modelProperty.value.type !== 'ObjectExpression') {
return
}
if (!allowVue3Compat) {
reportWithoutSuggestion(context, modelProperty)
return
}
const propName = findPropertyValue(modelProperty.value, 'prop')
const eventName = findPropertyValue(modelProperty.value, 'event')
if (!propName || !eventName) {
reportWithoutSuggestion(context, modelProperty)
return
}
const expectedEventName = `update:${propName.value}`
if (eventName.value !== expectedEventName) {
context.report({
node: modelProperty,
messageId: 'deprecatedModel',
suggest: [
{
messageId: 'renameEvent',
data: { expectedEventName },
fix(fixer) {
return fixer.replaceTextRange(
[eventName.range[0] + 1, eventName.range[1] - 1],
expectedEventName
)
}
}
]
})
}
})
}
}