oxc-project/oxc · error

Invalid fix capabilities. Did you mean 'suggestion'?

Error message

Invalid fix capabilities. Did you mean 'suggestion'?

What it means

Diagnostic from oxlint's vue/return-in-emits-validator rule (crates/oxc_linter/src/rules/vue/return_in_emits_validator.rs), `.vue` files only. Validators declared in `emits: { foo(payload) {...} }` (Options API) or `defineEmits({ foo(...) {...} })` must return a boolean verdict. This variant fires when the validator's top-level body contains no return-with-value at all (returns inside nested functions don't count), making the validator effectively always-false.

Source

Thrown at crates/oxc_macros/src/declare_oxc_lint.rs:425

fn parse_fix(s: &str) -> proc_macro2::TokenStream {
    const SEP: char = '_';

    match s {
        "none" => {
            return quote! { RuleFixMeta::None };
        }
        "pending" => {
            return quote! { RuleFixMeta::FixPending };
        }
        "fix" => return quote! { RuleFixMeta::Fixable(FixKind::SafeFix) },
        "suggestion" => return quote! { RuleFixMeta::Fixable(FixKind::Suggestion) },
        "conditional" => {
            panic!("Invalid fix capabilities: missing a fix kind. Did you mean 'fix-conditional'?")
        }
        "None" => panic!("Invalid fix capabilities. Did you mean 'none'?"),
        "Pending" => panic!("Invalid fix capabilities. Did you mean 'pending'?"),
        "Fix" => panic!("Invalid fix capabilities. Did you mean 'fix'?"),
        "Suggestion" => panic!("Invalid fix capabilities. Did you mean 'suggestion'?"),
        invalid if !invalid.contains(SEP) => panic!(
            "invalid fix capabilities: {invalid}. Valid capabilities are none, pending, fix, suggestion, or [fix|suggestion]_[conditional?]_[dangerous?]."
        ),
        _ => {}
    }

    assert!(s.contains(SEP));

    let mut is_conditional = false;
    let fix_kinds = s
        .split(SEP)
        .filter(|seg| match *seg {
            "conditional" => {
                is_conditional = true;
                false
            }
            // e.g. "safe_fix". safe is implied
            "safe"

View on GitHub (pinned to a3d33dda7c)

Solutions

  1. Return the check result: `foo(p) { return typeof p === 'string'; }`.
  2. For arrow validators use a concise body: `foo: (p) => typeof p === 'string'`.
  3. If no validation is needed, declare the event as a string: `emits: ['foo']`.

Example fix

// before
emits: { foo(payload) { validate(payload); } }

// after
emits: { foo(payload) { return validate(payload); } }
Defensive patterns

Strategy: validation

Validate before calling

// every emits validator must return a value
function checkEmits(defs) {
  for (const [name, v] of Object.entries(defs)) {
    if (typeof v !== 'function') continue;
    const src = v.toString();
    if (!/\breturn\s+[^;\n]/.test(src)) {
      throw new Error(`validator '${name}' never returns a value`);
    }
  }
}

Prevention

When it happens

Trigger: `emits: { foo() { doCheck(); } }` or `emits: { foo() { return; } }` — the function/arrow body has zero value-carrying top-level returns. Also validators whose only returns live inside nested function or arrow callbacks (nested_depth > 0 is skipped).

Common situations: Validators written as throwing assertions instead of predicates; refactors that empty the body; pasting event handlers into the emits option.

Related errors


AI-assisted analysis of oxc-project/oxc@a3d33dda7c (2026-08-20). Data as JSON: /api/errors/c09c172ff22ec25e. Report an issue: GitHub.