import { Linter } from '../index';

export interface Deprecated extends Linter.RulesRecord {
    /**
     * Rule to enforce consistent indentation.
     *
     * @since 4.0.0-alpha.0
     * @deprecated since 4.0.0, use [`indent`](https://eslint.org/docs/rules/indent) instead.
     * @see https://eslint.org/docs/rules/indent-legacy
     */
    'indent-legacy': Linter.RuleEntry<[
        number | 'tab',
        Partial<{
            /**
             * @default 0
             */
            SwitchCase: number;
            /**
             * @default 1
             */
            VariableDeclarator: Partial<{
                /**
                 * @default 1
                 */
                var: number | 'first';
                /**
                 * @default 1
                 */
                let: number | 'first';
                /**
                 * @default 1
                 */
                const: number | 'first';
            }> | number | 'first';
            /**
             * @default 1
             */
            outerIIFEBody: number;
            /**
             * @default 1
             */
            MemberExpression: number | 'off';
            /**
             * @default { parameters: 1, body: 1 }
             */
            FunctionDeclaration: Partial<{
                /**
                 * @default 1
                 */
                parameters: number | 'first' | 'off';
                /**
                 * @default 1
                 */
                body: number;
            }>;
            /**
             * @default { parameters: 1, body: 1 }
             */
            FunctionExpression: Partial<{
                /**
                 * @default 1
                 */
                parameters: number | 'first' | 'off';
                /**
                 * @default 1
                 */
                body: number;
            }>;
            /**
             * @default { arguments: 1 }
             */
            CallExpression: Partial<{
                /**
                 * @default 1
                 */
                arguments: number | 'first' | 'off';
            }>;
            /**
             * @default 1
             */
            ArrayExpression: number | 'first' | 'off';
            /**
             * @default 1
             */
            ObjectExpression: number | 'first' | 'off';
            /**
             * @default 1
             */
            ImportDeclaration: number | 'first' | 'off';
            /**
             * @default false
             */
            flatTernaryExpressions: boolean;
            ignoredNodes: string[];
            /**
             * @default false
             */
            ignoreComments: boolean;
        }>
    ]>;

    /**
     * Rule to require or disallow newlines around directives.
     *
     * @since 3.5.0
     * @deprecated since 4.0.0, use [`padding-line-between-statements`](https://eslint.org/docs/rules/padding-line-between-statements) instead.
     * @see https://eslint.org/docs/rules/lines-around-directive
     */
    'lines-around-directive': Linter.RuleEntry<[
        'always' | 'never'
    ]>;

    /**
     * Rule to require or disallow an empty line after variable declarations.
     *
     * @since 0.18.0
     * @deprecated since 4.0.0, use [`padding-line-between-statements`](https://eslint.org/docs/rules/padding-line-between-statements) instead.
     * @see https://eslint.org/docs/rules/newline-after-var
     */
    'newline-after-var': Linter.RuleEntry<[
        'always' | 'never'
    ]>;

    /**
     * Rule to require an empty line before `return` statements.
     *
     * @since 2.3.0
     * @deprecated since 4.0.0, use [`padding-line-between-statements`](https://eslint.org/docs/rules/padding-line-between-statements) instead.
     * @see https://eslint.org/docs/rules/newline-before-return
     */
    'newline-before-return': Linter.RuleEntry<[]>;

    /**
     * Rule to disallow shadowing of variables inside of `catch`.
     *
     * @since 0.0.9
     * @deprecated since 5.1.0, use [`no-shadow`](https://eslint.org/docs/rules/no-shadow) instead.
     * @see https://eslint.org/docs/rules/no-catch-shadow
     */
    'no-catch-shadow': Linter.RuleEntry<[]>;

    /**
     * Rule to disallow reassignment of native objects.
     *
     * @since 0.0.9
     * @deprecated since 3.3.0, use [`no-global-assign`](https://eslint.org/docs/rules/no-global-assign) instead.
     * @see https://eslint.org/docs/rules/no-native-reassign
     */
    'no-native-reassign': Linter.RuleEntry<[
        Partial<{
            exceptions: string[];
        }>
    ]>;

    /**
     * Rule to disallow negating the left operand in `in` expressions.
     *
     * @since 0.1.2
     * @deprecated since 3.3.0, use [`no-unsafe-negation`](https://eslint.org/docs/rules/no-unsafe-negation) instead.
     * @see https://eslint.org/docs/rules/no-negated-in-lhs
     */
    'no-negated-in-lhs': Linter.RuleEntry<[]>;

    /**
     * Rule to disallow spacing between function identifiers and their applications.
     *
     * @since 0.1.2
     * @deprecated since 3.3.0, use [`func-call-spacing`](https://eslint.org/docs/rules/func-call-spacing) instead.
     * @see https://eslint.org/docs/rules/no-spaced-func
     */
    'no-spaced-func': Linter.RuleEntry<[]>;

    /**
     * Rule to suggest using `Reflect` methods where applicable.
     *
     * @since 1.0.0-rc-2
     * @deprecated since 3.9.0
     * @see https://eslint.org/docs/rules/prefer-reflect
     */
    'prefer-reflect': Linter.RuleEntry<[
        Partial<{
            exceptions: string[];
        }>
    ]>;

    /**
     * Rule to require JSDoc comments.
     *
     * @since 1.4.0
     * @deprecated since 5.10.0
     * @see https://eslint.org/docs/rules/require-jsdoc
     */
    'require-jsdoc': Linter.RuleEntry<[
        Partial<{
            require: Partial<{
                /**
                 * @default true
                 */
                FunctionDeclaration: boolean;
                /**
                 * @default false
                 */
                MethodDefinition: boolean;
                /**
                 * @default false
                 */
                ClassDeclaration: boolean;
                /**
                 * @default false
                 */
                ArrowFunctionExpression: boolean;
                /**
                 * @default false
                 */
                FunctionExpression: boolean;
            }>;
        }>
    ]>;

    /**
     * Rule to enforce valid JSDoc comments.
     *
     * @since 0.4.0
     * @deprecated since 5.10.0
     * @see https://eslint.org/docs/rules/valid-jsdoc
     */
    'valid-jsdoc': Linter.RuleEntry<[
        Partial<{
            prefer: Record<string, string>;
            preferType: Record<string, string>;
            /**
             * @default true
             */
            requireReturn: boolean;
            /**
             * @default true
             */
            requireReturnType: boolean;
            /**
             * @remarks
             * Also accept for regular expression pattern
             */
            matchDescription: string;
            /**
             * @default true
             */
            requireParamDescription: boolean;
            /**
             * @default true
             */
            requireReturnDescription: boolean;
            /**
             * @default true
             */
            requireParamType: boolean;
        }>
    ]>;
}
