import type { DeclaredSink, Selector, SinkCall } from "../../../core/ports/config.port.js"; import type { Ancestor } from "../index/python/hierarchy.js"; export type SinkMatch = { readonly sink: DeclaredSink; readonly call: SinkCall; }; /** * The sink a class belongs to. A class claims a sink only when an ancestor's * import origin resolves to the declared base type, so a class that merely * carries the members claims nothing. */ export declare function sinkOfAncestry(ancestors: readonly Ancestor[], sinks: readonly DeclaredSink[]): DeclaredSink | null; /** The sink a class belongs to, with the ancestor that declares the boundary. */ export declare function sinkBoundaryOf(ancestors: readonly Ancestor[], sinks: readonly DeclaredSink[]): { readonly sink: DeclaredSink; readonly index: number; } | null; /** * Whether calling `member` on an instance of this hierarchy leaves it. A member * an ancestor below the boundary declares is the subclass's own business; one * declared at the boundary or above it, or nowhere the unit can see, can only * have come from the declared base type. */ export declare function crossesSinkBoundary(ancestors: readonly Ancestor[], sinks: readonly DeclaredSink[], member: string): boolean; export declare function callOfMember(sink: DeclaredSink, member: string): SinkCall | null; /** A per-member binding overrides the sink-level one for that member alone. */ export declare function bindingOf(match: SinkMatch, key: "pathArg" | "method" | "target"): Selector | null;