☂️ eslint-plugin-vue
[!WARNING] This comment is maintained by CI. Do not edit this comment directly. To update comment template, see https://github.com/oxc-project/oxc/tree/main/tasks/lint_rules
This is tracking issue for eslint-plugin-vue.
There are 243(+ 4 deprecated) rules.
- 1/8 recommended rules are remaining as TODO
- 70/235 not recommended rules are remaining as TODO
To get started, run the following command:
just new-vue-rule <RULE_NAME>
Then register the rule in crates/oxc_linter/src/rules.rs and also declare_all_lint_rules at the bottom.
Recommended rules
✨: 2, 🚫: 5 / total: 8
| Status | Name | Docs |
|---|---|---|
| 🚫 | vue/attributes-order | https://eslint.vuejs.org/rules/attributes-order.html |
| 🚫 | vue/block-order | https://eslint.vuejs.org/rules/block-order.html |
| 🚫 | vue/no-lone-template | https://eslint.vuejs.org/rules/no-lone-template.html |
| ✨ | vue/no-multiple-slot-args | https://eslint.vuejs.org/rules/no-multiple-slot-args.html |
| ✨ | vue/no-required-prop-with-default | https://eslint.vuejs.org/rules/no-required-prop-with-default.html |
| 🚫 | vue/no-v-html | https://eslint.vuejs.org/rules/no-v-html.html |
| vue/order-in-components | https://eslint.vuejs.org/rules/order-in-components.html | |
| 🚫 | vue/this-in-template | https://eslint.vuejs.org/rules/this-in-template.html |
✨ = Implemented, 🚫 = No need to implement
Not recommended rules
✨: 11, 🚫: 154 / total: 235
| Status | Name | Docs |
|---|---|---|
| 🚫 | vue/array-bracket-newline | https://eslint.vuejs.org/rules/array-bracket-newline.html |
| 🚫 | vue/array-bracket-spacing | https://eslint.vuejs.org/rules/array-bracket-spacing.html |
| 🚫 | vue/array-element-newline | https://eslint.vuejs.org/rules/array-element-newline.html |
| 🚫 | vue/arrow-spacing | https://eslint.vuejs.org/rules/arrow-spacing.html |
| 🚫 | vue/attribute-hyphenation | https://eslint.vuejs.org/rules/attribute-hyphenation.html |
| 🚫 | vue/block-lang | https://eslint.vuejs.org/rules/block-lang.html |
| 🚫 | vue/block-spacing | https://eslint.vuejs.org/rules/block-spacing.html |
| 🚫 | vue/block-tag-newline | https://eslint.vuejs.org/rules/block-tag-newline.html |
| 🚫 | vue/brace-style | https://eslint.vuejs.org/rules/brace-style.html |
| 🚫 | vue/camelcase | https://eslint.vuejs.org/rules/camelcase.html |
| 🚫 | vue/comma-dangle | https://eslint.vuejs.org/rules/comma-dangle.html |
| 🚫 | vue/comma-spacing | https://eslint.vuejs.org/rules/comma-spacing.html |
| 🚫 | vue/comma-style | https://eslint.vuejs.org/rules/comma-style.html |
| 🚫 | vue/comment-directive | https://eslint.vuejs.org/rules/comment-directive.html |
| vue/component-api-style | https://eslint.vuejs.org/rules/component-api-style.html | |
| vue/component-definition-name-casing | https://eslint.vuejs.org/rules/component-definition-name-casing.html | |
| 🚫 | vue/component-name-in-template-casing | https://eslint.vuejs.org/rules/component-name-in-template-casing.html |
| vue/component-options-name-casing | https://eslint.vuejs.org/rules/component-options-name-casing.html | |
| 🚫 | vue/custom-event-name-casing | https://eslint.vuejs.org/rules/custom-event-name-casing.html |
| ✨ | vue/define-emits-declaration | https://eslint.vuejs.org/rules/define-emits-declaration.html |
| 🚫 | vue/define-macros-order | https://eslint.vuejs.org/rules/define-macros-order.html |
| ✨ | vue/define-props-declaration | https://eslint.vuejs.org/rules/define-props-declaration.html |
| ✨ | vue/define-props-destructuring | https://eslint.vuejs.org/rules/define-props-destructuring.html |
| 🚫 | vue/dot-location | https://eslint.vuejs.org/rules/dot-location.html |
| 🚫 | vue/dot-notation | https://eslint.vuejs.org/rules/dot-notation.html |
| 🚫 | vue/enforce-style-attribute | https://eslint.vuejs.org/rules/enforce-style-attribute.html |
| 🚫 | vue/eqeqeq | https://eslint.vuejs.org/rules/eqeqeq.html |
| 🚫 | vue/first-attribute-linebreak | https://eslint.vuejs.org/rules/first-attribute-linebreak.html |
| 🚫 | vue/func-call-spacing | https://eslint.vuejs.org/rules/func-call-spacing.html |
| 🚫 | vue/html-button-has-type | https://eslint.vuejs.org/rules/html-button-has-type.html |
| 🚫 | vue/html-closing-bracket-newline | https://eslint.vuejs.org/rules/html-closing-bracket-newline.html |
| 🚫 | vue/html-closing-bracket-spacing | https://eslint.vuejs.org/rules/html-closing-bracket-spacing.html |
| 🚫 | vue/html-comment-content-newline | https://eslint.vuejs.org/rules/html-comment-content-newline.html |
| 🚫 | vue/html-comment-content-spacing | https://eslint.vuejs.org/rules/html-comment-content-spacing.html |
| 🚫 | vue/html-comment-indent | https://eslint.vuejs.org/rules/html-comment-indent.html |
| 🚫 | vue/html-end-tags | https://eslint.vuejs.org/rules/html-end-tags.html |
| 🚫 | vue/html-indent | https://eslint.vuejs.org/rules/html-indent.html |
| 🚫 | vue/html-quotes | https://eslint.vuejs.org/rules/html-quotes.html |
| 🚫 | vue/html-self-closing | https://eslint.vuejs.org/rules/html-self-closing.html |
| vue/jsx-uses-vars | https://eslint.vuejs.org/rules/jsx-uses-vars.html | |
| 🚫 | vue/key-spacing | https://eslint.vuejs.org/rules/key-spacing.html |
| 🚫 | vue/keyword-spacing | https://eslint.vuejs.org/rules/keyword-spacing.html |
| vue/match-component-file-name | https://eslint.vuejs.org/rules/match-component-file-name.html | |
| vue/match-component-import-name | https://eslint.vuejs.org/rules/match-component-import-name.html | |
| 🚫 | vue/max-attributes-per-line | https://eslint.vuejs.org/rules/max-attributes-per-line.html |
| 🚫 | vue/max-len | https://eslint.vuejs.org/rules/max-len.html |
| 🚫 | vue/max-lines-per-block | https://eslint.vuejs.org/rules/max-lines-per-block.html |
| ✨ | vue/max-props | https://eslint.vuejs.org/rules/max-props.html |
| 🚫 | vue/max-template-depth | https://eslint.vuejs.org/rules/max-template-depth.html |
| vue/multi-word-component-names | https://eslint.vuejs.org/rules/multi-word-component-names.html | |
| 🚫 | vue/multiline-html-element-content-newline | https://eslint.vuejs.org/rules/multiline-html-element-content-newline.html |
| 🚫 | vue/multiline-ternary | https://eslint.vuejs.org/rules/multiline-ternary.html |
| 🚫 | vue/mustache-interpolation-spacing | https://eslint.vuejs.org/rules/mustache-interpolation-spacing.html |
| 🚫 | vue/new-line-between-multi-line-property | https://eslint.vuejs.org/rules/new-line-between-multi-line-property.html |
| vue/next-tick-style | https://eslint.vuejs.org/rules/next-tick-style.html | |
| vue/no-arrow-functions-in-watch | https://eslint.vuejs.org/rules/no-arrow-functions-in-watch.html | |
| vue/no-async-in-computed-properties | https://eslint.vuejs.org/rules/no-async-in-computed-properties.html | |
| 🚫 | vue/no-bare-strings-in-template | https://eslint.vuejs.org/rules/no-bare-strings-in-template.html |
| vue/no-boolean-default | https://eslint.vuejs.org/rules/no-boolean-default.html | |
| 🚫 | vue/no-child-content | https://eslint.vuejs.org/rules/no-child-content.html |
| vue/no-computed-properties-in-data | https://eslint.vuejs.org/rules/no-computed-properties-in-data.html | |
| 🚫 | vue/no-console | https://eslint.vuejs.org/rules/no-console.html |
| 🚫 | vue/no-constant-condition | https://eslint.vuejs.org/rules/no-constant-condition.html |
| 🚫 | vue/no-custom-modifiers-on-v-model | https://eslint.vuejs.org/rules/no-custom-modifiers-on-v-model.html |
| vue/no-deprecated-data-object-declaration | https://eslint.vuejs.org/rules/no-deprecated-data-object-declaration.html | |
| vue/no-deprecated-delete-set | https://eslint.vuejs.org/rules/no-deprecated-delete-set.html | |
| vue/no-deprecated-destroyed-lifecycle | https://eslint.vuejs.org/rules/no-deprecated-destroyed-lifecycle.html | |
| vue/no-deprecated-dollar-listeners-api | https://eslint.vuejs.org/rules/no-deprecated-dollar-listeners-api.html | |
| vue/no-deprecated-dollar-scopedslots-api | https://eslint.vuejs.org/rules/no-deprecated-dollar-scopedslots-api.html | |
| vue/no-deprecated-events-api | https://eslint.vuejs.org/rules/no-deprecated-events-api.html | |
| 🚫 | vue/no-deprecated-filter | https://eslint.vuejs.org/rules/no-deprecated-filter.html |
| 🚫 | vue/no-deprecated-functional-template | https://eslint.vuejs.org/rules/no-deprecated-functional-template.html |
| 🚫 | vue/no-deprecated-html-element-is | https://eslint.vuejs.org/rules/no-deprecated-html-element-is.html |
| 🚫 | vue/no-deprecated-inline-template | https://eslint.vuejs.org/rules/no-deprecated-inline-template.html |
| vue/no-deprecated-model-definition | https://eslint.vuejs.org/rules/no-deprecated-model-definition.html | |
| vue/no-deprecated-props-default-this | https://eslint.vuejs.org/rules/no-deprecated-props-default-this.html | |
| 🚫 | vue/no-deprecated-router-link-tag-prop | https://eslint.vuejs.org/rules/no-deprecated-router-link-tag-prop.html |
| 🚫 | vue/no-deprecated-scope-attribute | https://eslint.vuejs.org/rules/no-deprecated-scope-attribute.html |
| 🚫 | vue/no-deprecated-slot-attribute | https://eslint.vuejs.org/rules/no-deprecated-slot-attribute.html |
| 🚫 | vue/no-deprecated-slot-scope-attribute | https://eslint.vuejs.org/rules/no-deprecated-slot-scope-attribute.html |
| 🚫 | vue/no-deprecated-v-bind-sync | https://eslint.vuejs.org/rules/no-deprecated-v-bind-sync.html |
| 🚫 | vue/no-deprecated-v-is | https://eslint.vuejs.org/rules/no-deprecated-v-is.html |
| 🚫 | vue/no-deprecated-v-on-native-modifier | https://eslint.vuejs.org/rules/no-deprecated-v-on-native-modifier.html |
| 🚫 | vue/no-deprecated-v-on-number-modifiers | https://eslint.vuejs.org/rules/no-deprecated-v-on-number-modifiers.html |
| vue/no-deprecated-vue-config-keycodes | https://eslint.vuejs.org/rules/no-deprecated-vue-config-keycodes.html | |
| vue/no-dupe-keys | https://eslint.vuejs.org/rules/no-dupe-keys.html | |
| 🚫 | vue/no-dupe-v-else-if | https://eslint.vuejs.org/rules/no-dupe-v-else-if.html |
| 🚫 | vue/no-duplicate-attr-inheritance | https://eslint.vuejs.org/rules/no-duplicate-attr-inheritance.html |
| 🚫 | vue/no-duplicate-attributes | https://eslint.vuejs.org/rules/no-duplicate-attributes.html |
| 🚫 | vue/no-empty-component-block | https://eslint.vuejs.org/rules/no-empty-component-block.html |
| 🚫 | vue/no-empty-pattern | https://eslint.vuejs.org/rules/no-empty-pattern.html |
| ✨ | vue/no-export-in-script-setup | https://eslint.vuejs.org/rules/no-export-in-script-setup.html |
| vue/no-expose-after-await | https://eslint.vuejs.org/rules/no-expose-after-await.html | |
| 🚫 | vue/no-extra-parens | https://eslint.vuejs.org/rules/no-extra-parens.html |
| 🚫 | vue/no-implicit-coercion | https://eslint.vuejs.org/rules/no-implicit-coercion.html |
| ✨ | vue/no-import-compiler-macros | https://eslint.vuejs.org/rules/no-import-compiler-macros.html |
| vue/no-irregular-whitespace | https://eslint.vuejs.org/rules/no-irregular-whitespace.html | |
| vue/no-lifecycle-after-await | https://eslint.vuejs.org/rules/no-lifecycle-after-await.html | |
| 🚫 | vue/no-loss-of-precision | https://eslint.vuejs.org/rules/no-loss-of-precision.html |
| 🚫 | vue/no-multi-spaces | https://eslint.vuejs.org/rules/no-multi-spaces.html |
| 🚫 | vue/no-multiple-objects-in-class | https://eslint.vuejs.org/rules/no-multiple-objects-in-class.html |
| 🚫 | vue/no-multiple-template-root | https://eslint.vuejs.org/rules/no-multiple-template-root.html |
| vue/no-mutating-props | https://eslint.vuejs.org/rules/no-mutating-props.html | |
| 🚫 | vue/no-negated-condition | https://eslint.vuejs.org/rules/no-negated-condition.html |
| 🚫 | vue/no-negated-v-if-condition | https://eslint.vuejs.org/rules/no-negated-v-if-condition.html |
| 🚫 | vue/no-parsing-error | https://eslint.vuejs.org/rules/no-parsing-error.html |
| vue/no-potential-component-option-typo | https://eslint.vuejs.org/rules/no-potential-component-option-typo.html | |
| vue/no-ref-as-operand | https://eslint.vuejs.org/rules/no-ref-as-operand.html | |
| vue/no-ref-object-reactivity-loss | https://eslint.vuejs.org/rules/no-ref-object-reactivity-loss.html | |
| vue/no-reserved-component-names | https://eslint.vuejs.org/rules/no-reserved-component-names.html | |
| vue/no-reserved-keys | https://eslint.vuejs.org/rules/no-reserved-keys.html | |
| vue/no-reserved-props | https://eslint.vuejs.org/rules/no-reserved-props.html | |
| 🚫 | vue/no-restricted-block | https://eslint.vuejs.org/rules/no-restricted-block.html |
| vue/no-restricted-call-after-await | https://eslint.vuejs.org/rules/no-restricted-call-after-await.html | |
| 🚫 | vue/no-restricted-class | https://eslint.vuejs.org/rules/no-restricted-class.html |
| vue/no-restricted-component-names | https://eslint.vuejs.org/rules/no-restricted-component-names.html | |
| vue/no-restricted-component-options | https://eslint.vuejs.org/rules/no-restricted-component-options.html | |
| vue/no-restricted-custom-event | https://eslint.vuejs.org/rules/no-restricted-custom-event.html | |
| 🚫 | vue/no-restricted-html-elements | https://eslint.vuejs.org/rules/no-restricted-html-elements.html |
| vue/no-restricted-props | https://eslint.vuejs.org/rules/no-restricted-props.html | |
| 🚫 | vue/no-restricted-static-attribute | https://eslint.vuejs.org/rules/no-restricted-static-attribute.html |
| 🚫 | vue/no-restricted-syntax | https://eslint.vuejs.org/rules/no-restricted-syntax.html |
| 🚫 | vue/no-restricted-v-bind | https://eslint.vuejs.org/rules/no-restricted-v-bind.html |
| 🚫 | vue/no-restricted-v-on | https://eslint.vuejs.org/rules/no-restricted-v-on.html |
| 🚫 | vue/no-root-v-if | https://eslint.vuejs.org/rules/no-root-v-if.html |
| vue/no-setup-props-reactivity-loss | https://eslint.vuejs.org/rules/no-setup-props-reactivity-loss.html | |
| vue/no-shared-component-data | https://eslint.vuejs.org/rules/no-shared-component-data.html | |
| vue/no-side-effects-in-computed-properties | https://eslint.vuejs.org/rules/no-side-effects-in-computed-properties.html | |
| 🚫 | vue/no-spaces-around-equal-signs-in-attribute | https://eslint.vuejs.org/rules/no-spaces-around-equal-signs-in-attribute.html |
| 🚫 | vue/no-sparse-arrays | https://eslint.vuejs.org/rules/no-sparse-arrays.html |
| 🚫 | vue/no-static-inline-styles | https://eslint.vuejs.org/rules/no-static-inline-styles.html |
| 🚫 | vue/no-template-key | https://eslint.vuejs.org/rules/no-template-key.html |
| 🚫 | vue/no-template-shadow | https://eslint.vuejs.org/rules/no-template-shadow.html |
| 🚫 | vue/no-template-target-blank | https://eslint.vuejs.org/rules/no-template-target-blank.html |
| 🚫 | vue/no-textarea-mustache | https://eslint.vuejs.org/rules/no-textarea-mustache.html |
| vue/no-this-in-before-route-enter | https://eslint.vuejs.org/rules/no-this-in-before-route-enter.html | |
| 🚫 | vue/no-undef-components | https://eslint.vuejs.org/rules/no-undef-components.html |
| vue/no-undef-properties | https://eslint.vuejs.org/rules/no-undef-properties.html | |
| 🚫 | vue/no-unsupported-features | https://eslint.vuejs.org/rules/no-unsupported-features.html |
| 🚫 | vue/no-unused-components | https://eslint.vuejs.org/rules/no-unused-components.html |
| vue/no-unused-emit-declarations | https://eslint.vuejs.org/rules/no-unused-emit-declarations.html | |
| vue/no-unused-properties | https://eslint.vuejs.org/rules/no-unused-properties.html | |
| 🚫 | vue/no-unused-refs | https://eslint.vuejs.org/rules/no-unused-refs.html |
| 🚫 | vue/no-unused-vars | https://eslint.vuejs.org/rules/no-unused-vars.html |
| vue/no-use-computed-property-like-method | https://eslint.vuejs.org/rules/no-use-computed-property-like-method.html | |
| 🚫 | vue/no-use-v-else-with-v-for | https://eslint.vuejs.org/rules/no-use-v-else-with-v-for.html |
| 🚫 | vue/no-use-v-if-with-v-for | https://eslint.vuejs.org/rules/no-use-v-if-with-v-for.html |
| 🚫 | vue/no-useless-concat | https://eslint.vuejs.org/rules/no-useless-concat.html |
| 🚫 | vue/no-useless-mustaches | https://eslint.vuejs.org/rules/no-useless-mustaches.html |
| 🚫 | vue/no-useless-template-attributes | https://eslint.vuejs.org/rules/no-useless-template-attributes.html |
| 🚫 | vue/no-useless-v-bind | https://eslint.vuejs.org/rules/no-useless-v-bind.html |
| 🚫 | vue/no-v-for-template-key-on-child | https://eslint.vuejs.org/rules/no-v-for-template-key-on-child.html |
| 🚫 | vue/no-v-text-v-html-on-component | https://eslint.vuejs.org/rules/no-v-text-v-html-on-component.html |
| 🚫 | vue/no-v-text | https://eslint.vuejs.org/rules/no-v-text.html |
| vue/no-watch-after-await | https://eslint.vuejs.org/rules/no-watch-after-await.html | |
| 🚫 | vue/object-curly-newline | https://eslint.vuejs.org/rules/object-curly-newline.html |
| 🚫 | vue/object-curly-spacing | https://eslint.vuejs.org/rules/object-curly-spacing.html |
| 🚫 | vue/object-property-newline | https://eslint.vuejs.org/rules/object-property-newline.html |
| 🚫 | vue/object-shorthand | https://eslint.vuejs.org/rules/object-shorthand.html |
| vue/one-component-per-file | https://eslint.vuejs.org/rules/one-component-per-file.html | |
| 🚫 | vue/operator-linebreak | https://eslint.vuejs.org/rules/operator-linebreak.html |
| 🚫 | vue/padding-line-between-blocks | https://eslint.vuejs.org/rules/padding-line-between-blocks.html |
| 🚫 | vue/padding-line-between-tags | https://eslint.vuejs.org/rules/padding-line-between-tags.html |
| 🚫 | vue/padding-lines-in-component-definition | https://eslint.vuejs.org/rules/padding-lines-in-component-definition.html |
| vue/prefer-define-options | https://eslint.vuejs.org/rules/prefer-define-options.html | |
| ✨ | vue/prefer-import-from-vue | https://eslint.vuejs.org/rules/prefer-import-from-vue.html |
| vue/prefer-prop-type-boolean-first | https://eslint.vuejs.org/rules/prefer-prop-type-boolean-first.html | |
| 🚫 | vue/prefer-separate-static-class | https://eslint.vuejs.org/rules/prefer-separate-static-class.html |
| 🚫 | vue/prefer-template | https://eslint.vuejs.org/rules/prefer-template.html |
| 🚫 | vue/prefer-true-attribute-shorthand | https://eslint.vuejs.org/rules/prefer-true-attribute-shorthand.html |
| vue/prefer-use-template-ref | https://eslint.vuejs.org/rules/prefer-use-template-ref.html | |
| vue/prop-name-casing | https://eslint.vuejs.org/rules/prop-name-casing.html | |
| 🚫 | vue/quote-props | https://eslint.vuejs.org/rules/quote-props.html |
| 🚫 | vue/require-component-is | https://eslint.vuejs.org/rules/require-component-is.html |
| ✨ | vue/require-default-export | https://eslint.vuejs.org/rules/require-default-export.html |
| vue/require-default-prop | https://eslint.vuejs.org/rules/require-default-prop.html | |
| vue/require-direct-export | https://eslint.vuejs.org/rules/require-direct-export.html | |
| vue/require-emit-validator | https://eslint.vuejs.org/rules/require-emit-validator.html | |
| 🚫 | vue/require-explicit-emits | https://eslint.vuejs.org/rules/require-explicit-emits.html |
| 🚫 | vue/require-explicit-slots | https://eslint.vuejs.org/rules/require-explicit-slots.html |
| vue/require-expose | https://eslint.vuejs.org/rules/require-expose.html | |
| vue/require-macro-variable-name | https://eslint.vuejs.org/rules/require-macro-variable-name.html | |
| vue/require-name-property | https://eslint.vuejs.org/rules/require-name-property.html | |
| vue/require-prop-comment | https://eslint.vuejs.org/rules/require-prop-comment.html | |
| vue/require-prop-type-constructor | https://eslint.vuejs.org/rules/require-prop-type-constructor.html | |
| vue/require-prop-types | https://eslint.vuejs.org/rules/require-prop-types.html | |
| vue/require-render-return | https://eslint.vuejs.org/rules/require-render-return.html | |
| vue/require-slots-as-functions | https://eslint.vuejs.org/rules/require-slots-as-functions.html | |
| 🚫 | vue/require-toggle-inside-transition | https://eslint.vuejs.org/rules/require-toggle-inside-transition.html |
| vue/require-typed-object-prop | https://eslint.vuejs.org/rules/require-typed-object-prop.html | |
| ✨ | vue/require-typed-ref | https://eslint.vuejs.org/rules/require-typed-ref.html |
| 🚫 | vue/require-v-for-key | https://eslint.vuejs.org/rules/require-v-for-key.html |
| vue/require-valid-default-prop | https://eslint.vuejs.org/rules/require-valid-default-prop.html | |
| 🚫 | vue/restricted-component-names | https://eslint.vuejs.org/rules/restricted-component-names.html |
| vue/return-in-computed-property | https://eslint.vuejs.org/rules/return-in-computed-property.html | |
| vue/return-in-emits-validator | https://eslint.vuejs.org/rules/return-in-emits-validator.html | |
| vue/script-indent | https://eslint.vuejs.org/rules/script-indent.html | |
| 🚫 | vue/singleline-html-element-content-newline | https://eslint.vuejs.org/rules/singleline-html-element-content-newline.html |
| 🚫 | vue/slot-name-casing | https://eslint.vuejs.org/rules/slot-name-casing.html |
| vue/sort-keys | https://eslint.vuejs.org/rules/sort-keys.html | |
| 🚫 | vue/space-in-parens | https://eslint.vuejs.org/rules/space-in-parens.html |
| 🚫 | vue/space-infix-ops | https://eslint.vuejs.org/rules/space-infix-ops.html |
| 🚫 | vue/space-unary-ops | https://eslint.vuejs.org/rules/space-unary-ops.html |
| 🚫 | vue/static-class-names-order | https://eslint.vuejs.org/rules/static-class-names-order.html |
| 🚫 | vue/template-curly-spacing | https://eslint.vuejs.org/rules/template-curly-spacing.html |
| 🚫 | vue/use-v-on-exact | https://eslint.vuejs.org/rules/use-v-on-exact.html |
| 🚫 | vue/v-bind-style | https://eslint.vuejs.org/rules/v-bind-style.html |
| 🚫 | vue/v-for-delimiter-style | https://eslint.vuejs.org/rules/v-for-delimiter-style.html |
| 🚫 | vue/v-if-else-key | https://eslint.vuejs.org/rules/v-if-else-key.html |
| 🚫 | vue/v-on-event-hyphenation | https://eslint.vuejs.org/rules/v-on-event-hyphenation.html |
| 🚫 | vue/v-on-handler-style | https://eslint.vuejs.org/rules/v-on-handler-style.html |
| 🚫 | vue/v-on-style | https://eslint.vuejs.org/rules/v-on-style.html |
| 🚫 | vue/v-slot-style | https://eslint.vuejs.org/rules/v-slot-style.html |
| 🚫 | vue/valid-attribute-name | https://eslint.vuejs.org/rules/valid-attribute-name.html |
| ✨ | vue/valid-define-emits | https://eslint.vuejs.org/rules/valid-define-emits.html |
| vue/valid-define-options | https://eslint.vuejs.org/rules/valid-define-options.html | |
| ✨ | vue/valid-define-props | https://eslint.vuejs.org/rules/valid-define-props.html |
| vue/valid-next-tick | https://eslint.vuejs.org/rules/valid-next-tick.html | |
| 🚫 | vue/valid-template-root | https://eslint.vuejs.org/rules/valid-template-root.html |
| 🚫 | vue/valid-v-bind | https://eslint.vuejs.org/rules/valid-v-bind.html |
| 🚫 | vue/valid-v-cloak | https://eslint.vuejs.org/rules/valid-v-cloak.html |
| 🚫 | vue/valid-v-else-if | https://eslint.vuejs.org/rules/valid-v-else-if.html |
| 🚫 | vue/valid-v-else | https://eslint.vuejs.org/rules/valid-v-else.html |
| 🚫 | vue/valid-v-for | https://eslint.vuejs.org/rules/valid-v-for.html |
| 🚫 | vue/valid-v-html | https://eslint.vuejs.org/rules/valid-v-html.html |
| 🚫 | vue/valid-v-if | https://eslint.vuejs.org/rules/valid-v-if.html |
| 🚫 | vue/valid-v-is | https://eslint.vuejs.org/rules/valid-v-is.html |
| 🚫 | vue/valid-v-memo | https://eslint.vuejs.org/rules/valid-v-memo.html |
| 🚫 | vue/valid-v-model | https://eslint.vuejs.org/rules/valid-v-model.html |
| 🚫 | vue/valid-v-on | https://eslint.vuejs.org/rules/valid-v-on.html |
| 🚫 | vue/valid-v-once | https://eslint.vuejs.org/rules/valid-v-once.html |
| 🚫 | vue/valid-v-pre | https://eslint.vuejs.org/rules/valid-v-pre.html |
| 🚫 | vue/valid-v-show | https://eslint.vuejs.org/rules/valid-v-show.html |
| 🚫 | vue/valid-v-slot | https://eslint.vuejs.org/rules/valid-v-slot.html |
| 🚫 | vue/valid-v-text | https://eslint.vuejs.org/rules/valid-v-text.html |
✨ = Implemented, 🚫 = No need to implement
Deprecated rules
✨: 0, 🚫: 3 / total: 4
| Status | Name | Docs |
|---|---|---|
| 🚫 | vue/no-v-for-template-key | https://eslint.vuejs.org/rules/no-v-for-template-key.html |
| 🚫 | vue/no-v-model-argument | https://eslint.vuejs.org/rules/no-v-model-argument.html |
| vue/valid-model-definition | https://eslint.vuejs.org/rules/valid-model-definition.html | |
| 🚫 | vue/valid-v-bind-sync | https://eslint.vuejs.org/rules/valid-v-bind-sync.html |
✨ = Implemented, 🚫 = No need to implement
after reading the docs, just want to make sure that i understood:
- vue template support not ready
- eslint vue support not ready
- formatter support not ready
so it is not for production at 1.0 ? (without eslint/prettier)
I'm trying out oxlint 1.16.0 with a minimal vue project, posting findings here in case it helps.
Config :
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": ["import", "promise", "vue", "typescript"],
"ignorePatterns": ["worker-configuration.d.ts"],
"rules": {
"import/default": "error",
"import/namespace": "error",
"import/export": "warn",
"import/named": "error",
"promise/no-callback-in-promise": "error",
"promise/no-new-statics": "error",
"promise/valid-params": "error",
"vue/valid-define-emits": "error",
"vue/valid-define-props": "error",
"vue/define-emits-declaration": "error",
"typescript/no-floating-promises": "off"
}
}
Test file :
<script lang="ts" setup>
const emit = defineEmits(["change", "update"]);
const emit2 = defineEmits({
change: (id) => typeof id === "number",
update: (value) => typeof value === "string",
})
Math.min(Math.max(100, x), 0);
Math.max(1000, Math.min(0, z));
x === y || x < y;
x < y || x === y;
function add(a: number, b: number) {
return a;
}
</script>
The cli command I'm running is :pnpm exec oxlint test.vue
Here's what I'm finding out at the moment
- eslint rules like [eslint(no-unused-vars)] are NOT working at all
- vue rules like [eslint-plugin-vue(define-emits-declaration)] are working with the CLI, but NOT with the vscode extension
- oxc rules like [[oxc(bad-min-max-func)] are NOT working with the CLI, but working with the vscode extension
Interestingly, the "source.fixAll.oxc": "explicit" apply fixes even though the cli doesn't detect them
I'm not sure where we are for vue support. Is there another place where we can subscribe ?
eslint rules like [eslint(no-unused-vars)] are NOT working at all
Because the linter does not know if the variable is used inside <template>, it does not enable the rule for .vue files.
vue rules like [eslint-plugin-vue(define-emits-declaration)] are working with the CLI, but NOT with the vscode extension
Make sure, you have the same VSCode Extension Version as your oxlint version.
oxc rules like [[oxc(bad-min-max-func)] are NOT working with the CLI, but working with the vscode extension
It worked for me in both tools:
× oxc(bad-min-max-func): Math.min and Math.max combination leads to constant result
╭─[testfile.vue:7:1]
6 │ })
7 │ Math.min(Math.max(100, x), 0);
· ─────────────────────────────
8 │ Math.max(1000, Math.min(0, z));
╰────
help: This evaluates to 0.0 because of the incorrect `Math.min`/`Math.max` combination
Make sure the oxc plugin is active.
When you have more problems, please create a new issue :)
not sure i completely understand - you need to vscode extension to enable vue files to linting vue files/templates blocks ? what if you ran it as a CI operation. a bit confused.
not sure i completely understand - you need to vscode extension to enable vue files to linting vue files/templates blocks ? what if you ran it as a CI operation. a bit confused.
It's the same for eslint as well as prettier, you need to have the cli and if you use vscode, you need the extension to show errors and the code actions (auto fix on save for example)
thanks for the response. clarification: does that mean that oxclint now spots errors within ? i read it required a plugin system to enable it.
does that mean that oxclint now spots errors within ?
It spots only errors within the <script> blocks. It has no <template>-syntax understanding,
that's why many rules are not supported for Vue.
i read it required a plugin system to enable it.
No, it works without any configuration. You can enable the vue plugin, but this will only enable its eslint-plugin-vue rules.
Hm, it's a bit confusing to mark the rules as no need to implement, unless the intention is never to support linting code inside <template> tags at all. Is that the intent long-term?
We do hope to support linting code inside <template> tags, likely via JS plugins. But what the mechanism for doing this will be is an open question right now.
have you seen this post by biome ("Full support for Vue, Svelte, and Astro ") https://biomejs.dev/blog/biome-v2-3/ perhaps they figured out a way to have a fast core logic that extends to support vue.
have you seen this post by biome ("Full support for Vue, Svelte, and Astro ") https://biomejs.dev/blog/biome-v2-3/ perhaps they figured out a way to have a fast core logic that extends to support vue.
Biome 2.3 introduces full support for Vue, Svelte, and Astro files. This means you can now format and lint the JavaScript and TypeScript code inside
The use of "full support" is different to how we are trying to provide full support.
In the blog post:
This means you can now format and lint the JavaScript and TypeScript code inside
Oxlint supported this since March https://oxc.rs/blog/2025-03-15-oxlint-beta.html#highlight-of-new-features-since-general-availability
Our full support means all rules listed in the issue description.