/**
							 | 
						|
								 * @fileoverview A rule to ensure whitespace before blocks.
							 | 
						|
								 * @author Mathias Schreck <https://github.com/lo1tuma>
							 | 
						|
								 * @deprecated in ESLint v8.53.0
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								"use strict";
							 | 
						|
								
							 | 
						|
								//------------------------------------------------------------------------------
							 | 
						|
								// Requirements
							 | 
						|
								//------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								const astUtils = require("./utils/ast-utils");
							 | 
						|
								
							 | 
						|
								//------------------------------------------------------------------------------
							 | 
						|
								// Helpers
							 | 
						|
								//------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * Checks whether the given node represents the body of a function.
							 | 
						|
								 * @param {ASTNode} node the node to check.
							 | 
						|
								 * @returns {boolean} `true` if the node is function body.
							 | 
						|
								 */
							 | 
						|
								function isFunctionBody(node) {
							 | 
						|
								    const parent = node.parent;
							 | 
						|
								
							 | 
						|
								    return (
							 | 
						|
								        node.type === "BlockStatement" &&
							 | 
						|
								        astUtils.isFunction(parent) &&
							 | 
						|
								        parent.body === node
							 | 
						|
								    );
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								//------------------------------------------------------------------------------
							 | 
						|
								// Rule Definition
							 | 
						|
								//------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								/** @type {import('../shared/types').Rule} */
							 | 
						|
								module.exports = {
							 | 
						|
								    meta: {
							 | 
						|
								        deprecated: true,
							 | 
						|
								        replacedBy: [],
							 | 
						|
								        type: "layout",
							 | 
						|
								
							 | 
						|
								        docs: {
							 | 
						|
								            description: "Enforce consistent spacing before blocks",
							 | 
						|
								            recommended: false,
							 | 
						|
								            url: "https://eslint.org/docs/latest/rules/space-before-blocks"
							 | 
						|
								        },
							 | 
						|
								
							 | 
						|
								        fixable: "whitespace",
							 | 
						|
								
							 | 
						|
								        schema: [
							 | 
						|
								            {
							 | 
						|
								                oneOf: [
							 | 
						|
								                    {
							 | 
						|
								                        enum: ["always", "never"]
							 | 
						|
								                    },
							 | 
						|
								                    {
							 | 
						|
								                        type: "object",
							 | 
						|
								                        properties: {
							 | 
						|
								                            keywords: {
							 | 
						|
								                                enum: ["always", "never", "off"]
							 | 
						|
								                            },
							 | 
						|
								                            functions: {
							 | 
						|
								                                enum: ["always", "never", "off"]
							 | 
						|
								                            },
							 | 
						|
								                            classes: {
							 | 
						|
								                                enum: ["always", "never", "off"]
							 | 
						|
								                            }
							 | 
						|
								                        },
							 | 
						|
								                        additionalProperties: false
							 | 
						|
								                    }
							 | 
						|
								                ]
							 | 
						|
								            }
							 | 
						|
								        ],
							 | 
						|
								
							 | 
						|
								        messages: {
							 | 
						|
								            unexpectedSpace: "Unexpected space before opening brace.",
							 | 
						|
								            missingSpace: "Missing space before opening brace."
							 | 
						|
								        }
							 | 
						|
								    },
							 | 
						|
								
							 | 
						|
								    create(context) {
							 | 
						|
								        const config = context.options[0],
							 | 
						|
								            sourceCode = context.sourceCode;
							 | 
						|
								        let alwaysFunctions = true,
							 | 
						|
								            alwaysKeywords = true,
							 | 
						|
								            alwaysClasses = true,
							 | 
						|
								            neverFunctions = false,
							 | 
						|
								            neverKeywords = false,
							 | 
						|
								            neverClasses = false;
							 | 
						|
								
							 | 
						|
								        if (typeof config === "object") {
							 | 
						|
								            alwaysFunctions = config.functions === "always";
							 | 
						|
								            alwaysKeywords = config.keywords === "always";
							 | 
						|
								            alwaysClasses = config.classes === "always";
							 | 
						|
								            neverFunctions = config.functions === "never";
							 | 
						|
								            neverKeywords = config.keywords === "never";
							 | 
						|
								            neverClasses = config.classes === "never";
							 | 
						|
								        } else if (config === "never") {
							 | 
						|
								            alwaysFunctions = false;
							 | 
						|
								            alwaysKeywords = false;
							 | 
						|
								            alwaysClasses = false;
							 | 
						|
								            neverFunctions = true;
							 | 
						|
								            neverKeywords = true;
							 | 
						|
								            neverClasses = true;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        /**
							 | 
						|
								         * Checks whether the spacing before the given block is already controlled by another rule:
							 | 
						|
								         * - `arrow-spacing` checks spaces after `=>`.
							 | 
						|
								         * - `keyword-spacing` checks spaces after keywords in certain contexts.
							 | 
						|
								         * - `switch-colon-spacing` checks spaces after `:` of switch cases.
							 | 
						|
								         * @param {Token} precedingToken first token before the block.
							 | 
						|
								         * @param {ASTNode|Token} node `BlockStatement` node or `{` token of a `SwitchStatement` node.
							 | 
						|
								         * @returns {boolean} `true` if requiring or disallowing spaces before the given block could produce conflicts with other rules.
							 | 
						|
								         */
							 | 
						|
								        function isConflicted(precedingToken, node) {
							 | 
						|
								            return (
							 | 
						|
								                astUtils.isArrowToken(precedingToken) ||
							 | 
						|
								                (
							 | 
						|
								                    astUtils.isKeywordToken(precedingToken) &&
							 | 
						|
								                    !isFunctionBody(node)
							 | 
						|
								                ) ||
							 | 
						|
								                (
							 | 
						|
								                    astUtils.isColonToken(precedingToken) &&
							 | 
						|
								                    node.parent &&
							 | 
						|
								                    node.parent.type === "SwitchCase" &&
							 | 
						|
								                    precedingToken === astUtils.getSwitchCaseColonToken(node.parent, sourceCode)
							 | 
						|
								                )
							 | 
						|
								            );
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        /**
							 | 
						|
								         * Checks the given BlockStatement node has a preceding space if it doesn’t start on a new line.
							 | 
						|
								         * @param {ASTNode|Token} node The AST node of a BlockStatement.
							 | 
						|
								         * @returns {void} undefined.
							 | 
						|
								         */
							 | 
						|
								        function checkPrecedingSpace(node) {
							 | 
						|
								            const precedingToken = sourceCode.getTokenBefore(node);
							 | 
						|
								
							 | 
						|
								            if (precedingToken && !isConflicted(precedingToken, node) && astUtils.isTokenOnSameLine(precedingToken, node)) {
							 | 
						|
								                const hasSpace = sourceCode.isSpaceBetweenTokens(precedingToken, node);
							 | 
						|
								                let requireSpace;
							 | 
						|
								                let requireNoSpace;
							 | 
						|
								
							 | 
						|
								                if (isFunctionBody(node)) {
							 | 
						|
								                    requireSpace = alwaysFunctions;
							 | 
						|
								                    requireNoSpace = neverFunctions;
							 | 
						|
								                } else if (node.type === "ClassBody") {
							 | 
						|
								                    requireSpace = alwaysClasses;
							 | 
						|
								                    requireNoSpace = neverClasses;
							 | 
						|
								                } else {
							 | 
						|
								                    requireSpace = alwaysKeywords;
							 | 
						|
								                    requireNoSpace = neverKeywords;
							 | 
						|
								                }
							 | 
						|
								
							 | 
						|
								                if (requireSpace && !hasSpace) {
							 | 
						|
								                    context.report({
							 | 
						|
								                        node,
							 | 
						|
								                        messageId: "missingSpace",
							 | 
						|
								                        fix(fixer) {
							 | 
						|
								                            return fixer.insertTextBefore(node, " ");
							 | 
						|
								                        }
							 | 
						|
								                    });
							 | 
						|
								                } else if (requireNoSpace && hasSpace) {
							 | 
						|
								                    context.report({
							 | 
						|
								                        node,
							 | 
						|
								                        messageId: "unexpectedSpace",
							 | 
						|
								                        fix(fixer) {
							 | 
						|
								                            return fixer.removeRange([precedingToken.range[1], node.range[0]]);
							 | 
						|
								                        }
							 | 
						|
								                    });
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        /**
							 | 
						|
								         * Checks if the CaseBlock of an given SwitchStatement node has a preceding space.
							 | 
						|
								         * @param {ASTNode} node The node of a SwitchStatement.
							 | 
						|
								         * @returns {void} undefined.
							 | 
						|
								         */
							 | 
						|
								        function checkSpaceBeforeCaseBlock(node) {
							 | 
						|
								            const cases = node.cases;
							 | 
						|
								            let openingBrace;
							 | 
						|
								
							 | 
						|
								            if (cases.length > 0) {
							 | 
						|
								                openingBrace = sourceCode.getTokenBefore(cases[0]);
							 | 
						|
								            } else {
							 | 
						|
								                openingBrace = sourceCode.getLastToken(node, 1);
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            checkPrecedingSpace(openingBrace);
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        return {
							 | 
						|
								            BlockStatement: checkPrecedingSpace,
							 | 
						|
								            ClassBody: checkPrecedingSpace,
							 | 
						|
								            SwitchStatement: checkSpaceBeforeCaseBlock
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								    }
							 | 
						|
								};
							 |