UNPKG

@ec0lint/plugin-css

Version:

ec0lint plugin that provides rules to verify CSS definition objects

82 lines (81 loc) 3.26 kB
"use strict"; 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, }); }, });