@ec0lint/plugin-css
Version:
ec0lint plugin that provides rules to verify CSS definition objects
83 lines (82 loc) • 3.67 kB
JavaScript
;
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,
});
},
});