eslint-plugin-vue
Version:
Official ESLint plugin for Vue.js
115 lines (112 loc) • 3.99 kB
JavaScript
;
const require_runtime = require('../_virtual/_rolldown/runtime.js');
const require_index = require('../utils/index.js');
//#region lib/rules/no-boolean-default.js
/**
* @fileoverview Prevents boolean defaults from being set
* @author Hiroki Osame
*/
var require_no_boolean_default = /* @__PURE__ */ require_runtime.__commonJSMin(((exports, module) => {
const utils = require_index.default;
/**
* @typedef {import('../utils').ComponentProp} ComponentProp
* @typedef {import('../utils').ComponentObjectProp} ComponentObjectProp
*/
/**
* @param {Expression|undefined} node
*/
function isBooleanIdentifier(node) {
return Boolean(node && node.type === "Identifier" && node.name === "Boolean");
}
/**
* Detects whether given prop node is a Boolean
* @param {ComponentObjectProp} prop
* @return {Boolean}
*/
function isBooleanProp(prop) {
const value = utils.skipTSAsExpression(prop.value);
return isBooleanIdentifier(value) || value.type === "ObjectExpression" && isBooleanIdentifier(utils.findProperty(value, "type")?.value);
}
/**
* @param {ObjectExpression} propDefValue
*/
function getDefaultNode(propDefValue) {
return utils.findProperty(propDefValue, "default");
}
module.exports = {
meta: {
type: "suggestion",
docs: {
description: "disallow boolean defaults",
categories: void 0,
url: "https://eslint.vuejs.org/rules/no-boolean-default.html"
},
fixable: null,
schema: [{ enum: ["default-false", "no-default"] }],
messages: {
noBooleanDefault: "Boolean prop should not set a default (Vue defaults it to false).",
defaultFalse: "Boolean prop should only be defaulted to false."
}
},
create(context) {
const booleanType = context.options[0] || "no-default";
/**
* @param {ComponentProp} prop
* @param {(propName: string) => Expression[]} otherDefaultProvider
*/
function processProp(prop, otherDefaultProvider) {
if (prop.type === "object") {
if (!isBooleanProp(prop)) return;
if (prop.value.type === "ObjectExpression") {
const defaultNode = getDefaultNode(prop.value);
if (defaultNode) verifyDefaultExpression(defaultNode.value);
}
if (prop.propName != null) for (const defaultNode of otherDefaultProvider(prop.propName)) verifyDefaultExpression(defaultNode);
} else if (prop.type === "type") {
if (prop.types.length !== 1 || prop.types[0] !== "Boolean") return;
for (const defaultNode of otherDefaultProvider(prop.propName)) verifyDefaultExpression(defaultNode);
}
}
/**
* @param {ComponentProp[]} props
* @param {(propName: string) => Expression[]} otherDefaultProvider
*/
function processProps(props, otherDefaultProvider) {
for (const prop of props) processProp(prop, otherDefaultProvider);
}
/**
* @param {Expression} defaultNode
*/
function verifyDefaultExpression(defaultNode) {
switch (booleanType) {
case "no-default":
context.report({
node: defaultNode,
messageId: "noBooleanDefault"
});
break;
case "default-false":
if (defaultNode.type !== "Literal" || defaultNode.value !== false) context.report({
node: defaultNode,
messageId: "defaultFalse"
});
break;
}
}
return utils.compositingVisitors(utils.executeOnVueComponent(context, (obj) => {
processProps(utils.getComponentPropsFromOptions(obj), () => []);
}), utils.defineScriptSetupVisitor(context, { onDefinePropsEnter(node, props) {
const defaultsByWithDefaults = utils.getWithDefaultsPropExpressions(node);
const defaultsByAssignmentPatterns = utils.getDefaultPropExpressionsForPropsDestructure(node);
processProps(props, (propName) => [defaultsByWithDefaults[propName], defaultsByAssignmentPatterns[propName]?.expression].filter(utils.isDef));
} }));
}
};
}));
//#endregion
Object.defineProperty(exports, 'default', {
enumerable: true,
get: function () {
return require_no_boolean_default();
}
});