/** * Unused-key reconciler (B3) — decide which *defined* keys no source references. * * A key counts as used if ANY usage layer reaches it, biased hard toward "used" * so a live key is never flagged for deletion: exact static call, dynamic-prefix * coverage, the loose literal-pool harvest (any string literal equal to a key), * an explicit dynamic-key allowlist, or a runtime-observed key. What survives all * layers is reported — `confirmed` when no opaque `t(variable)` site could be * hiding it, else `suspect`. Separately, static render keys absent from the * defined set surface as `used-but-undefined` (a typo / stale rename that renders * its raw key at runtime). */ import type { KeyUsageSite, UsageScan } from './scan/types.js'; export interface UnusedKeyFinding { key: string; /** `confirmed`: no usage signal and no opaque sites. `suspect`: opaque `t(var)` sites exist. */ tier: 'confirmed' | 'suspect'; } export interface UsedButUndefinedFinding { key: string; sites: KeyUsageSite[]; } export interface DynamicPrefixCoverage { prefix: string; /** Defined keys this prefix shields from the unused list (no other usage signal). */ shieldedKeys: number; } export interface UnusedReport { /** Defined keys reached by no usage layer. */ unused: UnusedKeyFinding[]; /** Static render keys (`t('x')`) with no matching defined key. */ usedButUndefined: UsedButUndefinedFinding[]; /** Per-prefix blast radius, so a human sees what each dynamic family hides. */ dynamicPrefixCoverage: DynamicPrefixCoverage[]; /** Count of unresolved `t(variable)` sites — why `suspect` exists. */ opaqueSiteCount: number; } export interface FindUnusedOptions { /** Key globs (`errors.*`) built dynamically — always treated as used. */ dynamicKeys?: string[]; /** Key globs excluded from the report entirely (intentionally retained, e.g. `legacy.*`). */ ignoreKeys?: string[]; /** Keys observed at runtime (e.g. from `createMissingKeyCollector`) — treated as used. */ runtimeUsedKeys?: Iterable; } export declare function findUnusedKeys(definedKeys: Iterable, scan: UsageScan, options?: FindUnusedOptions): UnusedReport;