/**
							 | 
						|
								 * @fileoverview Rule to check the spacing around the * in generator functions.
							 | 
						|
								 * @author Jamund Ferguson
							 | 
						|
								 * @deprecated in ESLint v8.53.0
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								"use strict";
							 | 
						|
								
							 | 
						|
								//------------------------------------------------------------------------------
							 | 
						|
								// Rule Definition
							 | 
						|
								//------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								const OVERRIDE_SCHEMA = {
							 | 
						|
								    oneOf: [
							 | 
						|
								        {
							 | 
						|
								            enum: ["before", "after", "both", "neither"]
							 | 
						|
								        },
							 | 
						|
								        {
							 | 
						|
								            type: "object",
							 | 
						|
								            properties: {
							 | 
						|
								                before: { type: "boolean" },
							 | 
						|
								                after: { type: "boolean" }
							 | 
						|
								            },
							 | 
						|
								            additionalProperties: false
							 | 
						|
								        }
							 | 
						|
								    ]
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								/** @type {import('../shared/types').Rule} */
							 | 
						|
								module.exports = {
							 | 
						|
								    meta: {
							 | 
						|
								        deprecated: true,
							 | 
						|
								        replacedBy: [],
							 | 
						|
								        type: "layout",
							 | 
						|
								
							 | 
						|
								        docs: {
							 | 
						|
								            description: "Enforce consistent spacing around `*` operators in generator functions",
							 | 
						|
								            recommended: false,
							 | 
						|
								            url: "https://eslint.org/docs/latest/rules/generator-star-spacing"
							 | 
						|
								        },
							 | 
						|
								
							 | 
						|
								        fixable: "whitespace",
							 | 
						|
								
							 | 
						|
								        schema: [
							 | 
						|
								            {
							 | 
						|
								                oneOf: [
							 | 
						|
								                    {
							 | 
						|
								                        enum: ["before", "after", "both", "neither"]
							 | 
						|
								                    },
							 | 
						|
								                    {
							 | 
						|
								                        type: "object",
							 | 
						|
								                        properties: {
							 | 
						|
								                            before: { type: "boolean" },
							 | 
						|
								                            after: { type: "boolean" },
							 | 
						|
								                            named: OVERRIDE_SCHEMA,
							 | 
						|
								                            anonymous: OVERRIDE_SCHEMA,
							 | 
						|
								                            method: OVERRIDE_SCHEMA
							 | 
						|
								                        },
							 | 
						|
								                        additionalProperties: false
							 | 
						|
								                    }
							 | 
						|
								                ]
							 | 
						|
								            }
							 | 
						|
								        ],
							 | 
						|
								
							 | 
						|
								        messages: {
							 | 
						|
								            missingBefore: "Missing space before *.",
							 | 
						|
								            missingAfter: "Missing space after *.",
							 | 
						|
								            unexpectedBefore: "Unexpected space before *.",
							 | 
						|
								            unexpectedAfter: "Unexpected space after *."
							 | 
						|
								        }
							 | 
						|
								    },
							 | 
						|
								
							 | 
						|
								    create(context) {
							 | 
						|
								
							 | 
						|
								        const optionDefinitions = {
							 | 
						|
								            before: { before: true, after: false },
							 | 
						|
								            after: { before: false, after: true },
							 | 
						|
								            both: { before: true, after: true },
							 | 
						|
								            neither: { before: false, after: false }
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        /**
							 | 
						|
								         * Returns resolved option definitions based on an option and defaults
							 | 
						|
								         * @param {any} option The option object or string value
							 | 
						|
								         * @param {Object} defaults The defaults to use if options are not present
							 | 
						|
								         * @returns {Object} the resolved object definition
							 | 
						|
								         */
							 | 
						|
								        function optionToDefinition(option, defaults) {
							 | 
						|
								            if (!option) {
							 | 
						|
								                return defaults;
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            return typeof option === "string"
							 | 
						|
								                ? optionDefinitions[option]
							 | 
						|
								                : Object.assign({}, defaults, option);
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        const modes = (function(option) {
							 | 
						|
								            const defaults = optionToDefinition(option, optionDefinitions.before);
							 | 
						|
								
							 | 
						|
								            return {
							 | 
						|
								                named: optionToDefinition(option.named, defaults),
							 | 
						|
								                anonymous: optionToDefinition(option.anonymous, defaults),
							 | 
						|
								                method: optionToDefinition(option.method, defaults)
							 | 
						|
								            };
							 | 
						|
								        }(context.options[0] || {}));
							 | 
						|
								
							 | 
						|
								        const sourceCode = context.sourceCode;
							 | 
						|
								
							 | 
						|
								        /**
							 | 
						|
								         * Checks if the given token is a star token or not.
							 | 
						|
								         * @param {Token} token The token to check.
							 | 
						|
								         * @returns {boolean} `true` if the token is a star token.
							 | 
						|
								         */
							 | 
						|
								        function isStarToken(token) {
							 | 
						|
								            return token.value === "*" && token.type === "Punctuator";
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        /**
							 | 
						|
								         * Gets the generator star token of the given function node.
							 | 
						|
								         * @param {ASTNode} node The function node to get.
							 | 
						|
								         * @returns {Token} Found star token.
							 | 
						|
								         */
							 | 
						|
								        function getStarToken(node) {
							 | 
						|
								            return sourceCode.getFirstToken(
							 | 
						|
								                (node.parent.method || node.parent.type === "MethodDefinition") ? node.parent : node,
							 | 
						|
								                isStarToken
							 | 
						|
								            );
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        /**
							 | 
						|
								         * capitalize a given string.
							 | 
						|
								         * @param {string} str the given string.
							 | 
						|
								         * @returns {string} the capitalized string.
							 | 
						|
								         */
							 | 
						|
								        function capitalize(str) {
							 | 
						|
								            return str[0].toUpperCase() + str.slice(1);
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        /**
							 | 
						|
								         * Checks the spacing between two tokens before or after the star token.
							 | 
						|
								         * @param {string} kind Either "named", "anonymous", or "method"
							 | 
						|
								         * @param {string} side Either "before" or "after".
							 | 
						|
								         * @param {Token} leftToken `function` keyword token if side is "before", or
							 | 
						|
								         *     star token if side is "after".
							 | 
						|
								         * @param {Token} rightToken Star token if side is "before", or identifier
							 | 
						|
								         *     token if side is "after".
							 | 
						|
								         * @returns {void}
							 | 
						|
								         */
							 | 
						|
								        function checkSpacing(kind, side, leftToken, rightToken) {
							 | 
						|
								            if (!!(rightToken.range[0] - leftToken.range[1]) !== modes[kind][side]) {
							 | 
						|
								                const after = leftToken.value === "*";
							 | 
						|
								                const spaceRequired = modes[kind][side];
							 | 
						|
								                const node = after ? leftToken : rightToken;
							 | 
						|
								                const messageId = `${spaceRequired ? "missing" : "unexpected"}${capitalize(side)}`;
							 | 
						|
								
							 | 
						|
								                context.report({
							 | 
						|
								                    node,
							 | 
						|
								                    messageId,
							 | 
						|
								                    fix(fixer) {
							 | 
						|
								                        if (spaceRequired) {
							 | 
						|
								                            if (after) {
							 | 
						|
								                                return fixer.insertTextAfter(node, " ");
							 | 
						|
								                            }
							 | 
						|
								                            return fixer.insertTextBefore(node, " ");
							 | 
						|
								                        }
							 | 
						|
								                        return fixer.removeRange([leftToken.range[1], rightToken.range[0]]);
							 | 
						|
								                    }
							 | 
						|
								                });
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        /**
							 | 
						|
								         * Enforces the spacing around the star if node is a generator function.
							 | 
						|
								         * @param {ASTNode} node A function expression or declaration node.
							 | 
						|
								         * @returns {void}
							 | 
						|
								         */
							 | 
						|
								        function checkFunction(node) {
							 | 
						|
								            if (!node.generator) {
							 | 
						|
								                return;
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            const starToken = getStarToken(node);
							 | 
						|
								            const prevToken = sourceCode.getTokenBefore(starToken);
							 | 
						|
								            const nextToken = sourceCode.getTokenAfter(starToken);
							 | 
						|
								
							 | 
						|
								            let kind = "named";
							 | 
						|
								
							 | 
						|
								            if (node.parent.type === "MethodDefinition" || (node.parent.type === "Property" && node.parent.method)) {
							 | 
						|
								                kind = "method";
							 | 
						|
								            } else if (!node.id) {
							 | 
						|
								                kind = "anonymous";
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            // Only check before when preceded by `function`|`static` keyword
							 | 
						|
								            if (!(kind === "method" && starToken === sourceCode.getFirstToken(node.parent))) {
							 | 
						|
								                checkSpacing(kind, "before", prevToken, starToken);
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            checkSpacing(kind, "after", starToken, nextToken);
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        return {
							 | 
						|
								            FunctionDeclaration: checkFunction,
							 | 
						|
								            FunctionExpression: checkFunction
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								    }
							 | 
						|
								};
							 |