fix(useVueValidVOn): allow verb-modifier-only handlers and object syntax#10773
Conversation
`useVueValidVOn` was reporting a missing handler for v-on directives that use a verb modifier (`.stop` or `.prevent`) without an expression. Forms like `<div @click.stop></div>` and `<form @submit.prevent></form>` are valid Vue syntax — the modifier carries an intrinsic side effect (`event.stopPropagation()` / `event.preventDefault()`), and the directive needs no handler. Mirror `eslint-plugin-vue`'s `valid-v-on`, which exempts the same `VERB_MODIFIERS` set (`stop`, `prevent`) from the missing-handler check while continuing to require a handler for every other modifier (`.capture`, `.once`, `.passive`, key aliases, etc.). While here, switch `find_invalid_modifiers` to `text_trimmed()` so the modifier-name lookup keeps working when the modifier is followed by whitespace (e.g. `<Foo @click.stop />`). Matches `no_vue_v_on_number_values`, which already uses `text_trimmed()`.
`useVueValidVOn` was reporting `<div v-on="$listeners"></div>` and
`<div v-on="{ click: onClick }"></div>` as having a missing event name.
An arg-less `v-on` with a value is the Vue object syntax: the value is
spread as event listeners onto the element, mirroring `v-bind="object"`.
`eslint-plugin-vue`'s `valid-v-on` accepts the same forms.
Only flag `MissingEventName` when both the argument and the value are
absent (`<div v-on></div>`). Move the `<div v-on="foo"></div>` case from
`invalid.vue` to `valid.vue` to lock the new behavior in.
The shape of this fix matches dyc3's prior fix for the v-bind variant
(biomejs#9643).
…arser limitation
The literal object form (`v-on="{ click: onClick }"`) is a Vue object
syntax case that hits a biome parser limitation where the inline object
literal is mis-parsed as a statement. Replace with a plain identifier
(`v-on="listeners"`) so the rule check is exercised without tripping
the parser. The semantically interesting cases (`$listeners` and a
plain identifier) are both covered.
Mirror the link convention dyc3 suggested on PR biomejs#10767: point the docstring at the official Vue docs for event modifiers (the section that documents the verb-modifier-only form) and v-on (the section that documents the arg-less object syntax). Add the same event-modifiers link as a doc comment on `has_verb_modifier`.
🦋 Changeset detectedLatest commit: 023abe4 The changes in this PR will be included in the next version bump. This PR includes changesets to release 13 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
✅ Organic activityNo automation signals detected in the analyzed events. This is an automated analysis by AgentScan |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
✅ Files skipped from review due to trivial changes (1)
Walkthrough
Possibly related PRs
Suggested labels
Suggested reviewers
🚥 Pre-merge checks | ✅ 3 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (3 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.changeset/fix-use-vue-valid-v-on-verb-modifier-only.md:
- Around line 5-7: Shorten the changeset entry to 1–3 sentences by removing
extra detail and keeping only the core fix summary. In the changeset content,
keep the main `useVueValidVOn` behavior change and the related
`v-on="$listeners"` false positive in a compact form, without examples or
explanatory asides. Make sure the final text remains concise and reads like a
standard Biome changeset entry.
In `@crates/biome_html_analyze/src/lint/correctness/use_vue_valid_v_on.rs`:
- Around line 78-95: The arg-less `v-on` object-syntax path in
`use_vue_valid_v_on` is incorrectly allowing modifiers like `stop` and `prevent`
to pass when a handler/value is present, so `v-on.stop="listeners"` is not being
reported. Update the directive validation logic to reject modifiers whenever
`vue_directive.arg()` is missing and the syntax is being treated as object
syntax, making sure this case is handled before or within the
`find_invalid_modifiers`/missing-handler flow. Add an invalid test fixture
covering an arg-less object-syntax example with a disallowed modifier such as
`stop` or `prevent`.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: d67301ca-4a8c-40fb-9c49-5c9450d4a8fc
⛔ Files ignored due to path filters (2)
crates/biome_html_analyze/tests/specs/correctness/useVueValidVOn/invalid.vue.snapis excluded by!**/*.snapand included by**crates/biome_html_analyze/tests/specs/correctness/useVueValidVOn/valid.vue.snapis excluded by!**/*.snapand included by**
📒 Files selected for processing (4)
.changeset/fix-use-vue-valid-v-on-verb-modifier-only.mdcrates/biome_html_analyze/src/lint/correctness/use_vue_valid_v_on.rscrates/biome_html_analyze/tests/specs/correctness/useVueValidVOn/invalid.vuecrates/biome_html_analyze/tests/specs/correctness/useVueValidVOn/valid.vue
| // Check for missing event name. An arg-less `v-on` is the | ||
| // object syntax (`v-on="$listeners"`); only flag when there | ||
| // is also no value to spread. | ||
| if vue_directive.arg().is_none() && vue_directive.initializer().is_none() { | ||
| return Some(ViolationKind::MissingEventName); | ||
| } | ||
|
|
||
| let modifiers = vue_directive.modifiers(); | ||
|
|
||
| // Check for invalid modifiers | ||
| if let Some(invalid_range) = | ||
| find_invalid_modifiers(&vue_directive.modifiers(), options.modifiers.as_ref()) | ||
| find_invalid_modifiers(&modifiers, options.modifiers.as_ref()) | ||
| { | ||
| return Some(ViolationKind::InvalidModifier(invalid_range)); | ||
| } | ||
|
|
||
| // Check for missing handler | ||
| if vue_directive.initializer().is_none() { | ||
| if vue_directive.initializer().is_none() && !has_verb_modifier(&modifiers) { |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect the rule implementation and nearby tests
ast-grep outline crates/biome_html_analyze/src/lint/correctness/use_vue_valid_v_on.rs --view expanded
printf '\n--- relevant matches ---\n'
rg -n "MissingEventName|InvalidModifier|has_verb_modifier|stop|prevent|v-on" crates/biome_html_analyze/src/lint/correctness/use_vue_valid_v_on.rs crates/biome_html_analyze/src -g '*.rs'
printf '\n--- test fixtures mentioning v-on ---\n'
rg -n "v-on|vue_valid_v_on|use_vue_valid_v_on" crates/biome_html_analyze -g '*.*'Repository: biomejs/biome
Length of output: 50369
🌐 Web query:
Vue v-on object syntax modifiers supported arg-less directive docs
💡 Result:
The Vue v-on directive, when used with the object syntax (e.g., v-on="{ click: handler }"), does not support event modifiers [1]. In Vue, modifiers (such as.stop,.prevent, or.capture) are directive postfixes meant for use with standard event binding syntax (e.g., @click.stop="handler") [1][2]. Because the object syntax expects an object of event names as keys and handler functions as values, modifiers cannot be applied to these keys [1][3]. Attempting to use a key like "keyup.enter" within the object will merely register a listener for an event literally named "keyup.enter" rather than applying the "enter" key modifier to the "keyup" event [3]. If you require modifiers while using dynamic or object-based event binding, common workarounds include: 1. Manual Handling: Register the base event and manually perform checks (e.g., checking event.key for "Enter") within your handler function [3]. 2. Using withModifiers: For more advanced scenarios, Vue exposes a helper function called withModifiers (found in @vue/runtime-dom) which can be used to manually wrap handlers with specific modifiers [4]. 3. Structural Alternatives: If possible, refactor your template to use individual v-on bindings, which fully support modifiers, instead of relying on the object syntax [1][2]. The object syntax for v-on was originally introduced specifically to support event proxying and programmatic binding, and its exclusion of modifier support is a documented limitation [1][5].
Citations:
- 1: https://vuejs.org/api/built-in-directives.html
- 2: https://vuejs.org/guide/essentials/event-handling
- 3: https://stackoverflow.com/questions/71638466/pass-event-modifiers-with-v-on-object-syntax
- 4: Extending object syntax of v-on to support modifiers vuejs/vue#7846
- 5: vuejs/vue@11614d6
Reject modifiers on arg-less object syntax. v-on.stop="listeners" should still be reported; the object-syntax path now skips it because the missing-handler check is bypassed and find_invalid_modifiers still accepts stop/prevent. Add an invalid fixture for one of these cases.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@crates/biome_html_analyze/src/lint/correctness/use_vue_valid_v_on.rs` around
lines 78 - 95, The arg-less `v-on` object-syntax path in `use_vue_valid_v_on` is
incorrectly allowing modifiers like `stop` and `prevent` to pass when a
handler/value is present, so `v-on.stop="listeners"` is not being reported.
Update the directive validation logic to reject modifiers whenever
`vue_directive.arg()` is missing and the syntax is being treated as object
syntax, making sure this case is handled before or within the
`find_invalid_modifiers`/missing-handler flow. Add an invalid test fixture
covering an arg-less object-syntax example with a disallowed modifier such as
`stop` or `prevent`.
Merging this PR will degrade performance by 7.5%
Warning Please fix the performance issues or acknowledge them on CodSpeed. Performance Changes
Tip Investigate this regression by commenting Comparing Footnotes
|
Per CodeRabbit review on PR biomejs#10773 and the CONTRIBUTING guidance that changesets be "concise" and "usually between 1 and 3 sentences long", collapse the entry to a single paragraph: the verb-modifier-only fix with a single example, and the arg-less object-syntax fix.
This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.5.2` -> `2.5.3`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.5.2/2.5.3) | `2.5.4` | --- ### Release Notes <details> <summary>biomejs/biome (@​biomejs/biome)</summary> ### [`v2.5.3`](https://github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#253) [Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.5.2...@biomejs/biome@2.5.3) ##### Patch Changes - [#​10815](biomejs/biome#10815) [`86613d5`](biomejs/biome@86613d5) Thanks [@​WaterWhisperer](https://github.com/WaterWhisperer)! - Fixed a parser panic reported in [#​10708](biomejs/biome#10708): Biome now recovers when unsupported CSS Modules `@value` rules or scoped `@keyframes` names end at EOF. - [#​10534](biomejs/biome#10534) [`da9b403`](biomejs/biome@da9b403) Thanks [@​Mokto](https://github.com/Mokto)! - Fixed [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/) false positives in Svelte files: Svelte store subscriptions (`$store` references in templates now keep the underlying `store` binding from being flagged), and `$bindable()` props that are only written to in the script block (write-only is intentional for bindable props) are no longer reported as unused. - [#​10827](biomejs/biome#10827) [`098ba41`](biomejs/biome@098ba41) Thanks [@​Aqu1bp](https://github.com/Aqu1bp)! - Fixed [#​10698](biomejs/biome#10698): The [`noUnsafeOptionalChaining`](https://biomejs.dev/linter/rules/no-unsafe-optional-chaining/) rule now reports unsafe optional chains wrapped in TypeScript `as`, `satisfies`, type assertion, and instantiation expressions, such as `new (value?.constructor as Constructor)()`. - [#​10773](biomejs/biome#10773) [`3c6513d`](biomejs/biome@3c6513d) Thanks [@​otkrickey](https://github.com/otkrickey)! - Fixed [#​10772](biomejs/biome#10772): [`useVueValidVOn`](https://biomejs.dev/linter/rules/use-vue-valid-v-on/) no longer reports a missing handler for v-on directives using a verb modifier (`.stop` / `.prevent`) without an expression, e.g. `<div @​click.stop></div>`. The rule also accepts the arg-less object syntax `<div v-on="$listeners"></div>` instead of reporting a missing event name. - [#​10721](biomejs/biome#10721) [`d83c66b`](biomejs/biome@d83c66b) Thanks [@​minseong0324](https://github.com/minseong0324)! - Improved type-aware lint rule inference for built-in globals and indexed function calls. Biome now resolves `Error(...)`, `new Error(...)`, optional `Error#stack`, and calls through indexed function values such as `handlers[0]()` more accurately. - [#​10865](biomejs/biome#10865) [`6450276`](biomejs/biome@6450276) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​10845](biomejs/biome#10845). Biome Language Server no longer goes in deadlock when the scanner is enabled. - [#​10853](biomejs/biome#10853) [`93d8e53`](biomejs/biome@93d8e53) Thanks [@​Netail](https://github.com/Netail)! - Fixed [#​10840](biomejs/biome#10840): Astro shorthand attribute syntax is now correctly being parsed from embedded nodes. - [#​10820](biomejs/biome#10820) [`bba3092`](biomejs/biome@bba3092) Thanks [@​JamBalaya56562](https://github.com/JamBalaya56562)! - Fixed [#​10619](biomejs/biome#10619): [`noProcessEnv`](https://biomejs.dev/linter/rules/no-process-env/) now also reports computed (bracket) member access. Previously only dot access was checked, so `process["env"]` and `env["NODE_ENV"]` (where `env` is imported from `node:process`) were missed. Both static and computed accesses are now reported. - [#​10835](biomejs/biome#10835) [`3447b2f`](biomejs/biome@3447b2f) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed [#​10824](biomejs/biome#10824): [`useDomQuerySelector`](https://biomejs.dev/linter/rules/use-dom-query-selector/) now supports an `ignore` option for receiver identifiers that should not be reported. - [#​10875](biomejs/biome#10875) [`b12e486`](biomejs/biome@b12e486) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed [#​10795](biomejs/biome#10795): `--profile-rules` now reports timings for each plugin separately as `plugin/<pluginName>`, matching the naming used by plugin suppressions, instead of aggregating all plugins under a single `plugin/plugin` entry. - [#​10877](biomejs/biome#10877) [`d6bc447`](biomejs/biome@d6bc447) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [biome-zed#164](biomejs/biome-zed#164): Biome no longer inserts stray whitespace when format-on-type runs after closing delimiters such as `)`, `]`, and `}`. - [#​10867](biomejs/biome#10867) [`a21463e`](biomejs/biome@a21463e) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed [#​10864](biomejs/biome#10864): Biome no longer crashes when checking or linting HTML files with unquoted attribute values such as `<textarea rows=4></textarea>`. </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNTIuMyIsInVwZGF0ZWRJblZlciI6IjQzLjI1Mi4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Client/pulls/12
This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.5.2` -> `2.5.3`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.5.2/2.5.3) | `2.5.4` | --- ### Release Notes <details> <summary>biomejs/biome (@​biomejs/biome)</summary> ### [`v2.5.3`](https://github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#253) [Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.5.2...@biomejs/biome@2.5.3) ##### Patch Changes - [#​10815](biomejs/biome#10815) [`86613d5`](biomejs/biome@86613d5) Thanks [@​WaterWhisperer](https://github.com/WaterWhisperer)! - Fixed a parser panic reported in [#​10708](biomejs/biome#10708): Biome now recovers when unsupported CSS Modules `@value` rules or scoped `@keyframes` names end at EOF. - [#​10534](biomejs/biome#10534) [`da9b403`](biomejs/biome@da9b403) Thanks [@​Mokto](https://github.com/Mokto)! - Fixed [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/) false positives in Svelte files: Svelte store subscriptions (`$store` references in templates now keep the underlying `store` binding from being flagged), and `$bindable()` props that are only written to in the script block (write-only is intentional for bindable props) are no longer reported as unused. - [#​10827](biomejs/biome#10827) [`098ba41`](biomejs/biome@098ba41) Thanks [@​Aqu1bp](https://github.com/Aqu1bp)! - Fixed [#​10698](biomejs/biome#10698): The [`noUnsafeOptionalChaining`](https://biomejs.dev/linter/rules/no-unsafe-optional-chaining/) rule now reports unsafe optional chains wrapped in TypeScript `as`, `satisfies`, type assertion, and instantiation expressions, such as `new (value?.constructor as Constructor)()`. - [#​10773](biomejs/biome#10773) [`3c6513d`](biomejs/biome@3c6513d) Thanks [@​otkrickey](https://github.com/otkrickey)! - Fixed [#​10772](biomejs/biome#10772): [`useVueValidVOn`](https://biomejs.dev/linter/rules/use-vue-valid-v-on/) no longer reports a missing handler for v-on directives using a verb modifier (`.stop` / `.prevent`) without an expression, e.g. `<div @​click.stop></div>`. The rule also accepts the arg-less object syntax `<div v-on="$listeners"></div>` instead of reporting a missing event name. - [#​10721](biomejs/biome#10721) [`d83c66b`](biomejs/biome@d83c66b) Thanks [@​minseong0324](https://github.com/minseong0324)! - Improved type-aware lint rule inference for built-in globals and indexed function calls. Biome now resolves `Error(...)`, `new Error(...)`, optional `Error#stack`, and calls through indexed function values such as `handlers[0]()` more accurately. - [#​10865](biomejs/biome#10865) [`6450276`](biomejs/biome@6450276) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​10845](biomejs/biome#10845). Biome Language Server no longer goes in deadlock when the scanner is enabled. - [#​10853](biomejs/biome#10853) [`93d8e53`](biomejs/biome@93d8e53) Thanks [@​Netail](https://github.com/Netail)! - Fixed [#​10840](biomejs/biome#10840): Astro shorthand attribute syntax is now correctly being parsed from embedded nodes. - [#​10820](biomejs/biome#10820) [`bba3092`](biomejs/biome@bba3092) Thanks [@​JamBalaya56562](https://github.com/JamBalaya56562)! - Fixed [#​10619](biomejs/biome#10619): [`noProcessEnv`](https://biomejs.dev/linter/rules/no-process-env/) now also reports computed (bracket) member access. Previously only dot access was checked, so `process["env"]` and `env["NODE_ENV"]` (where `env` is imported from `node:process`) were missed. Both static and computed accesses are now reported. - [#​10835](biomejs/biome#10835) [`3447b2f`](biomejs/biome@3447b2f) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed [#​10824](biomejs/biome#10824): [`useDomQuerySelector`](https://biomejs.dev/linter/rules/use-dom-query-selector/) now supports an `ignore` option for receiver identifiers that should not be reported. - [#​10875](biomejs/biome#10875) [`b12e486`](biomejs/biome@b12e486) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed [#​10795](biomejs/biome#10795): `--profile-rules` now reports timings for each plugin separately as `plugin/<pluginName>`, matching the naming used by plugin suppressions, instead of aggregating all plugins under a single `plugin/plugin` entry. - [#​10877](biomejs/biome#10877) [`d6bc447`](biomejs/biome@d6bc447) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [biome-zed#164](biomejs/biome-zed#164): Biome no longer inserts stray whitespace when format-on-type runs after closing delimiters such as `)`, `]`, and `}`. - [#​10867](biomejs/biome#10867) [`a21463e`](biomejs/biome@a21463e) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed [#​10864](biomejs/biome#10864): Biome no longer crashes when checking or linting HTML files with unquoted attribute values such as `<textarea rows=4></textarea>`. </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNTIuMyIsInVwZGF0ZWRJblZlciI6IjQzLjI1Mi4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Server/pulls/23
Summary
useVueValidVOnwas reporting a missing handler for v-on directives thatuse one of the verb modifiers (
.stop/.prevent) without anexpression. Forms like
<div @click.stop></div>and<form @submit.prevent></form>are valid Vue syntax — the modifiercarries an intrinsic side effect (
event.stopPropagation()/event.preventDefault()) and the directive needs no handler. The fixmirrors
eslint-plugin-vue'sVERB_MODIFIERSset used by the upstreamvalid-v-onrule.A second commit fixes a related false positive where
<div v-on="$listeners"></div>and other arg-lessv-onwith an objectvalue were reported as missing an event name. An arg-less
v-onwith avalue is the Vue object syntax (parallel to
<div v-bind="object"></div>,fixed for v-bind in #9643).
While here,
find_invalid_modifierswas switched totext_trimmed()sothe modifier-name lookup keeps working when the modifier is followed by
whitespace (
<Foo @click.stop />). Same shape as the latent bug fixedon the v-bind side in #10767.
no_vue_v_on_number_valuesalready usestext_trimmed().Vue docs for the relevant syntax:
fixes #10772
AI assistance disclosure
Implemented with Claude Code under my direction and review.
Test Plan
snapshots —
invalid.vuedrops the obsolete arg-less-with-value case;valid.vuegains verb-modifier-only handlers (tag-closing andself-closing components, longform/shorthand, verb+non-verb combos), the
arg-less
v-on="..."object syntax, and a verb-modifier inside av-for.