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 `