diff --git a/docs/rules/README.md b/docs/rules/README.md
index 9a54292c9..a8fbe985e 100644
--- a/docs/rules/README.md
+++ b/docs/rules/README.md
@@ -45,6 +45,7 @@ Rules in this category are enabled for all presets provided by eslint-plugin-vue
| [vue/multi-word-component-names](./multi-word-component-names.md) | require component names to be always multi-word | | :three::two::hammer: |
| [vue/no-arrow-functions-in-watch](./no-arrow-functions-in-watch.md) | disallow using arrow functions to define watcher | | :three::two::warning: |
| [vue/no-async-in-computed-properties](./no-async-in-computed-properties.md) | disallow asynchronous actions in computed properties | | :three::two::warning: |
+| [vue/no-child-content](./no-child-content.md) | disallow element's child contents which would be overwritten by a directive like `v-html` or `v-text` | :bulb: | :three::two::warning: |
| [vue/no-computed-properties-in-data](./no-computed-properties-in-data.md) | disallow accessing computed properties in `data`. | | :three::two::warning: |
| [vue/no-custom-modifiers-on-v-model](./no-custom-modifiers-on-v-model.md) | disallow custom modifiers on v-model used on the component | | :two::warning: |
| [vue/no-deprecated-data-object-declaration](./no-deprecated-data-object-declaration.md) | disallow using deprecated object declaration on data (in Vue.js 3.0.0+) | :wrench: | :three::warning: |
@@ -69,27 +70,32 @@ Rules in this category are enabled for all presets provided by eslint-plugin-vue
| [vue/no-dupe-keys](./no-dupe-keys.md) | disallow duplication of field names | | :three::two::warning: |
| [vue/no-dupe-v-else-if](./no-dupe-v-else-if.md) | disallow duplicate conditions in `v-if` / `v-else-if` chains | | :three::two::warning: |
| [vue/no-duplicate-attributes](./no-duplicate-attributes.md) | disallow duplication of attributes | | :three::two::warning: |
-| [vue/no-export-in-script-setup](./no-export-in-script-setup.md) | disallow `export` in `
+```
+
+
+
+
+
+```vue
+
+```
+
+
+
+
+
+```vue
+
+```
+
+
+
+
+
+```vue
+
+```
+
+
+
+
+
+```vue
+
+```
+
+
+
+
+
+```vue
+
+```
+
+
+
+## :mag: Implementation
+
+- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/valid-model-definition.js)
+- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/valid-model-definition.js)
diff --git a/eslint-internal-rules/no-invalid-meta-docs-categories.js b/eslint-internal-rules/no-invalid-meta-docs-categories.js
index b48125484..c95691c36 100644
--- a/eslint-internal-rules/no-invalid-meta-docs-categories.js
+++ b/eslint-internal-rules/no-invalid-meta-docs-categories.js
@@ -18,10 +18,8 @@
*/
function getPropertyFromObject(propertyName, node) {
if (node && node.type === 'ObjectExpression') {
- const properties = node.properties
-
- for (const property of properties) {
- if (property.key.name === propertyName) {
+ for (const property of node.properties) {
+ if (property.type === 'Property' && property.key.name === propertyName) {
return property
}
}
diff --git a/eslint-internal-rules/no-invalid-meta.js b/eslint-internal-rules/no-invalid-meta.js
index f1877ea4b..45057c9bf 100644
--- a/eslint-internal-rules/no-invalid-meta.js
+++ b/eslint-internal-rules/no-invalid-meta.js
@@ -18,10 +18,8 @@
*/
function getPropertyFromObject(propertyName, node) {
if (node && node.type === 'ObjectExpression') {
- const properties = node.properties
-
- for (const property of properties) {
- if (property.key.name === propertyName) {
+ for (const property of node.properties) {
+ if (property.type === 'Property' && property.key.name === propertyName) {
return property
}
}
diff --git a/lib/configs/essential.js b/lib/configs/essential.js
index 970473a4d..33cfe64e0 100644
--- a/lib/configs/essential.js
+++ b/lib/configs/essential.js
@@ -9,14 +9,18 @@ module.exports = {
'vue/multi-word-component-names': 'error',
'vue/no-arrow-functions-in-watch': 'error',
'vue/no-async-in-computed-properties': 'error',
+ 'vue/no-child-content': 'error',
'vue/no-computed-properties-in-data': 'error',
'vue/no-custom-modifiers-on-v-model': 'error',
'vue/no-dupe-keys': 'error',
'vue/no-dupe-v-else-if': 'error',
'vue/no-duplicate-attributes': 'error',
+ 'vue/no-export-in-script-setup': 'error',
'vue/no-multiple-template-root': 'error',
'vue/no-mutating-props': 'error',
'vue/no-parsing-error': 'error',
+ 'vue/no-ref-as-operand': 'error',
+ 'vue/no-reserved-component-names': 'error',
'vue/no-reserved-keys': 'error',
'vue/no-reserved-props': [
'error',
@@ -24,23 +28,30 @@ module.exports = {
vueVersion: 2
}
],
+ 'vue/no-setup-props-destructure': 'error',
'vue/no-shared-component-data': 'error',
'vue/no-side-effects-in-computed-properties': 'error',
'vue/no-template-key': 'error',
'vue/no-textarea-mustache': 'error',
'vue/no-unused-components': 'error',
'vue/no-unused-vars': 'error',
+ 'vue/no-use-computed-property-like-method': 'error',
'vue/no-use-v-if-with-v-for': 'error',
'vue/no-useless-template-attributes': 'error',
'vue/no-v-for-template-key': 'error',
'vue/no-v-model-argument': 'error',
+ 'vue/no-v-text-v-html-on-component': 'error',
'vue/require-component-is': 'error',
'vue/require-prop-type-constructor': 'error',
'vue/require-render-return': 'error',
'vue/require-v-for-key': 'error',
'vue/require-valid-default-prop': 'error',
'vue/return-in-computed-property': 'error',
+ 'vue/return-in-emits-validator': 'error',
'vue/use-v-on-exact': 'error',
+ 'vue/valid-define-emits': 'error',
+ 'vue/valid-define-props': 'error',
+ 'vue/valid-model-definition': 'error',
'vue/valid-next-tick': 'error',
'vue/valid-template-root': 'error',
'vue/valid-v-bind-sync': 'error',
diff --git a/lib/configs/vue3-essential.js b/lib/configs/vue3-essential.js
index 155774649..1a1507335 100644
--- a/lib/configs/vue3-essential.js
+++ b/lib/configs/vue3-essential.js
@@ -9,6 +9,7 @@ module.exports = {
'vue/multi-word-component-names': 'error',
'vue/no-arrow-functions-in-watch': 'error',
'vue/no-async-in-computed-properties': 'error',
+ 'vue/no-child-content': 'error',
'vue/no-computed-properties-in-data': 'error',
'vue/no-deprecated-data-object-declaration': 'error',
'vue/no-deprecated-destroyed-lifecycle': 'error',
@@ -33,10 +34,12 @@ module.exports = {
'vue/no-dupe-v-else-if': 'error',
'vue/no-duplicate-attributes': 'error',
'vue/no-export-in-script-setup': 'error',
+ 'vue/no-expose-after-await': 'error',
'vue/no-lifecycle-after-await': 'error',
'vue/no-mutating-props': 'error',
'vue/no-parsing-error': 'error',
'vue/no-ref-as-operand': 'error',
+ 'vue/no-reserved-component-names': 'error',
'vue/no-reserved-keys': 'error',
'vue/no-reserved-props': 'error',
'vue/no-setup-props-destructure': 'error',
@@ -46,10 +49,13 @@ module.exports = {
'vue/no-textarea-mustache': 'error',
'vue/no-unused-components': 'error',
'vue/no-unused-vars': 'error',
+ 'vue/no-use-computed-property-like-method': 'error',
'vue/no-use-v-if-with-v-for': 'error',
'vue/no-useless-template-attributes': 'error',
'vue/no-v-for-template-key-on-child': 'error',
+ 'vue/no-v-text-v-html-on-component': 'error',
'vue/no-watch-after-await': 'error',
+ 'vue/prefer-import-from-vue': 'error',
'vue/require-component-is': 'error',
'vue/require-prop-type-constructor': 'error',
'vue/require-render-return': 'error',
diff --git a/lib/index.js b/lib/index.js
index 39f91b515..08423c75e 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -202,6 +202,7 @@ module.exports = {
'v-slot-style': require('./rules/v-slot-style'),
'valid-define-emits': require('./rules/valid-define-emits'),
'valid-define-props': require('./rules/valid-define-props'),
+ 'valid-model-definition': require('./rules/valid-model-definition'),
'valid-next-tick': require('./rules/valid-next-tick'),
'valid-template-root': require('./rules/valid-template-root'),
'valid-v-bind-sync': require('./rules/valid-v-bind-sync'),
diff --git a/lib/rules/no-child-content.js b/lib/rules/no-child-content.js
index 138a425c1..1eb7fbdfe 100644
--- a/lib/rules/no-child-content.js
+++ b/lib/rules/no-child-content.js
@@ -79,7 +79,7 @@ module.exports = {
docs: {
description:
"disallow element's child contents which would be overwritten by a directive like `v-html` or `v-text`",
- categories: undefined,
+ categories: ['vue3-essential', 'essential'],
url: 'https://eslint.vuejs.org/rules/no-child-content.html'
},
fixable: null,
diff --git a/lib/rules/no-export-in-script-setup.js b/lib/rules/no-export-in-script-setup.js
index fe825fdd7..0105d52f4 100644
--- a/lib/rules/no-export-in-script-setup.js
+++ b/lib/rules/no-export-in-script-setup.js
@@ -17,7 +17,7 @@ module.exports = {
type: 'problem',
docs: {
description: 'disallow `export` in `