UNPKG

eslint-plugin-readable-tailwind

Version:

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

124 lines 4.54 kB
import { DEFAULT_ATTRIBUTE_NAMES, DEFAULT_CALLEE_NAMES, DEFAULT_TAG_NAMES, DEFAULT_VARIABLE_NAMES } from "../options/default-options.js"; export function getCommonOptions(ctx) { const attributes = getOption(ctx, "attributes") ?? DEFAULT_ATTRIBUTE_NAMES; const callees = getOption(ctx, "callees") ?? DEFAULT_CALLEE_NAMES; const variables = getOption(ctx, "variables") ?? DEFAULT_VARIABLE_NAMES; const tags = getOption(ctx, "tags") ?? DEFAULT_TAG_NAMES; const tailwindConfig = getOption(ctx, "entryPoint") ?? getOption(ctx, "tailwindConfig"); return { attributes, callees, tags, tailwindConfig, variables }; } function getOption(ctx, key) { return ctx.options[0]?.[key] ?? ctx.settings["eslint-plugin-readable-tailwind"]?.[key] ?? ctx.settings["readable-tailwind"]?.[key]; } export function getWhitespace(classes) { const leadingWhitespace = classes.match(/^\s*/)?.[0]; const trailingWhitespace = classes.match(/\s*$/)?.[0]; return { leadingWhitespace, trailingWhitespace }; } export function getQuotes(raw) { const openingQuote = raw.at(0); const closingQuote = raw.at(-1); return { closingQuote: closingQuote === "'" || closingQuote === '"' || closingQuote === "`" ? closingQuote : undefined, openingQuote: openingQuote === "'" || openingQuote === '"' || openingQuote === "`" ? openingQuote : undefined }; } export function getContent(raw, quotes, braces) { return raw.substring((quotes?.openingQuote?.length ?? 0) + (braces?.closingBraces?.length ?? 0), raw.length - (quotes?.closingQuote?.length ?? 0) - (braces?.openingBraces?.length ?? 0)); } export function splitClasses(classes) { if (classes.trim() === "") { return []; } return classes .trim() .split(/\s+/); } export function display(classes) { return classes .replaceAll(" ", "·") .replaceAll("\n", "↵\n") .replaceAll("\r", "↩\r") .replaceAll("\t", "→"); } export function augmentMessageWithWarnings(message, warnings) { if (!warnings || warnings.length === 0) { return message; } return [ warnings.flatMap(({ option, title, url }) => [ `⚠️ Warning: ${title}. Option \`${option}\` may be misconfigured.`, `Check documentation at ${url}` ]).join("\n"), message ].join("\n\n"); } export function splitWhitespaces(classes) { return classes.split(/\S+/); } export function getIndentation(line) { return line.match(/^[\t ]*/)?.[0].length ?? 0; } export function escapeForRegex(word) { return word.replace(/[$()*+.?[\\\]^{|}]/g, "\\$&"); } export function getExactClassLocation(literal, className, lastIndex) { const escapedClass = escapeForRegex(className); const regex = new RegExp(`(?:^|\\s+)(${escapedClass})(?=\\s+|$)`, "g"); const [...matches] = literal.content.matchAll(regex); const match = lastIndex ? matches.at(-1) : matches.at(0); if (match?.index === undefined) { return literal.loc; } const fullMatchIndex = match.index; const word = match?.[1]; const indexOfClass = fullMatchIndex + match[0].indexOf(word); const linesUpToStartIndex = literal.content.slice(0, indexOfClass).split("\n"); const isOnFirstLine = linesUpToStartIndex.length === 1; const containingLine = linesUpToStartIndex.at(-1); const line = literal.loc.start.line + linesUpToStartIndex.length - 1; const column = (isOnFirstLine ? literal.loc.start.column + (literal.openingQuote?.length ?? 0) : 0) + (containingLine?.length ?? 0); return { end: { column: column + className.length, line }, start: { column, line } }; } export function matchesName(pattern, name) { if (!name) { return false; } const match = name.match(pattern); return !!match && match[0] === name; } export function deduplicateLiterals(literals) { return literals.filter((l1, index) => { return literals.findIndex(l2 => { return l1.content === l2.content && l1.range[0] === l2.range[0] && l1.range[1] === l2.range[1]; }) === index; }); } export function isGenericNodeWithParent(node) { return (typeof node === "object" && node !== null && "parent" in node && node.parent !== null && typeof node.parent === "object"); } //# sourceMappingURL=utils.js.map