/**
 * Conditional utility type expansion - core infrastructure, NonNullable,
 * and Exclude/Extract expansion.
 *
 * DETERMINISTIC IR TYPING (INV-0 compliant):
 * These utility types are expanded using AST-based syntactic algorithms only.
 * No banned APIs (getTypeAtLocation, getTypeOfSymbolAtLocation, typeToTypeNode).
 * Uses Binding for symbol resolution and extracts types from TypeNodes.
 *
 * Split from conditional-utility-types.ts for file-size compliance (< 500 LOC).
 */
import * as ts from "typescript";
import { IrType } from "../../../types.js";
import type { Binding } from "../../../binding/index.js";
/**
 * Set of supported conditional utility types that can be expanded
 * Uses AST-based syntactic algorithms, not TS type evaluation.
 */
export declare const EXPANDABLE_CONDITIONAL_UTILITY_TYPES: Set<string>;
/**
 * Check if a type name is an expandable conditional utility type
 */
export declare const isExpandableConditionalUtilityType: (name: string) => boolean;
/**
 * Maximum recursion depth for nested conditional utility expansion.
 * Prevents infinite recursion on cyclic aliases or pathological inputs.
 */
export declare const MAX_CONDITIONAL_UTILITY_RECURSION = 16;
/**
 * Resolve a type alias to its underlying TypeNode (AST-based, INV-0 compliant).
 * Follows type alias chains to get the actual type definition.
 *
 * @param node - The TypeNode to resolve
 * @param binding - The Binding layer for symbol resolution
 * @returns The resolved TypeNode, or the original if not a resolvable alias
 */
export declare const resolveTypeAlias: (node: ts.TypeNode, binding: Binding) => ts.TypeNode;
export declare const unwrapParens: (node: ts.TypeNode) => ts.TypeNode;
export declare const flattenUnionTypeNodes: (node: ts.TypeNode) => readonly ts.TypeNode[];
/**
 * Expand NonNullable<T> using syntactic filtering (INV-0 compliant).
 */
export declare const expandNonNullable: (typeArg: ts.TypeNode, binding: Binding, convertType: (node: ts.TypeNode, binding: Binding) => IrType) => IrType | null;
/**
 * Expand Exclude<T, U> or Extract<T, U> using syntactic filtering (INV-0 compliant).
 */
export declare const expandExcludeExtract: (tArg: ts.TypeNode, uArg: ts.TypeNode, isExtract: boolean, binding: Binding, convertType: (node: ts.TypeNode, binding: Binding) => IrType, depth: number) => IrType | null;
/**
 * Internal recursive expander for conditional utility types.
 * Exported for use by sub-modules.
 */
export declare const expandConditionalUtilityTypeInternal: (node: ts.TypeReferenceNode, typeName: string, binding: Binding, convertType: (node: ts.TypeNode, binding: Binding) => IrType, depth: number) => IrType | null;
//# sourceMappingURL=conditional-utility-types-core.d.ts.map