UNPKG

eslint-plugin-sf-plugin

Version:
71 lines (70 loc) 3.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.noDependsOnBooleanFlags = void 0; /* * Copyright (c) 2024, salesforce.com, inc. * All rights reserved. * Licensed under the BSD 3-Clause license. * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ const utils_1 = require("@typescript-eslint/utils"); const eslint_utils_1 = require("@typescript-eslint/utils/eslint-utils"); const commands_1 = require("../shared/commands"); const flags_1 = require("../shared/flags"); exports.noDependsOnBooleanFlags = eslint_utils_1.RuleCreator.withoutDocs({ meta: { docs: { description: 'Do not allow flags to depend on boolean flags', recommended: 'recommended', url: 'https://github.com/salesforcecli/eslint-plugin-sf-plugin/blob/main/docs/rules/no-depends-on-boolean-flag.md' }, messages: { message: 'Depending on a boolean flag can lead to unexpected behavior. Use `flag.relationships` to check flag values instead' }, type: 'problem', schema: [], }, defaultOptions: [], create(context) { return (0, commands_1.isInCommandDirectory)(context) ? { Property(node) { var _a, _b, _c; if ((0, flags_1.isFlag)(node) && (0, commands_1.ancestorsContainsSfCommand)(context) && ((_a = node.value) === null || _a === void 0 ? void 0 : _a.type) === utils_1.AST_NODE_TYPES.CallExpression && ((_c = (_b = node.value.arguments) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.type) === utils_1.AST_NODE_TYPES.ObjectExpression) { const dependsOnFlagsProp = node.value.arguments[0].properties .filter(utils_1.ASTUtils.isNodeOfType(utils_1.AST_NODE_TYPES.Property)) .find((0, flags_1.flagPropertyIsNamed)('dependsOn')); if (dependsOnFlagsProp) { const dependedOnFlags = 'value' in dependsOnFlagsProp && utils_1.ASTUtils.isNodeOfType(utils_1.AST_NODE_TYPES.ArrayExpression)(dependsOnFlagsProp.value) ? dependsOnFlagsProp.value.elements .filter(utils_1.ASTUtils.isNodeOfType(utils_1.AST_NODE_TYPES.Literal)) .map((l) => l.value) : []; for (const flag of dependedOnFlags) { if (node.parent.type === 'ObjectExpression') { const possibleBoolFlag = node.parent.properties.find((f) => f.type === utils_1.AST_NODE_TYPES.Property && f.key.type == utils_1.AST_NODE_TYPES.Identifier && f.key.name === flag && f.value.type == utils_1.AST_NODE_TYPES.CallExpression && f.value.callee.type == utils_1.AST_NODE_TYPES.MemberExpression && f.value.callee.property.type == utils_1.AST_NODE_TYPES.Identifier && f.value.callee.property.name === 'boolean'); if (possibleBoolFlag) { context.report({ node: node, messageId: 'message', }); } } } } } }, } : {}; }, });