UNPKG

eslint-plugin-vue

Version:

Official ESLint plugin for Vue.js

115 lines (112 loc) 3.99 kB
'use strict'; 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(); } });