ESLint plugin for UnoCSS providing rules for class ordering, attributify ordering, blocklist enforcement, and class compilation
—
Rules for enforcing consistent ordering of UnoCSS utility classes across different contexts and frameworks.
Enforces consistent ordering of UnoCSS utilities in class attributes, function calls, and template literals.
/**
* ESLint rule for ordering UnoCSS utilities in class attributes
* Supports JSX, Vue, Svelte, and standard HTML class attributes
*/
interface OrderRule extends ESLintRule {
name: "order";
meta: {
type: "layout";
fixable: "code";
docs: {
description: "Order of UnoCSS utilities in class attribute";
};
messages: {
"invalid-order": "UnoCSS utilities are not ordered";
};
schema: [OrderRuleOptions];
};
defaultOptions: [OrderRuleOptions];
}
interface OrderRuleOptions {
/** Array of function names that contain UnoCSS classes */
unoFunctions?: string[];
/** Array of regex patterns matching variable names containing UnoCSS classes */
unoVariables?: string[];
}Default Configuration:
{
unoFunctions: ["clsx", "classnames"],
unoVariables: ["^cls", "classNames?$"]
}Usage Examples:
// ESLint configuration
{
rules: {
"@unocss/order": ["warn", {
unoFunctions: ["clsx", "classnames", "cn"],
unoVariables: ["^cls", "className", "styles$"]
}]
}
}Supported Contexts:
// JSX attributes
<div className="p-4 bg-red-500 text-white" />
// Vue templates
<div class="p-4 bg-red-500 text-white" />
// Svelte components
<div class="p-4 bg-red-500 text-white" />
// Function calls
clsx("p-4 bg-red-500", condition && "text-white")
// Template literals
const styles = `p-4 bg-red-500 text-white`
// Variable assignments
const buttonClass = "p-4 bg-red-500 text-white"Enforces ordering of UnoCSS attributify-style attributes in Vue templates.
/**
* ESLint rule for ordering UnoCSS attributify attributes
* Only works with Vue template syntax
*/
interface OrderAttributifyRule extends ESLintRule {
name: "order-attributify";
meta: {
type: "layout";
fixable: "code";
docs: {
description: "Order of UnoCSS attributes";
};
messages: {
"invalid-order": "UnoCSS attributes are not ordered";
};
schema: [];
};
defaultOptions: [];
}
/** Attribute names ignored during attributify ordering */
const IGNORE_ATTRIBUTES: string[] = ["style", "class", "classname", "value"];Usage Examples:
<!-- Before: unordered attributify attributes -->
<div text-white bg-red-500 p-4 m-2 />
<!-- After: ordered attributify attributes -->
<div p-4 m-2 bg-red-500 text-white />Configuration:
// ESLint configuration
{
rules: {
"@unocss/order-attributify": "warn"
}
}The order rules support various AST node types across different parsers:
Standard JavaScript/TypeScript:
Literal nodes for string literalsTemplateLiteral nodes for template stringsTaggedTemplateExpression for String.raw templatesCallExpression for function callsVariableDeclarator for variable assignmentsJSX (React):
JSXAttribute nodes for JSX attributesJSXExpressionContainer for dynamic expressionsVue Templates:
VAttribute nodes for template attributesVLiteral nodes for literal valuesSvelte Components:
SvelteAttribute nodes for component attributesSvelteLiteral and SvelteMustacheTag for valuesBoth rules integrate with UnoCSS configuration:
// ESLint settings integration
interface ESLintSettings {
unocss?: {
/** Path to UnoCSS configuration file */
configPath?: string;
};
}ESLint Configuration:
module.exports = {
settings: {
unocss: {
configPath: "./uno.config.ts"
}
},
rules: {
"@unocss/order": "warn",
"@unocss/order-attributify": "warn"
}
};Vue Integration:
vue-eslint-parserdefineTemplateBodyVisitor for template processingSvelte Integration:
svelte-eslint-parserJSX Integration:
@typescript-eslint/parserInstall with Tessl CLI
npx tessl i tessl/npm-unocss--eslint-plugin