import { FlatGitignoreOptions } from 'eslint-config-flat-gitignore';
import { ESLintPluginCommandOptions } from 'eslint-plugin-command/types';
import { Linter, ESLint } from 'eslint';
import { ESLintReactSettings } from '@eslint-react/shared';

type Config = Linter.Config;
type Plugin = ESLint.Plugin;
type Rules = Config["rules"];
type GitignoreOptions = FlatGitignoreOptions;
interface IgnoresOptions {
    ignores?: string[];
}
interface JavaScriptOptions {
    files?: string[];
    rules?: Rules;
    parserOptions?: Linter.ParserOptions;
    languageOptions?: Linter.LanguageOptions;
}
interface TypeScriptOptions {
    files?: string[];
    rules?: Rules;
    parserOptions?: Linter.ParserOptions;
    languageOptions?: Linter.LanguageOptions;
    typeCheck?: boolean;
}
type CommandOptions = ESLintPluginCommandOptions;
interface JsdocOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface ImportsOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface UnusedImportsOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface BarrelOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface PromiseOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface RegExpOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface NodeOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface PerfectionistOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface UnicornOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface ReactOptions {
    files?: string[];
    rules?: Rules;
    parserOptions?: Linter.ParserOptions;
    languageOptions?: Linter.LanguageOptions;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
    typescriptParserOptions?: Linter.ParserOptions;
    typescriptLanguageOptions?: Linter.LanguageOptions;
    typeCheck?: boolean;
    settings?: ESLintReactSettings;
}
interface ReactNativeOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface NextOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface VueOptions {
    files?: string[];
    rules?: Rules;
    typescriptRules?: Rules;
}
interface NuxtOptions {
    files?: string[];
    rules?: Rules;
    typescriptRules?: Rules;
}
interface TailwindCssOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface UnoCssOptions {
    files?: string[];
    rules?: Rules;
    typescriptFiles?: string[];
    typescriptRules?: Rules;
}
interface MarkdownOptions {
    markdownFiles?: string[];
    markdownInnerFiles?: string[];
    rules?: Rules;
}
interface JsoncOptions {
    files?: string[];
    rules?: Rules;
}
interface TomlOptions {
    files?: string[];
    rules?: Rules;
}
interface YmlOptions {
    files?: string[];
    rules?: Rules;
}
interface Options {
    /**
     * Based on eslint-config-flat-gitignore. Use gitignore and eslintignore.
     *
     * @default true
     */
    gitignore?: GitignoreOptions | boolean;
    /**
     * Use preset exclude.
     *
     * @default true
     */
    ignores?: IgnoresOptions | boolean;
    /**
     * Detect JavaScript issues.
     *
     * @default true
     */
    javascript?: JavaScriptOptions | boolean;
    /**
     * Detect TypeScript issues.
     *
     * Enabled by default if you have TypeScript installed.
     */
    typescript?: TypeScriptOptions | boolean;
    /**
     * Based on eslint-plugin-command.
     *
     * @default true
     */
    command?: CommandOptions | boolean;
    /**
     * Detect JSDoc issues.
     *
     * @default false
     */
    jsdoc?: JsdocOptions | boolean;
    /**
     * Detect import issues.
     *
     * @default true
     */
    imports?: ImportsOptions | boolean;
    /**
     * Detect unused import issues.
     *
     * @default true
     */
    unusedImports?: UnusedImportsOptions | boolean;
    /**
     * Detect barrel issues.
     *
     * @default false
     */
    barrel?: BarrelOptions | boolean;
    /**
     * Detect promise issues.
     *
     * @default true
     */
    promise?: PromiseOptions | boolean;
    /**
     * Detect regexp issues.
     *
     * @default true
     */
    regexp?: RegExpOptions | boolean;
    /**
     * Detect node issues.
     *
     * @default true
     */
    node?: NodeOptions | boolean;
    /**
     * Based on eslint-plugin-perfectionist.
     *
     * @default true
     */
    perfectionist?: PerfectionistOptions | boolean;
    /**
     * Based on eslint-plugin-unicorn.
     *
     * @default true
     */
    unicorn?: UnicornOptions | boolean;
    /**
     * Detect react issues.
     *
     * Enabled by default if you have react installed.
     */
    react?: ReactOptions | boolean;
    /**
     * Detect react-native issues.
     *
     * Enabled by default if you have react-native installed.
     */
    reactNative?: ReactNativeOptions | boolean;
    /**
     * Detect next issues.
     *
     * Enabled by default if you have next installed.
     */
    next?: NextOptions | boolean;
    /**
     * Detect vue issues.
     *
     * Enabled by default if you have vue installed.
     */
    vue?: VueOptions | boolean;
    /**
     * Detect nuxt issues.
     *
     * Enabled by default if you have nuxt installed.
     */
    nuxt?: NuxtOptions | boolean;
    /**
     * Detect tailwindcss issues.
     *
     * Enabled by default if you have tailwindcss installed.
     */
    tailwindcss?: TailwindCssOptions | boolean;
    /**
     * Detect unocss issues.
     *
     * Enabled by default if you have unocss installed.
     */
    unocss?: UnoCssOptions | boolean;
    /**
     * Detect markdown issues.
     *
     * @default true
     */
    markdown?: MarkdownOptions | boolean;
    /**
     * Detect jsonc issues.
     *
     * @default true
     */
    jsonc?: JsoncOptions | boolean;
    /**
     * Detect toml issues.
     *
     * @default true
     */
    toml?: TomlOptions | boolean;
    /**
     * Detect yml issues.
     *
     * @default true
     */
    yml?: YmlOptions | boolean;
}

declare function eslint(options?: Options, userConfigs?: (Config | Config[])[]): Config[];

export { type BarrelOptions as B, type Config as C, type GitignoreOptions as G, type IgnoresOptions as I, type JavaScriptOptions as J, type MarkdownOptions as M, type NextOptions as N, type Options as O, type PromiseOptions as P, type ReactOptions as R, type TailwindCssOptions as T, type UnicornOptions as U, type VueOptions as V, type YmlOptions as Y, type CommandOptions as a, type ImportsOptions as b, type JsdocOptions as c, type JsoncOptions as d, eslint as e, type NodeOptions as f, type NuxtOptions as g, type PerfectionistOptions as h, type ReactNativeOptions as i, type RegExpOptions as j, type TomlOptions as k, type TypeScriptOptions as l, type UnoCssOptions as m, type UnusedImportsOptions as n, type Plugin as o, type Rules as p };
