{"record":{"id":"c09c172ff22ec25e","repo":"oxc-project/oxc","slug":"invalid-fix-capabilities-did-you-mean-suggestion","errorCode":null,"errorMessage":"Invalid fix capabilities. Did you mean 'suggestion'?","messagePattern":"Invalid fix capabilities\\. Did you mean 'suggestion'\\?","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/oxc_macros/src/declare_oxc_lint.rs","lineNumber":425,"sourceCode":"fn parse_fix(s: &str) -> proc_macro2::TokenStream {\n    const SEP: char = '_';\n\n    match s {\n        \"none\" => {\n            return quote! { RuleFixMeta::None };\n        }\n        \"pending\" => {\n            return quote! { RuleFixMeta::FixPending };\n        }\n        \"fix\" => return quote! { RuleFixMeta::Fixable(FixKind::SafeFix) },\n        \"suggestion\" => return quote! { RuleFixMeta::Fixable(FixKind::Suggestion) },\n        \"conditional\" => {\n            panic!(\"Invalid fix capabilities: missing a fix kind. Did you mean 'fix-conditional'?\")\n        }\n        \"None\" => panic!(\"Invalid fix capabilities. Did you mean 'none'?\"),\n        \"Pending\" => panic!(\"Invalid fix capabilities. Did you mean 'pending'?\"),\n        \"Fix\" => panic!(\"Invalid fix capabilities. Did you mean 'fix'?\"),\n        \"Suggestion\" => panic!(\"Invalid fix capabilities. Did you mean 'suggestion'?\"),\n        invalid if !invalid.contains(SEP) => panic!(\n            \"invalid fix capabilities: {invalid}. Valid capabilities are none, pending, fix, suggestion, or [fix|suggestion]_[conditional?]_[dangerous?].\"\n        ),\n        _ => {}\n    }\n\n    assert!(s.contains(SEP));\n\n    let mut is_conditional = false;\n    let fix_kinds = s\n        .split(SEP)\n        .filter(|seg| match *seg {\n            \"conditional\" => {\n                is_conditional = true;\n                false\n            }\n            // e.g. \"safe_fix\". safe is implied\n            \"safe\"","sourceCodeStart":407,"sourceCodeEnd":443,"githubUrl":"https://github.com/oxc-project/oxc/blob/a3d33dda7cb69da23db4fcaa2c0c05de61e760a1/crates/oxc_macros/src/declare_oxc_lint.rs#L407-L443","documentation":"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.","triggerScenarios":"`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).","commonSituations":"Validators written as throwing assertions instead of predicates; refactors that empty the body; pasting event handlers into the emits option.","solutions":["Return the check result: `foo(p) { return typeof p === 'string'; }`.","For arrow validators use a concise body: `foo: (p) => typeof p === 'string'`.","If no validation is needed, declare the event as a string: `emits: ['foo']`."],"exampleFix":"// before\nemits: { foo(payload) { validate(payload); } }\n\n// after\nemits: { foo(payload) { return validate(payload); } }","handlingStrategy":"validation","validationCode":"// every emits validator must return a value\nfunction checkEmits(defs) {\n  for (const [name, v] of Object.entries(defs)) {\n    if (typeof v !== 'function') continue;\n    const src = v.toString();\n    if (!/\\breturn\\s+[^;\\n]/.test(src)) {\n      throw new Error(`validator '${name}' never returns a value`);\n    }\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Model validators as pure boolean predicates that always return.","Unit-test each validator with a valid and an invalid payload.","Use string-form emits when no validation is needed."],"tags":["vue","oxlint","lint","emits","validator","control-flow"],"backgroundTag":"vue-emits-validator-return","analyzedSha":"a3d33dda7cb69da23db4fcaa2c0c05de61e760a1","analyzedAt":"2026-08-20T07:01:07.079Z","contentChangedAt":"2026-08-20T07:01:07.079Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}