import { AI_SLOP_GREP_PATTERN_DESCRIPTIONS, AI_SLOP_GREP_PATTERN_RULES, COMPLEXITY_GREP_PATTERN_DESCRIPTIONS, COMPLEXITY_GREP_PATTERN_RULES, DEFENSIVE_PROGRAMMING_GREP_PATTERN_DESCRIPTIONS, DEFENSIVE_PROGRAMMING_GREP_PATTERN_RULES, INCONSISTENCY_GREP_PATTERN_DESCRIPTIONS, INCONSISTENCY_GREP_PATTERN_RULES, LEGACY_CODE_GREP_PATTERN_DESCRIPTIONS, LEGACY_CODE_GREP_PATTERN_RULES, SECURITY_SLOP_GREP_PATTERN_DESCRIPTIONS, SECURITY_SLOP_GREP_PATTERN_RULES, type GrepPatternRuleDefinition, } from "./grep-pattern-rule-families"; export type { GrepPatternRuleDefinition } from "./grep-pattern-rule-families"; export const GREP_PATTERN_RULE_FAMILIES = { aiSlop: AI_SLOP_GREP_PATTERN_RULES, legacyCode: LEGACY_CODE_GREP_PATTERN_RULES, defensiveProgramming: DEFENSIVE_PROGRAMMING_GREP_PATTERN_RULES, complexity: COMPLEXITY_GREP_PATTERN_RULES, securitySlop: SECURITY_SLOP_GREP_PATTERN_RULES, inconsistency: INCONSISTENCY_GREP_PATTERN_RULES, } as const; const GREP_PATTERN_RULE_DESCRIPTIONS = { ...AI_SLOP_GREP_PATTERN_DESCRIPTIONS, ...LEGACY_CODE_GREP_PATTERN_DESCRIPTIONS, ...DEFENSIVE_PROGRAMMING_GREP_PATTERN_DESCRIPTIONS, ...COMPLEXITY_GREP_PATTERN_DESCRIPTIONS, ...SECURITY_SLOP_GREP_PATTERN_DESCRIPTIONS, ...INCONSISTENCY_GREP_PATTERN_DESCRIPTIONS, }; const GREP_PATTERN_RULE_BY_ID = new Map( Object.values(GREP_PATTERN_RULE_FAMILIES) .flat() .map((rule) => [rule.id, rule]), ); const GREP_PATTERN_RULE_ORDER = [ "BANNER_COMMENT", "NARRATION_COMMENT", "APOLOGETIC_COMMENT", "OBVIOUS_JSX_LABEL", "TODO_REMOVE", "DEMO_PLACEHOLDER", "DEPRECATED_ANNOTATION", "HEDGING_COMMENT", "SECTION_LABEL_COMMENT", "INSTRUCTIONAL_COMMENT", "STATED_RETURN_COMMENT", "TRIPLE_NULL_GUARD", "EXPLICIT_TRUE_COMPARE", "RETURN_UNDEFINED", "PLACEHOLDER_VAR_NAME", "LOG_AND_RETHROW", "LINT_ESCAPE", "ENTRY_EXIT_LOG", "FIXME_HACK_XXX", "DEEP_NESTING", "NESTED_TERNARY", "HARDCODED_SECRET", "HARDCODED_URL", "SQL_INJECTION", "COMMENTED_CODE_BLOCK", "PLACEHOLDER_VALUE", "MIXED_IMPORT_STYLE", "CALLBACK_STYLE", "UNCHECKED_PROMISE", "HARDCODED_FAKE_DATA", "UNNECESSARY_INTERMEDIATE", "DEBUG_BREAKPOINT", "USEMEMO_EMPTY_DEPS", "FAKE_LOADING_DELAY", "UNNECESSARY_USECALLBACK", "REDUNDANT_BOOLEAN_RETURN", "UNDERSCORE_STATE", "BOOLEAN_FLAG_PARAMS", "REDUNDANT_CAST", "KEY_INDEX", "CLIENT_GENERATED_ID", "OR_CASCADE", "EMPTY_ARRAY_FALLBACK", "EMPTY_OBJECT_FALLBACK", "NOOP_LAMBDA_FALLBACK", "PROMISE_RESOLVE_FALLBACK", ] as const; export const GREP_PATTERN_RULES: GrepPatternRuleDefinition[] = GREP_PATTERN_RULE_ORDER.map((id) => { const rule = GREP_PATTERN_RULE_BY_ID.get(id); if (!rule) { throw new Error(`Missing grep-pattern rule definition for ${id}`); } return rule; }); export const GREP_PATTERN_RULE_CATALOG = GREP_PATTERN_RULES.map(({ id, category, tier }) => ({ id, category, tier, tool: "grep" as const, desc: GREP_PATTERN_RULE_DESCRIPTIONS[id] ?? id.toLowerCase().replace(/_/g, " "), }));