import { PartialDeep } from 'type-fest';
import { SyntaxNode, SyntaxNodeType } from '../ast';
import { TraversePath } from './traverse';
export interface QueryOptions {
    queryAll?: boolean;
    order?: 'asc' | 'desc';
}
export declare enum SelectorCombinator {
    Child = ">",
    Inside = " "
}
export type SelectorFilter = '*' | SyntaxNodeType | PartialDeep<SyntaxNode>;
export declare class Selector {
    filter: PartialDeep<SyntaxNode>;
    _offset?: number | undefined;
    static create: (filter: SelectorFilter, _offset?: number) => Selector;
    next?: Selector;
    combinator?: SelectorCombinator;
    private constructor();
    _prev?: Selector;
    _getStartSelector: () => Selector;
    private chain;
    child: (f: SelectorFilter, _offset?: number) => Selector;
    inside: (f: SelectorFilter, _offset?: number) => Selector;
    /** @inner */
    query: <T extends SyntaxNode = SyntaxNode>(node: SyntaxNode | null, options?: QueryOptions) => Record<string, TraversePath<T>>;
    /** @inner */
    recursion: <T extends SyntaxNode = SyntaxNode>(path: TraversePath<SyntaxNode>, options?: QueryOptions) => Record<string, TraversePath<T>>;
}
export declare const createSelector: (filter: SelectorFilter, _offset?: number) => Selector;
export declare const query: <T extends SyntaxNode = SyntaxNode>(ast: SyntaxNode | null, selector: Selector | Selector[], options?: QueryOptions) => TraversePath<T>[];
export declare const querySelector: <T extends SyntaxNode = SyntaxNode>(ast: SyntaxNode | null, selector: Selector | Selector[]) => TraversePath<T> | null;
export declare const querySelectorAll: <T extends SyntaxNode = SyntaxNode>(ast: SyntaxNode | null, selector: Selector | Selector[]) => TraversePath<T>[];
