import { type TSESTree } from '@typescript-eslint/utils';
import ts from 'typescript';
import { type NodeMap } from '../typescript/node-map';
export { walkAfterAsyncBoundaryAst, walkAst, walkSynchronousAst } from '../ast/ast-walk';
export type { NodeMap } from '../typescript/node-map';
export { findAngularCoreImport, findAngularCoreImports, findAngularCoreImportSpecifier, findRuntimeAngularCoreImport, getLocalNameForImport, } from './angular-imports';
export type ReactiveCallback = TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression;
export interface ReactiveScope {
    readonly callback: ReactiveCallback;
    readonly kind: string;
    readonly owner: TSESTree.CallExpression;
    readonly reportNode: TSESTree.Node;
}
export interface SignalUsage {
    readonly reads: TSESTree.CallExpression[];
    readonly writes: TSESTree.CallExpression[];
}
export declare function isReactiveCallback(node: TSESTree.Node | null | undefined): node is ReactiveCallback;
export declare function getReactiveCallbackArgument(node: TSESTree.CallExpression): ReactiveCallback | null;
export declare function isAngularEffectCall(node: TSESTree.CallExpression, program: TSESTree.Program): boolean;
export declare function isAngularInjectCall(node: TSESTree.CallExpression, program: TSESTree.Program): boolean;
export declare function isAngularUntrackedCall(node: TSESTree.CallExpression, program: TSESTree.Program): boolean;
export declare function getReactiveScopes(node: TSESTree.CallExpression, program: TSESTree.Program): ReactiveScope[];
export declare function isNodeInsideSynchronousReactiveScope(node: TSESTree.Node, callback: ReactiveCallback): boolean;
export declare function isNodeAfterAsyncBoundaryInReactiveScope(node: TSESTree.Node, callback: ReactiveCallback): boolean;
export declare function findEnclosingReactiveScope(node: TSESTree.Node, program: TSESTree.Program): ReactiveScope | null;
export declare function findEnclosingReactiveScopeAfterAsyncBoundary(node: TSESTree.Node, program: TSESTree.Program): ReactiveScope | null;
/**
 * Returns true when the TypeScript type at `node` is an Angular signal type.
 * Uses duck-typing: callable type whose name contains "Signal", or whose
 * string-keyed properties include the Angular `ɵ` brand.
 *
 * Falls back to `false` on any error.
 */
export declare function isSignalType(node: TSESTree.Node, checker: ts.TypeChecker, esTreeNodeToTSNodeMap: NodeMap): boolean;
export declare function isSignalReadCall(node: TSESTree.CallExpression, checker: ts.TypeChecker, esTreeNodeToTSNodeMap: NodeMap): boolean;
export declare function isWritableSignalWrite(node: TSESTree.CallExpression, checker: ts.TypeChecker, esTreeNodeToTSNodeMap: NodeMap): boolean;
/**
 * Returns true when `node` is a member expression `foo.bar` where `bar` is a
 * TypeScript getter. Getter accesses are opaque — the getter body can read
 * signals, so wrapping them in `untracked()` is justified.
 */
export declare function isGetterMemberAccess(node: TSESTree.MemberExpression, checker: ts.TypeChecker, esTreeNodeToTSNodeMap: NodeMap): boolean;
/**
 * Walks `scopeNode` and collects all signal reads and writes within it,
 * NOT recursing into nested `untracked(...)` calls (their contents are
 * already hidden from tracking).
 */
export declare function collectSignalUsages(scopeNode: TSESTree.Node, checker: ts.TypeChecker, esTreeNodeToTSNodeMap: NodeMap, program: TSESTree.Program): SignalUsage;
export declare function collectSignalReadsInsideUntracked(root: TSESTree.Node, checker: ts.TypeChecker, esTreeNodeToTSNodeMap: NodeMap, program: TSESTree.Program): TSESTree.CallExpression[];
export declare function isReactiveOwnerCall(node: TSESTree.Node, program: TSESTree.Program): node is TSESTree.CallExpression;
export declare function getReturnedReactiveOwnerCall(node: TSESTree.CallExpression, program: TSESTree.Program): TSESTree.CallExpression | null;
