← Files Biological Sequence & Alignment ViewerARCHIVED FILE
src/target-resolution.ts
1015 Bytes · Sep 30, 2026 · 23:01 UTC
export type TargetResolution<T> =
| { status: "resolved"; target: T }
| { candidates: Array<T>; status: "ambiguous" }
| { status: "not-found" };
/** Exact stable IDs win. Human-readable aliases must resolve uniquely. */
export function resolveViewerTarget<T>({
aliases,
id,
selector,
targets,
}: {
aliases: (target: T) => Array<string | null | undefined>;
id: (target: T) => string;
selector: string;
targets: Array<T>;
}): TargetResolution<T> {
const exact = targets.find((target) => id(target) === selector);
if (exact != null) return { status: "resolved", target: exact };
const normalized = selector.trim().toLowerCase();
const candidates = targets.filter((target) =>
aliases(target).some((alias) => alias?.trim().toLowerCase() === normalized),
);
if (candidates.length === 1 && candidates[0] != null) {
return { status: "resolved", target: candidates[0] };
}
return candidates.length > 1
? { candidates, status: "ambiguous" }
: { status: "not-found" };
}
SHA-256: 6f897c8ca23e2208b9db110697d035776e70f970559274921e83a633a907ee3b