UNPKG

eslint-plugin-readable-tailwind

Version:

auto-wraps tailwind classes after a certain print width or class count into multiple lines to improve readability.

118 lines 5.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.tailwindNoUnnecessaryWhitespace = void 0; const readable_tailwind_options_default_options_js_1 = require("../options/default-options.js"); const readable_tailwind_options_descriptions_js_1 = require("../options/descriptions.js"); const readable_tailwind_utils_quotes_js_1 = require("../utils/quotes.js"); const readable_tailwind_utils_rule_js_1 = require("../utils/rule.js"); const readable_tailwind_utils_utils_js_1 = require("../utils/utils.js"); const defaultOptions = { allowMultiline: true, attributes: readable_tailwind_options_default_options_js_1.DEFAULT_ATTRIBUTE_NAMES, callees: readable_tailwind_options_default_options_js_1.DEFAULT_CALLEE_NAMES, tags: readable_tailwind_options_default_options_js_1.DEFAULT_TAG_NAMES, variables: readable_tailwind_options_default_options_js_1.DEFAULT_VARIABLE_NAMES }; exports.tailwindNoUnnecessaryWhitespace = { name: "no-unnecessary-whitespace", rule: { create: ctx => (0, readable_tailwind_utils_rule_js_1.createRuleListener)(ctx, getOptions(ctx), lintLiterals), meta: { docs: { category: "Stylistic Issues", description: "Disallow unnecessary whitespace in tailwind classes.", recommended: true, url: "https://github.com/schoero/eslint-plugin-readable-tailwind/blob/main/docs/rules/no-unnecessary-whitespace.md" }, fixable: "whitespace", schema: [ { additionalProperties: false, properties: { allowMultiline: { default: defaultOptions.allowMultiline, description: "Allow multi-line class declarations. If this option is disabled, template literal strings will be collapsed into a single line string wherever possible. Must be set to `true` when used in combination with [readable-tailwind/multiline](./multiline.md).", type: "boolean" }, ...readable_tailwind_options_descriptions_js_1.CALLEE_SCHEMA, ...readable_tailwind_options_descriptions_js_1.ATTRIBUTE_SCHEMA, ...readable_tailwind_options_descriptions_js_1.VARIABLE_SCHEMA, ...readable_tailwind_options_descriptions_js_1.TAG_SCHEMA }, type: "object" } ], type: "layout" } } }; function lintLiterals(ctx, literals) { const { allowMultiline } = getOptions(ctx); for (const literal of literals) { const classes = splitClassesKeepWhitespace(literal, allowMultiline); const escapedClasses = (0, readable_tailwind_utils_quotes_js_1.escapeNestedQuotes)(classes.join(""), literal.openingQuote ?? "`"); const fixedClasses = [ literal.openingQuote ?? "", literal.type === "TemplateLiteral" && literal.closingBraces ? literal.closingBraces : "", escapedClasses, literal.type === "TemplateLiteral" && literal.openingBraces ? literal.openingBraces : "", literal.closingQuote ?? "" ].join(""); if (literal.raw === fixedClasses) { continue; } ctx.report({ data: { fixedClasses: (0, readable_tailwind_utils_utils_js_1.display)(fixedClasses), unnecessaryWhitespace: (0, readable_tailwind_utils_utils_js_1.display)(literal.raw) }, fix(fixer) { return fixer.replaceTextRange(literal.range, fixedClasses); }, loc: literal.loc, message: "Unnecessary whitespace. Expected\n\n{{ unnecessaryWhitespace }}\n\nto be\n\n{{ fixedClasses }}" }); } } function splitClassesKeepWhitespace(literal, allowMultiline) { const classes = literal.content; const classChunks = (0, readable_tailwind_utils_utils_js_1.splitClasses)(classes); const whitespaceChunks = (0, readable_tailwind_utils_utils_js_1.splitWhitespaces)(classes); const mixedChunks = []; if (classChunks.length === 0 && !literal.closingBraces && !literal.openingBraces) { return []; } while (whitespaceChunks.length > 0 || classChunks.length > 0) { const whitespaceChunk = whitespaceChunks.shift(); const classChunk = classChunks.shift(); const isFirstChunk = mixedChunks.length === 0; const isLastChunk = whitespaceChunks.length === 0 && classChunks.length === 0; if (whitespaceChunk) { if (whitespaceChunk.includes("\n") && allowMultiline === true) { const whitespaceWithoutLeadingSpaces = whitespaceChunk.replace(/^ +/, ""); mixedChunks.push(whitespaceWithoutLeadingSpaces); } else { if (!isFirstChunk && !isLastChunk || literal.type === "TemplateLiteral" && literal.closingBraces && isFirstChunk && !isLastChunk || literal.type === "TemplateLiteral" && literal.openingBraces && isLastChunk && !isFirstChunk) { mixedChunks.push(" "); } } } if (classChunk) { mixedChunks.push(classChunk); } } return mixedChunks; } function getOptions(ctx) { const options = ctx.options[0] ?? {}; const common = (0, readable_tailwind_utils_utils_js_1.getCommonOptions)(ctx); const allowMultiline = options.allowMultiline ?? defaultOptions.allowMultiline; return { ...common, allowMultiline }; } //# sourceMappingURL=tailwind-no-unnecessary-whitespace.js.map