import type { VariableType, TypeAliasEntry } from "../../types.js";
import type { TsNode } from "../../ir/tsIR.js";
/**
 * Build a TS IR node that evaluates to a runtime `TypeValidationDescriptor`.
 *
 * Mirrors `mapTypeToValidationSchema`'s structural recursion but threads
 * validator lists collected from `@validate(...)` tags at each level.
 *
 * Use this only when the type carries at least one `@validate` tag
 * somewhere — callers should check via `hasAnyValidateTag` first.
 *
 * `typeAliasesFull` (when provided) lets the walker pick up alias-level
 * validators for `typeAliasVariable` references that `resolveTypeDeep`
 * intentionally leaves intact (so codegen can keep `.meta(...)` on the
 * one top-level alias schema). Without it, alias-level `@validate`
 * tags reachable only through a non-generic alias reference would be
 * silently dropped.
 */
export declare function buildValidationDescriptor(variableType: VariableType, typeAliases: Record<string, VariableType>, typeAliasesFull?: Record<string, TypeAliasEntry>): TsNode;
/**
 * Walks a resolved type tree to determine whether any `@validate(...)`
 * tag is present at any depth. Builders use this to gate the
 * descriptor-based emit path; types without any `@validate` continue
 * to use the existing zero-cost `__validateType(...)` codegen.
 *
 * `aliasesFull` (optional) lets us see through non-generic
 * `typeAliasVariable` references — `deepResolveNode` leaves those
 * intact for codegen-by-name purposes, so we have to look them up
 * here to decide if the alias body carries `@validate`.
 */
export declare function hasAnyValidateTag(t: VariableType, aliasesFull?: Record<string, TypeAliasEntry>, seen?: Set<string>): boolean;
