/**
							 | 
						|
								 * @fileoverview Enforce spacing between rest and spread operators and their expressions.
							 | 
						|
								 * @author Kai Cataldo
							 | 
						|
								 * @deprecated in ESLint v8.53.0
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								"use strict";
							 | 
						|
								
							 | 
						|
								//------------------------------------------------------------------------------
							 | 
						|
								// Rule Definition
							 | 
						|
								//------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								/** @type {import('../shared/types').Rule} */
							 | 
						|
								module.exports = {
							 | 
						|
								    meta: {
							 | 
						|
								        deprecated: true,
							 | 
						|
								        replacedBy: [],
							 | 
						|
								        type: "layout",
							 | 
						|
								
							 | 
						|
								        docs: {
							 | 
						|
								            description: "Enforce spacing between rest and spread operators and their expressions",
							 | 
						|
								            recommended: false,
							 | 
						|
								            url: "https://eslint.org/docs/latest/rules/rest-spread-spacing"
							 | 
						|
								        },
							 | 
						|
								
							 | 
						|
								        fixable: "whitespace",
							 | 
						|
								
							 | 
						|
								        schema: [
							 | 
						|
								            {
							 | 
						|
								                enum: ["always", "never"]
							 | 
						|
								            }
							 | 
						|
								        ],
							 | 
						|
								
							 | 
						|
								        messages: {
							 | 
						|
								            unexpectedWhitespace: "Unexpected whitespace after {{type}} operator.",
							 | 
						|
								            expectedWhitespace: "Expected whitespace after {{type}} operator."
							 | 
						|
								        }
							 | 
						|
								    },
							 | 
						|
								
							 | 
						|
								    create(context) {
							 | 
						|
								        const sourceCode = context.sourceCode,
							 | 
						|
								            alwaysSpace = context.options[0] === "always";
							 | 
						|
								
							 | 
						|
								        //--------------------------------------------------------------------------
							 | 
						|
								        // Helpers
							 | 
						|
								        //--------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								        /**
							 | 
						|
								         * Checks whitespace between rest/spread operators and their expressions
							 | 
						|
								         * @param {ASTNode} node The node to check
							 | 
						|
								         * @returns {void}
							 | 
						|
								         */
							 | 
						|
								        function checkWhiteSpace(node) {
							 | 
						|
								            const operator = sourceCode.getFirstToken(node),
							 | 
						|
								                nextToken = sourceCode.getTokenAfter(operator),
							 | 
						|
								                hasWhitespace = sourceCode.isSpaceBetweenTokens(operator, nextToken);
							 | 
						|
								            let type;
							 | 
						|
								
							 | 
						|
								            switch (node.type) {
							 | 
						|
								                case "SpreadElement":
							 | 
						|
								                    type = "spread";
							 | 
						|
								                    if (node.parent.type === "ObjectExpression") {
							 | 
						|
								                        type += " property";
							 | 
						|
								                    }
							 | 
						|
								                    break;
							 | 
						|
								                case "RestElement":
							 | 
						|
								                    type = "rest";
							 | 
						|
								                    if (node.parent.type === "ObjectPattern") {
							 | 
						|
								                        type += " property";
							 | 
						|
								                    }
							 | 
						|
								                    break;
							 | 
						|
								                case "ExperimentalSpreadProperty":
							 | 
						|
								                    type = "spread property";
							 | 
						|
								                    break;
							 | 
						|
								                case "ExperimentalRestProperty":
							 | 
						|
								                    type = "rest property";
							 | 
						|
								                    break;
							 | 
						|
								                default:
							 | 
						|
								                    return;
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            if (alwaysSpace && !hasWhitespace) {
							 | 
						|
								                context.report({
							 | 
						|
								                    node,
							 | 
						|
								                    loc: operator.loc,
							 | 
						|
								                    messageId: "expectedWhitespace",
							 | 
						|
								                    data: {
							 | 
						|
								                        type
							 | 
						|
								                    },
							 | 
						|
								                    fix(fixer) {
							 | 
						|
								                        return fixer.replaceTextRange([operator.range[1], nextToken.range[0]], " ");
							 | 
						|
								                    }
							 | 
						|
								                });
							 | 
						|
								            } else if (!alwaysSpace && hasWhitespace) {
							 | 
						|
								                context.report({
							 | 
						|
								                    node,
							 | 
						|
								                    loc: {
							 | 
						|
								                        start: operator.loc.end,
							 | 
						|
								                        end: nextToken.loc.start
							 | 
						|
								                    },
							 | 
						|
								                    messageId: "unexpectedWhitespace",
							 | 
						|
								                    data: {
							 | 
						|
								                        type
							 | 
						|
								                    },
							 | 
						|
								                    fix(fixer) {
							 | 
						|
								                        return fixer.removeRange([operator.range[1], nextToken.range[0]]);
							 | 
						|
								                    }
							 | 
						|
								                });
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        //--------------------------------------------------------------------------
							 | 
						|
								        // Public
							 | 
						|
								        //--------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								        return {
							 | 
						|
								            SpreadElement: checkWhiteSpace,
							 | 
						|
								            RestElement: checkWhiteSpace,
							 | 
						|
								            ExperimentalSpreadProperty: checkWhiteSpace,
							 | 
						|
								            ExperimentalRestProperty: checkWhiteSpace
							 | 
						|
								        };
							 | 
						|
								    }
							 | 
						|
								};
							 |