routie dev init since i didn't adhere to any proper guidance up until now
This commit is contained in:
+141
@@ -0,0 +1,141 @@
|
||||
'use strict';
|
||||
|
||||
const require_runtime = require('../_virtual/_rolldown/runtime.js');
|
||||
const require_index = require('../utils/index.js');
|
||||
|
||||
//#region lib/rules/no-negated-v-if-condition.js
|
||||
/**
|
||||
* @author Wayne Zhang
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
var require_no_negated_v_if_condition = /* @__PURE__ */ require_runtime.__commonJSMin(((exports, module) => {
|
||||
const utils = require_index.default;
|
||||
/**
|
||||
* @typedef { VDirective & { value: (VExpressionContainer & { expression: Expression | null } ) | null } } VIfDirective
|
||||
*/
|
||||
/**
|
||||
* @param {Expression} expression
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function isNegatedExpression(expression) {
|
||||
return expression.type === "UnaryExpression" && expression.operator === "!" || expression.type === "BinaryExpression" && (expression.operator === "!=" || expression.operator === "!==");
|
||||
}
|
||||
/**
|
||||
* @param {VElement} node
|
||||
* @returns {VElement|null}
|
||||
*/
|
||||
function getNextSibling(node) {
|
||||
if (!node.parent?.children) return null;
|
||||
const siblings = node.parent.children;
|
||||
const currentIndex = siblings.indexOf(node);
|
||||
for (let i = currentIndex + 1; i < siblings.length; i++) {
|
||||
const sibling = siblings[i];
|
||||
if (sibling.type === "VElement") return sibling;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* @param {VElement} element
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function isDirectlyFollowedByElse(element) {
|
||||
const nextElement = getNextSibling(element);
|
||||
return nextElement ? utils.hasDirective(nextElement, "else") : false;
|
||||
}
|
||||
/**
|
||||
* @param {VElement} element
|
||||
*/
|
||||
function getDirective(element) {
|
||||
return element.startTag.attributes.find((attr) => attr.directive && attr.key.name && attr.key.name.name && [
|
||||
"if",
|
||||
"else-if",
|
||||
"else"
|
||||
].includes(attr.key.name.name));
|
||||
}
|
||||
module.exports = {
|
||||
meta: {
|
||||
type: "suggestion",
|
||||
docs: {
|
||||
description: "disallow negated conditions in v-if/v-else",
|
||||
categories: void 0,
|
||||
url: "https://eslint.vuejs.org/rules/no-negated-v-if-condition.html"
|
||||
},
|
||||
fixable: "code",
|
||||
schema: [],
|
||||
messages: { negatedCondition: "Unexpected negated condition in v-if with v-else." }
|
||||
},
|
||||
create(context) {
|
||||
const sourceCode = context.sourceCode;
|
||||
const processedPairs = /* @__PURE__ */ new Set();
|
||||
/**
|
||||
* @param {Expression} expression
|
||||
* @returns {string}
|
||||
*/
|
||||
function getConvertedCondition(expression) {
|
||||
if (expression.type === "UnaryExpression" && expression.operator === "!") return sourceCode.text.slice(expression.range[0] + 1, expression.range[1]);
|
||||
if (expression.type === "BinaryExpression") {
|
||||
const left = sourceCode.getText(expression.left);
|
||||
const right = sourceCode.getText(expression.right);
|
||||
if (expression.operator === "!=") return `${left} == ${right}`;
|
||||
else if (expression.operator === "!==") return `${left} === ${right}`;
|
||||
}
|
||||
return sourceCode.getText(expression);
|
||||
}
|
||||
/**
|
||||
* @param {VIfDirective} node
|
||||
*/
|
||||
function checkNegatedCondition(node) {
|
||||
if (!node.value?.expression) return;
|
||||
const expression = node.value.expression;
|
||||
const element = node.parent.parent;
|
||||
if (!isNegatedExpression(expression) || !isDirectlyFollowedByElse(element)) return;
|
||||
const elseElement = getNextSibling(element);
|
||||
if (!elseElement) return;
|
||||
const pairKey = `${element.range[0]}-${elseElement.range[0]}`;
|
||||
if (processedPairs.has(pairKey)) return;
|
||||
processedPairs.add(pairKey);
|
||||
context.report({
|
||||
node: expression,
|
||||
messageId: "negatedCondition",
|
||||
fix: (fixer) => swapElements(fixer, element, elseElement, expression)
|
||||
});
|
||||
}
|
||||
/**
|
||||
* @param {RuleFixer} fixer
|
||||
* @param {VElement} ifElement
|
||||
* @param {VElement} elseElement
|
||||
* @param {Expression} expression
|
||||
*/
|
||||
function* swapElements(fixer, ifElement, elseElement, expression) {
|
||||
const convertedCondition = getConvertedCondition(expression);
|
||||
const ifDir = getDirective(ifElement);
|
||||
const elseDir = getDirective(elseElement);
|
||||
if (!ifDir || !elseDir) return;
|
||||
const ifDirectiveName = ifDir.key.name.name;
|
||||
const ifText = sourceCode.text.slice(ifElement.range[0], ifElement.range[1]);
|
||||
const elseText = sourceCode.text.slice(elseElement.range[0], elseElement.range[1]);
|
||||
const newIfDirective = `v-${ifDirectiveName}="${convertedCondition}"`;
|
||||
const newIfText = elseText.slice(0, elseDir.range[0] - elseElement.range[0]) + newIfDirective + elseText.slice(elseDir.range[1] - elseElement.range[0]);
|
||||
const newElseText = ifText.slice(0, ifDir.range[0] - ifElement.range[0]) + "v-else" + ifText.slice(ifDir.range[1] - ifElement.range[0]);
|
||||
yield fixer.replaceTextRange(ifElement.range, newIfText);
|
||||
yield fixer.replaceTextRange(elseElement.range, newElseText);
|
||||
}
|
||||
return utils.defineTemplateBodyVisitor(context, {
|
||||
"VAttribute[directive=true][key.name.name='if']"(node) {
|
||||
checkNegatedCondition(node);
|
||||
},
|
||||
"VAttribute[directive=true][key.name.name='else-if']"(node) {
|
||||
checkNegatedCondition(node);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
}));
|
||||
|
||||
//#endregion
|
||||
Object.defineProperty(exports, 'default', {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return require_no_negated_v_if_condition();
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user