CoolFace
Apppublic

Umama-at-Bluchip/Quick-UI

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
comma-spacing.js193 linesDownload Raw Back to rules
1/**2 * @fileoverview Comma spacing - validates spacing before and after comma3 * @author Vignesh Anand aka vegetableman.4 * @deprecated in ESLint v8.53.05 */6"use strict";7 8const astUtils = require("./utils/ast-utils");9 10//------------------------------------------------------------------------------11// Rule Definition12//------------------------------------------------------------------------------13 14/** @type {import('../shared/types').Rule} */15module.exports = {16    meta: {17        deprecated: true,18        replacedBy: [],19        type: "layout",20 21        docs: {22            description: "Enforce consistent spacing before and after commas",23            recommended: false,24            url: "https://eslint.org/docs/latest/rules/comma-spacing"25        },26 27        fixable: "whitespace",28 29        schema: [30            {31                type: "object",32                properties: {33                    before: {34                        type: "boolean",35                        default: false36                    },37                    after: {38                        type: "boolean",39                        default: true40                    }41                },42                additionalProperties: false43            }44        ],45 46        messages: {47            missing: "A space is required {{loc}} ','.",48            unexpected: "There should be no space {{loc}} ','."49        }50    },51 52    create(context) {53 54        const sourceCode = context.sourceCode;55        const tokensAndComments = sourceCode.tokensAndComments;56 57        const options = {58            before: context.options[0] ? context.options[0].before : false,59            after: context.options[0] ? context.options[0].after : true60        };61 62        //--------------------------------------------------------------------------63        // Helpers64        //--------------------------------------------------------------------------65 66        // list of comma tokens to ignore for the check of leading whitespace67        const commaTokensToIgnore = [];68 69        /**70         * Reports a spacing error with an appropriate message.71         * @param {ASTNode} node The binary expression node to report.72         * @param {string} loc Is the error "before" or "after" the comma?73         * @param {ASTNode} otherNode The node at the left or right of `node`74         * @returns {void}75         * @private76         */77        function report(node, loc, otherNode) {78            context.report({79                node,80                fix(fixer) {81                    if (options[loc]) {82                        if (loc === "before") {83                            return fixer.insertTextBefore(node, " ");84                        }85                        return fixer.insertTextAfter(node, " ");86 87                    }88                    let start, end;89                    const newText = "";90 91                    if (loc === "before") {92                        start = otherNode.range[1];93                        end = node.range[0];94                    } else {95                        start = node.range[1];96                        end = otherNode.range[0];97                    }98 99                    return fixer.replaceTextRange([start, end], newText);100 101                },102                messageId: options[loc] ? "missing" : "unexpected",103                data: {104                    loc105                }106            });107        }108 109        /**110         * Adds null elements of the given ArrayExpression or ArrayPattern node to the ignore list.111         * @param {ASTNode} node An ArrayExpression or ArrayPattern node.112         * @returns {void}113         */114        function addNullElementsToIgnoreList(node) {115            let previousToken = sourceCode.getFirstToken(node);116 117            node.elements.forEach(element => {118                let token;119 120                if (element === null) {121                    token = sourceCode.getTokenAfter(previousToken);122 123                    if (astUtils.isCommaToken(token)) {124                        commaTokensToIgnore.push(token);125                    }126                } else {127                    token = sourceCode.getTokenAfter(element);128                }129 130                previousToken = token;131            });132        }133 134        //--------------------------------------------------------------------------135        // Public136        //--------------------------------------------------------------------------137 138        return {139            "Program:exit"() {140                tokensAndComments.forEach((token, i) => {141 142                    if (!astUtils.isCommaToken(token)) {143                        return;144                    }145 146                    const previousToken = tokensAndComments[i - 1];147                    const nextToken = tokensAndComments[i + 1];148 149                    if (150                        previousToken &&151                        !astUtils.isCommaToken(previousToken) && // ignore spacing between two commas152 153                        /*154                         * `commaTokensToIgnore` are ending commas of `null` elements (array holes/elisions).155                         * In addition to spacing between two commas, this can also ignore:156                         *157                         *   - Spacing after `[` (controlled by array-bracket-spacing)158                         *       Example: [ , ]159                         *                 ^160                         *   - Spacing after a comment (for backwards compatibility, this was possibly unintentional)161                         *       Example: [a, /* * / ,]162                         *                          ^163                         */164                        !commaTokensToIgnore.includes(token) &&165 166                        astUtils.isTokenOnSameLine(previousToken, token) &&167                        options.before !== sourceCode.isSpaceBetweenTokens(previousToken, token)168                    ) {169                        report(token, "before", previousToken);170                    }171 172                    if (173                        nextToken &&174                        !astUtils.isCommaToken(nextToken) && // ignore spacing between two commas175                        !astUtils.isClosingParenToken(nextToken) && // controlled by space-in-parens176                        !astUtils.isClosingBracketToken(nextToken) && // controlled by array-bracket-spacing177                        !astUtils.isClosingBraceToken(nextToken) && // controlled by object-curly-spacing178                        !(!options.after && nextToken.type === "Line") && // special case, allow space before line comment179                        astUtils.isTokenOnSameLine(token, nextToken) &&180                        options.after !== sourceCode.isSpaceBetweenTokens(token, nextToken)181                    ) {182                        report(token, "after", nextToken);183                    }184                });185            },186            ArrayExpression: addNullElementsToIgnoreList,187            ArrayPattern: addNullElementsToIgnoreList188 189        };190 191    }192};193