import { AST_TOKEN_TYPES, TSESTree as ESTree } from '@typescript-eslint/types';
import type { Loose, StringableASTNode, StringableASTNodeFn, WithoutType } from './types';
export declare const whiteSpace: (loc?: ESTree.SourceLocation) => string;
export declare const comments: (comments?: Loose<ESTree.Comment>[]) => {
    comments: (({
        type: AST_TOKEN_TYPES.Block;
        value: string;
    } & {
        loc?: ({
            start: {
                line: number;
                column: number;
            } & {};
            end: {
                line: number;
                column: number;
            } & {};
        } & {}) | undefined;
        range?: readonly number[] | undefined;
    }) | ({
        type: AST_TOKEN_TYPES.Line;
        value: string;
    } & {
        loc?: ({
            start: {
                line: number;
                column: number;
            } & {};
            end: {
                line: number;
                column: number;
            } & {};
        } & {}) | undefined;
        range?: readonly number[] | undefined;
    }))[];
    toString: () => string;
};
export declare const comment: ({ value, type, loc, ...other }: Loose<ESTree.Comment>) => {
    value: string;
    type: AST_TOKEN_TYPES.Block | AST_TOKEN_TYPES.Line;
    toString: () => string;
    range?: readonly number[] | undefined;
} | {
    value: string;
    type: AST_TOKEN_TYPES.Block | AST_TOKEN_TYPES.Line;
    toString: () => string;
    range?: readonly number[] | undefined;
};
/**
 * __JSXIdentifier__
 *
 * @param param Takes a string or the shape of a {ESTree.JSXIdentifier} node
 * @returns {ESTree.JSXIdentifier} node
 */
export declare const jsxIdentifier: (param: WithoutType<ESTree.JSXIdentifier> | string) => StringableASTNode<ESTree.JSXIdentifier>;
/**
 * __JSXOpeningFragment__
 *
 * @example
 * ```ts
 * <>hello</>
 * ^^
 * ```
 */
export declare const jsxOpeningFragment: StringableASTNodeFn<ESTree.JSXOpeningFragment>;
/**
 * __JSXClosingFragment__
 *
 * @example
 * ```ts
 * <>hello</>
 *        ^^
 * ```
 */
export declare const jsxClosingFragment: StringableASTNodeFn<ESTree.JSXClosingFragment>;
/**
 * __JSXFragment__
 *
 * @example
 * ```ts
 * <>hello</>
 * ^^^^^^^^^^
 * ```
 */
export declare const jsxFragment: StringableASTNodeFn<ESTree.JSXFragment>;
/**
 * __JSXSpreadChild__
 *
 * @example
 * ```ts
 * <>{...child}</>
 *   ^^^^^^^^^^
 * ```
 */
export declare const jsxSpreadChild: StringableASTNodeFn<ESTree.JSXSpreadChild>;
export declare const jsxMemberExpression: StringableASTNodeFn<ESTree.JSXMemberExpression>;
/**
 * __JSXElement__
 *
 * @example
 *
 * Usage
 * ```
 * import { jsxElement, jsxOpeningElement, jsxClosingElement, identifier } from 'eslint-codemod-utils'
 *
 * const modalName = identifier({ name: 'Modal' })
 * const modal = jsxElement({
 *  openingElement: jsxOpeningElement({ name: modalName, selfClosing: false }),
 *  closingElement: jsxClosingElement({ name: modalName }),
 * })
 * ```
 *
 * @example
 *
 * Produces
 * ```js
 * <Modal></Modal>
 * ```
 *
 * @returns {JSXElement}
 */
export declare const jsxElement: StringableASTNodeFn<ESTree.JSXElement>;
/**
 * __JSXSpreadAttribute__
 *
 * @example Usage
 *
 * ```js
 * import { jsxSpreadAttribute, identifier } from 'eslint-codemod-utils'
 *
 * const spreadAttr = jsxSpreadAttribute({
 *   argument: identifier({ name: 'spread' })
 * })
 * ```
 * @example
 *
 * ```js
 * // Produces a spread attribute
 * <div {...spread}>
 *      ⌃⌃⌃⌃⌃⌃⌃⌃⌃⌃⌃
 * ```
 *
 * @returns {ESTree.JSXSpreadAttribute}
 */
export declare const jsxSpreadAttribute: StringableASTNodeFn<ESTree.JSXSpreadAttribute>;
/**
 * __JSXOpeningElement__
 *
 * Note: `leadingComments` is a parser-added extension (ESLint attaches it to
 * the node during traversal). It's not part of `TSESTree.JSXOpeningElement`,
 * but the library has historically supported rendering it so that lint fixers
 * can preserve documentation comments on the opening tag. We accept it as an
 * optional extra input field and render it before the opening tag.
 */
export declare const jsxOpeningElement: ({ name, attributes, selfClosing, leadingComments, ...other }: WithoutType<ESTree.JSXOpeningElement> & {
    leadingComments?: (({
        type: AST_TOKEN_TYPES.Block;
        value: string;
    } & {
        loc?: ({
            start: {
                line: number;
                column: number;
            } & {};
            end: {
                line: number;
                column: number;
            } & {};
        } & {}) | undefined;
        range?: readonly number[] | undefined;
    }) | ({
        type: AST_TOKEN_TYPES.Line;
        value: string;
    } & {
        loc?: ({
            start: {
                line: number;
                column: number;
            } & {};
            end: {
                line: number;
                column: number;
            } & {};
        } & {}) | undefined;
        range?: readonly number[] | undefined;
    }))[] | undefined;
}) => StringableASTNode<ESTree.JSXOpeningElement>;
/**
 * __JSXClosingElement__
 *
 * @example
 *
 * ```js
 * // The below jsx div is a closing element.
 * // A closing element is expected to match a valid opening element of the same name
 * </div>
 * ```
 *
 * @returns {ESTree.JSXClosingElement}
 */
export declare const jsxClosingElement: StringableASTNodeFn<ESTree.JSXClosingElement>;
/**
 * __JSXText__
 *
 * @example
 *
 * ```js
 * // In the below jsx, the string, "hello world" is considered JSXText.
 * // JSXText can be a any number, boolean, or string value.
 * <div>hello world</div>
 * ```
 *
 * @returns {ESTree.JSXText}
 */
export declare const jsxText: StringableASTNodeFn<ESTree.JSXText>;
/**
 * __JSXEmptyExpression__
 *
 * @example
 *
 * ```tsx
 * <SomeJSX attribute={} />
 *                    ^^
 * ```
 *
 * @returns {ESTree.JSXEmptyExpression}
 */
export declare const jsxEmptyExpression: StringableASTNodeFn<ESTree.JSXEmptyExpression>;
/**
 * __JSXExpressionContainer__
 *
 * @example
 *
 * ```tsx
 * <SomeJSX attribute={someValue} />
 *                    ^^^^^^^^^^^
 * ```
 *
 * @returns {ESTree.JSXExpressionContainer}
 */
export declare const jsxExpressionContainer: StringableASTNodeFn<ESTree.JSXExpressionContainer>;
/**
 * __JSXAttribute__
 *
 * @example
 *
 * ```js
 * // In the below jsx, `a`, `b` and `c` reflect different valid
 * // jsx attributes. There values can come in many forms.
 * <div a={10} b="string" c={object} />
 * ```
 *
 * @returns {JSXAttribute}
 */
export declare const jsxAttribute: StringableASTNodeFn<ESTree.JSXAttribute>;
