@ec0lint/plugin-css
Version:
ec0lint plugin that provides rules to verify CSS definition objects
82 lines (81 loc) • 3.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("../utils");
const casing_1 = require("../utils/casing");
const allowedCaseOptions = ["camelCase", "kebab-case"];
exports.default = (0, utils_1.createRule)("property-casing", {
meta: {
docs: {
description: "enforce specific casing for CSS properties",
category: "Stylistic Issues",
recommended: false,
standard: true,
stylelint: null,
},
fixable: "code",
schema: [
{
enum: allowedCaseOptions,
},
],
messages: {
disallow: "'{{name}}' is not in {{caseType}}.",
},
type: "layout",
},
create(context) {
const option = context.options[0];
const caseType = allowedCaseOptions.includes(option) ? option : "camelCase";
const checker = (0, casing_1.getChecker)(caseType);
function createVisitor(cssContext) {
return {
onProperty(property) {
const prop = property.getName();
if (!prop) {
return;
}
if (checker(prop.name)) {
return;
}
context.report({
node: prop.expression,
messageId: "disallow",
data: {
name: prop.name,
caseType,
},
fix(fixer) {
if (!cssContext.isFixable(prop.directExpression)) {
return null;
}
const quoted = (prop.directExpression.type === "Literal" &&
typeof prop.directExpression.value ===
"string") ||
prop.directExpression.type === "TemplateLiteral";
if (!quoted && caseType === "kebab-case") {
return null;
}
const newName = prop.name === "cssFloat"
? "float"
: (0, casing_1.getExactConverter)(caseType)(prop.name);
if (newName === prop.name) {
return null;
}
let replaceRange = prop.directExpression.range;
if (quoted) {
replaceRange = [
replaceRange[0] + 1,
replaceRange[1] - 1,
];
}
return fixer.replaceTextRange(replaceRange, newName);
},
});
},
};
}
return (0, utils_1.defineCSSVisitor)(context, {
createVisitor,
});
},
});