/** * graph:duplicated-function-body — group catalog entries whose body * normalizes to the same hash and report duplicate bodies. The rule has * two complementary code paths under one slug: * * 1. **Per-instance (size-gated).** A "duplicate" is two or more * functions whose normalized body is byte-identical * (whitespace/comment normalization handled by hashFunctionBody). * Two thresholds filter out non-actionable hits: * * - minDuplicateBodyLines (default 5): the source span must be at * least this many lines. * - minDuplicateBodySize (default 200): the *normalized* body * (post comment-strip + whitespace-collapse) must be at least * this many characters. This catches the common case of a * `defineCheck({ ... analyze(content) { return analyzeFile(...) } })` * wrapper where the source spans 8+ lines but the executable * body is only ~80 characters once normalized — structurally * identical to every other thin wrapper, but never an actionable * refactor target. * * Emits N-1 signals per group (one per non-primary occurrence). * * 2. **Aggregate (cross-package).** For each body hash present in * ≥ minCrossPackageDuplicatePackages (default 3) DISTINCT packages * (via `pkgOf`), the rule emits ONE aggregate signal naming the * packages and SUPPRESSES the per-instance signals for that same hash * (no double-reporting). Bodies that don't reach N packages flow * through path (1) unchanged. * * This path applies a LIGHTER, body-size-only floor * (`minCrossPackageDuplicateBodySize`, default 80 chars — no line floor) * rather than the per-instance floor: a *small* body copied across * packages is exactly what this path exists to catch, so the floor is * tuned only to drop TRIVIAL bodies (empty DI-constructor shims, * one-line getters, thin delegators) that are never consolidation * targets, while keeping genuinely-small shared utilities visible. */ export declare const duplicatedFunctionBodyRule: import("../types.js").Rule; //# sourceMappingURL=duplicated-function-body.d.ts.map