{"record":{"id":"208b204eeffef03c","repo":"oxc-project/oxc","slug":"invalid-fix-capabilities-invalid-valid-capabil","errorCode":null,"errorMessage":"invalid fix capabilities: {invalid}. Valid capabilities are none, pending, fix, suggestion, or [fix|suggestion]_[conditional?]_[dangerous?].","messagePattern":"invalid fix capabilities: (.+?)\\. Valid capabilities are none, pending, fix, suggestion, or \\[fix\\|suggestion\\]_\\[conditional\\?\\]_\\[dangerous\\?\\]\\.","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/oxc_macros/src/declare_oxc_lint.rs","lineNumber":426,"sourceCode":"    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\"\n            // e.g. fix_or_suggestion","sourceCodeStart":408,"sourceCodeEnd":444,"githubUrl":"https://github.com/oxc-project/oxc/blob/a3d33dda7cb69da23db4fcaa2c0c05de61e760a1/crates/oxc_macros/src/declare_oxc_lint.rs#L408-L444","documentation":"The second diagnostic of oxlint's vue/return-in-emits-validator rule (crates/oxc_linter/src/rules/vue/return_in_emits_validator.rs). It fires when the validator does return values, but every returned expression is statically falsy — `false`, `0`, `null`, `''`, `undefined`, `NaN`, or `0n` literals (checked by is_falsy). Such a validator always rejects the event, which almost always signals placeholder or inverted logic rather than intent.","triggerScenarios":"`emits: { foo: () => false }`, or a body whose returns are all falsy literals across branches (`if (a) return false; else if (b) return 0;`). One return of a non-literal expression (variable, comparison) anywhere silences the rule because it could be truthy.","commonSituations":"Stub validators left from scaffolding (`return false` TODO); inverted conditions; returning literal results of side-effect calls that were inlined.","solutions":["Return the actual validation expression instead of a literal: `return payload.length > 0;`.","Replace stubs with real checks before merging; use `return true` only for deliberately permissive validators.","If always-reject is truly intended, disable the rule for that validator with a comment explaining why."],"exampleFix":"// before\nemits: { foo: () => false }\n\n// after\nemits: { foo: (payload) => payload !== null }","handlingStrategy":"validation","validationCode":"// validators must not return only falsy literals\nfunction checkEmits(defs) {\n  for (const [name, v] of Object.entries(defs)) {\n    if (typeof v !== 'function') continue;\n    if (/\\breturn\\s+(false|0|null|''|undefined|NaN|0n)\\s*[;\\n]/.test(v.toString())) {\n      throw new Error(`validator '${name}' returns only falsy literals`);\n    }\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Replace `return false` stubs with the real predicate before merging.","Review validators in pairs: one passing case, one rejecting case.","Never leave TODO validators that reject everything."],"tags":["vue","oxlint","lint","emits","validator","falsy-return"],"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-14T00:17:10.932Z"}