UNPKG

@ec0lint/plugin-css

Version:

ec0lint plugin that provides rules to verify CSS definition objects

83 lines (82 loc) 3.67 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = require("../utils"); const color_1 = require("../utils/color"); const postcss_value_parser_1 = __importDefault(require("postcss-value-parser")); exports.default = (0, utils_1.createRule)("no-useless-color-alpha", { meta: { docs: { description: "disallow unnecessary alpha-channel transparency value", category: "Best Practices", recommended: true, stylelint: null, }, fixable: "code", schema: [], messages: { unexpected: "The alpha value is 100% and does not need to be specified.", }, type: "suggestion", }, create(context) { function createVisitor(cssContext) { return { onProperty(property) { const value = property.getValue(); if (!value) { return; } const parsedValue = value.parsed; parsedValue.walk((node) => { const { value: textValue, type, sourceIndex } = node; if (type === "function" && textValue.toLowerCase() === "url") return false; if (type !== "word" && type !== "function") return undefined; const actual = postcss_value_parser_1.default.stringify(node); const parsed = (0, color_1.parseColor)(actual); const alpha = parsed.getAlpha(); if (alpha == null || alpha < 1) { return undefined; } const expected = parsed.removeAlpha().toColorString(); if (expected === actual) { return undefined; } const sourceCode = context.getSourceCode(); const startIndex = value.expression.range[0] + sourceIndex + 1; const endIndex = startIndex + actual.length; const loc = value.directExpression ? { start: sourceCode.getLocFromIndex(startIndex), end: sourceCode.getLocFromIndex(endIndex), } : undefined; context.report({ node: value.expression, loc, messageId: "unexpected", fix(fixer) { if (cssContext.isFixable(value.directExpression) && sourceCode.text.slice(startIndex, endIndex) === actual) { return fixer.replaceTextRange([startIndex, endIndex], expected); } return null; }, }); return undefined; }); }, }; } return (0, utils_1.defineCSSVisitor)(context, { createVisitor, }); }, });