github-pages-deploy-action/node_modules/eslint/lib/rules/multiline-ternary.js

115 lines
4.6 KiB
JavaScript
Raw Permalink Normal View History

2020-03-07 11:45:40 +08:00
/**
* @fileoverview Enforce newlines between operands of ternary expressions
* @author Kai Cataldo
*/
"use strict";
2020-03-31 20:40:00 +08:00
const astUtils = require("./utils/ast-utils");
2020-03-07 11:45:40 +08:00
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
module.exports = {
meta: {
type: "layout",
docs: {
description: "enforce newlines between operands of ternary expressions",
category: "Stylistic Issues",
recommended: false,
url: "https://eslint.org/docs/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."
}
},
create(context) {
const option = context.options[0];
const multiline = option !== "never";
const allowSingleLine = option === "always-multiline";
2020-06-27 02:01:06 +08:00
const sourceCode = context.getSourceCode();
2020-03-07 11:45:40 +08:00
//--------------------------------------------------------------------------
// Public
//--------------------------------------------------------------------------
return {
ConditionalExpression(node) {
2020-06-27 02:01:06 +08:00
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);
2020-03-07 11:45:40 +08:00
if (!multiline) {
if (!areTestAndConsequentOnSameLine) {
2020-06-27 02:01:06 +08:00
context.report({
node: node.test,
loc: {
start: firstTokenOfTest.loc.start,
end: lastTokenOfTest.loc.end
},
messageId: "unexpectedTestCons"
});
2020-03-07 11:45:40 +08:00
}
if (!areConsequentAndAlternateOnSameLine) {
2020-06-27 02:01:06 +08:00
context.report({
node: node.consequent,
loc: {
start: firstTokenOfConsequent.loc.start,
end: lastTokenOfConsequent.loc.end
},
messageId: "unexpectedConsAlt"
});
2020-03-07 11:45:40 +08:00
}
} else {
if (allowSingleLine && node.loc.start.line === node.loc.end.line) {
return;
}
if (areTestAndConsequentOnSameLine) {
2020-06-27 02:01:06 +08:00
context.report({
node: node.test,
loc: {
start: firstTokenOfTest.loc.start,
end: lastTokenOfTest.loc.end
},
messageId: "expectedTestCons"
});
2020-03-07 11:45:40 +08:00
}
if (areConsequentAndAlternateOnSameLine) {
2020-06-27 02:01:06 +08:00
context.report({
node: node.consequent,
loc: {
start: firstTokenOfConsequent.loc.start,
end: lastTokenOfConsequent.loc.end
},
messageId: "expectedConsAlt"
});
2020-03-07 11:45:40 +08:00
}
}
}
};
}
};