| /** | |
|  * @fileoverview Enforce newlines between operands of ternary expressions | |
|  * @author Kai Cataldo | |
|  * @deprecated in ESLint v8.53.0 | |
|  */ | |
| 
 | |
| "use strict"; | |
| 
 | |
| const astUtils = require("./utils/ast-utils"); | |
| 
 | |
| //------------------------------------------------------------------------------ | |
| // Rule Definition | |
| //------------------------------------------------------------------------------ | |
|  | |
| /** @type {import('../shared/types').Rule} */ | |
| module.exports = { | |
|     meta: { | |
|         deprecated: true, | |
|         replacedBy: [], | |
|         type: "layout", | |
| 
 | |
|         docs: { | |
|             description: "Enforce newlines between operands of ternary expressions", | |
|             recommended: false, | |
|             url: "https://eslint.org/docs/latest/rules/multiline-ternary" | |
|         }, | |
| 
 | |
|         schema: [ | |
|             { | |
|                 enum: ["always", "always-multiline", "never"] | |
|             } | |
|         ], | |
| 
 | |
|         messages: { | |
|             expectedTestCons: "Expected newline between test and consequent of ternary expression.", | |
|             expectedConsAlt: "Expected newline between consequent and alternate of ternary expression.", | |
|             unexpectedTestCons: "Unexpected newline between test and consequent of ternary expression.", | |
|             unexpectedConsAlt: "Unexpected newline between consequent and alternate of ternary expression." | |
|         }, | |
| 
 | |
|         fixable: "whitespace" | |
|     }, | |
| 
 | |
|     create(context) { | |
|         const sourceCode = context.sourceCode; | |
|         const option = context.options[0]; | |
|         const multiline = option !== "never"; | |
|         const allowSingleLine = option === "always-multiline"; | |
| 
 | |
|         //-------------------------------------------------------------------------- | |
|         // Public | |
|         //-------------------------------------------------------------------------- | |
|  | |
|         return { | |
|             ConditionalExpression(node) { | |
|                 const questionToken = sourceCode.getTokenAfter(node.test, astUtils.isNotClosingParenToken); | |
|                 const colonToken = sourceCode.getTokenAfter(node.consequent, astUtils.isNotClosingParenToken); | |
| 
 | |
|                 const firstTokenOfTest = sourceCode.getFirstToken(node); | |
|                 const lastTokenOfTest = sourceCode.getTokenBefore(questionToken); | |
|                 const firstTokenOfConsequent = sourceCode.getTokenAfter(questionToken); | |
|                 const lastTokenOfConsequent = sourceCode.getTokenBefore(colonToken); | |
|                 const firstTokenOfAlternate = sourceCode.getTokenAfter(colonToken); | |
| 
 | |
|                 const areTestAndConsequentOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfTest, firstTokenOfConsequent); | |
|                 const areConsequentAndAlternateOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfConsequent, firstTokenOfAlternate); | |
| 
 | |
|                 const hasComments = !!sourceCode.getCommentsInside(node).length; | |
| 
 | |
|                 if (!multiline) { | |
|                     if (!areTestAndConsequentOnSameLine) { | |
|                         context.report({ | |
|                             node: node.test, | |
|                             loc: { | |
|                                 start: firstTokenOfTest.loc.start, | |
|                                 end: lastTokenOfTest.loc.end | |
|                             }, | |
|                             messageId: "unexpectedTestCons", | |
|                             fix(fixer) { | |
|                                 if (hasComments) { | |
|                                     return null; | |
|                                 } | |
|                                 const fixers = []; | |
|                                 const areTestAndQuestionOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfTest, questionToken); | |
|                                 const areQuestionAndConsOnSameLine = astUtils.isTokenOnSameLine(questionToken, firstTokenOfConsequent); | |
| 
 | |
|                                 if (!areTestAndQuestionOnSameLine) { | |
|                                     fixers.push(fixer.removeRange([lastTokenOfTest.range[1], questionToken.range[0]])); | |
|                                 } | |
|                                 if (!areQuestionAndConsOnSameLine) { | |
|                                     fixers.push(fixer.removeRange([questionToken.range[1], firstTokenOfConsequent.range[0]])); | |
|                                 } | |
| 
 | |
|                                 return fixers; | |
|                             } | |
|                         }); | |
|                     } | |
| 
 | |
|                     if (!areConsequentAndAlternateOnSameLine) { | |
|                         context.report({ | |
|                             node: node.consequent, | |
|                             loc: { | |
|                                 start: firstTokenOfConsequent.loc.start, | |
|                                 end: lastTokenOfConsequent.loc.end | |
|                             }, | |
|                             messageId: "unexpectedConsAlt", | |
|                             fix(fixer) { | |
|                                 if (hasComments) { | |
|                                     return null; | |
|                                 } | |
|                                 const fixers = []; | |
|                                 const areConsAndColonOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfConsequent, colonToken); | |
|                                 const areColonAndAltOnSameLine = astUtils.isTokenOnSameLine(colonToken, firstTokenOfAlternate); | |
| 
 | |
|                                 if (!areConsAndColonOnSameLine) { | |
|                                     fixers.push(fixer.removeRange([lastTokenOfConsequent.range[1], colonToken.range[0]])); | |
|                                 } | |
|                                 if (!areColonAndAltOnSameLine) { | |
|                                     fixers.push(fixer.removeRange([colonToken.range[1], firstTokenOfAlternate.range[0]])); | |
|                                 } | |
| 
 | |
|                                 return fixers; | |
|                             } | |
|                         }); | |
|                     } | |
|                 } else { | |
|                     if (allowSingleLine && node.loc.start.line === node.loc.end.line) { | |
|                         return; | |
|                     } | |
| 
 | |
|                     if (areTestAndConsequentOnSameLine) { | |
|                         context.report({ | |
|                             node: node.test, | |
|                             loc: { | |
|                                 start: firstTokenOfTest.loc.start, | |
|                                 end: lastTokenOfTest.loc.end | |
|                             }, | |
|                             messageId: "expectedTestCons", | |
|                             fix: fixer => (hasComments ? null : ( | |
|                                 fixer.replaceTextRange( | |
|                                     [ | |
|                                         lastTokenOfTest.range[1], | |
|                                         questionToken.range[0] | |
|                                     ], | |
|                                     "\n" | |
|                                 ) | |
|                             )) | |
|                         }); | |
|                     } | |
| 
 | |
|                     if (areConsequentAndAlternateOnSameLine) { | |
|                         context.report({ | |
|                             node: node.consequent, | |
|                             loc: { | |
|                                 start: firstTokenOfConsequent.loc.start, | |
|                                 end: lastTokenOfConsequent.loc.end | |
|                             }, | |
|                             messageId: "expectedConsAlt", | |
|                             fix: (fixer => (hasComments ? null : ( | |
|                                 fixer.replaceTextRange( | |
|                                     [ | |
|                                         lastTokenOfConsequent.range[1], | |
|                                         colonToken.range[0] | |
|                                     ], | |
|                                     "\n" | |
|                                 ) | |
|                             ))) | |
|                         }); | |
|                     } | |
|                 } | |
|             } | |
|         }; | |
|     } | |
| };
 |