eslint-plugin-better-tailwindcss
Version:
auto-wraps tailwind classes after a certain print width or class count into multiple lines to improve readability.
66 lines • 3.14 kB
JavaScript
import { description, literal, optional, pipe, strictObject, union } from "valibot";
import { createGetDissectedClasses, getDissectedClasses } from "../tailwindcss/dissect-classes.js";
import { buildClass } from "../utils/class.js";
import { async } from "../utils/context.js";
import { lintClasses } from "../utils/lint.js";
import { createRule } from "../utils/rule.js";
import { splitClasses } from "../utils/utils.js";
export const enforceConsistentImportantPosition = createRule({
autofix: true,
category: "stylistic",
description: "Enforce consistent important position for classes.",
docs: "https://github.com/schoero/eslint-plugin-better-tailwindcss/blob/main/docs/rules/enforce-consistent-important-position.md",
name: "enforce-consistent-important-position",
recommended: false,
messages: {
position: "Incorrect important position. '{{ className }}' should be '{{ fix }}'."
},
schema: strictObject({
position: optional(pipe(union([
literal("legacy"),
literal("recommended")
]), description("Preferred position for important classes. 'legacy' places the important modifier (!) at the start of the class name, 'recommended' places it at the end.")))
}),
initialize: ctx => {
createGetDissectedClasses(ctx);
},
lintLiterals(ctx, literals) {
const { position: configuredPosition } = ctx.options;
const position = configuredPosition ?? (ctx.version.major >= 4
? "recommended"
: "legacy");
for (const literal of literals) {
const classes = splitClasses(literal.content);
const { dissectedClasses, warnings } = getDissectedClasses(async(ctx), classes);
lintClasses(ctx, literal, (className, index, after) => {
const dissectedClass = dissectedClasses[className];
if (!dissectedClass) {
return;
}
const [importantAtStart, importantAtEnd] = dissectedClass.important;
if (!importantAtStart && !importantAtEnd ||
position === "legacy" && importantAtStart ||
position === "recommended" && importantAtEnd) {
return;
}
if (ctx.version.major <= 3 && position === "recommended") {
warnings.push({
option: "position",
title: `The "${position}" position is not supported in Tailwind CSS v3`,
url: `${ctx.docs}#position`
});
}
const fix = position === "recommended"
? buildClass(ctx, { ...dissectedClass, important: [false, true] })
: buildClass(ctx, { ...dissectedClass, important: [true, false] });
return {
data: { className, fix },
fix,
id: "position",
warnings
};
});
}
}
});
//# sourceMappingURL=enforce-consistent-important-position.js.map