eslint-plugin-readable-tailwind
Version:
auto-wraps tailwind classes after a certain print width or class count into multiple lines to improve readability.
164 lines • 7.85 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getAttributesBySvelteTag = getAttributesBySvelteTag;
exports.getLiteralsBySvelteAttribute = getLiteralsBySvelteAttribute;
const readable_tailwind_parsers_es_js_1 = require("./es.js");
const readable_tailwind_types_rule_js_1 = require("../types/rule.js");
const readable_tailwind_utils_matchers_js_1 = require("../utils/matchers.js");
const readable_tailwind_utils_regex_js_1 = require("../utils/regex.js");
const readable_tailwind_utils_utils_js_1 = require("../utils/utils.js");
function getAttributesBySvelteTag(ctx, node) {
return node.attributes.reduce((acc, attribute) => {
if (isSvelteAttribute(attribute)) {
acc.push(attribute);
}
return acc;
}, []);
}
function getLiteralsBySvelteAttribute(ctx, attribute, attributes) {
// skip shorthand attributes #42
if (!Array.isArray(attribute.value)) {
return [];
}
const [value] = attribute.value;
if (!value) { // empty attribute
return [];
}
const literals = attributes.reduce((literals, attributes) => {
if ((0, readable_tailwind_utils_matchers_js_1.isAttributesName)(attributes)) {
if (!(0, readable_tailwind_utils_utils_js_1.matchesName)(attributes.toLowerCase(), attribute.key.name.toLowerCase())) {
return literals;
}
literals.push(...getLiteralsBySvelteLiteralNode(ctx, value));
}
else if ((0, readable_tailwind_utils_matchers_js_1.isAttributesRegex)(attributes)) {
literals.push(...(0, readable_tailwind_utils_regex_js_1.getLiteralsByESNodeAndRegex)(ctx, attribute, attributes));
}
else if ((0, readable_tailwind_utils_matchers_js_1.isAttributesMatchers)(attributes)) {
if (!(0, readable_tailwind_utils_utils_js_1.matchesName)(attributes[0].toLowerCase(), attribute.key.name.toLowerCase())) {
return literals;
}
literals.push(...getLiteralsBySvelteMatchers(ctx, value, attributes[1]));
}
return literals;
}, []);
return (0, readable_tailwind_utils_utils_js_1.deduplicateLiterals)(literals);
}
function getLiteralsBySvelteMatchers(ctx, node, matchers) {
const matcherFunctions = getSvelteMatcherFunctions(matchers);
const literalNodes = (0, readable_tailwind_utils_matchers_js_1.getLiteralNodesByMatchers)(ctx, node, matcherFunctions);
const literals = literalNodes.reduce((literals, literalNode) => {
literals.push(...getLiteralsBySvelteLiteralNode(ctx, literalNode));
return literals;
}, []);
return (0, readable_tailwind_utils_utils_js_1.deduplicateLiterals)(literals);
}
function getLiteralsBySvelteLiteralNode(ctx, node) {
if (isSvelteStringLiteral(node)) {
const stringLiteral = getStringLiteralBySvelteStringLiteral(ctx, node);
if (stringLiteral) {
return [stringLiteral];
}
}
if (isSvelteMustacheTag(node)) {
return getLiteralsBySvelteLiteralNode(ctx, node.expression);
}
if ((0, readable_tailwind_parsers_es_js_1.isESStringLike)(node)) {
return (0, readable_tailwind_parsers_es_js_1.getLiteralsByESLiteralNode)(ctx, node);
}
return [];
}
function getStringLiteralBySvelteStringLiteral(ctx, node) {
const content = node.value;
const raw = ctx.sourceCode.getText(node, 1, 1);
const quotes = (0, readable_tailwind_utils_utils_js_1.getQuotes)(raw);
const whitespaces = (0, readable_tailwind_utils_utils_js_1.getWhitespace)(content);
return {
...whitespaces,
...quotes,
content,
loc: node.loc,
node: node,
parent: node.parent,
range: [node.range[0] - 1, node.range[1] + 1], // include quotes in range
raw,
type: "StringLiteral"
};
}
function isSvelteAttribute(attribute) {
return "key" in attribute && "name" in attribute.key && typeof attribute.key.name === "string";
}
function isSvelteStringLiteral(node) {
return node.type === "SvelteLiteral";
}
function isSvelteMustacheTag(node) {
return node.type === "SvelteMustacheTag" &&
"kind" in node && node.kind === "text";
}
function getSvelteMatcherFunctions(matchers) {
return matchers.reduce((matcherFunctions, matcher) => {
switch (matcher.match) {
case readable_tailwind_types_rule_js_1.MatcherType.String: {
matcherFunctions.push(node => {
if ((0, readable_tailwind_utils_matchers_js_1.isInsideConditionalExpressionTest)(node)) {
return false;
}
if ((0, readable_tailwind_utils_matchers_js_1.isInsideLogicalExpressionLeft)(node)) {
return false;
}
if (!(0, readable_tailwind_parsers_es_js_1.hasESNodeParentExtension)(node)) {
return false;
}
return (!(0, readable_tailwind_parsers_es_js_1.isESObjectKey)(node) &&
!(0, readable_tailwind_parsers_es_js_1.isInsideObjectValue)(node) &&
((0, readable_tailwind_parsers_es_js_1.isESStringLike)(node) || isSvelteStringLiteral(node)));
});
break;
}
case readable_tailwind_types_rule_js_1.MatcherType.ObjectKey: {
matcherFunctions.push(node => {
if ((0, readable_tailwind_utils_matchers_js_1.isInsideConditionalExpressionTest)(node)) {
return false;
}
if ((0, readable_tailwind_utils_matchers_js_1.isInsideLogicalExpressionLeft)(node)) {
return false;
}
if (!(0, readable_tailwind_parsers_es_js_1.hasESNodeParentExtension)(node)) {
return false;
}
if (!(0, readable_tailwind_parsers_es_js_1.isESObjectKey)(node)) {
return false;
}
const path = (0, readable_tailwind_utils_matchers_js_1.getObjectPath)(node);
return path && matcher.pathPattern ? (0, readable_tailwind_utils_matchers_js_1.matchesPathPattern)(path, matcher.pathPattern) : true;
});
break;
}
case readable_tailwind_types_rule_js_1.MatcherType.ObjectValue: {
matcherFunctions.push(node => {
if ((0, readable_tailwind_utils_matchers_js_1.isInsideConditionalExpressionTest)(node)) {
return false;
}
if ((0, readable_tailwind_utils_matchers_js_1.isInsideLogicalExpressionLeft)(node)) {
return false;
}
if (!(0, readable_tailwind_parsers_es_js_1.hasESNodeParentExtension)(node)) {
return false;
}
if ((0, readable_tailwind_parsers_es_js_1.isESObjectKey)(node)) {
return false;
}
const path = (0, readable_tailwind_utils_matchers_js_1.getObjectPath)(node);
const matchesPattern = path !== undefined &&
matcher.pathPattern
? (0, readable_tailwind_utils_matchers_js_1.matchesPathPattern)(path, matcher.pathPattern)
: true;
return (0, readable_tailwind_parsers_es_js_1.isInsideObjectValue)(node) && (0, readable_tailwind_parsers_es_js_1.isESStringLike)(node) && matchesPattern;
});
break;
}
}
return matcherFunctions;
}, []);
}
//# sourceMappingURL=svelte.js.map