From ac3fe84e993055805a87d998a40755af6381b0c4 Mon Sep 17 00:00:00 2001 From: Imamuzzaki Abu Salam Date: Fri, 24 Jan 2025 21:30:53 +0700 Subject: [PATCH 1/4] feat: migrate to TypeScript and restructure project files Preparation to support TailwindCSS v4 requires me to migrate it to TS to protect my sane and peaceful mind --- lib/index.js | 5337 ++++++++++++++++- lib/index.js.map | 1 + lib/util/removeDuplicatesFromArray.js | 7 - package-lock.json | 4985 ++++++++++++--- package.json | 26 +- {lib => src}/.prettierrc.json | 0 .../configs/flat-recommended.ts | 8 +- lib/config/groups.js => src/configs/groups.ts | 2 +- src/configs/index.ts | 7 + .../configs/recommended.ts | 4 +- lib/config/rules.js => src/configs/rules.ts | 2 +- src/index.ts | 33 + .../rules/classnames-order.ts | 16 +- .../enforces-negative-arbitrary-values.ts | 14 +- .../rules/enforces-shorthand.ts | 16 +- src/rules/index.ts | 19 + .../rules/migration-from-tailwind-2.ts | 2 +- .../rules/no-arbitrary-value.ts | 2 +- .../rules/no-contradicting-classname.ts | 16 +- .../rules/no-custom-classname.ts | 20 +- .../rules/no-unnecessary-arbitrary-value.ts | 20 +- lib/util/ast.js => src/util/ast.ts | 21 +- lib/util/cssFiles.js => src/util/cssFiles.ts | 2 +- .../util/customConfig.ts | 28 +- lib/util/docsUrl.js => src/util/docsUrl.ts | 4 +- .../generated.js => src/util/generated.ts | 2 +- .../util/groupMethods.ts | 71 +- lib/util/parser.js => src/util/parser.ts | 6 +- .../order.js => src/util/prettier/order.ts | 14 +- lib/util/regex.js => src/util/regex.ts | 7 +- src/util/removeDuplicatesFromArray.ts | 7 + ...eDuplicatesFromClassnamesAndWhitespaces.ts | 9 +- lib/util/settings.js => src/util/settings.ts | 6 +- .../types/angle.js => src/util/types/angle.ts | 2 +- .../types/color.js => src/util/types/color.ts | 2 +- .../length.js => src/util/types/length.ts | 12 +- tsconfig.json | 23 + tsup.config.ts | 11 + 38 files changed, 9675 insertions(+), 1089 deletions(-) create mode 100644 lib/index.js.map delete mode 100644 lib/util/removeDuplicatesFromArray.js rename {lib => src}/.prettierrc.json (100%) rename lib/config/flat-recommended.js => src/configs/flat-recommended.ts (80%) rename lib/config/groups.js => src/configs/groups.ts (99%) create mode 100644 src/configs/index.ts rename lib/config/recommended.js => src/configs/recommended.ts (84%) rename lib/config/rules.js => src/configs/rules.ts (96%) create mode 100644 src/index.ts rename lib/rules/classnames-order.js => src/rules/classnames-order.ts (95%) rename lib/rules/enforces-negative-arbitrary-values.js => src/rules/enforces-negative-arbitrary-values.ts (96%) rename lib/rules/enforces-shorthand.js => src/rules/enforces-shorthand.ts (98%) create mode 100644 src/rules/index.ts rename lib/rules/migration-from-tailwind-2.js => src/rules/migration-from-tailwind-2.ts (99%) rename lib/rules/no-arbitrary-value.js => src/rules/no-arbitrary-value.ts (99%) rename lib/rules/no-contradicting-classname.js => src/rules/no-contradicting-classname.ts (96%) rename lib/rules/no-custom-classname.js => src/rules/no-custom-classname.ts (94%) rename lib/rules/no-unnecessary-arbitrary-value.js => src/rules/no-unnecessary-arbitrary-value.ts (96%) rename lib/util/ast.js => src/util/ast.ts (95%) rename lib/util/cssFiles.js => src/util/cssFiles.ts (98%) rename lib/util/customConfig.js => src/util/customConfig.ts (79%) rename lib/util/docsUrl.js => src/util/docsUrl.ts (78%) rename lib/util/generated.js => src/util/generated.ts (93%) rename lib/util/groupMethods.js => src/util/groupMethods.ts (90%) rename lib/util/parser.js => src/util/parser.ts (82%) rename lib/util/prettier/order.js => src/util/prettier/order.ts (86%) rename lib/util/regex.js => src/util/regex.ts (75%) create mode 100644 src/util/removeDuplicatesFromArray.ts rename lib/util/removeDuplicatesFromClassnamesAndWhitespaces.js => src/util/removeDuplicatesFromClassnamesAndWhitespaces.ts (69%) rename lib/util/settings.js => src/util/settings.ts (91%) rename lib/util/types/angle.js => src/util/types/angle.ts (92%) rename lib/util/types/color.js => src/util/types/color.ts (99%) rename lib/util/types/length.js => src/util/types/length.ts (94%) create mode 100644 tsconfig.json create mode 100644 tsup.config.ts diff --git a/lib/index.js b/lib/index.js index 53824e76..7faad006 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,28 +1,5311 @@ -/** - * @fileoverview Rules enforcing best practices while using Tailwind CSS - * @author François Massart - */ -'use strict'; - -//------------------------------------------------------------------------------ -// Plugin Definition -//------------------------------------------------------------------------------ - -// import all rules in lib/rules -var base = __dirname + '/rules/'; -module.exports = { - rules: { - 'classnames-order': require(base + 'classnames-order'), - 'enforces-negative-arbitrary-values': require(base + 'enforces-negative-arbitrary-values'), - 'enforces-shorthand': require(base + 'enforces-shorthand'), - 'migration-from-tailwind-2': require(base + 'migration-from-tailwind-2'), - 'no-arbitrary-value': require(base + 'no-arbitrary-value'), - 'no-contradicting-classname': require(base + 'no-contradicting-classname'), - 'no-custom-classname': require(base + 'no-custom-classname'), - 'no-unnecessary-arbitrary-value': require(base + 'no-unnecessary-arbitrary-value'), - }, - configs: { - recommended: require('./config/recommended'), - 'flat/recommended': require('./config/flat-recommended'), - }, +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { + get: (a, b) => (typeof require !== "undefined" ? require : a)[b] +}) : x)(function(x) { + if (typeof require !== "undefined") return require.apply(this, arguments); + throw Error('Dynamic require of "' + x + '" is not supported'); +}); +var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; }; +var __commonJS = (cb, mod) => function __require2() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name2 in all) + __defProp(target, name2, { get: all[name2], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/configs/rules.ts +var rules_default; +var init_rules = __esm({ + "src/configs/rules.ts"() { + "use strict"; + rules_default = { + "tailwindcss/classnames-order": "warn", + "tailwindcss/enforces-negative-arbitrary-values": "warn", + "tailwindcss/enforces-shorthand": "warn", + "tailwindcss/migration-from-tailwind-2": "warn", + "tailwindcss/no-arbitrary-value": "off", + "tailwindcss/no-custom-classname": "warn", + "tailwindcss/no-contradicting-classname": "error", + "tailwindcss/no-unnecessary-arbitrary-value": "warn" + }; + } +}); + +// src/configs/flat-recommended.ts +var plugin, flat_recommended_default; +var init_flat_recommended = __esm({ + async "src/configs/flat-recommended.ts"() { + "use strict"; + init_rules(); + plugin = await init_index().then(() => index_exports); + flat_recommended_default = [ + { + name: "tailwindcss:base", + plugins: { + get tailwindcss() { + return plugin; + } + }, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true + } + } + } + }, + { + name: "tailwindcss:rules", + rules: rules_default + } + ]; + } +}); + +// src/configs/recommended.ts +var recommended_default; +var init_recommended = __esm({ + "src/configs/recommended.ts"() { + "use strict"; + init_rules(); + recommended_default = { + plugins: ["tailwindcss"], + parserOptions: { + ecmaFeatures: { + jsx: true + } + }, + rules: rules_default + }; + } +}); + +// src/configs/index.ts +var configs; +var init_configs = __esm({ + async "src/configs/index.ts"() { + "use strict"; + await init_flat_recommended(); + init_recommended(); + configs = { + recommended: recommended_default, + "flat/recommended": flat_recommended_default + }; + } +}); + +// src/util/regex.ts +var regex_exports = {}; +__export(regex_exports, { + escapeRegex: () => escapeRegex, + separatorRegEx: () => separatorRegEx +}); +function escapeRegex(input) { + return input.replace(/[/\-\\^$*+?.()|[\]{}]/g, "\\$&"); +} +var separatorRegEx; +var init_regex = __esm({ + "src/util/regex.ts"() { + "use strict"; + separatorRegEx = /([\t\n\f\r ]+)/; + } +}); + +// src/util/removeDuplicatesFromArray.ts +var removeDuplicatesFromArray_exports = {}; +__export(removeDuplicatesFromArray_exports, { + default: () => removeDuplicatesFromArray_default +}); +function removeDuplicatesFromArray(arr) { + return [...new Set(arr)]; +} +var removeDuplicatesFromArray_default; +var init_removeDuplicatesFromArray = __esm({ + "src/util/removeDuplicatesFromArray.ts"() { + "use strict"; + removeDuplicatesFromArray_default = removeDuplicatesFromArray; + } +}); + +// src/util/ast.ts +var ast_exports = {}; +__export(ast_exports, { + default: () => ast_default +}); +function calleeToString(calleeNode) { + if (calleeNode.type === "Identifier") { + return calleeNode.name; + } + if (calleeNode.type === "MemberExpression") { + return `${calleeNode.object.name}.${calleeNode.property.name}`; + } +} +function isClassAttribute(node, classRegex) { + if (!node.name) { + return false; + } + let name2 = ""; + switch (node.type) { + case "TextAttribute": + name2 = node.name; + break; + case "JSXAttribute": + if (node.name.type === "JSXNamespacedName") { + const ns = node.name.namespace.name || ""; + name2 = (ns.length ? ns + ":" : "") + node.name.name.name; + } else { + name2 = node.name.name; + } + break; + default: + name2 = node.name.name; + } + return new RegExp(classRegex).test(name2); +} +function isVueClassAttribute(node, classRegex) { + const re = new RegExp(classRegex); + let name2 = ""; + switch (true) { + case (node.key && node.key.name && re.test(node.key.name)): + return true; + case (node.key && node.key.name && node.key.name.name && node.key.argument && node.key.argument.name && /^bind$/.test(node.key.name.name) && re.test(node.key.argument.name)): + return true; + default: + return false; + } +} +function isVLiteralValue(node) { + return node.value && node.value.type === "VLiteral"; +} +function isArrayExpression(node) { + return node.value && node.value.type === "VExpressionContainer" && node.value.expression && node.value.expression.type === "ArrayExpression"; +} +function isObjectExpression(node) { + return node.value && node.value.type === "VExpressionContainer" && node.value.expression && node.value.expression.type === "ObjectExpression"; +} +function isVueValidAttributeValue(node) { + switch (true) { + case isVLiteralValue(node): + // Simple string + case isArrayExpression(node): + // ['tw-unknown-class'] + case isObjectExpression(node): + return true; + default: + return false; + } +} +function isLiteralAttributeValue(node) { + if (node.type === "TextAttribute" && node.name === "class" && typeof node.value === "string") { + return true; + } + if (node.value) { + switch (node.value.type) { + case "Literal": + return !/\{|\?|\}/.test(node.value.value); + case "JSXExpressionContainer": + return node.value.expression.type === "Literal"; + } + } + return false; +} +function isValidJSXAttribute(node, classRegex) { + if (!isClassAttribute(node, classRegex)) { + return false; + } + if (!isLiteralAttributeValue(node)) { + return false; + } + return true; +} +function isValidVueAttribute(node, classRegex) { + if (!isVueClassAttribute(node, classRegex)) { + return false; + } + if (!isVueValidAttributeValue(node)) { + return false; + } + return true; +} +function extractRangeFromNode(node) { + if (node.type === "TextAttribute" && node.name === "class") { + return [node.valueSpan.fullStart.offset, node.valueSpan.end.offset]; + } + if (node.value === void 0) { + return [0, 0]; + } + switch (node.value.type) { + case "JSXExpressionContainer": + return node.value.expression.range; + default: + return node.value.range; + } +} +function extractValueFromNode(node) { + if (node.type === "TextAttribute" && node.name === "class") { + return node.value; + } + if (node.value === void 0) { + return node.value; + } + switch (node.value.type) { + case "JSXExpressionContainer": + return node.value.expression.value; + case "VExpressionContainer": + switch (node.value.expression.type) { + case "ArrayExpression": + return node.value.expression.elements; + case "ObjectExpression": + return node.value.expression.properties; + } + return node.value.expression.value; + default: + return node.value.value; + } +} +function extractClassnamesFromValue(classStr) { + if (typeof classStr !== "string") { + return { classNames: [], whitespaces: [], headSpace: false, tailSpace: false }; + } + let parts = classStr.split(separatorRegEx); + if (parts[0] === "") { + parts.shift(); + } + if (parts[parts.length - 1] === "") { + parts.pop(); + } + let headSpace = separatorRegEx.test(parts[0]); + let tailSpace = separatorRegEx.test(parts[parts.length - 1]); + const isClass = (_, i) => headSpace ? i % 2 !== 0 : i % 2 === 0; + const isNotClass = (_, i) => headSpace ? i % 2 === 0 : i % 2 !== 0; + let classNames = parts.filter(isClass); + let whitespaces = parts.filter(isNotClass); + return { classNames, whitespaces, headSpace, tailSpace }; +} +function parseNodeRecursive(rootNode, childNode, cb, skipConditional = false, isolate = false, ignoredKeys = []) { + let originalClassNamesValue; + let classNames; + if (childNode === null) { + originalClassNamesValue = extractValueFromNode(rootNode); + ({ classNames } = extractClassnamesFromValue(originalClassNamesValue)); + classNames = removeDuplicatesFromArray2(classNames); + if (classNames.length === 0) { + return; + } + cb(classNames, rootNode); + } else if (childNode === void 0) { + return; + } else { + const forceIsolation = skipConditional ? true : isolate; + let trim = false; + switch (childNode.type) { + case "TemplateLiteral": + childNode.expressions.forEach((exp) => { + parseNodeRecursive(rootNode, exp, cb, skipConditional, forceIsolation, ignoredKeys); + }); + childNode.quasis.forEach((quasis) => { + parseNodeRecursive(rootNode, quasis, cb, skipConditional, isolate, ignoredKeys); + }); + return; + case "ConditionalExpression": + parseNodeRecursive(rootNode, childNode.consequent, cb, skipConditional, forceIsolation, ignoredKeys); + parseNodeRecursive(rootNode, childNode.alternate, cb, skipConditional, forceIsolation, ignoredKeys); + return; + case "LogicalExpression": + parseNodeRecursive(rootNode, childNode.right, cb, skipConditional, forceIsolation, ignoredKeys); + return; + case "ArrayExpression": + childNode.elements.forEach((el) => { + parseNodeRecursive(rootNode, el, cb, skipConditional, forceIsolation, ignoredKeys); + }); + return; + case "ObjectExpression": + childNode.properties.forEach((prop) => { + const isUsedByClassNamesPlugin = rootNode.callee && rootNode.callee.name === "classnames" || rootNode.type === "VAttribute"; + if (prop.type === "SpreadElement") { + return; + } + if (prop.key.type === "Identifier" && ignoredKeys.includes(prop.key.name)) { + return; + } + parseNodeRecursive( + rootNode, + isUsedByClassNamesPlugin ? prop.key : prop.value, + cb, + skipConditional, + forceIsolation, + ignoredKeys + ); + }); + return; + case "Property": + parseNodeRecursive(rootNode, childNode.key, cb, skipConditional, forceIsolation, ignoredKeys); + return; + case "Literal": + trim = true; + originalClassNamesValue = childNode.value; + break; + case "TemplateElement": + originalClassNamesValue = childNode.value.raw; + break; + } + ({ classNames } = extractClassnamesFromValue(originalClassNamesValue)); + classNames = removeDuplicatesFromArray2(classNames); + if (classNames.length === 0) { + return; + } + const targetNode = isolate ? null : rootNode; + cb(classNames, targetNode); + } +} +function getTemplateElementPrefix(text, raw) { + const idx = text.indexOf(raw); + if (idx === 0) { + return ""; + } + return text.split(raw).shift(); +} +function getTemplateElementSuffix(text, raw) { + if (text.indexOf(raw) === -1) { + return ""; + } + return text.split(raw).pop(); +} +function getTemplateElementBody(text, prefix, suffix) { + let arr = text.split(prefix); + arr.shift(); + let body = arr.join(prefix); + arr = body.split(suffix); + arr.pop(); + return arr.join(suffix); +} +var removeDuplicatesFromArray2, ast_default; +var init_ast = __esm({ + "src/util/ast.ts"() { + "use strict"; + init_regex(); + removeDuplicatesFromArray2 = (init_removeDuplicatesFromArray(), __toCommonJS(removeDuplicatesFromArray_exports)); + ast_default = { + calleeToString, + extractRangeFromNode, + extractValueFromNode, + extractClassnamesFromValue, + isClassAttribute, + isLiteralAttributeValue, + isArrayExpression, + isObjectExpression, + isValidJSXAttribute, + isValidVueAttribute, + isVLiteralValue, + parseNodeRecursive, + getTemplateElementPrefix, + getTemplateElementSuffix, + getTemplateElementBody + }; + } +}); + +// src/util/customConfig.ts +var customConfig_exports = {}; +__export(customConfig_exports, { + default: () => customConfig_default +}); +import fs from "fs"; +import path from "path"; +import resolveConfig from "tailwindcss/resolveConfig"; +function requireUncached(module) { + delete __require.cache[__require.resolve(module)]; + if (twLoadConfig === null) { + return __require(module); + } else { + return twLoadConfig.loadConfig(module); + } +} +function loadConfig(config) { + let loadedConfig = null; + if (typeof config === "string") { + const resolvedPath = path.isAbsolute(config) ? config : path.join(path.resolve(), config); + try { + const stats = fs.statSync(resolvedPath); + const mtime = `${stats.mtime || ""}`; + if (stats === null) { + loadedConfig = {}; + } else if (lastModifiedDate !== mtime) { + lastModifiedDate = mtime; + loadedConfig = requireUncached(resolvedPath); + } else { + loadedConfig = null; + } + } catch (err) { + loadedConfig = {}; + } finally { + return loadedConfig; + } + } else { + if (typeof config === "object" && config !== null) { + return config; + } + return {}; + } +} +function convertConfigToString(config) { + switch (typeof config) { + case "string": + return config; + case "object": + return JSON.stringify(config); + default: + return config.toString(); + } +} +function resolve(twConfig) { + const newConfig = convertConfigToString(twConfig) !== convertConfigToString(previousConfig); + const now = Date.now(); + const expired = now - (lastCheck ?? 0) > CHECK_REFRESH_RATE; + if (newConfig || expired) { + previousConfig = twConfig; + lastCheck = now; + const userConfig = loadConfig(twConfig); + if (userConfig !== null) { + mergedConfig = resolveConfig(userConfig); + } + } + return mergedConfig; +} +var twLoadConfig, CHECK_REFRESH_RATE, previousConfig, lastCheck, mergedConfig, lastModifiedDate, customConfig_default; +var init_customConfig = __esm({ + "src/util/customConfig.ts"() { + "use strict"; + try { + twLoadConfig = __require("tailwindcss/lib/lib/load-config"); + } catch (err) { + twLoadConfig = null; + } + CHECK_REFRESH_RATE = 1e3; + previousConfig = null; + lastCheck = null; + mergedConfig = null; + lastModifiedDate = null; + customConfig_default = { + resolve + }; + } +}); + +// src/util/docsUrl.ts +var docsUrl_exports = {}; +__export(docsUrl_exports, { + default: () => docsUrl_default +}); +function docsUrl(ruleName) { + return `https://github.com/francoismassart/eslint-plugin-tailwindcss/tree/master/docs/rules/${ruleName}.md`; +} +var docsUrl_default; +var init_docsUrl = __esm({ + "src/util/docsUrl.ts"() { + "use strict"; + docsUrl_default = docsUrl; + } +}); + +// src/util/parser.ts +var parser_exports = {}; +__export(parser_exports, { + default: () => parser_default +}); +function defineTemplateBodyVisitor(context, templateBodyVisitor, scriptVisitor) { + const parserServices = getParserServices(context); + if (parserServices == null || parserServices.defineTemplateBodyVisitor == null) { + return scriptVisitor; + } + return parserServices.defineTemplateBodyVisitor(templateBodyVisitor, scriptVisitor); +} +function getParserServices(context) { + return context.sourceCode ? context.sourceCode.parserServices : context.parserServices; +} +var parser_default; +var init_parser = __esm({ + "src/util/parser.ts"() { + "use strict"; + parser_default = { + defineTemplateBodyVisitor + }; + } +}); + +// src/util/prettier/order.ts +function bigSign(bigIntValue) { + return (bigIntValue > 0n) - (bigIntValue < 0n); +} +function prefixCandidate(context, selector) { + let prefix = context.tailwindConfig.prefix; + return typeof prefix === "function" ? prefix(selector) : prefix + selector; +} +function getClassOrderPolyfill(classes, { env }) { + let parasiteUtilities = /* @__PURE__ */ new Set([prefixCandidate(env.context, "group"), prefixCandidate(env.context, "peer")]); + let classNamesWithOrder = []; + for (let className of classes) { + let order2 = env.generateRules(/* @__PURE__ */ new Set([className]), env.context).sort(([a], [z]) => bigSign(z - a))[0]?.[0] ?? null; + if (order2 === null && parasiteUtilities.has(className)) { + order2 = env.context.layerOrder.components; + } + classNamesWithOrder.push([className, order2]); + } + return classNamesWithOrder; +} +function sortClasses(classStr, { env, ignoreFirst = false, ignoreLast = false }) { + if (typeof classStr !== "string" || classStr === "") { + return classStr; + } + if (classStr.includes("{{")) { + return classStr; + } + let result = ""; + let parts = classStr.split(separatorRegEx); + let classes = parts.filter((_, i) => i % 2 === 0); + let whitespace = parts.filter((_, i) => i % 2 !== 0); + if (classes[classes.length - 1] === "") { + classes.pop(); + } + let prefix = ""; + if (ignoreFirst) { + prefix = `${classes.shift() ?? ""}${whitespace.shift() ?? ""}`; + } + let suffix = ""; + if (ignoreLast) { + suffix = `${whitespace.pop() ?? ""}${classes.pop() ?? ""}`; + } + let classNamesWithOrder = env.context.getClassOrder ? env.context.getClassOrder(classes) : getClassOrderPolyfill(classes, { env }); + classes = classNamesWithOrder.sort(([, a], [, z]) => { + if (a === z) return 0; + if (a === null) return -1; + if (z === null) return 1; + return bigSign(a - z); + }).map(([className]) => className); + for (let i = 0; i < classes.length; i++) { + result += `${classes[i]}${whitespace[i] ?? ""}`; + } + return prefix + result + suffix; +} +function order(unordered, context) { + const sorted = sortClasses(unordered.join(" "), { env: { context } }); + return sorted; +} +var order_default; +var init_order = __esm({ + "src/util/prettier/order.ts"() { + "use strict"; + init_regex(); + order_default = order; + } +}); + +// src/util/removeDuplicatesFromClassnamesAndWhitespaces.ts +function removeDuplicatesFromClassnamesAndWhitespaces(orderedClassNames, whitespaces, headSpace, tailSpace) { + let previous = orderedClassNames[0]; + const offset = !headSpace && !tailSpace || tailSpace ? -1 : 0; + for (let i = 1; i < orderedClassNames.length; i++) { + const cls = orderedClassNames[i]; + if (cls === previous) { + orderedClassNames.splice(i, 1); + whitespaces.splice(i + offset, 1); + i--; + } + previous = cls; + } +} +var removeDuplicatesFromClassnamesAndWhitespaces_default; +var init_removeDuplicatesFromClassnamesAndWhitespaces = __esm({ + "src/util/removeDuplicatesFromClassnamesAndWhitespaces.ts"() { + "use strict"; + removeDuplicatesFromClassnamesAndWhitespaces_default = removeDuplicatesFromClassnamesAndWhitespaces; + } +}); + +// src/util/settings.ts +var settings_exports = {}; +__export(settings_exports, { + default: () => settings_default +}); +function getOption(context, name2) { + const options = context.options[0] || {}; + if (options[name2] != void 0) { + return options[name2]; + } + if (context.settings && context.settings.tailwindcss && context.settings.tailwindcss[name2] != void 0) { + return context.settings.tailwindcss[name2]; + } + switch (name2) { + case "callees": + return ["classnames", "clsx", "ctl", "cva", "tv"]; + case "ignoredKeys": + return ["compoundVariants", "defaultVariants"]; + case "classRegex": + return "^class(Name)?$"; + case "config": + if (resolveDefaultConfigPathAlias === null) { + return "tailwind.config.js"; + } else { + return resolveDefaultConfigPathAlias(); + } + case "cssFiles": + return ["**/*.css", "!**/node_modules", "!**/.*", "!**/dist", "!**/build"]; + case "cssFilesRefreshRate": + return 5e3; + case "removeDuplicates": + return true; + case "skipClassAttribute": + return false; + case "tags": + return []; + case "whitelist": + return []; + } +} +var resolveDefaultConfigPathAlias, settings_default; +var init_settings = __esm({ + "src/util/settings.ts"() { + "use strict"; + try { + const { resolveDefaultConfigPath } = __require("tailwindcss/lib/util/resolveConfigPath"); + resolveDefaultConfigPathAlias = resolveDefaultConfigPath; + } catch (err) { + resolveDefaultConfigPathAlias = null; + } + settings_default = getOption; + } +}); + +// src/rules/classnames-order.ts +var createContextFallback, INVALID_CLASSNAMES_ORDER_MSG, contextFallbackCache, classnames_order_default; +var init_classnames_order = __esm({ + "src/rules/classnames-order.ts"() { + "use strict"; + init_ast(); + init_customConfig(); + init_docsUrl(); + init_parser(); + init_order(); + init_removeDuplicatesFromClassnamesAndWhitespaces(); + init_settings(); + createContextFallback = __require("tailwindcss/lib/lib/setupContextUtils").createContext; + INVALID_CLASSNAMES_ORDER_MSG = "Invalid Tailwind CSS classnames order"; + contextFallbackCache = /* @__PURE__ */ new WeakMap(); + classnames_order_default = { + meta: { + docs: { + description: "Enforce a consistent and logical order of the Tailwind CSS classnames", + category: "Stylistic Issues", + recommended: false, + url: docsUrl_default("classnames-order") + }, + messages: { + invalidOrder: INVALID_CLASSNAMES_ORDER_MSG + }, + fixable: "code", + schema: [ + { + type: "object", + properties: { + callees: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + ignoredKeys: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + config: { + // returned from `loadConfig()` utility + type: ["string", "object"] + }, + removeDuplicates: { + // default: true, + type: "boolean" + }, + tags: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + } + } + } + ] + }, + create: function(context) { + const callees = settings_default(context, "callees"); + const skipClassAttribute = settings_default(context, "skipClassAttribute"); + const tags = settings_default(context, "tags"); + const twConfig = settings_default(context, "config"); + const classRegex = settings_default(context, "classRegex"); + const removeDuplicates = settings_default(context, "removeDuplicates"); + const mergedConfig2 = customConfig_default.resolve(twConfig); + const contextFallback = ( + // Set the created contextFallback in the cache if it does not exist yet. + (contextFallbackCache.has(mergedConfig2) ? contextFallbackCache : contextFallbackCache.set(mergedConfig2, createContextFallback(mergedConfig2))).get(mergedConfig2) + ); + const sortNodeArgumentValue = (node, arg = null) => { + let originalClassNamesValue = null; + let start = null; + let end = null; + let prefix = ""; + let suffix = ""; + if (arg === null) { + originalClassNamesValue = ast_default.extractValueFromNode(node); + const range = ast_default.extractRangeFromNode(node); + if (node.type === "TextAttribute") { + start = range[0]; + end = range[1]; + } else { + start = range[0] + 1; + end = range[1] - 1; + } + } else { + switch (arg.type) { + case "Identifier": + return; + case "TemplateLiteral": + arg.expressions.forEach((exp) => { + sortNodeArgumentValue(node, exp); + }); + arg.quasis.forEach((quasis) => { + sortNodeArgumentValue(node, quasis); + }); + return; + case "ConditionalExpression": + sortNodeArgumentValue(node, arg.consequent); + sortNodeArgumentValue(node, arg.alternate); + return; + case "LogicalExpression": + sortNodeArgumentValue(node, arg.right); + return; + case "ArrayExpression": + arg.elements.forEach((el) => { + sortNodeArgumentValue(node, el); + }); + return; + case "ObjectExpression": + const isUsedByClassNamesPlugin = node.callee && node.callee.name === "classnames"; + const isVue = node.key && node.key.type === "VDirectiveKey"; + arg.properties.forEach((prop) => { + const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value; + sortNodeArgumentValue(node, propVal); + }); + return; + case "Property": + sortNodeArgumentValue(node, arg.key); + break; + case "Literal": + originalClassNamesValue = arg.value; + start = arg.range[0] + 1; + end = arg.range[1] - 1; + break; + case "TemplateElement": + originalClassNamesValue = arg.value.raw; + if (originalClassNamesValue === "") { + return; + } + start = arg.range[0]; + end = arg.range[1]; + const txt = context.getSourceCode().getText(arg); + prefix = ast_default.getTemplateElementPrefix(txt, originalClassNamesValue); + suffix = ast_default.getTemplateElementSuffix(txt, originalClassNamesValue); + originalClassNamesValue = ast_default.getTemplateElementBody(txt, prefix, suffix); + break; + } + } + let { classNames, whitespaces, headSpace, tailSpace } = ast_default.extractClassnamesFromValue(originalClassNamesValue); + if (classNames.length <= 1) { + return; + } + let orderedClassNames = order_default(classNames, contextFallback).split(" "); + if (removeDuplicates) { + removeDuplicatesFromClassnamesAndWhitespaces_default(orderedClassNames, whitespaces, headSpace, tailSpace); + } + let validatedClassNamesValue = ""; + for (let i = 0; i < orderedClassNames.length; i++) { + const w = whitespaces[i] ?? ""; + const cls = orderedClassNames[i]; + validatedClassNamesValue += headSpace ? `${w}${cls}` : `${cls}${w}`; + if (headSpace && tailSpace && i === orderedClassNames.length - 1) { + validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? ""; + } + } + if (originalClassNamesValue !== validatedClassNamesValue) { + validatedClassNamesValue = prefix + validatedClassNamesValue + suffix; + context.report({ + node, + messageId: "invalidOrder", + fix: function(fixer) { + return fixer.replaceTextRange([start, end], validatedClassNamesValue); + } + }); + } + }; + const attributeVisitor = function(node) { + if (!ast_default.isClassAttribute(node, classRegex) || skipClassAttribute) { + return; + } + if (ast_default.isLiteralAttributeValue(node)) { + sortNodeArgumentValue(node); + } else if (node.value && node.value.type === "JSXExpressionContainer") { + sortNodeArgumentValue(node, node.value.expression); + } + }; + const callExpressionVisitor = function(node) { + const calleeStr = ast_default.calleeToString(node.callee); + if (callees.findIndex((name2) => calleeStr === name2) === -1) { + return; + } + node.arguments.forEach((arg) => { + sortNodeArgumentValue(node, arg); + }); + }; + const scriptVisitor = { + JSXAttribute: attributeVisitor, + TextAttribute: attributeVisitor, + CallExpression: callExpressionVisitor, + TaggedTemplateExpression: function(node) { + if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { + return; + } + sortNodeArgumentValue(node, node.quasi); + } + }; + const templateVisitor = { + CallExpression: callExpressionVisitor, + /* + Tagged templates inside data bindings + https://github.com/vuejs/vue/issues/9721 + */ + VAttribute: function(node) { + switch (true) { + case !ast_default.isValidVueAttribute(node, classRegex): + return; + case ast_default.isVLiteralValue(node): + sortNodeArgumentValue(node, null); + break; + case ast_default.isArrayExpression(node): + node.value.expression.elements.forEach((arg) => { + sortNodeArgumentValue(node, arg); + }); + break; + case ast_default.isObjectExpression(node): + node.value.expression.properties.forEach((prop) => { + sortNodeArgumentValue(node, prop); + }); + break; + } + } + }; + return parser_default.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); + } + }; + } +}); + +// src/util/types/angle.ts +var units, mergedAngleValues, angle_default; +var init_angle = __esm({ + "src/util/types/angle.ts"() { + "use strict"; + units = ["deg", "grad", "rad", "turn"]; + mergedAngleValues = [ + `\\-?(\\d{1,}(\\.\\d{1,})?|\\.\\d{1,})(${units.join("|")})`, + `calc\\(.{1,}\\)`, + `var\\(\\-\\-[A-Za-z\\-]{1,}\\)` + ]; + angle_default = { + mergedAngleValues + }; + } +}); + +// src/util/types/color.ts +var cssNamedColors, hexRGBA, RGBIntegers, RGBPercentages, supportedRGBA, RGBAPercentages, optionalColorPrefixedVar, mandatoryColorPrefixed, notHSLAPlusWildcard, supportedHSL, colorValues, mergedColorValues, color_default; +var init_color = __esm({ + "src/util/types/color.ts"() { + "use strict"; + cssNamedColors = [ + "indianred", + "lightcoral", + "salmon", + "darksalmon", + "lightsalmon", + "crimson", + "red", + "firebrick", + "darkred", + "pink", + "lightpink", + "hotpink", + "deeppink", + "mediumvioletred", + "palevioletred", + "coral", + "tomato", + "orangered", + "darkorange", + "orange", + "gold", + "yellow", + "lightyellow", + "lemonchiffon", + "lightgoldenrodyellow", + "papayawhip", + "moccasin", + "peachpuff", + "palegoldenrod", + "khaki", + "darkkhaki", + "lavender", + "thistle", + "plum", + "violet", + "orchid", + "fuchsia", + "magenta", + "mediumorchid", + "mediumpurple", + "blueviolet", + "darkviolet", + "darkorchid", + "darkmagenta", + "purple", + "rebeccapurple", + "indigo", + "mediumslateblue", + "slateblue", + "darkslateblue", + "greenyellow", + "chartreuse", + "lawngreen", + "lime", + "limegreen", + "palegreen", + "lightgreen", + "mediumspringgreen", + "springgreen", + "mediumseagreen", + "seagreen", + "forestgreen", + "green", + "darkgreen", + "yellowgreen", + "olivedrab", + "olive", + "darkolivegreen", + "mediumaquamarine", + "darkseagreen", + "lightseagreen", + "darkcyan", + "teal", + "aqua", + "cyan", + "lightcyan", + "paleturquoise", + "aquamarine", + "turquoise", + "mediumturquoise", + "darkturquoise", + "cadetblue", + "steelblue", + "lightsteelblue", + "powderblue", + "lightblue", + "skyblue", + "lightskyblue", + "deepskyblue", + "dodgerblue", + "cornflowerblue", + "royalblue", + "blue", + "mediumblue", + "darkblue", + "navy", + "midnightblue", + "cornsilk", + "blanchedalmond", + "bisque", + "navajowhite", + "wheat", + "burlywood", + "tan", + "rosybrown", + "sandybrown", + "goldenrod", + "darkgoldenrod", + "peru", + "chocolate", + "saddlebrown", + "sienna", + "brown", + "maroon", + "white", + "snow", + "honeydew", + "mintcream", + "azure", + "aliceblue", + "ghostwhite", + "whitesmoke", + "seashell", + "beige", + "oldlace", + "floralwhite", + "ivory", + "antiquewhite", + "linen", + "lavenderblush", + "mistyrose", + "gainsboro", + "lightgray", + "lightgrey", + "silver", + "darkgray", + "darkgrey", + "gray", + "grey", + "dimgray", + "dimgrey", + "lightslategray", + "lightslategrey", + "slategray", + "slategrey", + "darkslategray", + "darkslategrey", + "black", + "transparent", + "currentColor" + ]; + hexRGBA = "\\#(([0-9A-Fa-f]{8})|([0-9A-Fa-f]{6})|([0-9A-Fa-f]{4})|([0-9A-Fa-f]{3}))"; + RGBIntegers = "rgb\\(\\d{1,3}\\,\\d{1,3}\\,\\d{1,3}\\)"; + RGBPercentages = "rgb\\(\\d{1,3}%\\,\\d{1,3}%\\,\\d{1,3}%\\)"; + supportedRGBA = "rgba\\(\\d{1,3}\\,\\d{1,3}\\,\\d{1,3}\\,\\d*(\\.\\d*)?%?\\)"; + RGBAPercentages = "rgba\\(\\d{1,3}%\\,\\d{1,3}%\\,\\d{1,3}%\\,\\d*(\\.\\d*)?%?\\)"; + optionalColorPrefixedVar = "(color\\:)?var\\(\\-\\-[A-Za-z\\-]{1,}\\)"; + mandatoryColorPrefixed = "color\\:(?!(hsla\\()).{1,}"; + notHSLAPlusWildcard = "(?!(hsla\\()).{1,}"; + supportedHSL = "hsl\\(\\d{1,3}%?\\,\\d{1,3}%?\\,\\d{1,3}%?\\)"; + colorValues = [hexRGBA, RGBIntegers, RGBPercentages, supportedRGBA, supportedHSL]; + mergedColorValues = [...cssNamedColors, ...colorValues]; + color_default = { + cssNamedColors, + colorValues, + mergedColorValues, + RGBAPercentages, + optionalColorPrefixedVar, + mandatoryColorPrefixed, + notHSLAPlusWildcard + }; + } +}); + +// src/util/types/length.ts +var fontUnits, viewportUnits, absoluteUnits, perInchUnits, otherUnits, mergedUnits, selectedUnits, absoluteValues, relativeValues, globalValues, mergedValues, mergedLengthValues, mergedUnitsRegEx, selectedUnitsRegEx, anyCalcRegEx, validZeroRegEx, length_default; +var init_length = __esm({ + "src/util/types/length.ts"() { + "use strict"; + init_removeDuplicatesFromArray(); + fontUnits = ["cap", "ch", "em", "ex", "ic", "lh", "rem", "rlh"]; + viewportUnits = ["vb", "vh", "vi", "vw", "vmin", "vmax"]; + absoluteUnits = ["px", "mm", "cm", "in", "pt", "pc"]; + perInchUnits = ["lin", "pt", "mm"]; + otherUnits = ["%"]; + mergedUnits = removeDuplicatesFromArray_default([ + ...fontUnits, + ...viewportUnits, + ...absoluteUnits, + ...perInchUnits, + ...otherUnits + ]); + selectedUnits = mergedUnits.filter((el) => { + return !["cap", "ic", "vb", "vi"].includes(el); + }); + absoluteValues = ["0", "xx\\-small", "x\\-small", "small", "medium", "large", "x\\-large", "xx\\-large"]; + relativeValues = ["larger", "smaller"]; + globalValues = ["inherit", "initial", "unset"]; + mergedValues = [...absoluteValues, ...relativeValues, ...globalValues]; + mergedLengthValues = [`\\-?\\d*\\.?\\d*(${mergedUnits.join("|")})`, ...mergedValues]; + mergedLengthValues.push("length\\:var\\(\\-\\-[a-z\\-]{1,}\\)"); + mergedUnitsRegEx = `\\[(\\d{1,}(\\.\\d{1,})?|(\\.\\d{1,})?)(${mergedUnits.join("|")})\\]`; + selectedUnitsRegEx = `\\[(\\d{1,}(\\.\\d{1,})?|(\\.\\d{1,})?)(${selectedUnits.join("|")})\\]`; + anyCalcRegEx = `\\[calc\\(.{1,}\\)\\]`; + validZeroRegEx = `^(0(\\.0{1,})?|\\.0{1,})(${mergedUnits.join("|")})?$`; + length_default = { + anyCalcRegEx, + mergedLengthValues, + mergedUnits, + mergedUnitsRegEx, + mergedValues, + selectedUnits, + selectedUnitsRegEx, + validZeroRegEx + }; + } +}); + +// src/util/groupMethods.ts +var groupMethods_exports = {}; +__export(groupMethods_exports, { + default: () => groupMethods_default +}); +function escapeSpecialChars(str) { + return str.replace(/\W/g, "\\$&"); +} +function generateOptionalOpacitySuffix(config) { + const opacityKeys = !config.theme["opacity"] ? [] : Object.keys(config.theme["opacity"]); + opacityKeys.push("\\[(\\d*\\.?\\d*)%?\\]"); + return `(\\/(${opacityKeys.join("|")}))?`; +} +function generateOptions(propName, keys, config, isNegative = false) { + const opacitySuffixes = generateOptionalOpacitySuffix(config); + const genericArbitraryOption = "\\[(.*)\\]"; + const defaultKeyIndex = keys.findIndex((v) => v === "DEFAULT"); + if (defaultKeyIndex > -1) { + keys.splice(defaultKeyIndex, 1); + } + const escapedKeys = keys.map((k) => escapeSpecialChars(k)); + switch (propName) { + case "dark": + if (config.darkMode === "class") { + return "dark"; + } else if (Array.isArray(config.darkMode) && config.darkMode.length === 2 && config.darkMode[0] === "class") { + let value = ""; + const res = /^\.(?[A-Z0-9\:\-\_\[\d\]]*)$/gi.exec(config.darkMode[1]); + if (res && res.groups) { + if (res.groups.classnameValue) { + value = res.groups.classnameValue; + } + } + return value; + } else { + return ""; + } + case "arbitraryProperties": + escapedKeys.push(genericArbitraryOption); + return "(" + escapedKeys.join("|") + ")"; + case "colors": + case "accentColor": + case "borderColor": + case "boxShadowColor": + case "divideColor": + case "fill": + case "outlineColor": + case "textColor": + case "stroke": + case "gradientColorStopPositions": + const options = []; + keys.forEach((k) => { + const color = config.theme[propName][k] || config.theme.colors[k]; + if (typeof color === "string") { + options.push(escapeSpecialChars(k) + opacitySuffixes); + } else { + const variants = Object.keys(color).map((colorKey) => escapeSpecialChars(colorKey)); + const defaultIndex = variants.findIndex((v) => v === "DEFAULT"); + const hasDefault = defaultIndex > -1; + if (hasDefault) { + variants.splice(defaultIndex, 1); + } + options.push(k + "(\\-(" + variants.join("|") + "))" + (hasDefault ? "?" : "") + opacitySuffixes); + } + }); + const arbitraryColors = [...color_default.mergedColorValues]; + switch (propName) { + case "fill": + arbitraryColors.push(`(?!(angle|length|list):).{1,}`); + break; + case "gradientColorStopPositions": + arbitraryColors.push(color_default.RGBAPercentages); + arbitraryColors.push(color_default.optionalColorPrefixedVar); + arbitraryColors.push(color_default.notHSLAPlusWildcard); + break; + case "textColor": + arbitraryColors.push(color_default.RGBAPercentages); + arbitraryColors.push(color_default.mandatoryColorPrefixed); + break; + default: + arbitraryColors.push(color_default.mandatoryColorPrefixed); + } + options.push(`\\[(${arbitraryColors.join("|")})\\]`); + return "(" + options.join("|") + ")"; + case "borderSpacing": + case "borderWidth": + case "divideWidth": + case "fontSize": + case "outlineWidth": + case "outlineOffset": + case "ringWidth": + case "ringOffsetWidth": + case "textUnderlineOffset": + escapedKeys.push(length_default.selectedUnitsRegEx); + escapedKeys.push(length_default.anyCalcRegEx); + escapedKeys.push(`\\[length\\:.{1,}\\]`); + return "(" + escapedKeys.join("|") + ")"; + case "strokeWidth": + escapedKeys.push(length_default.selectedUnitsRegEx); + escapedKeys.push(length_default.anyCalcRegEx); + escapedKeys.push(`\\[length\\:calc\\(.{1,}\\)\\]`); + escapedKeys.push(`\\[length\\:(.{1,})(${length_default.selectedUnits.join("|")})?\\]`); + return "(" + escapedKeys.join("|") + ")"; + case "gap": + case "height": + case "lineHeight": + case "maxHeight": + case "size": + case "maxWidth": + case "minHeight": + case "minWidth": + case "padding": + case "width": + case "blur": + case "brightness": + case "contrast": + case "grayscale": + case "invert": + case "saturate": + case "sepia": + case "backdropBlur": + case "backdropBrightness": + case "backdropContrast": + case "backdropGrayscale": + case "backdropInvert": + case "backdropOpacity": + case "backdropSaturate": + case "backdropSepia": + case "transitionDuration": + case "transitionTimingFunction": + case "transitionDelay": + case "animation": + case "transformOrigin": + case "scale": + case "cursor": + escapedKeys.push(length_default.mergedUnitsRegEx); + escapedKeys.push(`\\[(?!(angle|color|length|list):).{1,}\\]`); + return "(" + escapedKeys.join("|") + ")"; + case "backdropHueRotate": + case "hueRotate": + case "inset": + case "letterSpacing": + case "margin": + case "scrollMargin": + case "skew": + case "space": + case "textIndent": + case "translate": + escapedKeys.push(length_default.mergedUnitsRegEx); + escapedKeys.push(`\\[(?!(angle|color|length|list):).{1,}\\]`); + return "(" + escapedKeys.join("|") + ")"; + case "backgroundOpacity": + case "borderOpacity": + case "opacity": + case "ringOpacity": + escapedKeys.push(`\\[(0(\\.\\d{1,})?|\\.\\d{1,}|1)\\]`); + escapedKeys.push(length_default.anyCalcRegEx); + escapedKeys.push(`\\[var\\(\\-\\-[A-Za-z\\-]{1,}\\)\\]`); + return "(" + escapedKeys.join("|") + ")"; + case "rotate": + escapedKeys.push(`\\[(${angle_default.mergedAngleValues.join("|")})\\]`); + return "(" + escapedKeys.join("|") + ")"; + case "gridTemplateColumns": + case "gridColumn": + case "gridColumnStart": + case "gridColumnEnd": + case "gridTemplateRows": + case "gridRow": + case "gridRowStart": + case "gridRowEnd": + case "gridAutoColumns": + case "gridAutoRows": + escapedKeys.push(`\\[(?!(angle|color|length):).{1,}\\]`); + return "(" + escapedKeys.join("|") + ")"; + case "listStyleType": + escapedKeys.push(`\\[(?!(angle|color|length|list):).{1,}\\]`); + return "(" + escapedKeys.join("|") + ")"; + case "objectPosition": + escapedKeys.push(`\\[(?!(angle|color|length):).{1,}\\]`); + return "(" + escapedKeys.join("|") + ")"; + case "backgroundPosition": + case "boxShadow": + case "dropShadow": + case "transitionProperty": + escapedKeys.push(`\\[(?!((angle|color|length|list):)|#|var\\().{1,}\\]`); + return "(" + escapedKeys.join("|") + ")"; + case "backgroundSize": + escapedKeys.push(`\\[length:.{1,}\\]`); + return "(" + escapedKeys.join("|") + ")"; + case "backgroundImageUrl": + escapedKeys.push(`.{1,}`); + return "(" + escapedKeys.join("|") + ")"; + case "backgroundImage": + escapedKeys.push(`\\[url\\(.{1,}\\)\\]`); + return "(" + escapedKeys.join("|") + ")"; + case "order": + case "zIndex": + escapedKeys.push(genericArbitraryOption); + return "(" + escapedKeys.join("|") + ")"; + case "fontWeight": + case "typography": + case "lineClamp": + return "(" + escapedKeys.join("|") + ")"; + case "aspectRatio": + case "flexGrow": + case "flexShrink": + case "fontFamily": + case "flex": + case "borderRadius": + default: + escapedKeys.push(genericArbitraryOption); + return "(" + escapedKeys.join("|") + ")"; + } +} +function patchRegex(re, config) { + if (!cachedRegexes.has(config)) { + cachedRegexes.set(config, {}); + } + const cache = cachedRegexes.get(config); + if (re in cache) { + return cache[re]; + } + let patched = "\\!?"; + if (config.prefix.length) { + patched += escapeSpecialChars(config.prefix); + } + let replaced = re; + const propsRe = /\$\{(\-?[a-z]*)\}/gi; + const res = replaced.matchAll(propsRe); + const resArray = [...res]; + const props = resArray.map((arr) => arr[1]); + if (props.length === 0) { + return cache[re] = `${patched}(${replaced})`; + } + props.forEach((prop) => { + const token = new RegExp("\\$\\{" + prop + "\\}"); + const isNegative = prop.substr(0, 1) === "-"; + const absoluteProp = isNegative ? prop.substr(1) : prop; + if (prop === "dark") { + replaced = replaced.replace(token, generateOptions(absoluteProp, [], config, isNegative)); + return `${patched}(${replaced})`; + } else if (prop === "arbitraryProperties") { + replaced = replaced.replace( + new RegExp("\\$\\{" + absoluteProp + "\\}"), + generateOptions(absoluteProp, [], config, isNegative) + ); + return `${patched}(${replaced})`; + } else if (prop === "backgroundImageUrl") { + replaced = replaced.replace(new RegExp("\\$\\{" + prop + "\\}"), generateOptions(prop, [], config, false)); + return `${patched}(${replaced})`; + } else if (!config.theme || !config.theme[absoluteProp]) { + return; + } + const keys = Object.keys(config.theme[absoluteProp]).filter((key) => { + if (isNegative) { + const val = config.theme[absoluteProp][key]; + const isCalc = typeof val === "string" && val.indexOf("calc") === 0; + const num = parseFloat(val); + if (isCalc) { + return true; + } + if (isNaN(num)) { + return false; + } + } else if (key[0] === "-") { + return false; + } + return true; + }).map((key) => { + if (isNegative && key[0] === "-") { + return key.substring(1); + } + return key; + }); + if (keys.length === 0 || replaced.match(token) === null) { + return; + } + const opts = generateOptions(absoluteProp, keys, config, isNegative); + replaced = replaced.replace(token, opts); + }); + return cache[re] = `${patched}(${replaced})`; +} +function getGroups(groupsConfig, twConfig = null) { + const groups2 = []; + groupsConfig.forEach((group) => { + group.members.forEach((prop) => { + if (typeof prop.members === "string") { + groups2.push(prop.members); + } else { + prop.members.forEach((subprop) => { + groups2.push(subprop.members); + }); + } + }); + }); + if (twConfig === null) { + return groups2; + } + return groups2.map((re) => patchRegex(re, twConfig)); +} +function initGroupSlots(groups2) { + const slots = []; + groups2.forEach((g) => slots.push([])); + return slots; +} +function getGroupIndex(name2, arr, separator = ":") { + const classSuffix = getSuffix(name2, separator); + let idx = arr.findIndex((pattern) => { + const classRe = new RegExp(`^(${pattern})$`); + return classRe.test(classSuffix); + }, classSuffix); + return idx; +} +function getGroupConfigKeys(groupsConfig) { + const groups2 = []; + groupsConfig.forEach((group) => { + group.members.forEach((prop) => { + if (typeof prop.members === "string") { + groups2.push(prop.configKey ? prop.configKey : null); + } else { + prop.members.forEach((subprop) => { + groups2.push(subprop.configKey ? subprop.configKey : null); + }); + } + }); + }); + return groups2; +} +function getPrefix(name2, separator) { + const rootSeparator = String.raw`(? findInGroup(name2, v, config, group.type)); + if (!innerGroup) { + return null; + } else { + return findInGroup(name2, innerGroup, config, group.type); + } + } +} +function parseClassname(name2, arr, config, index = null) { + const leadingRe = new RegExp("^(?\\s*)"); + const trailingRe = new RegExp("(?\\s*)$"); + let leading = ""; + let core = ""; + let trailing = ""; + const leadingRes = leadingRe.exec(name2); + if (leadingRes && leadingRes.groups) { + leading = leadingRes.groups.leading || ""; + } + const trailingRes = trailingRe.exec(name2); + if (trailingRes && trailingRes.groups) { + trailing = trailingRes.groups.trailing || ""; + } + core = name2.substring(leading.length, name2.length - trailing.length); + const variants = getPrefix(core, config.separator); + const classSuffix = getSuffix(core, config.separator); + let slot = null; + arr.forEach((group) => { + if (slot === null) { + const found = findInGroup(classSuffix, group, config); + if (found) { + slot = found; + } + } + }); + const value = slot ? slot.value : ""; + const isNegative = value[0] === "-"; + const off = isNegative ? 1 : 0; + const body = core.substr(0, core.length - value.length + off).substr(variants.length + off); + return { + index, + name: core, + variants, + parentType: slot ? slot.group : "", + body, + value, + shorthand: slot && slot.shorthand ? slot.shorthand : "", + leading, + trailing, + important: body.substr(0, 1) === "!" + }; +} +var cachedRegexes, groupMethods_default; +var init_groupMethods = __esm({ + "src/util/groupMethods.ts"() { + "use strict"; + init_angle(); + init_color(); + init_length(); + cachedRegexes = /* @__PURE__ */ new WeakMap(); + groupMethods_default = { + initGroupSlots, + getArbitraryProperty, + getGroups, + getGroupIndex, + getGroupConfigKeys, + getPrefix, + getSuffix, + parseClassname + }; + } +}); + +// src/rules/enforces-negative-arbitrary-values.ts +var NEGATIVE_ARBITRARY_VALUE, enforces_negative_arbitrary_values_default; +var init_enforces_negative_arbitrary_values = __esm({ + "src/rules/enforces-negative-arbitrary-values.ts"() { + "use strict"; + init_ast(); + init_customConfig(); + init_docsUrl(); + init_groupMethods(); + init_parser(); + init_settings(); + NEGATIVE_ARBITRARY_VALUE = `Arbitrary value classname '{{classname}}' should not start with a dash (-)`; + enforces_negative_arbitrary_values_default = { + meta: { + docs: { + description: "Warns about dash prefixed classnames using arbitrary values", + category: "Best Practices", + recommended: true, + url: docsUrl_default("enforces-negative-arbitrary-values") + }, + messages: { + negativeArbitraryValue: NEGATIVE_ARBITRARY_VALUE + }, + fixable: null, + schema: [ + { + type: "object", + properties: { + callees: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + ignoredKeys: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + config: { + // returned from `loadConfig()` utility + type: ["string", "object"] + }, + tags: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + } + } + } + ] + }, + create: function(context) { + const callees = settings_default(context, "callees"); + const skipClassAttribute = settings_default(context, "skipClassAttribute"); + const tags = settings_default(context, "tags"); + const twConfig = settings_default(context, "config"); + const classRegex = settings_default(context, "classRegex"); + const mergedConfig2 = customConfig_default.resolve(twConfig); + const parseForNegativeArbitraryClassNames = (node, arg = null) => { + let originalClassNamesValue = null; + if (arg === null) { + originalClassNamesValue = ast_default.extractValueFromNode(node); + } else { + switch (arg.type) { + case "Identifier": + return; + case "TemplateLiteral": + arg.expressions.forEach((exp) => { + parseForNegativeArbitraryClassNames(node, exp); + }); + arg.quasis.forEach((quasis) => { + parseForNegativeArbitraryClassNames(node, quasis); + }); + return; + case "ConditionalExpression": + parseForNegativeArbitraryClassNames(node, arg.consequent); + parseForNegativeArbitraryClassNames(node, arg.alternate); + return; + case "LogicalExpression": + parseForNegativeArbitraryClassNames(node, arg.right); + return; + case "ArrayExpression": + arg.elements.forEach((el) => { + parseForNegativeArbitraryClassNames(node, el); + }); + return; + case "ObjectExpression": + const isUsedByClassNamesPlugin = node.callee && node.callee.name === "classnames"; + const isVue = node.key && node.key.type === "VDirectiveKey"; + arg.properties.forEach((prop) => { + const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value; + parseForNegativeArbitraryClassNames(node, propVal); + }); + return; + case "Property": + parseForNegativeArbitraryClassNames(node, arg.key); + return; + case "Literal": + originalClassNamesValue = arg.value; + break; + case "TemplateElement": + originalClassNamesValue = arg.value.raw; + if (originalClassNamesValue === "") { + return; + } + break; + } + } + let { classNames } = ast_default.extractClassnamesFromValue(originalClassNamesValue); + const detected = classNames.filter((cls) => { + const suffix = groupMethods_default.getSuffix(cls, mergedConfig2.separator); + const negArbitraryValRegEx = /^\-((inset|scale)(\-(y|x))?|top|right|bottom|left|top|z|order|(scroll\-)?m(y|x|t|r|l|b)?|(skew|space|translate)\-(y|x)|rotate|tracking|indent|(backdrop\-)?hue\-rotate)\-\[.*\]$/i; + return negArbitraryValRegEx.test(suffix); + }); + detected.forEach((className) => { + context.report({ + node, + messageId: "negativeArbitraryValue", + data: { + classname: className + } + }); + }); + }; + const attributeVisitor = function(node) { + if (!ast_default.isClassAttribute(node, classRegex) || skipClassAttribute) { + return; + } + if (ast_default.isLiteralAttributeValue(node)) { + parseForNegativeArbitraryClassNames(node); + } else if (node.value && node.value.type === "JSXExpressionContainer") { + parseForNegativeArbitraryClassNames(node, node.value.expression); + } + }; + const callExpressionVisitor = function(node) { + const calleeStr = ast_default.calleeToString(node.callee); + if (callees.findIndex((name2) => calleeStr === name2) === -1) { + return; + } + node.arguments.forEach((arg) => { + parseForNegativeArbitraryClassNames(node, arg); + }); + }; + const scriptVisitor = { + JSXAttribute: attributeVisitor, + TextAttribute: attributeVisitor, + CallExpression: callExpressionVisitor, + TaggedTemplateExpression: function(node) { + if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { + return; + } + parseForNegativeArbitraryClassNames(node, node.quasi); + } + }; + const templateVisitor = { + CallExpression: callExpressionVisitor, + /* + Tagged templates inside data bindings + https://github.com/vuejs/vue/issues/9721 + */ + VAttribute: function(node) { + switch (true) { + case !ast_default.isValidVueAttribute(node, classRegex): + return; + case ast_default.isVLiteralValue(node): + parseForNegativeArbitraryClassNames(node); + break; + case ast_default.isArrayExpression(node): + node.value.expression.elements.forEach((arg) => { + parseForNegativeArbitraryClassNames(node, arg); + }); + break; + case ast_default.isObjectExpression(node): + node.value.expression.properties.forEach((prop) => { + parseForNegativeArbitraryClassNames(node, prop); + }); + break; + } + } + }; + return parser_default.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); + } + }; + } +}); + +// src/configs/groups.ts +var groups; +var init_groups = __esm({ + "src/configs/groups.ts"() { + "use strict"; + groups = [ + { + type: "Core Concepts", + members: [ + { + type: "Hover, Focus, & Other States", + members: [ + { + type: "group", + members: "group" + }, + { + type: "peer", + members: "peer" + } + ] + }, + { + type: "Dark Mode", + members: "${dark}" + }, + { + type: "Arbitrary properties", + members: "${arbitraryProperties}" + } + ] + }, + { + type: "Layout", + members: [ + { + type: "Aspect Ratio", + members: "aspect\\-(?${aspectRatio})", + configKey: "aspectRatio" + }, + { + type: "Container", + members: "container" + }, + { + type: "Columns", + members: "columns\\-(?${columns})", + configKey: "columns" + }, + { + type: "Break After", + members: "break\\-after\\-(?auto|avoid|all|avoid\\-page|page|left|right|column)" + }, + { + type: "Break Before", + members: "break\\-before\\-(?auto|avoid|all|avoid\\-page|page|left|right|column)" + }, + { + type: "Break Inside", + members: "break\\-inside\\-(?auto|avoid|avoid\\-page|avoid\\-column)" + }, + { + type: "Box Decoration Break", + members: "box\\-decoration\\-(?clone|slice)" + }, + { + type: "Deprecated Box Decoration Break", + members: "decoration\\-(?clone|slice)", + deprecated: true + }, + { + type: "Box Sizing", + members: "box\\-(?border|content)" + }, + { + type: "Display", + members: "block|flex|grid|flow\\-root|contents|hidden|inline(\\-(block|flex|table|grid))?|table\\-(column|footer|header|row)\\-group|table(\\-(caption|row|cell|column))?|list\\-item" + }, + { + type: "Floats", + members: "float\\-(?right|left|none)" + }, + { + type: "Clear", + members: "clear\\-(?left|right|both|none)" + }, + { + type: "Isolation", + members: "(isolate|isolation\\-auto)" + }, + { + type: "Object Fit", + members: "object\\-(?contain|cover|fill|none|scale\\-down)" + }, + { + type: "Object Position", + members: "object\\-(?${objectPosition})", + configKey: "objectPosition" + }, + { + type: "Overflow", + members: [ + { + type: "overflow", + members: "overflow\\-(?auto|hidden|clip|visible|scroll)", + shorthand: "all", + body: "overflow" + }, + { + type: "overflow-x", + members: "overflow\\-x\\-(?auto|hidden|clip|visible|scroll)", + shorthand: "x", + body: "overflow-x" + }, + { + type: "overflow-y", + members: "overflow\\-y\\-(?auto|hidden|clip|visible|scroll)", + shorthand: "y", + body: "overflow-y" + } + ] + }, + { + type: "Overscroll Behavior", + members: [ + { + type: "overscroll", + members: "overscroll\\-(?auto|contain|none)", + shorthand: "all", + body: "overscroll" + }, + { + type: "overscroll-x", + members: "overscroll\\-x\\-(?auto|contain|none)", + shorthand: "x", + body: "overscroll-x" + }, + { + type: "overscroll-y", + members: "overscroll\\-y\\-(?auto|contain|none)", + shorthand: "y", + body: "overscroll-y" + } + ] + }, + { + type: "Position", + members: "static|fixed|absolute|relative|sticky" + }, + { + type: "Top / Right / Bottom / Left", + members: [ + { + type: "inset", + members: "(inset\\-(?${inset})|\\-inset\\-(?${-inset}))", + shorthand: "all", + body: "inset", + configKey: "inset" + }, + { + type: "inset-y", + members: "(inset\\-y\\-(?${inset})|\\-inset\\-y\\-(?${-inset}))", + shorthand: "y", + body: "inset-y", + configKey: "inset" + }, + { + type: "inset-x", + members: "(inset\\-x\\-(?${inset})|\\-inset\\-x\\-(?${-inset}))", + shorthand: "x", + body: "inset-x", + configKey: "inset" + }, + { + type: "top", + members: "(top\\-(?${inset})|\\-top\\-(?${-inset}))", + shorthand: "t", + body: "top", + configKey: "inset" + }, + { + type: "right", + members: "(right\\-(?${inset})|\\-right\\-(?${-inset}))", + shorthand: "r", + body: "right", + configKey: "inset" + }, + { + type: "bottom", + members: "(bottom\\-(?${inset})|\\-bottom\\-(?${-inset}))", + shorthand: "b", + body: "bottom", + configKey: "inset" + }, + { + type: "left", + members: "(left\\-(?${inset})|\\-left\\-(?${-inset}))", + shorthand: "l", + body: "left", + configKey: "inset" + } + ] + }, + { + type: "Visibility", + members: "(in)?visible|collapse" + }, + { + type: "Z-Index", + members: "(z\\-(?${zIndex})|\\-z\\-(?${-zIndex}))", + configKey: "zIndex" + } + ] + }, + { + type: "Flexbox & Grid", + members: [ + { + type: "Flex Basis", + members: "basis\\-(?${flexBasis})", + configKey: "flexBasis" + }, + { + type: "Flex Direction", + members: "flex\\-(row|col)(\\-reverse)?" + }, + { + type: "Flex Wrap", + members: "flex\\-(wrap(\\-reverse)?|nowrap)" + }, + { + type: "Flex", + members: "flex\\-(?${flex})", + configKey: "flex" + }, + { + type: "Flex Grow", + members: "grow(\\-(?${flexGrow}))?", + configKey: "flexGrow" + }, + { + type: "Deprecated Flex Grow", + members: "flex\\-grow(\\-(?${flexGrow}))?", + deprecated: true, + configKey: "flexGrow" + }, + { + type: "Flex Shrink", + members: "shrink(\\-(?${flexShrink}))?", + configKey: "flexShrink" + }, + { + type: "Deprecated Flex Shrink", + members: "flex\\-shrink(\\-(?${flexShrink}))?", + deprecated: true, + configKey: "flexShrink" + }, + { + type: "Order", + members: "(order\\-(?${order})|\\-order\\-(?${-order}))", + configKey: "order" + }, + { + type: "Grid Template Columns", + members: "grid\\-cols\\-(?${gridTemplateColumns})", + configKey: "gridTemplateColumns" + }, + { + type: "Grid Column Start / End", + members: [ + { + type: "grid-column", + members: "col\\-(?${gridColumn})", + configKey: "gridColumn" + }, + { + type: "grid-column-start", + members: "col\\-start\\-(?${gridColumnStart})", + configKey: "gridColumnStart" + }, + { + type: "grid-column-end", + members: "col\\-end\\-(?${gridColumnEnd})", + configKey: "gridColumnEnd" + } + ] + }, + { + type: "Grid Template Rows", + members: "grid\\-rows\\-(?${gridTemplateRows})", + configKey: "gridTemplateRows" + }, + { + type: "Grid Row Start / End", + members: [ + { + type: "grid-row", + members: "row\\-(?${gridRow})", + configKey: "gridRow" + }, + { + type: "grid-row-start", + members: "row\\-start\\-(?${gridRowStart})", + configKey: "gridRowStart" + }, + { + type: "grid-row-end", + members: "row\\-end\\-(?${gridRowEnd})", + configKey: "gridRowEnd" + } + ] + }, + { + type: "Grid Auto Flow", + members: "grid\\-flow\\-(dense|(row|col)(\\-dense)?)" + }, + { + type: "Grid Auto Columns", + members: "auto\\-cols\\-(?${gridAutoColumns})", + configKey: "gridAutoColumns" + }, + { + type: "Grid Auto Rows", + members: "auto\\-rows\\-(?${gridAutoRows})", + configKey: "gridAutoRows" + }, + { + type: "Gap", + members: [ + { + type: "gap", + members: "gap\\-(?${gap})", + shorthand: "all", + body: "gap", + configKey: "gap" + }, + { + type: "column-gap", + members: "gap\\-x\\-(?${gap})", + shorthand: "x", + body: "gap-x", + configKey: "gap" + }, + { + type: "row-gap", + members: "gap\\-y\\-(?${gap})", + shorthand: "y", + body: "gap-y", + configKey: "gap" + } + ] + }, + { + type: "Justify Content", + members: "justify\\-(start|end|center|between|around|evenly)" + }, + { + type: "Justify Items", + members: "justify\\-items\\-(start|end|center|stretch)" + }, + { + type: "Justify Self", + members: "justify\\-self\\-(auto|start|end|center|stretch)" + }, + { + type: "Align Content", + members: "content\\-(center|start|end|between|around|evenly|baseline)" + }, + { + type: "Align Items", + members: "items\\-(start|end|center|baseline|stretch)" + }, + { + type: "Align Self", + members: "self\\-(auto|start|end|center|stretch|baseline)" + }, + { + type: "Place Content", + members: "place\\-content\\-(center|start|end|between|around|evenly|stretch|baseline)" + }, + { + type: "Place Items", + members: "place\\-items\\-(start|end|center|stretch|baseline)" + }, + { + type: "Place Self", + members: "place\\-self\\-(auto|start|end|center|stretch)" + } + ] + }, + { + type: "Spacing", + members: [ + { + type: "Padding", + members: [ + { + type: "p", + members: "p\\-(?${padding})", + shorthand: "all", + body: "p", + configKey: "padding" + }, + { + type: "py", + members: "py\\-(?${padding})", + shorthand: "y", + body: "py", + configKey: "padding" + }, + { + type: "px", + members: "px\\-(?${padding})", + shorthand: "x", + body: "px", + configKey: "padding" + }, + { + type: "pt", + members: "pt\\-(?${padding})", + shorthand: "t", + body: "pt", + configKey: "padding" + }, + { + type: "pr", + members: "pr\\-(?${padding})", + shorthand: "r", + body: "pr", + configKey: "padding" + }, + { + type: "pb", + members: "pb\\-(?${padding})", + shorthand: "b", + body: "pb", + configKey: "padding" + }, + { + type: "pl", + members: "pl\\-(?${padding})", + shorthand: "l", + body: "pl", + configKey: "padding" + } + ] + }, + { + type: "Margin", + members: [ + { + type: "m", + members: "(m\\-(?${margin})|\\-m\\-(?${-margin}))", + shorthand: "all", + body: "m", + configKey: "margin" + }, + { + type: "my", + members: "(my\\-(?${margin})|\\-my\\-(?${-margin}))", + shorthand: "y", + body: "my", + configKey: "margin" + }, + { + type: "mx", + members: "(mx\\-(?${margin})|\\-mx\\-(?${-margin}))", + shorthand: "x", + body: "mx", + configKey: "margin" + }, + { + type: "mt", + members: "(mt\\-(?${margin})|\\-mt\\-(?${-margin}))", + shorthand: "t", + body: "mt", + configKey: "margin" + }, + { + type: "mr", + members: "(mr\\-(?${margin})|\\-mr\\-(?${-margin}))", + shorthand: "r", + body: "mr", + configKey: "margin" + }, + { + type: "mb", + members: "(mb\\-(?${margin})|\\-mb\\-(?${-margin}))", + shorthand: "b", + body: "mb", + configKey: "margin" + }, + { + type: "ml", + members: "(ml\\-(?${margin})|\\-ml\\-(?${-margin}))", + shorthand: "l", + body: "ml", + configKey: "margin" + } + ] + }, + { + type: "Space Between", + members: [ + { + type: "space-y", + members: "(space\\-y\\-(?${space})|\\-space\\-y\\-(?${-space}))", + configKey: "space" + }, + { + type: "space-x", + members: "(space\\-x\\-(?${space})|\\-space\\-x\\-(?${-space}))", + configKey: "space" + }, + { + type: "space-y-reverse", + members: "space\\-y\\-reverse" + }, + { + type: "space-x-reverse", + members: "space\\-x\\-reverse" + } + ] + } + ] + }, + { + type: "Sizing", + members: [ + { + type: "Width", + members: "w\\-(?${width})", + configKey: "width" + }, + { + type: "Min-Width", + members: "min\\-w\\-(?${minWidth})", + configKey: "minWidth" + }, + { + type: "Max-Width", + members: "max\\-w\\-(?${maxWidth})", + configKey: "maxWidth" + }, + { + type: "Height", + members: "h\\-(?${height})", + configKey: "height" + }, + { + type: "Min-Height", + members: "min\\-h\\-(?${minHeight})", + configKey: "minHeight" + }, + { + type: "Max-Height", + members: "max\\-h\\-(?${maxHeight})", + configKey: "maxHeight" + }, + { + type: "Size", + members: "size\\-(?${size})", + configKey: "size" + } + ] + }, + { + type: "Typography", + members: [ + { + type: "Font Family", + members: "font\\-(?${fontFamily})", + configKey: "fontFamily" + }, + { + type: "Font Size", + members: "text\\-(?${fontSize})", + configKey: "fontSize" + }, + { + type: "Font Smoothing", + members: "(subpixel\\-)?antialiased" + }, + { + type: "Font Style", + members: "(not\\-)?italic" + }, + { + type: "Font Weight", + members: "font\\-(?${fontWeight})", + configKey: "fontWeight" + }, + { + type: "Font Variant Numeric", + members: [ + { + type: "Normal Nums", + members: "normal\\-nums" + }, + { + type: "Ordinal", + members: "ordinal" + }, + { + type: "Slashed Zero", + members: "slashed-zero" + }, + { + type: "Style Nums", + members: "(lining|oldstyle)\\-nums" + }, + { + type: "Proportinal or Tabular", + members: "(proportional|tabular)\\-nums" + }, + { + type: "Fractions", + members: "(diagonal|stacked)\\-fractions" + } + ] + }, + { + type: "Letter Spacing", + members: "(tracking\\-(?${letterSpacing})|\\-tracking\\-(?${-letterSpacing}))", + configKey: "letterSpacing" + }, + // { + // type: 'Line Clamp', + // members: 'line\\-clamp\\-(?${lineClamp})', + // configKey: 'lineClamp', + // }, + { + type: "Line Height", + members: "leading\\-(?${lineHeight})", + configKey: "lineHeight" + }, + // { + // type: 'List Style Image', + // members: 'list\\-image\\-(?${listStyleImage})', + // configKey: 'listStyleImage', + // }, + { + type: "List Style Type", + members: "list\\-(?${listStyleType})", + configKey: "listStyleType" + }, + { + type: "List Style Position", + members: "list\\-(in|out)side" + }, + { + type: "Text Alignment", + members: "text\\-(left|center|right|justify|start|end)" + }, + { + type: "Text Color", + members: "text\\-(?${textColor})", + configKey: "colors" + }, + { + type: "Text Decoration", + members: "(no\\-)?underline|overline|line\\-through" + }, + { + type: "Text Decoration Color", + members: "decoration\\-(?${colors})", + configKey: "colors" + }, + { + type: "Text Decoration Style", + members: "decoration\\-(solid|double|dotted|dashed|wavy)" + }, + { + type: "Text Decoration Thickness", + members: "decoration\\-(?${textDecorationThickness})", + configKey: "textDecorationThickness" + }, + { + type: "Text Underline Offset", + members: "underline\\-offset\\-(?${textUnderlineOffset})", + configKey: "textUnderlineOffset" + }, + { + type: "Text Transform", + members: "(upper|lower|normal\\-)case|capitalize" + }, + { + type: "Text Overflow", + members: "truncate|text\\-(ellipsis|clip)" + }, + { + type: "Deprecated Text Overflow", + members: "overflow\\-(ellipsis|clip)", + deprecated: true + }, + { + type: "Text Wrap", + members: "text\\-(wrap|nowrap|balance|pretty)" + }, + { + type: "Text Indent", + members: "(indent\\-(?${textIndent})|\\-indent\\-(?${-textIndent}))", + configKey: "textIndent" + }, + { + type: "Vertical Alignment", + members: "align\\-(baseline|top|middle|bottom|text\\-(top|bottom)|sub|super)" + }, + { + type: "Whitespace", + members: "whitespace\\-(normal|nowrap|pre(\\-(line|wrap))?)" + }, + { + type: "Word Break", + members: "break\\-(normal|words|all|keep)" + }, + { + type: "Content", + members: "content\\-(?${content})", + configKey: "content" + } + ] + }, + { + type: "Backgrounds", + members: [ + { + type: "Background Image URL", + members: "bg\\-\\[(image\\:|url\\()(?${backgroundImageUrl})\\)\\]" + }, + { + type: "Background Attachment", + members: "bg\\-(fixed|local|scroll)" + }, + { + type: "Background Clip", + members: "bg\\-clip\\-(border|padding|content|text)" + }, + { + type: "Background Color", + members: "bg\\-(?${colors})", + configKey: "colors" + }, + { + type: "Deprecated Background Opacity", + members: "bg\\-opacity\\-(?${backgroundOpacity})", + deprecated: true + }, + { + type: "Background Origin", + members: "bg\\-origin\\-(border|padding|content)" + }, + { + type: "Background Position", + members: "bg\\-(?${backgroundPosition})", + configKey: "backgroundPosition" + }, + { + type: "Background Repeat", + members: "bg\\-(no\\-repeat|repeat(\\-(x|y|round|space))?)" + }, + { + type: "Background Size", + members: "bg\\-(?${backgroundSize})", + configKey: "backgroundSize" + }, + { + type: "Background Image", + members: "bg\\-(?${backgroundImage})", + configKey: "backgroundImage" + }, + { + type: "Gradient Color Stops", + members: [ + { + type: "from", + members: "from\\-(?${gradientColorStopPositions})", + configKey: "gradientColorStopPositions" + }, + { + type: "via", + members: "via\\-(?${gradientColorStopPositions})", + configKey: "gradientColorStopPositions" + }, + { + type: "to", + members: "to\\-(?${gradientColorStopPositions})", + configKey: "gradientColorStopPositions" + } + ] + } + ] + }, + { + type: "Borders", + members: [ + { + type: "Border Radius", + members: [ + { + type: "border-radius", + members: "rounded(\\-(?${borderRadius}))?", + shorthand: "all", + body: "rounded", + configKey: "borderRadius" + }, + { + type: "border-radius-top", + members: "rounded\\-t(\\-(?${borderRadius}))?", + shorthand: "t", + body: "rounded-t", + configKey: "borderRadius" + }, + { + type: "border-radius-right", + members: "rounded\\-r(\\-(?${borderRadius}))?", + shorthand: "r", + body: "rounded-r", + configKey: "borderRadius" + }, + { + type: "border-radius-bottom", + members: "rounded\\-b(\\-(?${borderRadius}))?", + shorthand: "b", + body: "rounded-b", + configKey: "borderRadius" + }, + { + type: "border-radius-left", + members: "rounded\\-l(\\-(?${borderRadius}))?", + shorthand: "l", + body: "rounded-l", + configKey: "borderRadius" + }, + { + type: "border-radius-top-left", + members: "rounded\\-tl(\\-(?${borderRadius}))?", + shorthand: "tl", + body: "rounded-tl", + configKey: "borderRadius" + }, + { + type: "border-radius-top-right", + members: "rounded\\-tr(\\-(?${borderRadius}))?", + shorthand: "tr", + body: "rounded-tr", + configKey: "borderRadius" + }, + { + type: "border-radius-bottom-right", + members: "rounded\\-br(\\-(?${borderRadius}))?", + shorthand: "br", + body: "rounded-br", + configKey: "borderRadius" + }, + { + type: "border-radius-bottom-left", + members: "rounded\\-bl(\\-(?${borderRadius}))?", + shorthand: "bl", + body: "rounded-bl", + configKey: "borderRadius" + } + ] + }, + { + type: "Border Width", + members: [ + { + type: "border-width", + members: "border(\\-(?${borderWidth}))?", + shorthand: "all", + body: "border", + configKey: "borderWidth" + }, + { + type: "border-y-width", + members: "border\\-y(\\-(?${borderWidth}))?", + shorthand: "y", + body: "border-y", + configKey: "borderWidth" + }, + { + type: "border-x-width", + members: "border\\-x(\\-(?${borderWidth}))?", + shorthand: "x", + body: "border-x", + configKey: "borderWidth" + }, + { + type: "border-top-width", + members: "border\\-t(\\-(?${borderWidth}))?", + shorthand: "t", + body: "border-t", + configKey: "borderWidth" + }, + { + type: "border-right-width", + members: "border\\-r(\\-(?${borderWidth}))?", + shorthand: "r", + body: "border-r", + configKey: "borderWidth" + }, + { + type: "border-bottom-width", + members: "border\\-b(\\-(?${borderWidth}))?", + shorthand: "b", + body: "border-b", + configKey: "borderWidth" + }, + { + type: "border-left-width", + members: "border\\-l(\\-(?${borderWidth}))?", + shorthand: "l", + body: "border-l", + configKey: "borderWidth" + } + ] + }, + { + type: "Border Color", + members: [ + { + type: "border-color", + members: "border\\-(?${borderColor})", + shorthand: "all", + body: "border", + configKey: "borderColor" + }, + { + type: "border-y-color", + members: "border\\-y\\-(?${borderColor})", + shorthand: "y", + body: "border-y", + configKey: "borderColor" + }, + { + type: "border-x-color", + members: "border\\-x\\-(?${borderColor})", + shorthand: "x", + body: "border-x", + configKey: "borderColor" + }, + { + type: "border-top-color", + members: "border\\-t\\-(?${borderColor})", + shorthand: "t", + body: "border-t", + configKey: "borderColor" + }, + { + type: "border-right-color", + members: "border\\-r\\-(?${borderColor})", + shorthand: "r", + body: "border-r", + configKey: "borderColor" + }, + { + type: "border-bottom-color", + members: "border\\-b\\-(?${borderColor})", + shorthand: "b", + body: "border-b", + configKey: "borderColor" + }, + { + type: "border-left-color", + members: "border\\-l\\-(?${borderColor})", + shorthand: "l", + body: "border-l", + configKey: "borderColor" + } + ] + }, + { + type: "Deprecated Border Opacity", + members: "border\\-opacity\\-(?${borderOpacity})", + deprecated: true, + configKey: "borderOpacity" + }, + { + type: "Border Style", + members: "border\\-(solid|dashed|dotted|double|hidden|none)" + }, + { + type: "Divide Width", + members: [ + { + type: "divide-y", + members: "divide\\-y(\\-(?${divideWidth}))?", + configKey: "divideWidth" + }, + { + type: "divide-x", + members: "divide\\-x(\\-(?${divideWidth}))?", + configKey: "divideWidth" + }, + { + type: "divide-y-reverse", + members: "divide\\-y\\-reverse" + }, + { + type: "divide-x-reverse", + members: "divide\\-x\\-reverse" + } + ] + }, + { + type: "Divide Color", + members: "divide\\-(?${divideColor})", + configKey: "divideColor" + }, + { + type: "Divide Style", + members: "divide\\-(solid|dashed|dotted|double|none)" + }, + { + type: "Outline Width", + members: "outline\\-(?${outlineWidth})", + configKey: "outlineWidth" + }, + { + type: "Outline Color", + members: "outline\\-(?${outlineColor})", + configKey: "outlineColor" + }, + { + type: "Outline Style", + members: "outline(\\-(none|dashed|dotted|double|hidden))?" + }, + { + type: "Outline Offset", + members: "(outline\\-offset\\-(?${outlineOffset})|\\-outline\\-offset\\-(?${-outlineOffset}))", + configKey: "outlineOffset" + }, + { + type: "Ring Width", + members: [ + { + type: "ring", + members: "ring(\\-(?${ringWidth}))?", + configKey: "ringWidth" + } + ] + }, + { + type: "Ring Inset", + members: [ + { + type: "ring-inset", + members: "ring\\-inset" + } + ] + }, + { + type: "Ring Color", + members: "ring\\-(?${colors})", + configKey: "colors" + }, + { + type: "Deprecated Ring Opacity", + members: "ring\\-opacity\\-(?${ringOpacity})", + deprecated: true, + configKey: "ringOpacity" + }, + { + type: "Ring Offset Width", + members: "ring\\-offset\\-(?${ringOffsetWidth})", + configKey: "ringOffsetWidth" + }, + { + type: "Ring Offset Color", + members: "ring\\-offset\\-(?${colors})", + configKey: "colors" + } + ] + }, + { + type: "Effects", + members: [ + { + type: "Box Shadow", + members: "shadow(\\-(?${boxShadow}))?", + configKey: "boxShadow" + }, + { + type: "Box Shadow Color", + members: "shadow(\\-(?${boxShadowColor}))?", + configKey: "boxShadowColor" + }, + { + type: "Opacity", + members: "opacity\\-(?${opacity})", + configKey: "opacity" + }, + { + type: "Mix Blend Mode", + members: "mix\\-blend\\-(normal|multiply|screen|overlay|darken|lighten|color\\-(burn|dodge)|(hard|soft)\\-light|difference|exclusion|hue|saturation|color|luminosity|plus\\-lighter)" + }, + { + type: "Background Blend Mode", + members: "bg\\-blend\\-(normal|multiply|screen|overlay|darken|lighten|color\\-(dodge|burn)|(hard|soft)\\-light|difference|exclusion|hue|saturation|color|luminosity)" + } + ] + }, + { + type: "Filters", + members: [ + { + type: "Deprecated Filter", + members: "filter", + deprecated: true + }, + { + type: "Blur", + members: "blur(\\-(?${blur}))?", + configKey: "blur" + }, + { + type: "Brightness", + members: "brightness\\-(?${brightness})", + configKey: "brightness" + }, + { + type: "Contrast", + members: "contrast\\-(?${contrast})", + configKey: "contrast" + }, + { + type: "Drop Shadow", + members: "drop\\-shadow(\\-(?${dropShadow}))?", + configKey: "dropShadow" + }, + { + type: "Grayscale", + members: "grayscale(\\-(?${grayscale}))?", + configKey: "grayscale" + }, + { + type: "Hue Rotate", + members: "hue\\-rotate\\-(?${hueRotate})|\\-hue\\-rotate\\-(?${-hueRotate})", + configKey: "hueRotate" + }, + { + type: "Invert", + members: "invert(\\-(?${invert}))?", + configKey: "invert" + }, + { + type: "Saturate", + members: "saturate\\-(?${saturate})", + configKey: "saturate" + }, + { + type: "Sepia", + members: "sepia(\\-(?${sepia}))?", + configKey: "sepia" + }, + { + type: "Backdrop Blur", + members: "backdrop\\-blur(\\-(?${backdropBlur}))?", + configKey: "backdropBlur" + }, + { + type: "Backdrop Brightness", + members: "backdrop\\-brightness\\-(?${backdropBrightness})", + configKey: "backdropBrightness" + }, + { + type: "Backdrop Contrast", + members: "backdrop\\-contrast\\-(?${backdropContrast})", + configKey: "backdropContrast" + }, + { + type: "Backdrop Grayscale", + members: "backdrop\\-grayscale(\\-(?${backdropGrayscale}))?", + configKey: "backdropGrayscale" + }, + { + type: "Backdrop Hue Rotate", + members: "backdrop\\-hue\\-rotate\\-(?${backdropHueRotate})|\\-backdrop\\-hue\\-rotate\\-(?${-backdropHueRotate})", + configKey: "backdropHueRotate" + }, + { + type: "Backdrop Invert", + members: "backdrop\\-invert(\\-(?${backdropInvert}))?", + configKey: "backdropInvert" + }, + { + type: "Backdrop Opacity", + members: "backdrop\\-opacity\\-(?${backdropOpacity})", + configKey: "backdropOpacity" + }, + { + type: "Backdrop Saturate", + members: "backdrop\\-saturate\\-(?${backdropSaturate})", + configKey: "backdropSaturate" + }, + { + type: "Backdrop Sepia", + members: "backdrop\\-sepia(\\-(?${backdropSepia}))?", + configKey: "backdropSepia" + } + ] + }, + { + type: "Tables", + members: [ + { + type: "Border Collapse", + members: "border\\-(collapse|separate)" + }, + { + type: "Border Spacing", + members: [ + { + type: "border-spacing", + members: "border\\-spacing\\-(?${borderSpacing})", + shorthand: "all", + body: "border-spacing", + configKey: "borderSpacing" + }, + { + type: "border-spacing-x", + members: "border\\-spacing\\-x\\-(?${borderSpacing})", + shorthand: "x", + body: "border-spacing-x", + configKey: "borderSpacing" + }, + { + type: "border-spacing-y", + members: "border\\-spacing\\-y\\-(?${borderSpacing})", + shorthand: "y", + body: "border-spacing-y", + configKey: "borderSpacing" + } + ] + }, + { + type: "Table Layout", + members: "table\\-(auto|fixed)" + } + ] + }, + { + type: "Transitions & Animation", + members: [ + { + type: "Transition Property", + members: "transition(\\-(?${transitionProperty}))?", + configKey: "transitionProperty" + }, + { + type: "Transition Duration", + members: "duration(\\-(?${transitionDuration}))?", + configKey: "transitionDuration" + }, + { + type: "Transition Timing Function", + members: "ease(\\-(?${transitionTimingFunction}))?", + configKey: "transitionTimingFunction" + }, + { + type: "Transition Delay", + members: "delay\\-(?${transitionDelay})", + configKey: "transitionDelay" + }, + { + type: "Animation", + members: "animate\\-(?${animation})", + configKey: "animation" + } + ] + }, + { + type: "Transforms", + members: [ + { + type: "Transform GPU", + members: [ + { + type: "transform-gpu", + members: "transform\\-gpu" + } + ] + }, + { + type: "Transform None", + members: [ + { + type: "transform-none", + members: "transform\\-none" + } + ] + }, + { + type: "Deprecated Transform", + members: [ + { + type: "transform", + members: "transform", + deprecated: true + } + ] + }, + { + type: "Scale", + members: [ + { + type: "scale", + members: "scale\\-(?${scale})|\\-scale\\-(?${-scale})", + shorthand: "all", + body: "scale", + configKey: "scale" + }, + { + type: "scale-y", + members: "scale\\-y\\-(?${scale})|\\-scale\\-y\\-(?${-scale})", + shorthand: "y", + body: "scale-y", + configKey: "scale" + }, + { + type: "scale-x", + members: "scale\\-x\\-(?${scale})|\\-scale\\-x\\-(?${-scale})", + shorthand: "x", + body: "scale-x", + configKey: "scale" + } + ] + }, + { + type: "Rotate", + members: "(rotate\\-(?${rotate})|\\-rotate\\-(?${-rotate}))", + configKey: "rotate" + }, + { + type: "Translate", + members: [ + { + type: "translate-x", + members: "(translate\\-x\\-(?${translate})|\\-translate\\-x\\-(?${-translate}))", + configKey: "translate" + }, + { + type: "translate-y", + members: "(translate\\-y\\-(?${translate})|\\-translate\\-y\\-(?${-translate}))", + configKey: "translate" + } + ] + }, + { + type: "Skew", + members: [ + { + type: "skew-x", + members: "(skew\\-x\\-(?${skew})|\\-skew\\-x\\-(?${-skew}))", + configKey: "skew" + }, + { + type: "skew-y", + members: "(skew\\-y\\-(?${skew})|\\-skew\\-y\\-(?${-skew}))", + configKey: "skew" + } + ] + }, + { + type: "Transform Origin", + members: "origin\\-(?${transformOrigin})", + configKey: "transformOrigin" + } + ] + }, + { + type: "Interactivity", + members: [ + { + type: "Accent Color", + members: "accent\\-(?${accentColor})", + configKey: "accentColor" + }, + { + type: "Appearance", + members: "appearance\\-none" + }, + { + type: "Cursor", + members: "cursor\\-(?${cursor})", + configKey: "cursor" + }, + { + type: "Caret Color", + members: "caret\\-(?${colors})", + configKey: "colors" + }, + { + type: "Pointer Events", + members: "pointer\\-events\\-(none|auto)" + }, + { + type: "Resize", + members: "resize(\\-(none|x|y))?" + }, + { + type: "Scroll Behavior", + members: "scroll\\-(auto|smooth)" + }, + { + type: "Scroll Margin", + members: "scroll\\-(?${scrollMargin})", + configKey: "scrollMargin", + members: [ + { + type: "scroll-m", + members: "scroll-m\\-(?${scrollMargin})|\\-scroll-m\\-(?${-scrollMargin})", + configKey: "scrollMargin" + }, + { + type: "scroll-my", + members: "scroll-my\\-(?${scrollMargin})|\\-scroll-my\\-(?${-scrollMargin})", + configKey: "scrollMargin" + }, + { + type: "scroll-mx", + members: "scroll-mx\\-(?${scrollMargin})|\\-scroll-mx\\-(?${-scrollMargin})", + configKey: "scrollMargin" + }, + { + type: "scroll-mt", + members: "scroll-mt\\-(?${scrollMargin})|\\-scroll-mt\\-(?${-scrollMargin})", + configKey: "scrollMargin" + }, + { + type: "scroll-mr", + members: "scroll-mr\\-(?${scrollMargin})|\\-scroll-mr\\-(?${-scrollMargin})", + configKey: "scrollMargin" + }, + { + type: "scroll-mb", + members: "scroll-mb\\-(?${scrollMargin})|\\-scroll-mb\\-(?${-scrollMargin})", + configKey: "scrollMargin" + }, + { + type: "scroll-ml", + members: "scroll-ml\\-(?${scrollMargin})|\\-scroll-ml\\-(?${-scrollMargin})", + configKey: "scrollMargin" + } + ] + }, + { + type: "Scroll Padding", + members: "scroll\\-(?${scrollPadding})", + configKey: "scrollPadding", + members: [ + { + type: "scroll-p", + members: "scroll-p\\-(?${scrollPadding})", + configKey: "scrollPadding" + }, + { + type: "scroll-py", + members: "scroll-py\\-(?${scrollPadding})", + configKey: "scrollPadding" + }, + { + type: "scroll-px", + members: "scroll-px\\-(?${scrollPadding})", + configKey: "scrollPadding" + }, + { + type: "scroll-pt", + members: "scroll-pt\\-(?${scrollPadding})", + configKey: "scrollPadding" + }, + { + type: "scroll-pr", + members: "scroll-pr\\-(?${scrollPadding})", + configKey: "scrollPadding" + }, + { + type: "scroll-pb", + members: "scroll-pb\\-(?${scrollPadding})", + configKey: "scrollPadding" + }, + { + type: "scroll-pl", + members: "scroll-pl\\-(?${scrollPadding})", + configKey: "scrollPadding" + } + ] + }, + { + type: "Scroll Snap Align", + members: "snap\\-(start|end|center|align-none)" + }, + { + type: "Scroll Snap Stop", + members: "snap\\-(normal|always)" + }, + { + type: "Scroll Snap Type", + members: "snap\\-(none|x|y|both)" + }, + { + type: "Scroll Snap Type Strictness", + members: "snap\\-(mandatory|proximity)" + }, + { + type: "Touch Action", + members: [ + { + type: "Touch Action Mode", + members: "touch\\-(auto|none|manipulation)" + }, + { + type: "Touch Action X", + members: "touch\\-(pan\\-(x|left|right))" + }, + { + type: "Touch Action Y", + members: "touch\\-(pan\\-(y|up|down))" + }, + { + type: "Touch Action Pinch Zoom", + members: "touch\\-pinch\\-zoom" + } + ] + }, + { + type: "User Select", + members: "select\\-(none|text|all|auto)" + }, + { + type: "Will Change", + members: "will\\-change\\-(?${willChange})", + configKey: "willChange" + } + ] + }, + { + type: "SVG", + members: [ + { + type: "Fill", + members: "fill\\-(?${fill})", + configKey: "fill" + }, + { + type: "Stroke", + members: "stroke\\-(?${stroke})", + configKey: "stroke" + }, + { + type: "Stroke Width", + members: "stroke\\-(?${strokeWidth})", + configKey: "strokeWidth" + } + ] + }, + { + type: "Accessibility", + members: [ + { + type: "Screen Readers", + members: "(not\\-)?sr\\-only" + }, + { + type: "Forced Color Adjust", + members: "forced\\-color\\-adjust\\-(auto|none)" + } + ] + }, + { + type: "Official Plugins", + members: [ + { + // TODO: + // Support for custom prose classname like on + // https://tailwindcss.com/docs/typography-plugin#changing-the-default-class-name + // Adding custom color themes + // https://tailwindcss.com/docs/typography-plugin#adding-custom-color-themes + type: "Typography", + members: [ + { + type: "prose", + members: "(not\\-)?prose" + }, + { + type: "Prose Gray Scale", + members: "prose\\-(gray|slate|zinc|neutral|stone)" + }, + { + type: "Prose Type Scale", + members: "prose\\-(sm|base|lg|2?xl)" + }, + { + type: "Prose Dark Mode", + members: "prose\\-invert" + } + // These are modifiers and not the last part of the classname + // { + // type: 'Prose Element modifiers', + // members: + // 'prose\\-(headings|lead|h1|h2|h3|h4|p|a|blockquote|figure|figcaption|strong|em|code|pre|ol|ul|li|table|thead|tr|th|td|img|video|hr)', + // }, + ] + }, + // ('Forms' plugin has no related classnames, only selectors like `input[type='password']`) + { + type: "Aspect Ratio", + members: [ + { + type: "aspect-w", + members: "aspect\\-(none|w\\-(?${aspectRatio}))" + }, + { + type: "aspect-h", + members: "aspect\\-h\\-(?${aspectRatio})" + } + ] + }, + { + type: "Line Clamp", + members: "line\\-clamp\\-(none|(?${lineClamp}))" + } + ] + } + ]; + } +}); + +// src/rules/enforces-shorthand.ts +var SHORTHAND_CANDIDATE_CLASSNAMES_DETECTED_MSG, enforces_shorthand_default; +var init_enforces_shorthand = __esm({ + "src/rules/enforces-shorthand.ts"() { + "use strict"; + init_groups(); + init_ast(); + init_customConfig(); + init_docsUrl(); + init_groupMethods(); + init_parser(); + init_settings(); + SHORTHAND_CANDIDATE_CLASSNAMES_DETECTED_MSG = `Classnames '{{classnames}}' could be replaced by the '{{shorthand}}' shorthand!`; + enforces_shorthand_default = { + meta: { + docs: { + description: "Enforces the usage of shorthand Tailwind CSS classnames", + category: "Best Practices", + recommended: true, + url: docsUrl_default("enforces-shorthand") + }, + messages: { + shorthandCandidateDetected: SHORTHAND_CANDIDATE_CLASSNAMES_DETECTED_MSG + }, + fixable: "code", + schema: [ + { + type: "object", + properties: { + callees: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + ignoredKeys: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + config: { + // returned from `loadConfig()` utility + type: ["string", "object"] + }, + tags: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + } + } + } + ] + }, + create: function(context) { + const callees = settings_default(context, "callees"); + const skipClassAttribute = settings_default(context, "skipClassAttribute"); + const tags = settings_default(context, "tags"); + const twConfig = settings_default(context, "config"); + const classRegex = settings_default(context, "classRegex"); + const mergedConfig2 = customConfig_default.resolve(twConfig); + const placeContentOptions = ["center", "start", "end", "between", "around", "evenly", "baseline", "stretch"]; + const placeItemsOptions = ["start", "end", "center", "stretch"]; + const placeSelfOptions = ["auto", "start", "end", "center", "stretch"]; + const complexEquivalences = [ + { + needles: ["overflow-hidden", "text-ellipsis", "whitespace-nowrap"], + shorthand: "truncate", + mode: "exact" + }, + { + needles: ["w-", "h-"], + shorthand: "size-", + mode: "value" + }, + ...placeContentOptions.map((opt) => { + return { + needles: [`content-${opt}`, `justify-${opt}`], + shorthand: `place-content-${opt}`, + mode: "exact" + }; + }), + ...placeItemsOptions.map((opt) => { + return { + needles: [`items-${opt}`, `justify-items-${opt}`], + shorthand: `place-items-${opt}`, + mode: "exact" + }; + }), + ...placeSelfOptions.map((opt) => { + return { + needles: [`self-${opt}`, `justify-self-${opt}`], + shorthand: `place-self-${opt}`, + mode: "exact" + }; + }) + ]; + const targetProperties = { + Layout: ["Overflow", "Overscroll Behavior", "Top / Right / Bottom / Left"], + "Flexbox & Grid": ["Gap"], + Spacing: ["Padding", "Margin"], + Sizing: ["Width", "Height"], + Borders: ["Border Radius", "Border Width", "Border Color"], + Tables: ["Border Spacing"], + Transforms: ["Scale"], + Typography: ["Text Overflow", "Whitespace"] + }; + const cloned = JSON.parse(JSON.stringify(groups)); + const targetGroups = cloned.filter((g) => Object.keys(targetProperties).includes(g.type)); + targetGroups.forEach((g) => { + g.members = g.members.filter((sub) => targetProperties[g.type].includes(sub.type)); + }); + const getBodyByShorthand = (targetGroups2, parentType, shorthand) => { + const findByMemberType = (obj) => obj.members.find((m) => m.type === parentType); + const mainGroup = targetGroups2.find(findByMemberType); + if (!mainGroup) { + return ""; + } + const typeGroup = mainGroup.members.find((m) => m.type === parentType); + if (!typeGroup) { + return ""; + } + const type = typeGroup.members.find((m) => m.shorthand === shorthand); + return !type ? "" : type.body; + }; + const parseForShorthandCandidates = (node, arg = null) => { + let originalClassNamesValue = null; + let start = null; + let end = null; + let prefix = ""; + let suffix = ""; + const troubles = []; + if (arg === null) { + originalClassNamesValue = ast_default.extractValueFromNode(node); + const range = ast_default.extractRangeFromNode(node); + if (node.type === "TextAttribute") { + start = range[0]; + end = range[1]; + } else { + start = range[0] + 1; + end = range[1] - 1; + } + } else { + switch (arg.type) { + case "Identifier": + return; + case "TemplateLiteral": + arg.expressions.forEach((exp) => { + parseForShorthandCandidates(node, exp); + }); + arg.quasis.forEach((quasis) => { + parseForShorthandCandidates(node, quasis); + }); + return; + case "ConditionalExpression": + parseForShorthandCandidates(node, arg.consequent); + parseForShorthandCandidates(node, arg.alternate); + return; + case "LogicalExpression": + parseForShorthandCandidates(node, arg.right); + return; + case "ArrayExpression": + arg.elements.forEach((el) => { + parseForShorthandCandidates(node, el); + }); + return; + case "ObjectExpression": + const isUsedByClassNamesPlugin = node.callee && node.callee.name === "classnames"; + const isVue = node.key && node.key.type === "VDirectiveKey"; + arg.properties.forEach((prop) => { + const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value; + parseForShorthandCandidates(node, propVal); + }); + return; + case "Property": + parseForShorthandCandidates(node, arg.key); + return; + case "Literal": + originalClassNamesValue = arg.value; + start = arg.range[0] + 1; + end = arg.range[1] - 1; + break; + case "TemplateElement": + originalClassNamesValue = arg.value.raw; + if (originalClassNamesValue === "") { + return; + } + start = arg.range[0]; + end = arg.range[1]; + const txt = context.getSourceCode().getText(arg); + prefix = ast_default.getTemplateElementPrefix(txt, originalClassNamesValue); + suffix = ast_default.getTemplateElementSuffix(txt, originalClassNamesValue); + originalClassNamesValue = ast_default.getTemplateElementBody(txt, prefix, suffix); + break; + } + } + let { classNames, whitespaces, headSpace, tailSpace } = ast_default.extractClassnamesFromValue(originalClassNamesValue); + if (classNames.length <= 1) { + return; + } + const parsed = []; + classNames.forEach((className, index) => { + parsed.push(groupMethods_default.parseClassname(className, targetGroups, mergedConfig2, index)); + }); + const validated = []; + let remaining = parsed; + for (const { needles: inputSet, shorthand: outputClassname, mode } of complexEquivalences) { + if (remaining.length < inputSet.length) { + continue; + } + const parsedElementsInInputSet = remaining.filter((remainingClass) => { + if (mode === "exact") { + return inputSet.some((inputClass) => remainingClass.name.includes(inputClass)); + } + if (mode === "value") { + const bodyMatch = inputSet.some( + (inputClassPattern) => `${mergedConfig2.prefix}${inputClassPattern}` === remainingClass.body + ); + if ([void 0, null].includes(mergedConfig2.theme.size)) { + return false; + } + const sizeKeys = Object.keys(mergedConfig2.theme.size); + const isSize = ["w-", "h-"].includes(remainingClass.body); + const isValidSize = sizeKeys.includes(remainingClass.value); + const wValue = mergedConfig2.theme.width[remainingClass.value]; + const hValue = mergedConfig2.theme.height[remainingClass.value]; + const sizeValue = mergedConfig2.theme.size[remainingClass.value]; + const fullMatch = wValue === hValue && wValue === sizeValue; + return bodyMatch && !(isSize && !isValidSize && !fullMatch); + } + }); + const variantGroups = /* @__PURE__ */ new Map(); + parsedElementsInInputSet.forEach((o) => { + const val = mode === "value" ? o.value : ""; + const v = `${o.variants}${o.important ? "!" : ""}${val}`; + if (!variantGroups.has(v)) { + variantGroups.set( + v, + parsedElementsInInputSet.filter( + (c) => c.variants === o.variants && c.important === o.important && (val === "" || c.value === val) + ) + ); + } + }); + const validKeys = /* @__PURE__ */ new Set(); + variantGroups.forEach((classes, key) => { + let skip = false; + if (classes.length < inputSet.length) { + skip = true; + } + if (mode === "value" && new Set(classes.map((p) => p.value)).size !== 1) { + skip = true; + } + if (!skip) { + validKeys.add(key); + } + }); + validKeys.forEach((k) => { + const candidates = variantGroups.get(k); + const index = candidates[0].index; + const variants = candidates[0].variants; + const important = candidates[0].important ? "!" : ""; + const classValue = mode === "value" ? candidates[0].value : ""; + const patchedClassname = `${variants}${important}${mergedConfig2.prefix}${outputClassname}${classValue}`; + troubles.push([candidates.map((c) => `${c.name}`), patchedClassname]); + const validatedClassname = groupMethods_default.parseClassname(patchedClassname, targetGroups, mergedConfig2, index); + validated.push(validatedClassname); + remaining = remaining.filter((p) => !candidates.includes(p)); + }); + } + const checkedGroups = []; + remaining.forEach((classname, idx, arr) => { + if (classname.parentType === "") { + validated.push(classname); + } else if (!checkedGroups.includes(classname.parentType)) { + checkedGroups.push(classname.parentType); + const sameType = remaining.filter((cls) => cls.parentType === classname.parentType); + const checkedVariantsValue = []; + sameType.forEach((cls) => { + const key = cls.variants + (cls.important ? "!" : "") + cls.value; + if (!checkedVariantsValue.includes(key)) { + checkedVariantsValue.push(key); + const sameVariantAndValue = sameType.filter((v) => { + return !(v.variants !== cls.variants || v.value !== cls.value || v.important !== cls.important); + }); + if (sameVariantAndValue.length === 1) { + validated.push(cls); + } else if (sameVariantAndValue.length) { + const supportCorners = ["Border Radius"].includes(classname.parentType); + const hasTL = supportCorners && sameVariantAndValue.some((c) => ["tl", "t", "all"].includes(c.shorthand)); + const hasTR = supportCorners && sameVariantAndValue.some((c) => ["tr", "t", "all"].includes(c.shorthand)); + const hasBR = supportCorners && sameVariantAndValue.some((c) => ["br", "b", "all"].includes(c.shorthand)); + const hasBL = supportCorners && sameVariantAndValue.some((c) => ["bl", "b", "all"].includes(c.shorthand)); + const hasT = sameVariantAndValue.some((c) => c.shorthand === "t") || hasTL && hasTR; + const hasR = sameVariantAndValue.some((c) => c.shorthand === "r") || hasTR && hasBR; + const hasB = sameVariantAndValue.some((c) => c.shorthand === "b") || hasBL && hasBR; + const hasL = sameVariantAndValue.some((c) => c.shorthand === "l") || hasTL && hasBL; + const hasX = sameVariantAndValue.some((c) => c.shorthand === "x") || hasL && hasR; + const hasY = sameVariantAndValue.some((c) => c.shorthand === "y") || hasT && hasB; + const hasAllProp = sameVariantAndValue.some((c) => c.shorthand === "all"); + const hasAllPropNoCorner = hasY && hasX; + const hasAllPropWithCorners = hasL && hasR || hasT && hasB; + const hasAllEquivalent = !supportCorners ? hasAllPropNoCorner : hasAllPropWithCorners; + const hasAll = hasAllProp || hasAllEquivalent; + const important = cls.important ? "!" : ""; + const isNegative = ("" + cls.value).substring(0, 1) === "-"; + const minus = isNegative ? "-" : ""; + const absoluteVal = isNegative ? ("" + cls.value).substring(1) : cls.value; + if (hasAll) { + const all = getBodyByShorthand(targetGroups, classname.parentType, "all"); + const val = absoluteVal.length ? "-" + absoluteVal : ""; + const patchedName = `${cls.variants}${important}${minus}${mergedConfig2.prefix}${all}${val}`; + troubles.push([sameVariantAndValue.map((c) => c.name), patchedName]); + cls.name = patchedName; + cls.shorthand = "all"; + validated.push(cls); + } else if (hasY || hasX) { + const xOrY = hasX ? "x" : "y"; + const xOrYType = getBodyByShorthand(targetGroups, classname.parentType, xOrY); + const patchedName = `${cls.variants}${important}${minus}${mergedConfig2.prefix}${xOrYType}${absoluteVal.length ? "-" + absoluteVal : ""}`; + const toBeReplaced = sameVariantAndValue.filter((c) => { + const candidates = hasX ? ["l", "r"] : ["t", "b"]; + return candidates.includes(c.shorthand); + }).map((c) => c.name); + const toBeKept = sameVariantAndValue.filter((c) => { + const candidates = hasY ? ["l", "r"] : ["t", "b"]; + return candidates.includes(c.shorthand); + }); + troubles.push([toBeReplaced, patchedName]); + let replaced = false; + sameVariantAndValue.forEach((ref, i) => { + if (toBeKept.find((k) => k.name === ref.name)) { + validated.push(ref); + } else if (!replaced) { + replaced = true; + const cloned2 = JSON.parse(JSON.stringify(ref)); + cloned2.name = patchedName; + cloned2.shorthand = xOrY; + validated.push(cloned2); + } + }); + } else if (supportCorners && (hasT || hasR || hasB || hasL)) { + const side = hasT ? "t" : hasR ? "r" : hasB ? "b" : "l"; + const sideBody = getBodyByShorthand(targetGroups, classname.parentType, side); + const val = absoluteVal.length ? "-" + absoluteVal : ""; + const patchedName = `${cls.variants}${important}${minus}${mergedConfig2.prefix}${sideBody}${val}`; + const toBeReplaced = sameVariantAndValue.filter((c) => { + const candidates = hasT ? ["tl", "tr"] : hasR ? ["tr", "br"] : hasB ? ["bl", "br"] : ["tl", "bl"]; + return candidates.includes(c.shorthand); + }).map((c) => c.name); + const toBeKept = sameVariantAndValue.filter((c) => { + const candidates = hasT ? ["bl", "br"] : hasR ? ["tl", "bl"] : hasB ? ["tl", "tr"] : ["tr", "br"]; + return candidates.includes(c.shorthand); + }); + troubles.push([toBeReplaced, patchedName]); + let replaced = false; + sameVariantAndValue.forEach((ref, i) => { + if (toBeKept.find((k) => k.name === ref.name)) { + validated.push(ref); + } else if (!replaced) { + replaced = true; + const cloned2 = JSON.parse(JSON.stringify(ref)); + cloned2.name = patchedName; + cloned2.shorthand = side; + validated.push(cloned2); + } + }); + } else { + validated.push(...sameVariantAndValue); + } + } + } + }); + } + }); + validated.sort((a, b) => a.index < b.index ? -1 : 1); + const union = validated.map((val) => val.leading + val.name + val.trailing); + let validatedClassNamesValue = ""; + if (union.length === 1) { + validatedClassNamesValue += headSpace ? whitespaces[0] : ""; + validatedClassNamesValue += union[0]; + validatedClassNamesValue += tailSpace ? whitespaces[whitespaces.length - 1] : ""; + } else { + for (let i = 0; i < union.length; i++) { + const isLast = i === union.length - 1; + const w = whitespaces[i] ?? ""; + const cls = union[i]; + validatedClassNamesValue += headSpace ? `${w}${cls}` : isLast ? `${cls}` : `${cls}${w}`; + if (tailSpace && isLast) { + validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? ""; + } + } + } + troubles.forEach((issue) => { + if (originalClassNamesValue !== validatedClassNamesValue) { + validatedClassNamesValue = prefix + validatedClassNamesValue + suffix; + context.report({ + node, + messageId: "shorthandCandidateDetected", + data: { + classnames: issue[0].join(", "), + shorthand: issue[1] + }, + fix: function(fixer) { + return fixer.replaceTextRange([start, end], validatedClassNamesValue); + } + }); + } + }); + }; + const attributeVisitor = function(node) { + if (!ast_default.isClassAttribute(node, classRegex) || skipClassAttribute) { + return; + } + if (ast_default.isLiteralAttributeValue(node)) { + parseForShorthandCandidates(node); + } else if (node.value && node.value.type === "JSXExpressionContainer") { + parseForShorthandCandidates(node, node.value.expression); + } + }; + const callExpressionVisitor = function(node) { + const calleeStr = ast_default.calleeToString(node.callee); + if (callees.findIndex((name2) => calleeStr === name2) === -1) { + return; + } + node.arguments.forEach((arg) => { + parseForShorthandCandidates(node, arg); + }); + }; + const scriptVisitor = { + JSXAttribute: attributeVisitor, + TextAttribute: attributeVisitor, + CallExpression: callExpressionVisitor, + TaggedTemplateExpression: function(node) { + if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { + return; + } + parseForShorthandCandidates(node, node.quasi); + } + }; + const templateVisitor = { + CallExpression: callExpressionVisitor, + /* + Tagged templates inside data bindings + https://github.com/vuejs/vue/issues/9721 + */ + VAttribute: function(node) { + switch (true) { + case !ast_default.isValidVueAttribute(node, classRegex): + return; + case ast_default.isVLiteralValue(node): + parseForShorthandCandidates(node); + break; + case ast_default.isArrayExpression(node): + node.value.expression.elements.forEach((arg) => { + parseForShorthandCandidates(node, arg); + }); + break; + case ast_default.isObjectExpression(node): + node.value.expression.properties.forEach((prop) => { + parseForShorthandCandidates(node, prop); + }); + break; + } + } + }; + return parser_default.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); + } + }; + } +}); + +// src/rules/migration-from-tailwind-2.ts +var docsUrl2, customConfig, astUtil, groupUtil, getOption2, parserUtil, CLASSNAME_NOT_NEEDED_MSG, CLASSNAMES_NOT_NEEDED_MSG, CLASSNAME_CHANGED_MSG, OPACITY_CLASS_DEPRECATED_MSG, migration_from_tailwind_2_default; +var init_migration_from_tailwind_2 = __esm({ + "src/rules/migration-from-tailwind-2.ts"() { + "use strict"; + docsUrl2 = (init_docsUrl(), __toCommonJS(docsUrl_exports)); + customConfig = (init_customConfig(), __toCommonJS(customConfig_exports)); + astUtil = (init_ast(), __toCommonJS(ast_exports)); + groupUtil = (init_groupMethods(), __toCommonJS(groupMethods_exports)); + getOption2 = (init_settings(), __toCommonJS(settings_exports)); + parserUtil = (init_parser(), __toCommonJS(parser_exports)); + CLASSNAME_NOT_NEEDED_MSG = `Classname '{{classnames}}' is not needed in Tailwind CSS v3!`; + CLASSNAMES_NOT_NEEDED_MSG = `Classnames '{{classnames}}' are not needed in Tailwind CSS v3!`; + CLASSNAME_CHANGED_MSG = `Classname '{{deprecated}}' should be updated to '{{updated}}' in Tailwind CSS v3!`; + OPACITY_CLASS_DEPRECATED_MSG = `Classname '{{classname}}' should be replaced by an opacity suffix (eg. '/{{value}}')`; + migration_from_tailwind_2_default = { + meta: { + docs: { + description: "Detect obsolete classnames when upgrading to Tailwind CSS v3", + category: "Possible Errors", + recommended: true, + url: docsUrl2("migration-from-tailwind-2") + }, + messages: { + classnameNotNeeded: CLASSNAME_NOT_NEEDED_MSG, + classnamesNotNeeded: CLASSNAMES_NOT_NEEDED_MSG, + classnameChanged: CLASSNAME_CHANGED_MSG, + classnameOpacityDeprecated: OPACITY_CLASS_DEPRECATED_MSG + }, + fixable: "code", + schema: [ + { + type: "object", + properties: { + callees: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + ignoredKeys: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + config: { + // returned from `loadConfig()` utility + type: ["string", "object"] + }, + tags: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + } + } + } + ] + }, + create: function(context) { + const callees = getOption2(context, "callees"); + const skipClassAttribute = getOption2(context, "skipClassAttribute"); + const tags = getOption2(context, "tags"); + const twConfig = getOption2(context, "config"); + const classRegex = getOption2(context, "classRegex"); + const mergedConfig2 = customConfig.resolve(twConfig); + const parseForObsoleteClassNames = (node, arg = null) => { + let originalClassNamesValue = null; + let start = null; + let end = null; + let prefix = ""; + let suffix = ""; + if (arg === null) { + originalClassNamesValue = astUtil.extractValueFromNode(node); + const range = astUtil.extractRangeFromNode(node); + if (node.type === "TextAttribute") { + start = range[0]; + end = range[1]; + } else { + start = range[0] + 1; + end = range[1] - 1; + } + } else { + switch (arg.type) { + case "Identifier": + return; + case "TemplateLiteral": + arg.expressions.forEach((exp) => { + parseForObsoleteClassNames(node, exp); + }); + arg.quasis.forEach((quasis) => { + parseForObsoleteClassNames(node, quasis); + }); + return; + case "ConditionalExpression": + parseForObsoleteClassNames(node, arg.consequent); + parseForObsoleteClassNames(node, arg.alternate); + return; + case "LogicalExpression": + parseForObsoleteClassNames(node, arg.right); + return; + case "ArrayExpression": + arg.elements.forEach((el) => { + parseForObsoleteClassNames(node, el); + }); + return; + case "ObjectExpression": + arg.properties.forEach((prop) => { + parseForObsoleteClassNames(node, prop.key); + }); + return; + case "Property": + parseForObsoleteClassNames(node, arg.key); + return; + case "Literal": + originalClassNamesValue = arg.value; + start = arg.range[0] + 1; + end = arg.range[1] - 1; + break; + case "TemplateElement": + originalClassNamesValue = arg.value.raw; + if (originalClassNamesValue === "") { + return; + } + start = arg.range[0]; + end = arg.range[1]; + const txt = context.getSourceCode().getText(arg); + prefix = astUtil.getTemplateElementPrefix(txt, originalClassNamesValue); + suffix = astUtil.getTemplateElementSuffix(txt, originalClassNamesValue); + originalClassNamesValue = astUtil.getTemplateElementBody(txt, prefix, suffix); + break; + } + } + let { classNames, whitespaces, headSpace, tailSpace } = astUtil.extractClassnamesFromValue(originalClassNamesValue); + const notNeeded = []; + const outdated = []; + const deprecatedBgOpacity = []; + const filtered = classNames.filter((cls) => { + const suffix2 = groupUtil.getSuffix(cls, mergedConfig2.separator); + if (/^((backdrop\-)?(filter|transform))$/i.test(suffix2)) { + notNeeded.push(cls); + return false; + } + let overflowRes = /^overflow\-(?clip|ellipsis)$/i.exec(suffix2); + if (overflowRes && overflowRes.groups && overflowRes.groups.value) { + outdated.push([cls, cls.replace(/overflow\-(clip|ellipsis)$/i, `text-${overflowRes.groups.value}`)]); + } + let growShrinkRes = /flex\-(?grow|shrink)(\-(?${flexVal}))?/i.exec(suffix2); + if (growShrinkRes && growShrinkRes.groups && growShrinkRes.groups.prop) { + const prop = growShrinkRes.groups.prop; + const flexVal = growShrinkRes.groups.flexVal; + const optionalVal = flexVal ? `-${flexVal}` : ""; + const fixRegex = new RegExp(`flex-${prop}${optionalVal}`); + outdated.push([cls, cls.replace(fixRegex, `${prop}${flexVal ? "-" + flexVal : ""}`)]); + } + let boxRes = /^decoration\-(?clone|slice)$/i.exec(suffix2); + if (boxRes && boxRes.groups && boxRes.groups.value) { + const boxVal = boxRes.groups.value; + const fixRegex = new RegExp(`decoration-${boxVal}`); + outdated.push([cls, cls.replace(fixRegex, `box-decoration-${boxVal}`)]); + } + let bgOpacityRes = /^(bg|border|ring)\-opacity\-(?\d{1,})$/i.exec(suffix2); + if (bgOpacityRes && bgOpacityRes.groups && bgOpacityRes.groups.value) { + const opacityVal = bgOpacityRes.groups.value; + deprecatedBgOpacity.push([cls, opacityVal]); + } + let placeholderRes = /^placeholder\-(?.{1,})$/i.exec(suffix2); + if (placeholderRes && placeholderRes.groups && placeholderRes.groups.value) { + const placeholderVal = placeholderRes.groups.value; + const fixPlaceholderRegex = new RegExp(`placeholder-${placeholderVal}$`); + outdated.push([cls, cls.replace(fixPlaceholderRegex, `placeholder:text-${placeholderVal}`)]); + } + return true; + }); + if (notNeeded.length) { + let validatedClassNamesValue = ""; + for (let i = 0; i < filtered.length; i++) { + const isLast = i === filtered.length - 1; + const w = whitespaces[i] ?? ""; + const cls = filtered[i]; + validatedClassNamesValue += headSpace ? `${w}${cls}` : isLast ? `${cls}` : `${cls}${w}`; + if (headSpace && tailSpace && isLast) { + validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? ""; + } + } + validatedClassNamesValue = prefix + validatedClassNamesValue + suffix; + context.report({ + node, + messageId: notNeeded.length === 1 ? "classnameNotNeeded" : "classnamesNotNeeded", + data: { + classnames: notNeeded.join(", ") + }, + fix: function(fixer) { + return fixer.replaceTextRange([start, end], validatedClassNamesValue); + } + }); + } + outdated.forEach((outdatedClass) => { + let validatedClassNamesValue = ""; + for (let i = 0; i < filtered.length; i++) { + const w = whitespaces[i] ?? ""; + const cls = filtered[i]; + validatedClassNamesValue += headSpace ? `${w}${cls}` : `${cls}${w}`; + if (headSpace && tailSpace && i === filtered.length - 1) { + validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? ""; + } + } + validatedClassNamesValue = prefix + validatedClassNamesValue.replace(outdatedClass[0], outdatedClass[1]) + suffix; + context.report({ + node, + messageId: "classnameChanged", + data: { + deprecated: outdatedClass[0], + updated: outdatedClass[1] + }, + fix: function(fixer) { + return fixer.replaceTextRange([start, end], validatedClassNamesValue); + } + }); + }); + deprecatedBgOpacity.forEach((bgClass) => { + context.report({ + node, + messageId: "classnameOpacityDeprecated", + data: { + classname: bgClass[0], + value: bgClass[1] + } + }); + }); + }; + const attributeVisitor = function(node) { + if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) { + return; + } + if (astUtil.isLiteralAttributeValue(node)) { + parseForObsoleteClassNames(node); + } else if (node.value && node.value.type === "JSXExpressionContainer") { + parseForObsoleteClassNames(node, node.value.expression); + } + }; + const callExpressionVisitor = function(node) { + const calleeStr = astUtil.calleeToString(node.callee); + if (callees.findIndex((name2) => calleeStr === name2) === -1) { + return; + } + node.arguments.forEach((arg) => { + parseForObsoleteClassNames(node, arg); + }); + }; + const scriptVisitor = { + JSXAttribute: attributeVisitor, + TextAttribute: attributeVisitor, + CallExpression: callExpressionVisitor, + TaggedTemplateExpression: function(node) { + if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { + return; + } + parseForObsoleteClassNames(node, node.quasi); + } + }; + const templateVisitor = { + CallExpression: callExpressionVisitor, + /* + Tagged templates inside data bindings + https://github.com/vuejs/vue/issues/9721 + */ + VAttribute: function(node) { + switch (true) { + case !astUtil.isValidVueAttribute(node, classRegex): + return; + case astUtil.isVLiteralValue(node): + parseForObsoleteClassNames(node); + break; + case astUtil.isArrayExpression(node): + node.value.expression.elements.forEach((arg) => { + parseForObsoleteClassNames(node, arg); + }); + break; + case astUtil.isObjectExpression(node): + node.value.expression.properties.forEach((prop) => { + parseForObsoleteClassNames(node, prop); + }); + break; + } + } + }; + return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); + } + }; + } +}); + +// src/rules/no-arbitrary-value.ts +var docsUrl3, customConfig2, astUtil2, groupUtil2, getOption3, parserUtil2, ARBITRARY_VALUE_DETECTED_MSG, no_arbitrary_value_default; +var init_no_arbitrary_value = __esm({ + "src/rules/no-arbitrary-value.ts"() { + "use strict"; + docsUrl3 = (init_docsUrl(), __toCommonJS(docsUrl_exports)); + customConfig2 = (init_customConfig(), __toCommonJS(customConfig_exports)); + astUtil2 = (init_ast(), __toCommonJS(ast_exports)); + groupUtil2 = (init_groupMethods(), __toCommonJS(groupMethods_exports)); + getOption3 = (init_settings(), __toCommonJS(settings_exports)); + parserUtil2 = (init_parser(), __toCommonJS(parser_exports)); + ARBITRARY_VALUE_DETECTED_MSG = `Arbitrary value detected in '{{classname}}'`; + no_arbitrary_value_default = { + meta: { + docs: { + description: "Forbid using arbitrary values in classnames", + category: "Best Practices", + recommended: false, + url: docsUrl3("no-arbitrary-value") + }, + messages: { + arbitraryValueDetected: ARBITRARY_VALUE_DETECTED_MSG + }, + fixable: null, + schema: [ + { + type: "object", + properties: { + callees: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + ignoredKeys: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + config: { + // returned from `loadConfig()` utility + type: ["string", "object"] + }, + tags: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + } + } + } + ] + }, + create: function(context) { + const callees = getOption3(context, "callees"); + const skipClassAttribute = getOption3(context, "skipClassAttribute"); + const tags = getOption3(context, "tags"); + const twConfig = getOption3(context, "config"); + const classRegex = getOption3(context, "classRegex"); + const mergedConfig2 = customConfig2.resolve(twConfig); + const parseForArbitraryValues = (node, arg = null) => { + let originalClassNamesValue = null; + if (arg === null) { + originalClassNamesValue = astUtil2.extractValueFromNode(node); + } else { + switch (arg.type) { + case "Identifier": + return; + case "TemplateLiteral": + arg.expressions.forEach((exp) => { + parseForArbitraryValues(node, exp); + }); + arg.quasis.forEach((quasis) => { + parseForArbitraryValues(node, quasis); + }); + return; + case "ConditionalExpression": + parseForArbitraryValues(node, arg.consequent); + parseForArbitraryValues(node, arg.alternate); + return; + case "LogicalExpression": + parseForArbitraryValues(node, arg.right); + return; + case "ArrayExpression": + arg.elements.forEach((el) => { + parseForArbitraryValues(node, el); + }); + return; + case "ObjectExpression": + const isUsedByClassNamesPlugin = node.callee && node.callee.name === "classnames"; + const isVue = node.key && node.key.type === "VDirectiveKey"; + arg.properties.forEach((prop) => { + const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value; + parseForArbitraryValues(node, propVal); + }); + return; + case "Property": + parseForArbitraryValues(node, arg.key); + return; + case "Literal": + originalClassNamesValue = arg.value; + break; + case "TemplateElement": + originalClassNamesValue = arg.value.raw; + if (originalClassNamesValue === "") { + return; + } + break; + } + } + let { classNames } = astUtil2.extractClassnamesFromValue(originalClassNamesValue); + const forbidden = []; + classNames.forEach((cls, idx) => { + const parsed = groupUtil2.parseClassname(cls, [], mergedConfig2, idx); + if (/\[.*\]/i.test(parsed.body)) { + forbidden.push(parsed.name); + } + }); + forbidden.forEach((forbiddenClass) => { + context.report({ + node, + messageId: "arbitraryValueDetected", + data: { + classname: forbiddenClass + } + }); + }); + }; + const attributeVisitor = function(node) { + if (!astUtil2.isClassAttribute(node, classRegex) || skipClassAttribute) { + return; + } + if (astUtil2.isLiteralAttributeValue(node)) { + parseForArbitraryValues(node); + } else if (node.value && node.value.type === "JSXExpressionContainer") { + parseForArbitraryValues(node, node.value.expression); + } + }; + const callExpressionVisitor = function(node) { + const calleeStr = astUtil2.calleeToString(node.callee); + if (callees.findIndex((name2) => calleeStr === name2) === -1) { + return; + } + node.arguments.forEach((arg) => { + parseForArbitraryValues(node, arg); + }); + }; + const scriptVisitor = { + JSXAttribute: attributeVisitor, + TextAttribute: attributeVisitor, + CallExpression: callExpressionVisitor, + TaggedTemplateExpression: function(node) { + if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { + return; + } + parseForArbitraryValues(node, node.quasi); + } + }; + const templateVisitor = { + CallExpression: callExpressionVisitor, + /* + Tagged templates inside data bindings + https://github.com/vuejs/vue/issues/9721 + */ + VAttribute: function(node) { + switch (true) { + case !astUtil2.isValidVueAttribute(node, classRegex): + return; + case astUtil2.isVLiteralValue(node): + parseForArbitraryValues(node, null); + break; + case astUtil2.isArrayExpression(node): + node.value.expression.elements.forEach((arg) => { + parseForArbitraryValues(node, arg); + }); + break; + case astUtil2.isObjectExpression(node): + node.value.expression.properties.forEach((prop) => { + parseForArbitraryValues(node, prop); + }); + break; + } + } + }; + return parserUtil2.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); + } + }; + } +}); + +// src/rules/no-contradicting-classname.ts +var CONFLICTING_CLASSNAMES_DETECTED_MSG, no_contradicting_classname_default; +var init_no_contradicting_classname = __esm({ + "src/rules/no-contradicting-classname.ts"() { + "use strict"; + init_groups(); + init_ast(); + init_customConfig(); + init_docsUrl(); + init_groupMethods(); + init_parser(); + init_settings(); + CONFLICTING_CLASSNAMES_DETECTED_MSG = `Classnames {{classnames}} are conflicting!`; + no_contradicting_classname_default = { + meta: { + docs: { + description: 'Avoid contradicting Tailwind CSS classnames (e.g. "w-3 w-5")', + category: "Possible Errors", + recommended: true, + url: docsUrl_default("no-contradicting-classname") + }, + messages: { + conflictingClassnames: CONFLICTING_CLASSNAMES_DETECTED_MSG + }, + fixable: null, + schema: [ + { + type: "object", + properties: { + callees: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + ignoredKeys: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + config: { + // returned from `loadConfig()` utility + type: ["string", "object"] + }, + tags: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + } + } + } + ] + }, + create: function(context) { + const callees = settings_default(context, "callees"); + const ignoredKeys = settings_default(context, "ignoredKeys"); + const skipClassAttribute = settings_default(context, "skipClassAttribute"); + const tags = settings_default(context, "tags"); + const twConfig = settings_default(context, "config"); + const classRegex = settings_default(context, "classRegex"); + const mergedConfig2 = customConfig_default.resolve(twConfig); + const groups2 = groupMethods_default.getGroups(groups, mergedConfig2); + const parseForContradictingClassNames = (classNames, node) => { + const sorted = groupMethods_default.initGroupSlots(groups2); + classNames.forEach((className) => { + const idx = groupMethods_default.getGroupIndex(className, groups2, mergedConfig2.separator); + if (idx > -1) { + sorted[idx].push(className); + } + }); + const sortedGroups = sorted.filter((slot) => slot.length > 1); + const arbitraryPropsGroupIndex = sortedGroups.findIndex((slot) => { + const suffix = groupMethods_default.getSuffix(slot[0], mergedConfig2.separator); + return groupMethods_default.getArbitraryProperty(suffix, mergedConfig2.separator) !== ""; + }); + const ambiguousArbitraryValuesOrClasses = String.raw`(\[(.*${mergedConfig2.separator}))|(^((?!:).)*$)`; + sortedGroups.forEach((group, groupIndex) => { + const variants = []; + group.forEach((cls) => { + const prefix = groupMethods_default.getPrefix(cls, mergedConfig2.separator); + const name2 = cls.substr(prefix.length); + if (groupIndex === arbitraryPropsGroupIndex) { + const arbitraryProp = groupMethods_default.getArbitraryProperty(name2, mergedConfig2.separator); + const identifier = prefix + arbitraryProp; + const idx = variants.findIndex((v) => identifier === v.prefix); + if (idx === -1) { + variants.push({ + prefix: identifier, + name: [name2] + }); + } else { + variants[idx].name.push(name2); + } + } else { + const rePrefix = prefix === "" ? ambiguousArbitraryValuesOrClasses : "^" + prefix; + const idx = variants.findIndex((v) => v.prefix === rePrefix); + if (idx === -1) { + variants.push({ + prefix: rePrefix, + name: [name2] + }); + } else { + variants[idx].name.push(name2); + } + } + }); + const potentialTroubles = variants.filter((v) => v.name.length > 1); + if (potentialTroubles.length) { + potentialTroubles.forEach((variantGroup) => { + const re = new RegExp(variantGroup.prefix); + const conflicting = group.filter((c) => re.test(c)); + context.report({ + node, + messageId: "conflictingClassnames", + data: { + classnames: conflicting.join(", ") + } + }); + }); + } + }); + }; + const attributeVisitor = function(node) { + if (!ast_default.isClassAttribute(node, classRegex) || skipClassAttribute) { + return; + } + if (ast_default.isLiteralAttributeValue(node)) { + ast_default.parseNodeRecursive(node, null, parseForContradictingClassNames, true, false, ignoredKeys); + } else if (node.value && node.value.type === "JSXExpressionContainer") { + ast_default.parseNodeRecursive( + node, + node.value.expression, + parseForContradictingClassNames, + true, + false, + ignoredKeys + ); + } + }; + const callExpressionVisitor = function(node) { + const calleeStr = ast_default.calleeToString(node.callee); + if (callees.findIndex((name2) => calleeStr === name2) === -1) { + return; + } + const allClassnamesForNode = []; + const pushClasses = (classNames, targetNode) => { + if (targetNode === null) { + parseForContradictingClassNames(classNames, node); + } else { + allClassnamesForNode.push(...classNames); + } + }; + node.arguments.forEach((arg) => { + ast_default.parseNodeRecursive(node, arg, pushClasses, true, false, ignoredKeys); + }); + parseForContradictingClassNames(allClassnamesForNode, node); + }; + const scriptVisitor = { + JSXAttribute: attributeVisitor, + TextAttribute: attributeVisitor, + CallExpression: callExpressionVisitor, + TaggedTemplateExpression: function(node) { + if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { + return; + } + const allClassnamesForNode = []; + const pushClasses = (classNames, targetNode) => { + if (targetNode === null) { + parseForContradictingClassNames(classNames, node); + } else { + allClassnamesForNode.push(...classNames); + } + }; + ast_default.parseNodeRecursive(node, node.quasi, pushClasses, true, false, ignoredKeys); + parseForContradictingClassNames(allClassnamesForNode, node); + } + }; + const templateVisitor = { + CallExpression: callExpressionVisitor, + /* + Tagged templates inside data bindings + https://github.com/vuejs/vue/issues/9721 + */ + VAttribute: function(node) { + switch (true) { + case !ast_default.isValidVueAttribute(node, classRegex): + return; + case ast_default.isVLiteralValue(node): + ast_default.parseNodeRecursive(node, null, parseForContradictingClassNames, true, false, ignoredKeys); + break; + case ast_default.isArrayExpression(node): + const allClassnamesForNode = []; + const pushClasses = (classNames, targetNode) => { + if (targetNode === null) { + parseForContradictingClassNames(classNames, node); + } else { + allClassnamesForNode.push(...classNames); + } + }; + node.value.expression.elements.forEach((el) => { + ast_default.parseNodeRecursive(node, el, pushClasses, true, false, ignoredKeys); + }); + parseForContradictingClassNames(allClassnamesForNode, node); + break; + case ast_default.isObjectExpression(node): + node.value.expression.properties.forEach((prop) => { + ast_default.parseNodeRecursive(node, prop, parseForContradictingClassNames, false, false, ignoredKeys); + }); + break; + } + } + }; + return parser_default.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); + } + }; + } +}); + +// src/util/cssFiles.ts +var fg, fs2, postcss, lastClassFromSelectorRegexp, removeDuplicatesFromArray3, cssFilesInfos, lastUpdate, classnamesFromFiles, generateClassnamesListSync, cssFiles_default; +var init_cssFiles = __esm({ + "src/util/cssFiles.ts"() { + "use strict"; + fg = __require("fast-glob"); + fs2 = __require("fs"); + postcss = __require("postcss"); + lastClassFromSelectorRegexp = /\.([^\.\,\s\n\:\(\)\[\]\'~\+\>\*\\]*)/gim; + removeDuplicatesFromArray3 = (init_removeDuplicatesFromArray(), __toCommonJS(removeDuplicatesFromArray_exports)); + cssFilesInfos = /* @__PURE__ */ new Map(); + lastUpdate = null; + classnamesFromFiles = []; + generateClassnamesListSync = (patterns, refreshRate = 5e3) => { + const now = Date.now(); + const isExpired = lastUpdate === null || now - lastUpdate > refreshRate; + if (!isExpired) { + return classnamesFromFiles; + } + lastUpdate = now; + const filesToBeRemoved = /* @__PURE__ */ new Set([...cssFilesInfos.keys()]); + const files = fg.sync(patterns, { suppressErrors: true, stats: true }); + for (const file of files) { + let mtime = ""; + let canBeSkipped = cssFilesInfos.has(file.path); + if (canBeSkipped) { + filesToBeRemoved.delete(file.path); + const stats = fs2.statSync(file.path); + mtime = `${stats.mtime || ""}`; + canBeSkipped = cssFilesInfos.get(file.path).mtime === mtime; + } + if (canBeSkipped) { + continue; + } + const data = fs2.readFileSync(file.path, "utf-8"); + const root = postcss.parse(data); + let detectedClassnames = /* @__PURE__ */ new Set(); + root.walkRules((rule) => { + const matches = [...rule.selector.matchAll(lastClassFromSelectorRegexp)]; + const classnames = matches.map((arr) => arr[1]); + detectedClassnames = /* @__PURE__ */ new Set([...detectedClassnames, ...classnames]); + }); + cssFilesInfos.set(file.path, { + mtime, + classNames: [...detectedClassnames] + }); + } + const deletedFiles = [...filesToBeRemoved]; + for (let i = 0; i < deletedFiles.length; i++) { + cssFilesInfos.delete(deletedFiles[i]); + } + classnamesFromFiles = []; + cssFilesInfos.forEach((css) => { + classnamesFromFiles = [...classnamesFromFiles, ...css.classNames]; + }); + return removeDuplicatesFromArray3(classnamesFromFiles); + }; + cssFiles_default = generateClassnamesListSync; + } +}); + +// src/util/generated.ts +function generate(className, context) { + const gen = generateRulesFallback(/* @__PURE__ */ new Set([className]), context); + return gen; +} +var generateRulesFallback, generated_default; +var init_generated = __esm({ + "src/util/generated.ts"() { + "use strict"; + generateRulesFallback = __require("tailwindcss/lib/lib/generateRules").generateRules; + generated_default = generate; + } +}); + +// src/rules/no-custom-classname.ts +var createContextFallback2, escapeRegex2, CUSTOM_CLASSNAME_DETECTED_MSG, getGroupNameRegex, contextFallbackCache2, no_custom_classname_default; +var init_no_custom_classname = __esm({ + "src/rules/no-custom-classname.ts"() { + "use strict"; + init_groups(); + init_ast(); + init_cssFiles(); + init_customConfig(); + init_docsUrl(); + init_generated(); + init_groupMethods(); + init_parser(); + init_settings(); + createContextFallback2 = __require("tailwindcss/lib/lib/setupContextUtils").createContext; + escapeRegex2 = (init_regex(), __toCommonJS(regex_exports)).escapeRegex; + CUSTOM_CLASSNAME_DETECTED_MSG = `Classname '{{classname}}' is not a Tailwind CSS class!`; + getGroupNameRegex = (prefix = "") => new RegExp(`^${escapeRegex2(prefix)}(group|peer)/[\\w\\$\\#\\@\\%\\^\\&\\*\\_\\-]+$`, "i"); + contextFallbackCache2 = /* @__PURE__ */ new WeakMap(); + no_custom_classname_default = { + meta: { + docs: { + description: "Detect classnames which do not belong to Tailwind CSS", + category: "Best Practices", + recommended: false, + url: docsUrl_default("no-custom-classname") + }, + messages: { + customClassnameDetected: CUSTOM_CLASSNAME_DETECTED_MSG + }, + fixable: null, + schema: [ + { + type: "object", + properties: { + callees: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + ignoredKeys: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + config: { + // returned from `loadConfig()` utility + type: ["string", "object"] + }, + cssFiles: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + cssFilesRefreshRate: { + type: "number" + // default: 5_000, + }, + tags: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + whitelist: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + } + } + } + ] + }, + create: function(context) { + const callees = settings_default(context, "callees"); + const ignoredKeys = settings_default(context, "ignoredKeys"); + const skipClassAttribute = settings_default(context, "skipClassAttribute"); + const tags = settings_default(context, "tags"); + const twConfig = settings_default(context, "config"); + const cssFiles = settings_default(context, "cssFiles"); + const cssFilesRefreshRate = settings_default(context, "cssFilesRefreshRate"); + const whitelist = settings_default(context, "whitelist"); + const classRegex = settings_default(context, "classRegex"); + const mergedConfig2 = customConfig_default.resolve(twConfig); + const contextFallback = ( + // Set the created contextFallback in the cache if it does not exist yet. + (contextFallbackCache2.has(mergedConfig2) ? contextFallbackCache2 : contextFallbackCache2.set(mergedConfig2, createContextFallback2(mergedConfig2))).get(mergedConfig2) + ); + const groups2 = groupMethods_default.getGroups(groups, mergedConfig2); + const classnamesFromFiles2 = cssFiles_default(cssFiles, cssFilesRefreshRate); + const groupNameRegex = getGroupNameRegex(mergedConfig2.prefix); + const parseForCustomClassNames = (classNames, node) => { + classNames.forEach((className) => { + const gen = generated_default(className, contextFallback); + if (gen.length) { + return; + } + const idx = groupMethods_default.getGroupIndex(className, groups2, mergedConfig2.separator); + if (idx >= 0) { + return; + } + const whitelistIdx = groupMethods_default.getGroupIndex(className, whitelist, mergedConfig2.separator); + if (whitelistIdx >= 0) { + return; + } + const fromFilesIdx = groupMethods_default.getGroupIndex(className, classnamesFromFiles2, mergedConfig2.separator); + if (fromFilesIdx >= 0) { + return; + } + if (groupNameRegex.test(className)) { + return; + } + context.report({ + node, + messageId: "customClassnameDetected", + data: { + classname: className + } + }); + }); + }; + const attributeVisitor = function(node) { + if (!ast_default.isClassAttribute(node, classRegex) || skipClassAttribute) { + return; + } + if (ast_default.isLiteralAttributeValue(node)) { + ast_default.parseNodeRecursive(node, null, parseForCustomClassNames, false, false, ignoredKeys); + } else if (node.value && node.value.type === "JSXExpressionContainer") { + ast_default.parseNodeRecursive(node, node.value.expression, parseForCustomClassNames, false, false, ignoredKeys); + } + }; + const callExpressionVisitor = function(node) { + const calleeStr = ast_default.calleeToString(node.callee); + if (callees.findIndex((name2) => calleeStr === name2) === -1) { + return; + } + node.arguments.forEach((arg) => { + ast_default.parseNodeRecursive(node, arg, parseForCustomClassNames, false, false, ignoredKeys); + }); + }; + const scriptVisitor = { + JSXAttribute: attributeVisitor, + TextAttribute: attributeVisitor, + CallExpression: callExpressionVisitor, + TaggedTemplateExpression: function(node) { + if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { + return; + } + ast_default.parseNodeRecursive(node, node.quasi, parseForCustomClassNames, false, false, ignoredKeys); + } + }; + const templateVisitor = { + CallExpression: callExpressionVisitor, + /* + Tagged templates inside data bindings + https://github.com/vuejs/vue/issues/9721 + */ + VAttribute: function(node) { + switch (true) { + case !ast_default.isValidVueAttribute(node, classRegex): + return; + case ast_default.isVLiteralValue(node): + ast_default.parseNodeRecursive(node, null, parseForCustomClassNames, false, false, ignoredKeys); + break; + case ast_default.isArrayExpression(node): + node.value.expression.elements.forEach((arg) => { + ast_default.parseNodeRecursive(node, arg, parseForCustomClassNames, false, false, ignoredKeys); + }); + break; + case ast_default.isObjectExpression(node): + node.value.expression.properties.forEach((prop) => { + ast_default.parseNodeRecursive(node, prop, parseForCustomClassNames, false, false, ignoredKeys); + }); + break; + } + } + }; + return parser_default.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); + } + }; + } +}); + +// src/rules/no-unnecessary-arbitrary-value.ts +var validZeroRegEx2, UNNECESSARY_ARBITRARY_VALUE_DETECTED_MSG, no_unnecessary_arbitrary_value_default; +var init_no_unnecessary_arbitrary_value = __esm({ + "src/rules/no-unnecessary-arbitrary-value.ts"() { + "use strict"; + init_groups(); + init_ast(); + init_customConfig(); + init_docsUrl(); + init_groupMethods(); + init_parser(); + init_settings(); + init_length(); + validZeroRegEx2 = length_default.validZeroRegEx; + UNNECESSARY_ARBITRARY_VALUE_DETECTED_MSG = `The arbitrary class '{{classname}}' could be replaced by '{{presets}}'`; + no_unnecessary_arbitrary_value_default = { + meta: { + docs: { + description: "Forbid using arbitrary values in classnames when an equivalent preset exists", + category: "Best Practices", + recommended: true, + url: docsUrl_default("no-unnecessary-arbitrary-value") + }, + messages: { + unnecessaryArbitraryValueDetected: UNNECESSARY_ARBITRARY_VALUE_DETECTED_MSG + }, + fixable: "code", + schema: [ + { + type: "object", + properties: { + callees: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + ignoredKeys: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + }, + config: { + // returned from `loadConfig()` utility + type: ["string", "object"] + }, + tags: { + type: "array", + items: { type: "string", minLength: 0 }, + uniqueItems: true + } + } + } + ] + }, + create: function(context) { + const callees = settings_default(context, "callees"); + const skipClassAttribute = settings_default(context, "skipClassAttribute"); + const tags = settings_default(context, "tags"); + const twConfig = settings_default(context, "config"); + const classRegex = settings_default(context, "classRegex"); + const mergedConfig2 = customConfig_default.resolve(twConfig); + const groups2 = groupMethods_default.getGroups(groups, mergedConfig2); + const configKeys = groupMethods_default.getGroupConfigKeys(groups); + let parentTemplateLiteral = null; + const parseForArbitraryValues = (node, arg = null) => { + let start = null; + let end = null; + let originalClassNamesValue = null; + if (arg === null) { + originalClassNamesValue = ast_default.extractValueFromNode(node); + const range = ast_default.extractRangeFromNode(node); + if (node.type === "TextAttribute") { + start = range[0]; + end = range[1]; + } else { + start = range[0] + 1; + end = range[1] - 1; + } + } else { + switch (arg.type) { + case "Identifier": + return; + case "TemplateLiteral": + parentTemplateLiteral = arg; + arg.expressions.forEach((exp) => { + parseForArbitraryValues(node, exp); + }); + arg.quasis.forEach((quasis) => { + parseForArbitraryValues(node, quasis); + }); + parentTemplateLiteral = null; + return; + case "ConditionalExpression": + parseForArbitraryValues(node, arg.consequent); + parseForArbitraryValues(node, arg.alternate); + return; + case "LogicalExpression": + parseForArbitraryValues(node, arg.right); + return; + case "ArrayExpression": + arg.elements.forEach((el) => { + parseForArbitraryValues(node, el); + }); + return; + case "ObjectExpression": + const isUsedByClassNamesPlugin = node.callee && node.callee.name === "classnames"; + const isVue = node.key && node.key.type === "VDirectiveKey"; + arg.properties.forEach((prop) => { + const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value; + parseForArbitraryValues(node, propVal); + }); + return; + case "Property": + parseForArbitraryValues(node, arg.key); + start = arg.range[0] + 1; + end = arg.range[1] - 1; + return; + case "Literal": + originalClassNamesValue = arg.value; + start = arg.range[0] + 1; + end = arg.range[1] - 1; + break; + case "TemplateElement": + originalClassNamesValue = arg.value.raw; + if (originalClassNamesValue === "") { + return; + } + start = arg.range[0]; + end = arg.range[1]; + if (parentTemplateLiteral) { + if (parentTemplateLiteral.range[0] === start) { + start += 1; + } else { + start += 1; + } + if (parentTemplateLiteral.range[1] === end) { + end -= 1; + } else { + end -= 2; + } + } + break; + } + } + const arbitraryRegEx = /^(?.*)\[(?.*)\]$/i; + const { classNames } = ast_default.extractClassnamesFromValue(originalClassNamesValue); + const arbitraryClassnames = classNames.filter((c) => arbitraryRegEx.test(c)); + if (arbitraryClassnames.length === 0) { + return; + } + const unnecessaryArbitraryClasses = []; + const existingSubstitutes = []; + arbitraryClassnames.forEach((arbitraryClass, idx) => { + const parsed = groupMethods_default.parseClassname(arbitraryClass, [], mergedConfig2, idx); + const res = arbitraryRegEx.exec(parsed.name); + if (res && res.groups && res.groups.backBone && res.groups.arbitraryValue) { + const backBone = res.groups.backBone; + const arbitraryValue = res.groups.arbitraryValue; + const groupIdx = groupMethods_default.getGroupIndex(arbitraryClass, groups2, mergedConfig2.separator); + if ([groups2[groupIdx], parsed.body, arbitraryValue].includes(void 0)) { + return false; + } + const canBeNegative = groups2[groupIdx].indexOf("?") !== -1; + const isNegativeClass = parsed.body.indexOf("-") === 0; + const isNegativeValue = arbitraryValue.indexOf("-") === 0; + const configurationKey = configKeys[groupIdx]; + const configuration = mergedConfig2.theme[configurationKey]; + if ([void 0, null].includes(configuration)) { + return false; + } + const configurationKeys = Object.keys(configuration); + const zeroValueWithOrWithoutUnitsPattern = new RegExp(validZeroRegEx2, "i"); + const isZeroArbitraryValue = zeroValueWithOrWithoutUnitsPattern.test(arbitraryValue); + const negativeSubstitutes = []; + const matchingConfigurationKeys = configurationKeys.filter((key) => { + const configValue = configuration[key]; + if (isZeroArbitraryValue && zeroValueWithOrWithoutUnitsPattern.test(configValue)) { + negativeSubstitutes.push(false); + return true; + } + if (canBeNegative) { + const absoluteValue = isNegativeValue ? arbitraryValue.substring(1) : arbitraryValue; + const computedAsNegative = isNegativeClass !== isNegativeValue; + if (`${configValue}` === `${absoluteValue}`) { + negativeSubstitutes.push(computedAsNegative); + return true; + } + return false; + } + if (`${configValue}` === `${arbitraryValue}`) { + negativeSubstitutes.push(false); + return true; + } + return false; + }); + if (matchingConfigurationKeys.length) { + unnecessaryArbitraryClasses.push(parsed.name); + existingSubstitutes.push( + matchingConfigurationKeys.map((key, idx2) => { + let patchedBody = backBone.substring(parsed.variants.length); + patchedBody = patchedBody.charAt(0) === "-" ? patchedBody.substring(1) : patchedBody; + const noneOrMinus = negativeSubstitutes[idx2] ? "-" : ""; + if (key === "DEFAULT") { + return parsed.variants + noneOrMinus + patchedBody.substring(0, patchedBody.length - 1); + } + return parsed.variants + noneOrMinus + patchedBody + key; + }) + ); + } + } + }); + const fixables = {}; + unnecessaryArbitraryClasses.forEach((forbiddenClass, idx) => { + if (existingSubstitutes[idx].length === 1) { + const rangeKey = `s${start}e${end}`; + if (!fixables[rangeKey]) { + fixables[rangeKey] = []; + } + const fixer = { + unjustified: forbiddenClass, + substitute: existingSubstitutes[idx][0] + }; + fixables[rangeKey].push(fixer); + } else { + context.report({ + node, + messageId: "unnecessaryArbitraryValueDetected", + data: { + classname: forbiddenClass, + presets: existingSubstitutes[idx].join("' or '") + } + }); + } + }); + Object.keys(fixables).forEach((rangeKey) => { + const batchFixes = fixables[rangeKey]; + let patched = originalClassNamesValue; + const forbiddenClasses = []; + const substitutes = []; + for (let idx = 0; idx < batchFixes.length; idx++) { + const unjustified = batchFixes[idx].unjustified; + forbiddenClasses.push(unjustified); + const substitute = batchFixes[idx].substitute; + substitutes.push(substitute); + patched = patched.replace(unjustified, substitute); + } + context.report({ + node, + messageId: "unnecessaryArbitraryValueDetected", + data: { + classname: forbiddenClasses.join(", "), + presets: substitutes.join(", ") + }, + fix: function(fixer) { + return fixer.replaceTextRange([start, end], patched); + } + }); + }); + }; + const attributeVisitor = function(node) { + if (!ast_default.isClassAttribute(node, classRegex) || skipClassAttribute) { + return; + } + if (ast_default.isLiteralAttributeValue(node)) { + parseForArbitraryValues(node); + } else if (node.value && node.value.type === "JSXExpressionContainer") { + parseForArbitraryValues(node, node.value.expression); + } + }; + const callExpressionVisitor = function(node) { + const calleeStr = ast_default.calleeToString(node.callee); + if (callees.findIndex((name2) => calleeStr === name2) === -1) { + return; + } + node.arguments.forEach((arg) => { + parseForArbitraryValues(node, arg); + }); + }; + const scriptVisitor = { + JSXAttribute: attributeVisitor, + TextAttribute: attributeVisitor, + CallExpression: callExpressionVisitor, + TaggedTemplateExpression: function(node) { + if (!tags.includes(node.tag.name)) { + return; + } + parseForArbitraryValues(node, node.quasi); + } + }; + const templateVisitor = { + CallExpression: callExpressionVisitor, + /* + Tagged templates inside data bindings + https://github.com/vuejs/vue/issues/9721 + */ + VAttribute: function(node) { + switch (true) { + case !ast_default.isValidVueAttribute(node, classRegex): + return; + case ast_default.isVLiteralValue(node): + parseForArbitraryValues(node, null); + break; + case ast_default.isArrayExpression(node): + node.value.expression.elements.forEach((arg) => { + parseForArbitraryValues(node, arg); + }); + break; + case ast_default.isObjectExpression(node): + node.value.expression.properties.forEach((prop) => { + parseForArbitraryValues(node, prop); + }); + break; + } + } + }; + return parser_default.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); + } + }; + } +}); + +// src/rules/index.ts +var rules; +var init_rules2 = __esm({ + "src/rules/index.ts"() { + "use strict"; + init_classnames_order(); + init_enforces_negative_arbitrary_values(); + init_enforces_shorthand(); + init_migration_from_tailwind_2(); + init_no_arbitrary_value(); + init_no_contradicting_classname(); + init_no_custom_classname(); + init_no_unnecessary_arbitrary_value(); + rules = { + "classnames-order": classnames_order_default, + "enforces-negative-arbitrary-values": enforces_negative_arbitrary_values_default, + "enforces-shorthand": enforces_shorthand_default, + "migration-from-tailwind-2": migration_from_tailwind_2_default, + "no-arbitrary-value": no_arbitrary_value_default, + "no-contradicting-classname": no_contradicting_classname_default, + "no-custom-classname": no_custom_classname_default, + "no-unnecessary-arbitrary-value": no_unnecessary_arbitrary_value_default + }; + } +}); + +// package.json +var require_package = __commonJS({ + "package.json"(exports, module) { + module.exports = { + name: "eslint-plugin-tailwindcss", + version: "3.18.0", + description: "Rules enforcing best practices while using Tailwind CSS", + type: "module", + keywords: [ + "eslint", + "eslintplugin", + "eslint-plugin", + "tailwind", + "tailwindcss" + ], + author: "Fran\xE7ois Massart", + repository: { + type: "git", + url: "https://github.com/francoismassart/eslint-plugin-tailwindcss" + }, + homepage: "https://github.com/francoismassart/eslint-plugin-tailwindcss", + bugs: "https://github.com/francoismassart/eslint-plugin-tailwindcss/issues", + main: "lib/index.js", + scripts: { + test: "npm run test:base && npm run test:integration", + "test:base": 'mocha "tests/lib/**/*.js"', + "test:integration": 'mocha "tests/integrations/*.js" --timeout 60000', + build: "tsc --build", + "build:diagnostics": "tsc --build --diagnostics", + watch: "tsc --watch", + tsup: "tsup ./src/index.ts --outDir lib/", + "tsup:watch": "tsup ./src/index.ts --watch --outDir lib/", + "docs:init": "eslint-doc-generator --init-rule-docs", + "docs:update": "eslint-doc-generator" + }, + files: [ + "lib" + ], + peerDependencies: { + tailwindcss: "^4.0.0" + }, + dependencies: { + "@typescript-eslint/utils": "^7.13.0", + eslint: "^8.56.0", + "fast-glob": "^3.2.5", + postcss: "^8.4.4" + }, + devDependencies: { + "@angular-eslint/template-parser": "^15.2.0", + "@tailwindcss/aspect-ratio": "^0.4.2", + "@tailwindcss/forms": "^0.5.3", + "@tailwindcss/line-clamp": "^0.4.2", + "@tailwindcss/typography": "^0.5.8", + "@types/eslint": "^8.56.10", + "@types/jest": "^29.5.12", + "@types/node": "^18.12.0", + "@typescript-eslint/parser": "^7.13.0", + "@typescript-eslint/rule-tester": "^7.13.0", + autoprefixer: "^10.4.0", + daisyui: "^2.6.4", + eslint: "^8.57.0", + "eslint-doc-generator": "^1.7.1", + mocha: "^10.2.0", + semver: "^7.6.0", + tailwindcss: "^4.0.0", + tsup: "^8.1.0", + typescript: "^5.4.5", + "vue-eslint-parser": "^9.4.2" + }, + packageManager: "npm@10.2.5+sha256.8002e3e7305d2abd4016e1368af48d49b066c269079eeb10a56e7d6598acfdaa", + engines: { + node: ">=18.12.0" + }, + license: "MIT" + }; + } +}); + +// src/index.ts +var index_exports = {}; +__export(index_exports, { + default: () => index_default +}); +var name, version, plugin2, index_default; +var init_index = __esm({ + async "src/index.ts"() { + await init_configs(); + init_rules2(); + ({ name, version } = await Promise.resolve().then(() => __toESM(require_package(), 1))); + plugin2 = { + meta: { + name, + version + }, + rules, + configs + }; + index_default = plugin2; + } +}); +await init_index(); +export { + index_default as default +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/index.js.map b/lib/index.js.map new file mode 100644 index 00000000..dfc907ff --- /dev/null +++ b/lib/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/configs/rules.ts","../src/configs/flat-recommended.ts","../src/configs/recommended.ts","../src/configs/index.ts","../src/util/regex.ts","../src/util/removeDuplicatesFromArray.ts","../src/util/ast.ts","../src/util/customConfig.ts","../src/util/docsUrl.ts","../src/util/parser.ts","../src/util/prettier/order.ts","../src/util/removeDuplicatesFromClassnamesAndWhitespaces.ts","../src/util/settings.ts","../src/rules/classnames-order.ts","../src/util/types/angle.ts","../src/util/types/color.ts","../src/util/types/length.ts","../src/util/groupMethods.ts","../src/rules/enforces-negative-arbitrary-values.ts","../src/configs/groups.ts","../src/rules/enforces-shorthand.ts","../src/rules/migration-from-tailwind-2.ts","../src/rules/no-arbitrary-value.ts","../src/rules/no-contradicting-classname.ts","../src/util/cssFiles.ts","../src/util/generated.ts","../src/rules/no-custom-classname.ts","../src/rules/no-unnecessary-arbitrary-value.ts","../src/rules/index.ts","../package.json","../src/index.ts"],"sourcesContent":["/**\n * @fileoverview Default rules configuration\n * @author François Massart\n */\n\nexport default {\n 'tailwindcss/classnames-order': 'warn',\n 'tailwindcss/enforces-negative-arbitrary-values': 'warn',\n 'tailwindcss/enforces-shorthand': 'warn',\n 'tailwindcss/migration-from-tailwind-2': 'warn',\n 'tailwindcss/no-arbitrary-value': 'off',\n 'tailwindcss/no-custom-classname': 'warn',\n 'tailwindcss/no-contradicting-classname': 'error',\n 'tailwindcss/no-unnecessary-arbitrary-value': 'warn',\n};\n","/**\n * @fileoverview Recommended coniguration for flat style\n * @see https://eslint.org/docs/latest/use/configure/configuration-files-new\n * @author François Massart\n */\n'use strict';\n\nimport rules from './rules';\n\nconst plugin = await import('../index');\n\nexport default [\n {\n name: 'tailwindcss:base',\n plugins: {\n get tailwindcss() {\n return plugin;\n },\n },\n languageOptions: {\n parserOptions: {\n ecmaFeatures: {\n jsx: true,\n },\n },\n },\n },\n {\n name: 'tailwindcss:rules',\n rules,\n },\n];\n","/**\n * @fileoverview Recommended coniguration for legacy style\n * @see https://eslint.org/docs/latest/use/configure/configuration-files\n * @author François Massart\n */\n'use strict';\n\nimport rules from './rules';\n\nexport default {\n plugins: ['tailwindcss'],\n parserOptions: {\n ecmaFeatures: {\n jsx: true,\n },\n },\n rules,\n};\n","import flatRecommended from './flat-recommended';\nimport recommended from './recommended';\n\nexport const configs = {\n recommended,\n 'flat/recommended': flatRecommended,\n};\n","/**\n * Escapes a string to be used in a regular expression\n * Copied from https://stackoverflow.com/a/3561711.\n * @param {string} input\n * @returns {string}\n */\nfunction escapeRegex(input: string): string {\n return input.replace(/[/\\-\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nconst separatorRegEx = /([\\t\\n\\f\\r ]+)/;\n\nexport { escapeRegex, separatorRegEx };\n","'use strict';\n\nfunction removeDuplicatesFromArray(arr: Iterable | null | undefined) {\n return [...new Set(arr)];\n}\n\nexport default removeDuplicatesFromArray;\n","/**\n * @fileoverview Utility functions for AST\n */\n\n'use strict';\n\nimport { separatorRegEx } from './regex';\n// context.parserPath\n// /.../eslint-plugin-tailwindcss/node_modules/espree/espree.js\n// /.../eslint-plugin-tailwindcss/node_modules/@angular-eslint/template-parser/dist/index.js\n\nconst removeDuplicatesFromArray = require('./removeDuplicatesFromArray');\n\nfunction calleeToString(calleeNode) {\n if (calleeNode.type === 'Identifier') {\n return calleeNode.name;\n }\n if (calleeNode.type === 'MemberExpression') {\n return `${calleeNode.object.name}.${calleeNode.property.name}`;\n }\n}\n\n/**\n * Find out if node is `class` or `className`\n *\n * @param {ASTNode} node The AST node being checked\n * @param {String} classRegex Regex to test the attribute that is being checked against\n * @returns {Boolean}\n */\nfunction isClassAttribute(node, classRegex) {\n if (!node.name) {\n return false;\n }\n let name = '';\n switch (node.type) {\n case 'TextAttribute':\n name = node.name;\n break;\n case 'JSXAttribute':\n if (node.name.type === 'JSXNamespacedName') {\n const ns = node.name.namespace.name || '';\n name = (ns.length ? ns + ':' : '') + node.name.name.name;\n } else {\n name = node.name.name;\n }\n break;\n default:\n name = node.name.name;\n }\n return new RegExp(classRegex).test(name);\n}\n\n/**\n * Find out if node is `class`\n *\n * @param {ASTNode} node The AST node being checked\n * @param {String} classRegex Regex to test the attribute that is being checked against\n * @returns {Boolean}\n */\nfunction isVueClassAttribute(node, classRegex) {\n const re = new RegExp(classRegex);\n let name = '';\n switch (true) {\n case node.key && node.key.name && re.test(node.key.name):\n // class=\"vue-classes-as-litteral\"\n return true;\n case node.key &&\n node.key.name &&\n node.key.name.name &&\n node.key.argument &&\n node.key.argument.name &&\n /^bind$/.test(node.key.name.name) &&\n re.test(node.key.argument.name):\n // v-bind:class=\"vue-classes-as-bind\"\n // :class=\"vue-classes-as-bind\"\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Find out if node's value attribute is just simple text\n *\n * @param {ASTNode} node The AST node being checked\n * @returns {Boolean}\n */\nfunction isVLiteralValue(node) {\n return node.value && node.value.type === 'VLiteral';\n}\n\n/**\n * Find out if node's value attribute is an ArrayExpression\n *\n * @param {ASTNode} node The AST node being checked\n * @returns {Boolean}\n */\nfunction isArrayExpression(node) {\n return (\n node.value &&\n node.value.type === 'VExpressionContainer' &&\n node.value.expression &&\n node.value.expression.type === 'ArrayExpression'\n );\n}\n\n/**\n * Find out if node's value attribute is an ObjectExpression\n *\n * @param {ASTNode} node The AST node being checked\n * @returns {Boolean}\n */\nfunction isObjectExpression(node) {\n return (\n node.value &&\n node.value.type === 'VExpressionContainer' &&\n node.value.expression &&\n node.value.expression.type === 'ObjectExpression'\n );\n}\n\n/**\n * Find out if node's value attribute is just simple text\n *\n * @param {ASTNode} node The AST node being checked\n * @returns {Boolean}\n */\nfunction isVueValidAttributeValue(node) {\n switch (true) {\n case isVLiteralValue(node): // Simple string\n case isArrayExpression(node): // ['tw-unknown-class']\n case isObjectExpression(node): // {'tw-unknown-class': true}\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Find out if node's value attribute is just simple text\n *\n * @param {ASTNode} node The AST node being checked\n * @returns {Boolean}\n */\nfunction isLiteralAttributeValue(node) {\n if (node.type === 'TextAttribute' && node.name === 'class' && typeof node.value === 'string') {\n return true;\n }\n if (node.value) {\n switch (node.value.type) {\n case 'Literal':\n // No support for dynamic or conditional...\n return !/\\{|\\?|\\}/.test(node.value.value);\n case 'JSXExpressionContainer':\n // className={\"...\"}\n return node.value.expression.type === 'Literal';\n }\n }\n return false;\n}\n\n/**\n * Find out if the node is a valid candidate for our rules\n *\n * @param {ASTNode} node The AST node being checked\n * @param {String} classRegex Regex to test the attribute that is being checked against\n * @returns {Boolean}\n */\nfunction isValidJSXAttribute(node, classRegex) {\n if (!isClassAttribute(node, classRegex)) {\n // Only run for class[Name] attributes\n return false;\n }\n if (!isLiteralAttributeValue(node)) {\n // No support for dynamic or conditional classnames\n return false;\n }\n return true;\n}\n\n/**\n * Find out if the node is a valid candidate for our rules\n *\n * @param {ASTNode} node The AST node being checked\n * @param {String} classRegex Regex to test the attribute that is being checked against\n * @returns {Boolean}\n */\nfunction isValidVueAttribute(node, classRegex) {\n if (!isVueClassAttribute(node, classRegex)) {\n // Only run for class attributes\n return false;\n }\n if (!isVueValidAttributeValue(node)) {\n // No support for dynamic or conditional classnames\n return false;\n }\n return true;\n}\n\nfunction extractRangeFromNode(node) {\n if (node.type === 'TextAttribute' && node.name === 'class') {\n return [node.valueSpan.fullStart.offset, node.valueSpan.end.offset];\n }\n if (node.value === undefined) {\n return [0, 0];\n }\n switch (node.value.type) {\n case 'JSXExpressionContainer':\n return node.value.expression.range;\n default:\n return node.value.range;\n }\n}\n\nfunction extractValueFromNode(node) {\n if (node.type === 'TextAttribute' && node.name === 'class') {\n return node.value;\n }\n if (node.value === undefined) {\n return node.value;\n }\n\n switch (node.value.type) {\n case 'JSXExpressionContainer':\n return node.value.expression.value;\n case 'VExpressionContainer':\n switch (node.value.expression.type) {\n case 'ArrayExpression':\n return node.value.expression.elements;\n case 'ObjectExpression':\n return node.value.expression.properties;\n }\n return node.value.expression.value;\n default:\n return node.value.value;\n }\n}\n\nfunction extractClassnamesFromValue(classStr) {\n if (typeof classStr !== 'string') {\n return { classNames: [], whitespaces: [], headSpace: false, tailSpace: false };\n }\n let parts = classStr.split(separatorRegEx);\n if (parts[0] === '') {\n parts.shift();\n }\n if (parts[parts.length - 1] === '') {\n parts.pop();\n }\n let headSpace = separatorRegEx.test(parts[0]);\n let tailSpace = separatorRegEx.test(parts[parts.length - 1]);\n const isClass = (_, i) => (headSpace ? i % 2 !== 0 : i % 2 === 0);\n const isNotClass = (_, i) => (headSpace ? i % 2 === 0 : i % 2 !== 0);\n let classNames = parts.filter(isClass);\n let whitespaces = parts.filter(isNotClass);\n return { classNames: classNames, whitespaces: whitespaces, headSpace: headSpace, tailSpace: tailSpace };\n}\n\n/**\n * Inspect and parse an abstract syntax node and run a callback function\n *\n * @param {ASTNode} rootNode The current root node being parsed by eslint\n * @param {ASTNode} childNode The AST node child argument being checked\n * @param {Function} cb The callback function\n * @param {Boolean} skipConditional Optional, indicate distinct parsing for conditional nodes\n * @param {Boolean} isolate Optional, set internally to isolate parsing and validation on conditional children\n * @param {Array} ignoredKeys Optional, set object keys which should not be parsed e.g. for `cva`\n * @returns {void}\n */\nfunction parseNodeRecursive(rootNode, childNode, cb, skipConditional = false, isolate = false, ignoredKeys = []) {\n // TODO allow vue non litteral\n let originalClassNamesValue;\n let classNames;\n if (childNode === null) {\n originalClassNamesValue = extractValueFromNode(rootNode);\n ({ classNames } = extractClassnamesFromValue(originalClassNamesValue));\n classNames = removeDuplicatesFromArray(classNames);\n if (classNames.length === 0) {\n // Don't run for empty className\n return;\n }\n cb(classNames, rootNode);\n } else if (childNode === undefined) {\n // Ignore invalid child candidates (probably inside complex TemplateLiteral)\n return;\n } else {\n const forceIsolation = skipConditional ? true : isolate;\n let trim = false;\n switch (childNode.type) {\n case 'TemplateLiteral':\n childNode.expressions.forEach((exp) => {\n parseNodeRecursive(rootNode, exp, cb, skipConditional, forceIsolation, ignoredKeys);\n });\n childNode.quasis.forEach((quasis) => {\n parseNodeRecursive(rootNode, quasis, cb, skipConditional, isolate, ignoredKeys);\n });\n return;\n case 'ConditionalExpression':\n parseNodeRecursive(rootNode, childNode.consequent, cb, skipConditional, forceIsolation, ignoredKeys);\n parseNodeRecursive(rootNode, childNode.alternate, cb, skipConditional, forceIsolation, ignoredKeys);\n return;\n case 'LogicalExpression':\n parseNodeRecursive(rootNode, childNode.right, cb, skipConditional, forceIsolation, ignoredKeys);\n return;\n case 'ArrayExpression':\n childNode.elements.forEach((el) => {\n parseNodeRecursive(rootNode, el, cb, skipConditional, forceIsolation, ignoredKeys);\n });\n return;\n case 'ObjectExpression':\n childNode.properties.forEach((prop) => {\n const isUsedByClassNamesPlugin =\n (rootNode.callee && rootNode.callee.name === 'classnames') || rootNode.type === 'VAttribute';\n\n if (prop.type === 'SpreadElement') {\n // Ignore spread elements\n return;\n }\n\n if (prop.key.type === 'Identifier' && ignoredKeys.includes(prop.key.name)) {\n // Ignore specific keys defined in settings\n return;\n }\n\n parseNodeRecursive(\n rootNode,\n isUsedByClassNamesPlugin ? prop.key : prop.value,\n cb,\n skipConditional,\n forceIsolation,\n ignoredKeys\n );\n });\n return;\n case 'Property':\n parseNodeRecursive(rootNode, childNode.key, cb, skipConditional, forceIsolation, ignoredKeys);\n return;\n case 'Literal':\n trim = true;\n originalClassNamesValue = childNode.value;\n break;\n case 'TemplateElement':\n originalClassNamesValue = childNode.value.raw;\n break;\n }\n ({ classNames } = extractClassnamesFromValue(originalClassNamesValue));\n classNames = removeDuplicatesFromArray(classNames);\n if (classNames.length === 0) {\n // Don't run for empty className\n return;\n }\n const targetNode = isolate ? null : rootNode;\n cb(classNames, targetNode);\n }\n}\n\nfunction getTemplateElementPrefix(text, raw) {\n const idx = text.indexOf(raw);\n if (idx === 0) {\n return '';\n }\n return text.split(raw).shift();\n}\n\nfunction getTemplateElementSuffix(text, raw) {\n if (text.indexOf(raw) === -1) {\n return '';\n }\n return text.split(raw).pop();\n}\n\nfunction getTemplateElementBody(text, prefix, suffix) {\n let arr = text.split(prefix);\n arr.shift();\n let body = arr.join(prefix);\n arr = body.split(suffix);\n arr.pop();\n return arr.join(suffix);\n}\n\nexport default {\n calleeToString,\n extractRangeFromNode,\n extractValueFromNode,\n extractClassnamesFromValue,\n isClassAttribute,\n isLiteralAttributeValue,\n isArrayExpression,\n isObjectExpression,\n isValidJSXAttribute,\n isValidVueAttribute,\n isVLiteralValue,\n parseNodeRecursive,\n getTemplateElementPrefix,\n getTemplateElementSuffix,\n getTemplateElementBody,\n};\n","'use strict';\n\nimport fs from 'fs';\nimport path from 'path';\nimport resolveConfig from 'tailwindcss/resolveConfig';\nlet twLoadConfig: { loadConfig: (arg0: any) => any } | null;\n\ntry {\n twLoadConfig = require('tailwindcss/lib/lib/load-config');\n} catch (err) {\n twLoadConfig = null;\n}\n\nconst CHECK_REFRESH_RATE = 1_000;\nlet previousConfig: null = null;\nlet lastCheck: number | null = null;\nlet mergedConfig: null = null;\nlet lastModifiedDate: string | null = null;\n\n/**\n * @see https://stackoverflow.com/questions/9210542/node-js-require-cache-possible-to-invalidate\n * @param {string} module The path to the module\n * @returns the module's export\n */\nfunction requireUncached(module: string) {\n delete require.cache[require.resolve(module)];\n if (twLoadConfig === null) {\n // Using native loading\n return require(module);\n } else {\n // Using Tailwind CSS's loadConfig utility\n return twLoadConfig.loadConfig(module);\n }\n}\n\n/**\n * Load the config from a path string or parsed from an object\n * @param {string|Object} config\n * @returns `null` when unchanged, `{}` when not found\n */\nfunction loadConfig(config: string | null) {\n let loadedConfig = null;\n if (typeof config === 'string') {\n const resolvedPath = path.isAbsolute(config) ? config : path.join(path.resolve(), config);\n try {\n const stats = fs.statSync(resolvedPath);\n const mtime = `${stats.mtime || ''}`;\n if (stats === null) {\n // Default to no config\n loadedConfig = {};\n } else if (lastModifiedDate !== mtime) {\n // Load the config based on path\n lastModifiedDate = mtime;\n loadedConfig = requireUncached(resolvedPath);\n } else {\n // Unchanged config\n loadedConfig = null;\n }\n } catch (err) {\n // Default to no config\n loadedConfig = {};\n } finally {\n return loadedConfig;\n }\n } else {\n if (typeof config === 'object' && config !== null) {\n return config;\n }\n return {};\n }\n}\n\nfunction convertConfigToString(config: any) {\n switch (typeof config) {\n case 'string':\n return config;\n case 'object':\n return JSON.stringify(config);\n default:\n return config.toString();\n }\n}\n\nfunction resolve(twConfig: any) {\n const newConfig = convertConfigToString(twConfig) !== convertConfigToString(previousConfig);\n const now = Date.now();\n const expired = now - (lastCheck ?? 0) > CHECK_REFRESH_RATE;\n if (newConfig || expired) {\n previousConfig = twConfig;\n lastCheck = now;\n const userConfig = loadConfig(twConfig);\n // userConfig is null when config file was not modified\n if (userConfig !== null) {\n mergedConfig = resolveConfig(userConfig);\n }\n }\n return mergedConfig;\n}\n\nexport default {\n resolve,\n};\n","'use strict';\n\n// Copied from https://github.com/yannickcr/eslint-plugin-react/blob/master/lib/util/docsUrl.js\nfunction docsUrl(ruleName: string) {\n return `https://github.com/francoismassart/eslint-plugin-tailwindcss/tree/master/docs/rules/${ruleName}.md`;\n}\n\nexport default docsUrl;\n","/**\n * @see parserServices https://eslint.org/docs/developer-guide/working-with-rules#the-context-object\n * @param {Object} context\n * @param {Function} templateBodyVisitor\n * @param {Function} scriptVisitor\n * @returns\n */\nfunction defineTemplateBodyVisitor(context: object, templateBodyVisitor: Function, scriptVisitor: Function) {\n const parserServices = getParserServices(context);\n if (parserServices == null || parserServices.defineTemplateBodyVisitor == null) {\n // Default parser\n return scriptVisitor;\n }\n\n // Using \"vue-eslint-parser\" requires this setup\n // @see https://eslint.org/docs/developer-guide/working-with-rules#the-context-object\n return parserServices.defineTemplateBodyVisitor(templateBodyVisitor, scriptVisitor);\n}\n\n/**\n * This function is API compatible with eslint v8.x and eslint v9 or later.\n * @see https://eslint.org/blog/2023/09/preparing-custom-rules-eslint-v9/#from-context-to-sourcecode\n */\nfunction getParserServices(context: { sourceCode?: any; parserServices?: any }) {\n return context.sourceCode ? context.sourceCode.parserServices : context.parserServices;\n}\n\nexport default {\n defineTemplateBodyVisitor,\n};\n","import { separatorRegEx } from '../regex';\n\nfunction bigSign(bigIntValue: number) {\n return (bigIntValue > 0n) - (bigIntValue < 0n);\n}\n\nfunction prefixCandidate(context: { tailwindConfig: { prefix: any } }, selector: string) {\n let prefix = context.tailwindConfig.prefix;\n return typeof prefix === 'function' ? prefix(selector) : prefix + selector;\n}\n\n// Polyfill for older Tailwind CSS versions\nfunction getClassOrderPolyfill(classes: string[], { env }: { env: any }) {\n // A list of utilities that are used by certain Tailwind CSS utilities but\n // that don't exist on their own. This will result in them \"not existing\" and\n // sorting could be weird since you still require them in order to make the\n // host utitlies work properly. (Thanks Biology)\n let parasiteUtilities = new Set([prefixCandidate(env.context, 'group'), prefixCandidate(env.context, 'peer')]);\n\n let classNamesWithOrder = [];\n\n for (let className of classes) {\n let order = env.generateRules(new Set([className]), env.context).sort(([a], [z]) => bigSign(z - a))[0]?.[0] ?? null;\n\n if (order === null && parasiteUtilities.has(className)) {\n // This will make sure that it is at the very beginning of the\n // `components` layer which technically means 'before any\n // components'.\n order = env.context.layerOrder.components;\n }\n\n classNamesWithOrder.push([className, order]);\n }\n\n return classNamesWithOrder;\n}\n\nfunction sortClasses(classStr: string, { env, ignoreFirst = false, ignoreLast = false }: { env: { context: any } }) {\n if (typeof classStr !== 'string' || classStr === '') {\n return classStr;\n }\n\n // Ignore class attributes containing `{{`, to match Prettier behaviour:\n // https://github.com/prettier/prettier/blob/main/src/language-html/embed.js#L83-L88\n if (classStr.includes('{{')) {\n return classStr;\n }\n\n let result = '';\n let parts = classStr.split(separatorRegEx);\n let classes = parts.filter((_, i) => i % 2 === 0);\n let whitespace = parts.filter((_, i) => i % 2 !== 0);\n\n if (classes[classes.length - 1] === '') {\n classes.pop();\n }\n\n let prefix = '';\n if (ignoreFirst) {\n prefix = `${classes.shift() ?? ''}${whitespace.shift() ?? ''}`;\n }\n\n let suffix = '';\n if (ignoreLast) {\n suffix = `${whitespace.pop() ?? ''}${classes.pop() ?? ''}`;\n }\n\n let classNamesWithOrder = env.context.getClassOrder\n ? env.context.getClassOrder(classes)\n : getClassOrderPolyfill(classes, { env });\n\n classes = classNamesWithOrder\n .sort(([, a], [, z]) => {\n if (a === z) return 0;\n // if (a === null) return options.unknownClassPosition === 'start' ? -1 : 1\n // if (z === null) return options.unknownClassPosition === 'start' ? 1 : -1\n if (a === null) return -1;\n if (z === null) return 1;\n return bigSign(a - z);\n })\n .map(([className]) => className);\n\n for (let i = 0; i < classes.length; i++) {\n result += `${classes[i]}${whitespace[i] ?? ''}`;\n }\n\n return prefix + result + suffix;\n}\n\n/**\n *\n * @param {Array} unordered the unordered classnames\n * @param context\n * @returns {Array} the ordered classnames\n */\nfunction order(unordered: any[], context: any) {\n const sorted = sortClasses(unordered.join(' '), { env: { context: context } });\n return sorted;\n}\n\nexport default order;\n","'use strict';\n\nfunction removeDuplicatesFromClassnamesAndWhitespaces(\n orderedClassNames: string[],\n whitespaces: string[],\n headSpace: boolean,\n tailSpace: boolean\n) {\n let previous = orderedClassNames[0];\n const offset = (!headSpace && !tailSpace) || tailSpace ? -1 : 0;\n for (let i = 1; i < orderedClassNames.length; i++) {\n const cls = orderedClassNames[i];\n // This function assumes that the list of classNames is ordered, so just comparing to the previous className is enough\n if (cls === previous) {\n orderedClassNames.splice(i, 1);\n whitespaces.splice(i + offset, 1);\n i--;\n }\n previous = cls;\n }\n}\n\nexport default removeDuplicatesFromClassnamesAndWhitespaces;\n","'use strict';\nlet resolveDefaultConfigPathAlias: (() => any) | null;\n\ntry {\n const { resolveDefaultConfigPath } = require('tailwindcss/lib/util/resolveConfigPath');\n resolveDefaultConfigPathAlias = resolveDefaultConfigPath;\n} catch (err) {\n resolveDefaultConfigPathAlias = null;\n}\n\nfunction getOption(context, name: string) {\n // Options (defined at rule level)\n const options = context.options[0] || {};\n if (options[name] != undefined) {\n return options[name];\n }\n // Settings (defined at plugin level, shared accross rules)\n if (context.settings && context.settings.tailwindcss && context.settings.tailwindcss[name] != undefined) {\n return context.settings.tailwindcss[name];\n }\n // Fallback to defaults\n switch (name) {\n case 'callees':\n return ['classnames', 'clsx', 'ctl', 'cva', 'tv'];\n case 'ignoredKeys':\n return ['compoundVariants', 'defaultVariants'];\n case 'classRegex':\n return '^class(Name)?$';\n case 'config':\n if (resolveDefaultConfigPathAlias === null) {\n return 'tailwind.config.js';\n } else {\n return resolveDefaultConfigPathAlias();\n }\n case 'cssFiles':\n return ['**/*.css', '!**/node_modules', '!**/.*', '!**/dist', '!**/build'];\n case 'cssFilesRefreshRate':\n return 5_000;\n case 'removeDuplicates':\n return true;\n case 'skipClassAttribute':\n return false;\n case 'tags':\n return [];\n case 'whitelist':\n return [];\n }\n}\n\nexport default getOption;\n","/**\n * @fileoverview Use a consistent orders for the Tailwind CSS classnames, based on property then on variants\n * @author François Massart\n */\n'use strict';\n\nimport astUtil from '../util/ast';\nimport customConfig from '../util/customConfig';\nimport docsUrl from '../util/docsUrl';\nimport parserUtil from '../util/parser';\nimport order from '../util/prettier/order';\nimport removeDuplicatesFromClassnamesAndWhitespaces from '../util/removeDuplicatesFromClassnamesAndWhitespaces';\nimport getOption from '../util/settings';\nconst createContextFallback = require('tailwindcss/lib/lib/setupContextUtils').createContext;\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst INVALID_CLASSNAMES_ORDER_MSG = 'Invalid Tailwind CSS classnames order';\n\nconst contextFallbackCache = new WeakMap();\n\nexport default {\n meta: {\n docs: {\n description: 'Enforce a consistent and logical order of the Tailwind CSS classnames',\n category: 'Stylistic Issues',\n recommended: false,\n url: docsUrl('classnames-order'),\n },\n messages: {\n invalidOrder: INVALID_CLASSNAMES_ORDER_MSG,\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n removeDuplicates: {\n // default: true,\n type: 'boolean',\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n const removeDuplicates = getOption(context, 'removeDuplicates');\n\n const mergedConfig = customConfig.resolve(twConfig);\n const contextFallback = // Set the created contextFallback in the cache if it does not exist yet.\n (\n contextFallbackCache.has(mergedConfig)\n ? contextFallbackCache\n : contextFallbackCache.set(mergedConfig, createContextFallback(mergedConfig))\n ).get(mergedConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n /**\n * Recursive function crawling into child nodes\n * @param {ASTNode} node The root node of the current parsing\n * @param {ASTNode} arg The child node of node\n * @returns {void}\n */\n const sortNodeArgumentValue = (node, arg = null) => {\n let originalClassNamesValue = null;\n let start = null;\n let end = null;\n let prefix = '';\n let suffix = '';\n if (arg === null) {\n originalClassNamesValue = astUtil.extractValueFromNode(node);\n const range = astUtil.extractRangeFromNode(node);\n if (node.type === 'TextAttribute') {\n start = range[0];\n end = range[1];\n } else {\n start = range[0] + 1;\n end = range[1] - 1;\n }\n } else {\n switch (arg.type) {\n case 'Identifier':\n return;\n case 'TemplateLiteral':\n arg.expressions.forEach((exp) => {\n sortNodeArgumentValue(node, exp);\n });\n arg.quasis.forEach((quasis) => {\n sortNodeArgumentValue(node, quasis);\n });\n return;\n case 'ConditionalExpression':\n sortNodeArgumentValue(node, arg.consequent);\n sortNodeArgumentValue(node, arg.alternate);\n return;\n case 'LogicalExpression':\n sortNodeArgumentValue(node, arg.right);\n return;\n case 'ArrayExpression':\n arg.elements.forEach((el) => {\n sortNodeArgumentValue(node, el);\n });\n return;\n case 'ObjectExpression':\n const isUsedByClassNamesPlugin = node.callee && node.callee.name === 'classnames';\n const isVue = node.key && node.key.type === 'VDirectiveKey';\n arg.properties.forEach((prop) => {\n const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value;\n sortNodeArgumentValue(node, propVal);\n });\n return;\n case 'Property':\n sortNodeArgumentValue(node, arg.key);\n break;\n case 'Literal':\n originalClassNamesValue = arg.value;\n start = arg.range[0] + 1;\n end = arg.range[1] - 1;\n break;\n case 'TemplateElement':\n originalClassNamesValue = arg.value.raw;\n if (originalClassNamesValue === '') {\n return;\n }\n start = arg.range[0];\n end = arg.range[1];\n // https://github.com/eslint/eslint/issues/13360\n // The problem is that range computation includes the backticks (`test`)\n // but value.raw does not include them, so there is a mismatch.\n // start/end does not include the backticks, therefore it matches value.raw.\n const txt = context.getSourceCode().getText(arg);\n prefix = astUtil.getTemplateElementPrefix(txt, originalClassNamesValue);\n suffix = astUtil.getTemplateElementSuffix(txt, originalClassNamesValue);\n originalClassNamesValue = astUtil.getTemplateElementBody(txt, prefix, suffix);\n break;\n }\n }\n\n let { classNames, whitespaces, headSpace, tailSpace } =\n astUtil.extractClassnamesFromValue(originalClassNamesValue);\n\n if (classNames.length <= 1) {\n // Don't run sorting for a single or empty className\n return;\n }\n\n let orderedClassNames = order(classNames, contextFallback).split(' ');\n\n if (removeDuplicates) {\n removeDuplicatesFromClassnamesAndWhitespaces(orderedClassNames, whitespaces, headSpace, tailSpace);\n }\n\n // Generates the validated/sorted attribute value\n let validatedClassNamesValue = '';\n for (let i = 0; i < orderedClassNames.length; i++) {\n const w = whitespaces[i] ?? '';\n const cls = orderedClassNames[i];\n validatedClassNamesValue += headSpace ? `${w}${cls}` : `${cls}${w}`;\n if (headSpace && tailSpace && i === orderedClassNames.length - 1) {\n validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? '';\n }\n }\n\n if (originalClassNamesValue !== validatedClassNamesValue) {\n validatedClassNamesValue = prefix + validatedClassNamesValue + suffix;\n context.report({\n node: node,\n messageId: 'invalidOrder',\n fix: function (fixer) {\n return fixer.replaceTextRange([start, end], validatedClassNamesValue);\n },\n });\n }\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n sortNodeArgumentValue(node);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n sortNodeArgumentValue(node, node.value.expression);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n\n node.arguments.forEach((arg) => {\n sortNodeArgumentValue(node, arg);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n\n sortNodeArgumentValue(node, node.quasi);\n },\n };\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n sortNodeArgumentValue(node, null);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n sortNodeArgumentValue(node, arg);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n sortNodeArgumentValue(node, prop);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","const units = ['deg', 'grad', 'rad', 'turn'];\n\nconst mergedAngleValues = [\n `\\\\-?(\\\\d{1,}(\\\\.\\\\d{1,})?|\\\\.\\\\d{1,})(${units.join('|')})`,\n `calc\\\\(.{1,}\\\\)`,\n `var\\\\(\\\\-\\\\-[A-Za-z\\\\-]{1,}\\\\)`,\n];\n\nexport default {\n mergedAngleValues,\n};\n","const cssNamedColors = [\n 'indianred',\n 'lightcoral',\n 'salmon',\n 'darksalmon',\n 'lightsalmon',\n 'crimson',\n 'red',\n 'firebrick',\n 'darkred',\n 'pink',\n 'lightpink',\n 'hotpink',\n 'deeppink',\n 'mediumvioletred',\n 'palevioletred',\n 'coral',\n 'tomato',\n 'orangered',\n 'darkorange',\n 'orange',\n 'gold',\n 'yellow',\n 'lightyellow',\n 'lemonchiffon',\n 'lightgoldenrodyellow',\n 'papayawhip',\n 'moccasin',\n 'peachpuff',\n 'palegoldenrod',\n 'khaki',\n 'darkkhaki',\n 'lavender',\n 'thistle',\n 'plum',\n 'violet',\n 'orchid',\n 'fuchsia',\n 'magenta',\n 'mediumorchid',\n 'mediumpurple',\n 'blueviolet',\n 'darkviolet',\n 'darkorchid',\n 'darkmagenta',\n 'purple',\n 'rebeccapurple',\n 'indigo',\n 'mediumslateblue',\n 'slateblue',\n 'darkslateblue',\n 'greenyellow',\n 'chartreuse',\n 'lawngreen',\n 'lime',\n 'limegreen',\n 'palegreen',\n 'lightgreen',\n 'mediumspringgreen',\n 'springgreen',\n 'mediumseagreen',\n 'seagreen',\n 'forestgreen',\n 'green',\n 'darkgreen',\n 'yellowgreen',\n 'olivedrab',\n 'olive',\n 'darkolivegreen',\n 'mediumaquamarine',\n 'darkseagreen',\n 'lightseagreen',\n 'darkcyan',\n 'teal',\n 'aqua',\n 'cyan',\n 'lightcyan',\n 'paleturquoise',\n 'aquamarine',\n 'turquoise',\n 'mediumturquoise',\n 'darkturquoise',\n 'cadetblue',\n 'steelblue',\n 'lightsteelblue',\n 'powderblue',\n 'lightblue',\n 'skyblue',\n 'lightskyblue',\n 'deepskyblue',\n 'dodgerblue',\n 'cornflowerblue',\n 'royalblue',\n 'blue',\n 'mediumblue',\n 'darkblue',\n 'navy',\n 'midnightblue',\n 'cornsilk',\n 'blanchedalmond',\n 'bisque',\n 'navajowhite',\n 'wheat',\n 'burlywood',\n 'tan',\n 'rosybrown',\n 'sandybrown',\n 'goldenrod',\n 'darkgoldenrod',\n 'peru',\n 'chocolate',\n 'saddlebrown',\n 'sienna',\n 'brown',\n 'maroon',\n 'white',\n 'snow',\n 'honeydew',\n 'mintcream',\n 'azure',\n 'aliceblue',\n 'ghostwhite',\n 'whitesmoke',\n 'seashell',\n 'beige',\n 'oldlace',\n 'floralwhite',\n 'ivory',\n 'antiquewhite',\n 'linen',\n 'lavenderblush',\n 'mistyrose',\n 'gainsboro',\n 'lightgray',\n 'lightgrey',\n 'silver',\n 'darkgray',\n 'darkgrey',\n 'gray',\n 'grey',\n 'dimgray',\n 'dimgrey',\n 'lightslategray',\n 'lightslategrey',\n 'slategray',\n 'slategrey',\n 'darkslategray',\n 'darkslategrey',\n 'black',\n 'transparent',\n 'currentColor',\n];\n\n// RGB[A] hexa: #123456AA, #B4DA55, #000A, #123\nconst hexRGBA = '\\\\#(([0-9A-Fa-f]{8})|([0-9A-Fa-f]{6})|([0-9A-Fa-f]{4})|([0-9A-Fa-f]{3}))';\n\n// RGB 0-255: rgb(10,20,30)\nconst RGBIntegers = 'rgb\\\\(\\\\d{1,3}\\\\,\\\\d{1,3}\\\\,\\\\d{1,3}\\\\)';\n\n// RGB %: rgb(25%,50%,75%)\nconst RGBPercentages = 'rgb\\\\(\\\\d{1,3}%\\\\,\\\\d{1,3}%\\\\,\\\\d{1,3}%\\\\)';\n\n// RGBA: rgba(50,100,255,.5), rgba(50,100,255,50%)\nconst supportedRGBA = 'rgba\\\\(\\\\d{1,3}\\\\,\\\\d{1,3}\\\\,\\\\d{1,3}\\\\,\\\\d*(\\\\.\\\\d*)?%?\\\\)';\n\nconst RGBAPercentages = 'rgba\\\\(\\\\d{1,3}%\\\\,\\\\d{1,3}%\\\\,\\\\d{1,3}%\\\\,\\\\d*(\\\\.\\\\d*)?%?\\\\)';\n\nconst optionalColorPrefixedVar = '(color\\\\:)?var\\\\(\\\\-\\\\-[A-Za-z\\\\-]{1,}\\\\)';\n\nconst mandatoryColorPrefixed = 'color\\\\:(?!(hsla\\\\()).{1,}';\n\nconst notHSLAPlusWildcard = '(?!(hsla\\\\()).{1,}';\n\n// HSL\nconst supportedHSL = 'hsl\\\\(\\\\d{1,3}%?\\\\,\\\\d{1,3}%?\\\\,\\\\d{1,3}%?\\\\)';\n\n// 'hsla\\\\(\\\\d{1,3}%?\\\\,\\\\d{1,3}%?\\\\,\\\\d{1,3}%?\\\\,\\\\d*(\\\\.\\\\d*)?%?\\\\)',\n\nconst colorValues = [hexRGBA, RGBIntegers, RGBPercentages, supportedRGBA, supportedHSL];\n\nconst mergedColorValues = [...cssNamedColors, ...colorValues];\n\nexport default {\n cssNamedColors,\n colorValues,\n mergedColorValues,\n RGBAPercentages,\n optionalColorPrefixedVar,\n mandatoryColorPrefixed,\n notHSLAPlusWildcard,\n};\n","import removeDuplicatesFromArray from '../removeDuplicatesFromArray';\n\n// Units\nconst fontUnits = ['cap', 'ch', 'em', 'ex', 'ic', 'lh', 'rem', 'rlh'];\nconst viewportUnits = ['vb', 'vh', 'vi', 'vw', 'vmin', 'vmax'];\nconst absoluteUnits = ['px', 'mm', 'cm', 'in', 'pt', 'pc'];\nconst perInchUnits = ['lin', 'pt', 'mm'];\nconst otherUnits = ['%'];\nconst mergedUnits = removeDuplicatesFromArray([\n ...fontUnits,\n ...viewportUnits,\n ...absoluteUnits,\n ...perInchUnits,\n ...otherUnits,\n]);\nconst selectedUnits = mergedUnits.filter((el) => {\n // All units minus this blacklist\n return !['cap', 'ic', 'vb', 'vi'].includes(el);\n});\n\nconst absoluteValues = ['0', 'xx\\\\-small', 'x\\\\-small', 'small', 'medium', 'large', 'x\\\\-large', 'xx\\\\-large'];\nconst relativeValues = ['larger', 'smaller'];\nconst globalValues = ['inherit', 'initial', 'unset'];\nconst mergedValues = [...absoluteValues, ...relativeValues, ...globalValues];\n\nconst mergedLengthValues = [`\\\\-?\\\\d*\\\\.?\\\\d*(${mergedUnits.join('|')})`, ...mergedValues];\nmergedLengthValues.push('length\\\\:var\\\\(\\\\-\\\\-[a-z\\\\-]{1,}\\\\)');\n\nconst mergedUnitsRegEx = `\\\\[(\\\\d{1,}(\\\\.\\\\d{1,})?|(\\\\.\\\\d{1,})?)(${mergedUnits.join('|')})\\\\]`;\n\nconst selectedUnitsRegEx = `\\\\[(\\\\d{1,}(\\\\.\\\\d{1,})?|(\\\\.\\\\d{1,})?)(${selectedUnits.join('|')})\\\\]`;\n\nconst anyCalcRegEx = `\\\\[calc\\\\(.{1,}\\\\)\\\\]`;\n\nconst validZeroRegEx = `^(0(\\\\.0{1,})?|\\\\.0{1,})(${mergedUnits.join('|')})?$`;\n\nexport default {\n anyCalcRegEx,\n mergedLengthValues,\n mergedUnits,\n mergedUnitsRegEx,\n mergedValues,\n selectedUnits,\n selectedUnitsRegEx,\n validZeroRegEx,\n};\n","/**\n * @fileoverview Utilities used for grouping classnames\n */\n\n'use strict';\n\n// Ambiguous values\n// ================\n// Supported hints: length, color, angle, list\n// -------------------------------------------\n//\n// border-[color/width]\n// text-[color/size]\n// ring-[color/width]\n// ring-offset-[color/width]\n// stroke-[current/width]\n// bg-[color/(position/size)]\n//\n// font-[family/weight]\n\nimport angle from './types/angle';\nimport color from './types/color';\nimport length from './types/length';\n\n/**\n * Escape special chars for regular expressions\n *\n * @param {String} str Regular expression to be escaped\n * @returns {String} Escaped version\n */\nfunction escapeSpecialChars(str: string) {\n return str.replace(/\\W/g, '\\\\$&');\n}\n\n/**\n * Generates the opacity suffix based on config\n *\n * @param {Object} config Tailwind CSS Config\n * @returns {String} The suffix or an empty string\n */\nfunction generateOptionalOpacitySuffix(config: { theme: { [x: string]: {} } }) {\n const opacityKeys = !config.theme['opacity'] ? [] : Object.keys(config.theme['opacity']);\n opacityKeys.push('\\\\[(\\\\d*\\\\.?\\\\d*)%?\\\\]');\n return `(\\\\/(${opacityKeys.join('|')}))?`;\n}\n\n/**\n * Generate the possible options for the RegEx\n *\n * @param {String} propName The name of the prop e.g. textColor\n * @param {Array} keys Keys to be injected in the options\n * @param {Object} config Tailwind CSS Config\n * @param {Boolean} isNegative If the value is negative\n * @returns {String} Generated part of regex exposing the possible values\n */\nfunction generateOptions(\n propName: string | number,\n keys: any[],\n config: { darkMode: string | any[]; theme: { [x: string]: { [x: string]: any }; colors: { [x: string]: any } } },\n isNegative = false\n) {\n const opacitySuffixes = generateOptionalOpacitySuffix(config);\n const genericArbitraryOption = '\\\\[(.*)\\\\]';\n const defaultKeyIndex = keys.findIndex((v: string) => v === 'DEFAULT');\n if (defaultKeyIndex > -1) {\n keys.splice(defaultKeyIndex, 1);\n }\n const escapedKeys = keys.map((k: string) => escapeSpecialChars(k));\n switch (propName) {\n case 'dark':\n // Optional `dark` class\n if (config.darkMode === 'class') {\n return 'dark';\n } else if (Array.isArray(config.darkMode) && config.darkMode.length === 2 && config.darkMode[0] === 'class') {\n // https://tailwindcss.com/docs/dark-mode#customizing-the-class-name\n // For the sake of simplicity we only support a single class name\n let value = '';\n const res = /^\\.(?[A-Z0-9\\:\\-\\_\\[\\d\\]]*)$/gi.exec(config.darkMode[1]);\n if (res && res.groups) {\n if (res.groups.classnameValue) {\n value = res.groups.classnameValue;\n }\n }\n return value;\n } else {\n return '';\n }\n case 'arbitraryProperties':\n escapedKeys.push(genericArbitraryOption);\n return '(' + escapedKeys.join('|') + ')';\n case 'colors':\n case 'accentColor':\n case 'borderColor':\n case 'boxShadowColor':\n case 'divideColor':\n case 'fill':\n case 'outlineColor':\n case 'textColor':\n case 'stroke':\n case 'gradientColorStopPositions':\n // Colors can use segments like 'indigo' and 'indigo-light'\n // https://tailwindcss.com/docs/customizing-colors#color-object-syntax\n const options = [];\n keys.forEach((k: string) => {\n const color = config.theme[propName][k] || config.theme.colors[k];\n if (typeof color === 'string') {\n options.push(escapeSpecialChars(k) + opacitySuffixes);\n } else {\n const variants = Object.keys(color).map((colorKey) => escapeSpecialChars(colorKey));\n const defaultIndex = variants.findIndex((v) => v === 'DEFAULT');\n const hasDefault = defaultIndex > -1;\n if (hasDefault) {\n variants.splice(defaultIndex, 1);\n }\n options.push(k + '(\\\\-(' + variants.join('|') + '))' + (hasDefault ? '?' : '') + opacitySuffixes);\n }\n });\n const arbitraryColors = [...color.mergedColorValues];\n switch (propName) {\n case 'fill':\n // Forbidden prefixes\n arbitraryColors.push(`(?!(angle|length|list)\\:).{1,}`);\n break;\n case 'gradientColorStopPositions':\n arbitraryColors.push(color.RGBAPercentages); // RGBA % 0.5[%]\n arbitraryColors.push(color.optionalColorPrefixedVar);\n arbitraryColors.push(color.notHSLAPlusWildcard);\n break;\n case 'textColor':\n arbitraryColors.push(color.RGBAPercentages); // RGBA % 0.5[%]\n arbitraryColors.push(color.mandatoryColorPrefixed);\n break;\n default:\n arbitraryColors.push(color.mandatoryColorPrefixed);\n }\n options.push(`\\\\[(${arbitraryColors.join('|')})\\\\]`);\n return '(' + options.join('|') + ')';\n case 'borderSpacing':\n case 'borderWidth':\n case 'divideWidth':\n case 'fontSize':\n case 'outlineWidth':\n case 'outlineOffset':\n case 'ringWidth':\n case 'ringOffsetWidth':\n case 'textUnderlineOffset':\n escapedKeys.push(length.selectedUnitsRegEx);\n escapedKeys.push(length.anyCalcRegEx);\n // Mandatory `length:` prefix + wildcard\n escapedKeys.push(`\\\\[length\\\\:.{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'strokeWidth':\n escapedKeys.push(length.selectedUnitsRegEx);\n escapedKeys.push(length.anyCalcRegEx);\n // Mandatory `length:` prefix + calc + wildcard\n escapedKeys.push(`\\\\[length\\\\:calc\\\\(.{1,}\\\\)\\\\]`);\n // Mandatory `length:` prefix + wildcard + optional units\n escapedKeys.push(`\\\\[length\\\\:(.{1,})(${length.selectedUnits.join('|')})?\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'gap':\n case 'height':\n case 'lineHeight':\n case 'maxHeight':\n case 'size':\n case 'maxWidth':\n case 'minHeight':\n case 'minWidth':\n case 'padding':\n case 'width':\n case 'blur':\n case 'brightness':\n case 'contrast':\n case 'grayscale':\n case 'invert':\n case 'saturate':\n case 'sepia':\n case 'backdropBlur':\n case 'backdropBrightness':\n case 'backdropContrast':\n case 'backdropGrayscale':\n case 'backdropInvert':\n case 'backdropOpacity':\n case 'backdropSaturate':\n case 'backdropSepia':\n case 'transitionDuration':\n case 'transitionTimingFunction':\n case 'transitionDelay':\n case 'animation':\n case 'transformOrigin':\n case 'scale':\n case 'cursor':\n // All units\n escapedKeys.push(length.mergedUnitsRegEx);\n // Forbidden prefixes\n escapedKeys.push(`\\\\[(?!(angle|color|length|list)\\:).{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'backdropHueRotate':\n case 'hueRotate':\n case 'inset':\n case 'letterSpacing':\n case 'margin':\n case 'scrollMargin':\n case 'skew':\n case 'space':\n case 'textIndent':\n case 'translate':\n // All units\n escapedKeys.push(length.mergedUnitsRegEx);\n // Forbidden prefixes\n escapedKeys.push(`\\\\[(?!(angle|color|length|list)\\:).{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'backgroundOpacity':\n case 'borderOpacity':\n case 'opacity':\n case 'ringOpacity':\n // 0 ... .5 ... 1\n escapedKeys.push(`\\\\[(0(\\\\.\\\\d{1,})?|\\\\.\\\\d{1,}|1)\\\\]`);\n escapedKeys.push(length.anyCalcRegEx);\n // Unprefixed var()\n escapedKeys.push(`\\\\[var\\\\(\\\\-\\\\-[A-Za-z\\\\-]{1,}\\\\)\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'rotate':\n escapedKeys.push(`\\\\[(${angle.mergedAngleValues.join('|')})\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'gridTemplateColumns':\n case 'gridColumn':\n case 'gridColumnStart':\n case 'gridColumnEnd':\n case 'gridTemplateRows':\n case 'gridRow':\n case 'gridRowStart':\n case 'gridRowEnd':\n case 'gridAutoColumns':\n case 'gridAutoRows':\n // Forbidden prefixes\n escapedKeys.push(`\\\\[(?!(angle|color|length)\\:).{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'listStyleType':\n // Forbidden prefixes\n escapedKeys.push(`\\\\[(?!(angle|color|length|list)\\:).{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'objectPosition':\n // Forbidden prefixes\n escapedKeys.push(`\\\\[(?!(angle|color|length)\\:).{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'backgroundPosition':\n case 'boxShadow':\n case 'dropShadow':\n case 'transitionProperty':\n // Forbidden prefixes\n escapedKeys.push(`\\\\[(?!((angle|color|length|list)\\:)|#|var\\\\().{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'backgroundSize':\n // Forbidden prefixes\n escapedKeys.push(`\\\\[length\\:.{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'backgroundImageUrl':\n // Forbidden prefixes\n escapedKeys.push(`.{1,}`);\n return '(' + escapedKeys.join('|') + ')';\n case 'backgroundImage':\n // Forbidden prefixes\n escapedKeys.push(`\\\\[url\\\\(.{1,}\\\\)\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'order':\n case 'zIndex':\n escapedKeys.push(genericArbitraryOption);\n return '(' + escapedKeys.join('|') + ')';\n case 'fontWeight':\n case 'typography':\n case 'lineClamp':\n // Cannot be arbitrary?\n return '(' + escapedKeys.join('|') + ')';\n case 'aspectRatio':\n case 'flexGrow':\n case 'flexShrink':\n case 'fontFamily':\n case 'flex':\n case 'borderRadius':\n default:\n escapedKeys.push(genericArbitraryOption);\n return '(' + escapedKeys.join('|') + ')';\n }\n}\n\nconst cachedRegexes = new WeakMap();\n\n/**\n * Customize the regex based on config\n *\n * @param {String} re Regular expression\n * @param {Object} config The merged Tailwind CSS config\n * @returns {String} Patched version with config values and additional parameters\n */\nfunction patchRegex(re: string, config): string {\n if (!cachedRegexes.has(config)) {\n cachedRegexes.set(config, {});\n }\n const cache = cachedRegexes.get(config);\n if (re in cache) {\n return cache[re];\n }\n let patched = '\\\\!?';\n // Prefix\n if (config.prefix.length) {\n patched += escapeSpecialChars(config.prefix);\n }\n // Props\n let replaced = re;\n const propsRe = /\\$\\{(\\-?[a-z]*)\\}/gi;\n const res = replaced.matchAll(propsRe);\n const resArray = [...res];\n const props = resArray.map((arr) => arr[1]);\n if (props.length === 0) {\n return (cache[re] = `${patched}(${replaced})`);\n }\n // e.g. backgroundColor, letterSpacing, -margin...\n props.forEach((prop) => {\n const token = new RegExp('\\\\$\\\\{' + prop + '\\\\}');\n const isNegative = prop.substr(0, 1) === '-';\n const absoluteProp = isNegative ? prop.substr(1) : prop;\n if (prop === 'dark') {\n // Special case, not a default property from the theme\n replaced = replaced.replace(token, generateOptions(absoluteProp, [], config, isNegative));\n return `${patched}(${replaced})`;\n } else if (prop === 'arbitraryProperties') {\n // Special case\n replaced = replaced.replace(\n new RegExp('\\\\$\\\\{' + absoluteProp + '\\\\}'),\n generateOptions(absoluteProp, [], config, isNegative)\n );\n return `${patched}(${replaced})`;\n } else if (prop === 'backgroundImageUrl') {\n // Special case\n replaced = replaced.replace(new RegExp('\\\\$\\\\{' + prop + '\\\\}'), generateOptions(prop, [], config, false));\n return `${patched}(${replaced})`;\n } else if (!config.theme || !config.theme[absoluteProp]) {\n // prop not found in config\n return;\n }\n // Normal scenario\n const keys = Object.keys(config.theme[absoluteProp])\n .filter((key) => {\n if (isNegative) {\n // Negative prop cannot support NaN values and inherits positive values\n const val = config.theme[absoluteProp][key];\n const isCalc = typeof val === 'string' && val.indexOf('calc') === 0;\n const num = parseFloat(val);\n if (isCalc) {\n return true;\n }\n if (isNaN(num)) {\n return false;\n }\n } else if (key[0] === '-') {\n // Positive prop cannot use key starting with '-'\n return false;\n }\n return true;\n })\n .map((key) => {\n if (isNegative && key[0] === '-') {\n return key.substring(1);\n }\n return key;\n });\n if (keys.length === 0 || replaced.match(token) === null) {\n // empty array\n return;\n }\n const opts = generateOptions(absoluteProp, keys, config, isNegative);\n replaced = replaced.replace(token, opts);\n });\n return (cache[re] = `${patched}(${replaced})`);\n}\n\n/**\n * Generates a flatten array from the groups config\n *\n * @param {Array} groupsConfig The array of objects containing the regex\n * @param {Object} twConfig The merged config of Tailwind CSS\n * @returns {Array} Flatten array\n */\nfunction getGroups(groupsConfig: any[], twConfig = null) {\n const groups: any[] = [];\n groupsConfig.forEach((group: { members: any[] }) => {\n // e.g. SIZING or SPACING\n group.members.forEach((prop: { members: any[] }) => {\n // e.g. Width or Padding\n if (typeof prop.members === 'string') {\n // Unique property, like `width` limited to one value\n groups.push(prop.members);\n } else {\n // Multiple properties, like `padding`, `padding-top`...\n prop.members.forEach((subprop: { members: any }) => {\n groups.push(subprop.members);\n });\n }\n });\n });\n if (twConfig === null) {\n return groups;\n }\n return groups.map((re) => patchRegex(re, twConfig));\n}\n\n/**\n * Generates an array of empty arrays prior to grouping\n *\n * @param {Array} groups The array of objects containing the regex\n * @returns {Array} Array of empty arrays\n */\nfunction initGroupSlots(groups: any[]) {\n const slots: never[][] = [];\n groups.forEach((g: any) => slots.push([]));\n return slots;\n}\n\n/**\n * Searches for a match between classname and Tailwind CSS group\n *\n * @param {Array} name The target classname\n * @param {Array} arr The flatten array containing the regex\n * @param {String} separator The delimiter to be used between variants\n * @returns {Array} Array of empty arrays\n */\nfunction getGroupIndex(name: any, arr: any[], separator = ':') {\n const classSuffix = getSuffix(name, separator);\n let idx = arr.findIndex((pattern: any) => {\n const classRe = new RegExp(`^(${pattern})$`);\n return classRe.test(classSuffix);\n }, classSuffix);\n return idx;\n}\n\n/**\n * Generates a flatten array from the groups configKeys\n *\n * @param {Array} groupsConfig The array of objects containing the regex\n * @param {Object} twConfig The merged config of Tailwind CSS\n * @returns {Array} Flatten array\n */\nfunction getGroupConfigKeys(groupsConfig: any[]) {\n const groups: any[] = [];\n groupsConfig.forEach((group: { members: any[] }) => {\n // e.g. SIZING or SPACING\n group.members.forEach((prop: { members: any[]; configKey: any }) => {\n // e.g. Width or Padding\n if (typeof prop.members === 'string') {\n // Unique property, like `width` limited to one value\n groups.push(prop.configKey ? prop.configKey : null);\n } else {\n // Multiple properties, like `padding`, `padding-top`...\n prop.members.forEach((subprop: { configKey: any }) => {\n groups.push(subprop.configKey ? subprop.configKey : null);\n });\n }\n });\n });\n return groups;\n}\n\n/**\n * Returns the prefix (variants) of a className including the separator or an empty string if none\n *\n * @param {String} name Classname to be parsed\n * @param {String} separator The separator character as in config\n * @returns {String} The prefix\n */\nfunction getPrefix(name: string, separator: string | any[]) {\n const rootSeparator = String.raw`(? \"mask-type\"\n *\n * @see https://tailwindcss.com/docs/adding-custom-styles#arbitrary-properties\n * @param {String} name Classname suffix (without it variants) to be parsed\n * @param {String} separator The separator character as in config\n * @returns {String} The arbitrary property\n */\nfunction getArbitraryProperty(name: string, separator: any) {\n const arbitraryPropPattern = String.raw`^\\[([a-z\\-]*)${separator}\\.*`;\n const arbitraryPropRegExp = new RegExp(arbitraryPropPattern);\n const results = arbitraryPropRegExp.exec(name);\n return results === null ? '' : results[1];\n}\n\n/**\n * Get the last part of the full classname\n * e.g. \"lg:w-[100px]\" => \"w-[100px]\"\n *\n * @param {String} className The target classname\n * @param {String} separator The delimiter to be used between variants\n * @returns {String} The classname without its variants\n */\nfunction getSuffix(className: string, separator = ':') {\n const prefix = getPrefix(className, separator);\n return className.substring(prefix.length);\n}\n\n/**\n * Find the group of a classname\n *\n * @param {String} name Classname to be find using patterns (without modifiers)\n * @param {Array} group The group being tested\n * @param {Object} config Tailwind CSS config\n * @param {String} parentType The name of the parent group\n * @returns {Object} The infos\n */\nfunction findInGroup(name: string, group: { members: any[]; type: null | undefined }, config: any, parentType = null) {\n if (typeof group.members === 'string') {\n const pattern = patchRegex(group.members, config);\n const classRe = new RegExp(`^(${pattern})$`);\n if (classRe.test(name)) {\n const res = classRe.exec(name);\n let value = '';\n if (res && res.groups) {\n if (res.groups.value) {\n value = res.groups.value;\n }\n if (res.groups.negativeValue) {\n value = '-' + res.groups.negativeValue;\n }\n }\n return {\n group: parentType,\n ...group,\n value: value,\n };\n } else {\n return null;\n }\n } else {\n const innerGroup = group.members.find((v: any) => findInGroup(name, v, config, group.type));\n if (!innerGroup) {\n return null;\n } else {\n return findInGroup(name, innerGroup, config, group.type);\n }\n }\n}\n\n/**\n * Returns an object with parsed properties\n *\n * @param {String} name Classname to be parsed\n * @param {Array} arr The flatten array containing the regex\n * @param {Object} config The Tailwind CSS config\n * @param {Number} index The index\n * @returns {Object} Parsed infos\n */\nfunction parseClassname(name: string, arr: any[], config: { separator: string | undefined }, index = null) {\n const leadingRe = new RegExp('^(?\\\\s*)');\n const trailingRe = new RegExp('(?\\\\s*)$');\n let leading = '';\n let core = '';\n let trailing = '';\n const leadingRes = leadingRe.exec(name);\n if (leadingRes && leadingRes.groups) {\n leading = leadingRes.groups.leading || '';\n }\n const trailingRes = trailingRe.exec(name);\n if (trailingRes && trailingRes.groups) {\n trailing = trailingRes.groups.trailing || '';\n }\n core = name.substring(leading.length, name.length - trailing.length);\n const variants = getPrefix(core, config.separator);\n const classSuffix = getSuffix(core, config.separator);\n let slot = null;\n arr.forEach((group: any) => {\n if (slot === null) {\n const found = findInGroup(classSuffix, group, config);\n if (found) {\n slot = found;\n }\n }\n });\n const value = slot ? slot.value : '';\n const isNegative = value[0] === '-';\n const off = isNegative ? 1 : 0;\n const body = core.substr(0, core.length - value.length + off).substr(variants.length + off);\n return {\n index: index,\n name: core,\n variants: variants,\n parentType: slot ? slot.group : '',\n body: body,\n value: value,\n shorthand: slot && slot.shorthand ? slot.shorthand : '',\n leading: leading,\n trailing: trailing,\n important: body.substr(0, 1) === '!',\n };\n}\n\nexport default {\n initGroupSlots,\n getArbitraryProperty,\n getGroups,\n getGroupIndex,\n getGroupConfigKeys,\n getPrefix,\n getSuffix,\n parseClassname,\n};\n","/**\n * @fileoverview Warns about `-` prefixed classnames using arbitrary values\n * @author François Massart\n */\n'use strict';\n\nimport astUtil from '../util/ast';\nimport customConfig from '../util/customConfig';\nimport docsUrl from '../util/docsUrl';\nimport groupUtil from '../util/groupMethods';\nimport parserUtil from '../util/parser';\nimport getOption from '../util/settings';\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst NEGATIVE_ARBITRARY_VALUE = `Arbitrary value classname '{{classname}}' should not start with a dash (-)`;\n\nexport default {\n meta: {\n docs: {\n description: 'Warns about dash prefixed classnames using arbitrary values',\n category: 'Best Practices',\n recommended: true,\n url: docsUrl('enforces-negative-arbitrary-values'),\n },\n messages: {\n negativeArbitraryValue: NEGATIVE_ARBITRARY_VALUE,\n },\n fixable: null,\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n /**\n * Recursive function crawling into child nodes\n * @param {ASTNode} node The root node of the current parsing\n * @param {ASTNode} arg The child node of node\n * @returns {void}\n */\n const parseForNegativeArbitraryClassNames = (node, arg = null) => {\n let originalClassNamesValue = null;\n if (arg === null) {\n originalClassNamesValue = astUtil.extractValueFromNode(node);\n } else {\n switch (arg.type) {\n case 'Identifier':\n return;\n case 'TemplateLiteral':\n arg.expressions.forEach((exp) => {\n parseForNegativeArbitraryClassNames(node, exp);\n });\n arg.quasis.forEach((quasis) => {\n parseForNegativeArbitraryClassNames(node, quasis);\n });\n return;\n case 'ConditionalExpression':\n parseForNegativeArbitraryClassNames(node, arg.consequent);\n parseForNegativeArbitraryClassNames(node, arg.alternate);\n return;\n case 'LogicalExpression':\n parseForNegativeArbitraryClassNames(node, arg.right);\n return;\n case 'ArrayExpression':\n arg.elements.forEach((el) => {\n parseForNegativeArbitraryClassNames(node, el);\n });\n return;\n case 'ObjectExpression':\n const isUsedByClassNamesPlugin = node.callee && node.callee.name === 'classnames';\n const isVue = node.key && node.key.type === 'VDirectiveKey';\n arg.properties.forEach((prop) => {\n const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value;\n parseForNegativeArbitraryClassNames(node, propVal);\n });\n return;\n case 'Property':\n parseForNegativeArbitraryClassNames(node, arg.key);\n return;\n case 'Literal':\n originalClassNamesValue = arg.value;\n break;\n case 'TemplateElement':\n originalClassNamesValue = arg.value.raw;\n if (originalClassNamesValue === '') {\n return;\n }\n break;\n }\n }\n\n let { classNames } = astUtil.extractClassnamesFromValue(originalClassNamesValue);\n\n const detected = classNames.filter((cls) => {\n const suffix = groupUtil.getSuffix(cls, mergedConfig.separator);\n const negArbitraryValRegEx =\n /^\\-((inset|scale)(\\-(y|x))?|top|right|bottom|left|top|z|order|(scroll\\-)?m(y|x|t|r|l|b)?|(skew|space|translate)\\-(y|x)|rotate|tracking|indent|(backdrop\\-)?hue\\-rotate)\\-\\[.*\\]$/i;\n return negArbitraryValRegEx.test(suffix);\n });\n\n detected.forEach((className) => {\n context.report({\n node,\n messageId: 'negativeArbitraryValue',\n data: {\n classname: className,\n },\n });\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n parseForNegativeArbitraryClassNames(node);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n parseForNegativeArbitraryClassNames(node, node.value.expression);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n node.arguments.forEach((arg) => {\n parseForNegativeArbitraryClassNames(node, arg);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n parseForNegativeArbitraryClassNames(node, node.quasi);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n parseForNegativeArbitraryClassNames(node);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n parseForNegativeArbitraryClassNames(node, arg);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n parseForNegativeArbitraryClassNames(node, prop);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","/**\n * @fileoverview Default groups for Tailwind CSS classnames\n * @description The hierarchy of `members` can be useful to detect redundant and/or contradicting classnames\n * @version v3.1.3\n * @see https://tailwindcss.com/docs\n * @author François Massart\n */\nexport const groups = [\n {\n type: 'Core Concepts',\n members: [\n {\n type: 'Hover, Focus, & Other States',\n members: [\n {\n type: 'group',\n members: 'group',\n },\n {\n type: 'peer',\n members: 'peer',\n },\n ],\n },\n {\n type: 'Dark Mode',\n members: '${dark}',\n },\n {\n type: 'Arbitrary properties',\n members: '${arbitraryProperties}',\n },\n ],\n },\n {\n type: 'Layout',\n members: [\n {\n type: 'Aspect Ratio',\n members: 'aspect\\\\-(?${aspectRatio})',\n configKey: 'aspectRatio',\n },\n {\n type: 'Container',\n members: 'container',\n },\n {\n type: 'Columns',\n members: 'columns\\\\-(?${columns})',\n configKey: 'columns',\n },\n {\n type: 'Break After',\n members: 'break\\\\-after\\\\-(?auto|avoid|all|avoid\\\\-page|page|left|right|column)',\n },\n {\n type: 'Break Before',\n members: 'break\\\\-before\\\\-(?auto|avoid|all|avoid\\\\-page|page|left|right|column)',\n },\n {\n type: 'Break Inside',\n members: 'break\\\\-inside\\\\-(?auto|avoid|avoid\\\\-page|avoid\\\\-column)',\n },\n {\n type: 'Box Decoration Break',\n members: 'box\\\\-decoration\\\\-(?clone|slice)',\n },\n {\n type: 'Deprecated Box Decoration Break',\n members: 'decoration\\\\-(?clone|slice)',\n deprecated: true,\n },\n {\n type: 'Box Sizing',\n members: 'box\\\\-(?border|content)',\n },\n {\n type: 'Display',\n members:\n 'block|flex|grid|flow\\\\-root|contents|hidden|inline(\\\\-(block|flex|table|grid))?|table\\\\-(column|footer|header|row)\\\\-group|table(\\\\-(caption|row|cell|column))?|list\\\\-item',\n },\n {\n type: 'Floats',\n members: 'float\\\\-(?right|left|none)',\n },\n {\n type: 'Clear',\n members: 'clear\\\\-(?left|right|both|none)',\n },\n {\n type: 'Isolation',\n members: '(isolate|isolation\\\\-auto)',\n },\n {\n type: 'Object Fit',\n members: 'object\\\\-(?contain|cover|fill|none|scale\\\\-down)',\n },\n {\n type: 'Object Position',\n members: 'object\\\\-(?${objectPosition})',\n configKey: 'objectPosition',\n },\n {\n type: 'Overflow',\n members: [\n {\n type: 'overflow',\n members: 'overflow\\\\-(?auto|hidden|clip|visible|scroll)',\n shorthand: 'all',\n body: 'overflow',\n },\n {\n type: 'overflow-x',\n members: 'overflow\\\\-x\\\\-(?auto|hidden|clip|visible|scroll)',\n shorthand: 'x',\n body: 'overflow-x',\n },\n {\n type: 'overflow-y',\n members: 'overflow\\\\-y\\\\-(?auto|hidden|clip|visible|scroll)',\n shorthand: 'y',\n body: 'overflow-y',\n },\n ],\n },\n {\n type: 'Overscroll Behavior',\n members: [\n {\n type: 'overscroll',\n members: 'overscroll\\\\-(?auto|contain|none)',\n shorthand: 'all',\n body: 'overscroll',\n },\n {\n type: 'overscroll-x',\n members: 'overscroll\\\\-x\\\\-(?auto|contain|none)',\n shorthand: 'x',\n body: 'overscroll-x',\n },\n {\n type: 'overscroll-y',\n members: 'overscroll\\\\-y\\\\-(?auto|contain|none)',\n shorthand: 'y',\n body: 'overscroll-y',\n },\n ],\n },\n {\n type: 'Position',\n members: 'static|fixed|absolute|relative|sticky',\n },\n {\n type: 'Top / Right / Bottom / Left',\n members: [\n {\n type: 'inset',\n members: '(inset\\\\-(?${inset})|\\\\-inset\\\\-(?${-inset}))',\n shorthand: 'all',\n body: 'inset',\n configKey: 'inset',\n },\n {\n type: 'inset-y',\n members: '(inset\\\\-y\\\\-(?${inset})|\\\\-inset\\\\-y\\\\-(?${-inset}))',\n shorthand: 'y',\n body: 'inset-y',\n configKey: 'inset',\n },\n {\n type: 'inset-x',\n members: '(inset\\\\-x\\\\-(?${inset})|\\\\-inset\\\\-x\\\\-(?${-inset}))',\n shorthand: 'x',\n body: 'inset-x',\n configKey: 'inset',\n },\n {\n type: 'top',\n members: '(top\\\\-(?${inset})|\\\\-top\\\\-(?${-inset}))',\n shorthand: 't',\n body: 'top',\n configKey: 'inset',\n },\n {\n type: 'right',\n members: '(right\\\\-(?${inset})|\\\\-right\\\\-(?${-inset}))',\n shorthand: 'r',\n body: 'right',\n configKey: 'inset',\n },\n {\n type: 'bottom',\n members: '(bottom\\\\-(?${inset})|\\\\-bottom\\\\-(?${-inset}))',\n shorthand: 'b',\n body: 'bottom',\n configKey: 'inset',\n },\n {\n type: 'left',\n members: '(left\\\\-(?${inset})|\\\\-left\\\\-(?${-inset}))',\n shorthand: 'l',\n body: 'left',\n configKey: 'inset',\n },\n ],\n },\n {\n type: 'Visibility',\n members: '(in)?visible|collapse',\n },\n {\n type: 'Z-Index',\n members: '(z\\\\-(?${zIndex})|\\\\-z\\\\-(?${-zIndex}))',\n configKey: 'zIndex',\n },\n ],\n },\n {\n type: 'Flexbox & Grid',\n members: [\n {\n type: 'Flex Basis',\n members: 'basis\\\\-(?${flexBasis})',\n configKey: 'flexBasis',\n },\n {\n type: 'Flex Direction',\n members: 'flex\\\\-(row|col)(\\\\-reverse)?',\n },\n {\n type: 'Flex Wrap',\n members: 'flex\\\\-(wrap(\\\\-reverse)?|nowrap)',\n },\n {\n type: 'Flex',\n members: 'flex\\\\-(?${flex})',\n configKey: 'flex',\n },\n {\n type: 'Flex Grow',\n members: 'grow(\\\\-(?${flexGrow}))?',\n configKey: 'flexGrow',\n },\n {\n type: 'Deprecated Flex Grow',\n members: 'flex\\\\-grow(\\\\-(?${flexGrow}))?',\n deprecated: true,\n configKey: 'flexGrow',\n },\n {\n type: 'Flex Shrink',\n members: 'shrink(\\\\-(?${flexShrink}))?',\n configKey: 'flexShrink',\n },\n {\n type: 'Deprecated Flex Shrink',\n members: 'flex\\\\-shrink(\\\\-(?${flexShrink}))?',\n deprecated: true,\n configKey: 'flexShrink',\n },\n {\n type: 'Order',\n members: '(order\\\\-(?${order})|\\\\-order\\\\-(?${-order}))',\n configKey: 'order',\n },\n {\n type: 'Grid Template Columns',\n members: 'grid\\\\-cols\\\\-(?${gridTemplateColumns})',\n configKey: 'gridTemplateColumns',\n },\n {\n type: 'Grid Column Start / End',\n members: [\n {\n type: 'grid-column',\n members: 'col\\\\-(?${gridColumn})',\n configKey: 'gridColumn',\n },\n {\n type: 'grid-column-start',\n members: 'col\\\\-start\\\\-(?${gridColumnStart})',\n configKey: 'gridColumnStart',\n },\n {\n type: 'grid-column-end',\n members: 'col\\\\-end\\\\-(?${gridColumnEnd})',\n configKey: 'gridColumnEnd',\n },\n ],\n },\n {\n type: 'Grid Template Rows',\n members: 'grid\\\\-rows\\\\-(?${gridTemplateRows})',\n configKey: 'gridTemplateRows',\n },\n {\n type: 'Grid Row Start / End',\n members: [\n {\n type: 'grid-row',\n members: 'row\\\\-(?${gridRow})',\n configKey: 'gridRow',\n },\n {\n type: 'grid-row-start',\n members: 'row\\\\-start\\\\-(?${gridRowStart})',\n configKey: 'gridRowStart',\n },\n {\n type: 'grid-row-end',\n members: 'row\\\\-end\\\\-(?${gridRowEnd})',\n configKey: 'gridRowEnd',\n },\n ],\n },\n {\n type: 'Grid Auto Flow',\n members: 'grid\\\\-flow\\\\-(dense|(row|col)(\\\\-dense)?)',\n },\n {\n type: 'Grid Auto Columns',\n members: 'auto\\\\-cols\\\\-(?${gridAutoColumns})',\n configKey: 'gridAutoColumns',\n },\n {\n type: 'Grid Auto Rows',\n members: 'auto\\\\-rows\\\\-(?${gridAutoRows})',\n configKey: 'gridAutoRows',\n },\n {\n type: 'Gap',\n members: [\n {\n type: 'gap',\n members: 'gap\\\\-(?${gap})',\n shorthand: 'all',\n body: 'gap',\n configKey: 'gap',\n },\n {\n type: 'column-gap',\n members: 'gap\\\\-x\\\\-(?${gap})',\n shorthand: 'x',\n body: 'gap-x',\n configKey: 'gap',\n },\n {\n type: 'row-gap',\n members: 'gap\\\\-y\\\\-(?${gap})',\n shorthand: 'y',\n body: 'gap-y',\n configKey: 'gap',\n },\n ],\n },\n {\n type: 'Justify Content',\n members: 'justify\\\\-(start|end|center|between|around|evenly)',\n },\n {\n type: 'Justify Items',\n members: 'justify\\\\-items\\\\-(start|end|center|stretch)',\n },\n {\n type: 'Justify Self',\n members: 'justify\\\\-self\\\\-(auto|start|end|center|stretch)',\n },\n {\n type: 'Align Content',\n members: 'content\\\\-(center|start|end|between|around|evenly|baseline)',\n },\n {\n type: 'Align Items',\n members: 'items\\\\-(start|end|center|baseline|stretch)',\n },\n {\n type: 'Align Self',\n members: 'self\\\\-(auto|start|end|center|stretch|baseline)',\n },\n {\n type: 'Place Content',\n members: 'place\\\\-content\\\\-(center|start|end|between|around|evenly|stretch|baseline)',\n },\n {\n type: 'Place Items',\n members: 'place\\\\-items\\\\-(start|end|center|stretch|baseline)',\n },\n {\n type: 'Place Self',\n members: 'place\\\\-self\\\\-(auto|start|end|center|stretch)',\n },\n ],\n },\n {\n type: 'Spacing',\n members: [\n {\n type: 'Padding',\n members: [\n {\n type: 'p',\n members: 'p\\\\-(?${padding})',\n shorthand: 'all',\n body: 'p',\n configKey: 'padding',\n },\n {\n type: 'py',\n members: 'py\\\\-(?${padding})',\n shorthand: 'y',\n body: 'py',\n configKey: 'padding',\n },\n {\n type: 'px',\n members: 'px\\\\-(?${padding})',\n shorthand: 'x',\n body: 'px',\n configKey: 'padding',\n },\n {\n type: 'pt',\n members: 'pt\\\\-(?${padding})',\n shorthand: 't',\n body: 'pt',\n configKey: 'padding',\n },\n {\n type: 'pr',\n members: 'pr\\\\-(?${padding})',\n shorthand: 'r',\n body: 'pr',\n configKey: 'padding',\n },\n {\n type: 'pb',\n members: 'pb\\\\-(?${padding})',\n shorthand: 'b',\n body: 'pb',\n configKey: 'padding',\n },\n {\n type: 'pl',\n members: 'pl\\\\-(?${padding})',\n shorthand: 'l',\n body: 'pl',\n configKey: 'padding',\n },\n ],\n },\n {\n type: 'Margin',\n members: [\n {\n type: 'm',\n members: '(m\\\\-(?${margin})|\\\\-m\\\\-(?${-margin}))',\n shorthand: 'all',\n body: 'm',\n configKey: 'margin',\n },\n {\n type: 'my',\n members: '(my\\\\-(?${margin})|\\\\-my\\\\-(?${-margin}))',\n shorthand: 'y',\n body: 'my',\n configKey: 'margin',\n },\n {\n type: 'mx',\n members: '(mx\\\\-(?${margin})|\\\\-mx\\\\-(?${-margin}))',\n shorthand: 'x',\n body: 'mx',\n configKey: 'margin',\n },\n {\n type: 'mt',\n members: '(mt\\\\-(?${margin})|\\\\-mt\\\\-(?${-margin}))',\n shorthand: 't',\n body: 'mt',\n configKey: 'margin',\n },\n {\n type: 'mr',\n members: '(mr\\\\-(?${margin})|\\\\-mr\\\\-(?${-margin}))',\n shorthand: 'r',\n body: 'mr',\n configKey: 'margin',\n },\n {\n type: 'mb',\n members: '(mb\\\\-(?${margin})|\\\\-mb\\\\-(?${-margin}))',\n shorthand: 'b',\n body: 'mb',\n configKey: 'margin',\n },\n {\n type: 'ml',\n members: '(ml\\\\-(?${margin})|\\\\-ml\\\\-(?${-margin}))',\n shorthand: 'l',\n body: 'ml',\n configKey: 'margin',\n },\n ],\n },\n {\n type: 'Space Between',\n members: [\n {\n type: 'space-y',\n members: '(space\\\\-y\\\\-(?${space})|\\\\-space\\\\-y\\\\-(?${-space}))',\n configKey: 'space',\n },\n {\n type: 'space-x',\n members: '(space\\\\-x\\\\-(?${space})|\\\\-space\\\\-x\\\\-(?${-space}))',\n configKey: 'space',\n },\n {\n type: 'space-y-reverse',\n members: 'space\\\\-y\\\\-reverse',\n },\n {\n type: 'space-x-reverse',\n members: 'space\\\\-x\\\\-reverse',\n },\n ],\n },\n ],\n },\n {\n type: 'Sizing',\n members: [\n {\n type: 'Width',\n members: 'w\\\\-(?${width})',\n configKey: 'width',\n },\n {\n type: 'Min-Width',\n members: 'min\\\\-w\\\\-(?${minWidth})',\n configKey: 'minWidth',\n },\n {\n type: 'Max-Width',\n members: 'max\\\\-w\\\\-(?${maxWidth})',\n configKey: 'maxWidth',\n },\n {\n type: 'Height',\n members: 'h\\\\-(?${height})',\n configKey: 'height',\n },\n {\n type: 'Min-Height',\n members: 'min\\\\-h\\\\-(?${minHeight})',\n configKey: 'minHeight',\n },\n {\n type: 'Max-Height',\n members: 'max\\\\-h\\\\-(?${maxHeight})',\n configKey: 'maxHeight',\n },\n {\n type: 'Size',\n members: 'size\\\\-(?${size})',\n configKey: 'size',\n },\n ],\n },\n {\n type: 'Typography',\n members: [\n {\n type: 'Font Family',\n members: 'font\\\\-(?${fontFamily})',\n configKey: 'fontFamily',\n },\n {\n type: 'Font Size',\n members: 'text\\\\-(?${fontSize})',\n configKey: 'fontSize',\n },\n {\n type: 'Font Smoothing',\n members: '(subpixel\\\\-)?antialiased',\n },\n {\n type: 'Font Style',\n members: '(not\\\\-)?italic',\n },\n {\n type: 'Font Weight',\n members: 'font\\\\-(?${fontWeight})',\n configKey: 'fontWeight',\n },\n {\n type: 'Font Variant Numeric',\n members: [\n {\n type: 'Normal Nums',\n members: 'normal\\\\-nums',\n },\n {\n type: 'Ordinal',\n members: 'ordinal',\n },\n {\n type: 'Slashed Zero',\n members: 'slashed-zero',\n },\n {\n type: 'Style Nums',\n members: '(lining|oldstyle)\\\\-nums',\n },\n {\n type: 'Proportinal or Tabular',\n members: '(proportional|tabular)\\\\-nums',\n },\n {\n type: 'Fractions',\n members: '(diagonal|stacked)\\\\-fractions',\n },\n ],\n },\n {\n type: 'Letter Spacing',\n members: '(tracking\\\\-(?${letterSpacing})|\\\\-tracking\\\\-(?${-letterSpacing}))',\n configKey: 'letterSpacing',\n },\n // {\n // type: 'Line Clamp',\n // members: 'line\\\\-clamp\\\\-(?${lineClamp})',\n // configKey: 'lineClamp',\n // },\n {\n type: 'Line Height',\n members: 'leading\\\\-(?${lineHeight})',\n configKey: 'lineHeight',\n },\n // {\n // type: 'List Style Image',\n // members: 'list\\\\-image\\\\-(?${listStyleImage})',\n // configKey: 'listStyleImage',\n // },\n {\n type: 'List Style Type',\n members: 'list\\\\-(?${listStyleType})',\n configKey: 'listStyleType',\n },\n {\n type: 'List Style Position',\n members: 'list\\\\-(in|out)side',\n },\n {\n type: 'Text Alignment',\n members: 'text\\\\-(left|center|right|justify|start|end)',\n },\n {\n type: 'Text Color',\n members: 'text\\\\-(?${textColor})',\n configKey: 'colors',\n },\n {\n type: 'Text Decoration',\n members: '(no\\\\-)?underline|overline|line\\\\-through',\n },\n {\n type: 'Text Decoration Color',\n members: 'decoration\\\\-(?${colors})',\n configKey: 'colors',\n },\n {\n type: 'Text Decoration Style',\n members: 'decoration\\\\-(solid|double|dotted|dashed|wavy)',\n },\n {\n type: 'Text Decoration Thickness',\n members: 'decoration\\\\-(?${textDecorationThickness})',\n configKey: 'textDecorationThickness',\n },\n {\n type: 'Text Underline Offset',\n members: 'underline\\\\-offset\\\\-(?${textUnderlineOffset})',\n configKey: 'textUnderlineOffset',\n },\n {\n type: 'Text Transform',\n members: '(upper|lower|normal\\\\-)case|capitalize',\n },\n {\n type: 'Text Overflow',\n members: 'truncate|text\\\\-(ellipsis|clip)',\n },\n {\n type: 'Deprecated Text Overflow',\n members: 'overflow\\\\-(ellipsis|clip)',\n deprecated: true,\n },\n {\n type: 'Text Wrap',\n members: 'text\\\\-(wrap|nowrap|balance|pretty)',\n },\n {\n type: 'Text Indent',\n members: '(indent\\\\-(?${textIndent})|\\\\-indent\\\\-(?${-textIndent}))',\n configKey: 'textIndent',\n },\n {\n type: 'Vertical Alignment',\n members: 'align\\\\-(baseline|top|middle|bottom|text\\\\-(top|bottom)|sub|super)',\n },\n {\n type: 'Whitespace',\n members: 'whitespace\\\\-(normal|nowrap|pre(\\\\-(line|wrap))?)',\n },\n {\n type: 'Word Break',\n members: 'break\\\\-(normal|words|all|keep)',\n },\n {\n type: 'Content',\n members: 'content\\\\-(?${content})',\n configKey: 'content',\n },\n ],\n },\n {\n type: 'Backgrounds',\n members: [\n {\n type: 'Background Image URL',\n members: 'bg\\\\-\\\\[(image\\\\:|url\\\\()(?${backgroundImageUrl})\\\\)\\\\]',\n },\n {\n type: 'Background Attachment',\n members: 'bg\\\\-(fixed|local|scroll)',\n },\n {\n type: 'Background Clip',\n members: 'bg\\\\-clip\\\\-(border|padding|content|text)',\n },\n {\n type: 'Background Color',\n members: 'bg\\\\-(?${colors})',\n configKey: 'colors',\n },\n {\n type: 'Deprecated Background Opacity',\n members: 'bg\\\\-opacity\\\\-(?${backgroundOpacity})',\n deprecated: true,\n },\n {\n type: 'Background Origin',\n members: 'bg\\\\-origin\\\\-(border|padding|content)',\n },\n {\n type: 'Background Position',\n members: 'bg\\\\-(?${backgroundPosition})',\n configKey: 'backgroundPosition',\n },\n {\n type: 'Background Repeat',\n members: 'bg\\\\-(no\\\\-repeat|repeat(\\\\-(x|y|round|space))?)',\n },\n {\n type: 'Background Size',\n members: 'bg\\\\-(?${backgroundSize})',\n configKey: 'backgroundSize',\n },\n {\n type: 'Background Image',\n members: 'bg\\\\-(?${backgroundImage})',\n configKey: 'backgroundImage',\n },\n {\n type: 'Gradient Color Stops',\n members: [\n {\n type: 'from',\n members: 'from\\\\-(?${gradientColorStopPositions})',\n configKey: 'gradientColorStopPositions',\n },\n {\n type: 'via',\n members: 'via\\\\-(?${gradientColorStopPositions})',\n configKey: 'gradientColorStopPositions',\n },\n {\n type: 'to',\n members: 'to\\\\-(?${gradientColorStopPositions})',\n configKey: 'gradientColorStopPositions',\n },\n ],\n },\n ],\n },\n {\n type: 'Borders',\n members: [\n {\n type: 'Border Radius',\n members: [\n {\n type: 'border-radius',\n members: 'rounded(\\\\-(?${borderRadius}))?',\n shorthand: 'all',\n body: 'rounded',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-top',\n members: 'rounded\\\\-t(\\\\-(?${borderRadius}))?',\n shorthand: 't',\n body: 'rounded-t',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-right',\n members: 'rounded\\\\-r(\\\\-(?${borderRadius}))?',\n shorthand: 'r',\n body: 'rounded-r',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-bottom',\n members: 'rounded\\\\-b(\\\\-(?${borderRadius}))?',\n shorthand: 'b',\n body: 'rounded-b',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-left',\n members: 'rounded\\\\-l(\\\\-(?${borderRadius}))?',\n shorthand: 'l',\n body: 'rounded-l',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-top-left',\n members: 'rounded\\\\-tl(\\\\-(?${borderRadius}))?',\n shorthand: 'tl',\n body: 'rounded-tl',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-top-right',\n members: 'rounded\\\\-tr(\\\\-(?${borderRadius}))?',\n shorthand: 'tr',\n body: 'rounded-tr',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-bottom-right',\n members: 'rounded\\\\-br(\\\\-(?${borderRadius}))?',\n shorthand: 'br',\n body: 'rounded-br',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-bottom-left',\n members: 'rounded\\\\-bl(\\\\-(?${borderRadius}))?',\n shorthand: 'bl',\n body: 'rounded-bl',\n configKey: 'borderRadius',\n },\n ],\n },\n {\n type: 'Border Width',\n members: [\n {\n type: 'border-width',\n members: 'border(\\\\-(?${borderWidth}))?',\n shorthand: 'all',\n body: 'border',\n configKey: 'borderWidth',\n },\n {\n type: 'border-y-width',\n members: 'border\\\\-y(\\\\-(?${borderWidth}))?',\n shorthand: 'y',\n body: 'border-y',\n configKey: 'borderWidth',\n },\n {\n type: 'border-x-width',\n members: 'border\\\\-x(\\\\-(?${borderWidth}))?',\n shorthand: 'x',\n body: 'border-x',\n configKey: 'borderWidth',\n },\n {\n type: 'border-top-width',\n members: 'border\\\\-t(\\\\-(?${borderWidth}))?',\n shorthand: 't',\n body: 'border-t',\n configKey: 'borderWidth',\n },\n {\n type: 'border-right-width',\n members: 'border\\\\-r(\\\\-(?${borderWidth}))?',\n shorthand: 'r',\n body: 'border-r',\n configKey: 'borderWidth',\n },\n {\n type: 'border-bottom-width',\n members: 'border\\\\-b(\\\\-(?${borderWidth}))?',\n shorthand: 'b',\n body: 'border-b',\n configKey: 'borderWidth',\n },\n {\n type: 'border-left-width',\n members: 'border\\\\-l(\\\\-(?${borderWidth}))?',\n shorthand: 'l',\n body: 'border-l',\n configKey: 'borderWidth',\n },\n ],\n },\n {\n type: 'Border Color',\n members: [\n {\n type: 'border-color',\n members: 'border\\\\-(?${borderColor})',\n shorthand: 'all',\n body: 'border',\n configKey: 'borderColor',\n },\n {\n type: 'border-y-color',\n members: 'border\\\\-y\\\\-(?${borderColor})',\n shorthand: 'y',\n body: 'border-y',\n configKey: 'borderColor',\n },\n {\n type: 'border-x-color',\n members: 'border\\\\-x\\\\-(?${borderColor})',\n shorthand: 'x',\n body: 'border-x',\n configKey: 'borderColor',\n },\n {\n type: 'border-top-color',\n members: 'border\\\\-t\\\\-(?${borderColor})',\n shorthand: 't',\n body: 'border-t',\n configKey: 'borderColor',\n },\n {\n type: 'border-right-color',\n members: 'border\\\\-r\\\\-(?${borderColor})',\n shorthand: 'r',\n body: 'border-r',\n configKey: 'borderColor',\n },\n {\n type: 'border-bottom-color',\n members: 'border\\\\-b\\\\-(?${borderColor})',\n shorthand: 'b',\n body: 'border-b',\n configKey: 'borderColor',\n },\n {\n type: 'border-left-color',\n members: 'border\\\\-l\\\\-(?${borderColor})',\n shorthand: 'l',\n body: 'border-l',\n configKey: 'borderColor',\n },\n ],\n },\n {\n type: 'Deprecated Border Opacity',\n members: 'border\\\\-opacity\\\\-(?${borderOpacity})',\n deprecated: true,\n configKey: 'borderOpacity',\n },\n {\n type: 'Border Style',\n members: 'border\\\\-(solid|dashed|dotted|double|hidden|none)',\n },\n {\n type: 'Divide Width',\n members: [\n {\n type: 'divide-y',\n members: 'divide\\\\-y(\\\\-(?${divideWidth}))?',\n configKey: 'divideWidth',\n },\n {\n type: 'divide-x',\n members: 'divide\\\\-x(\\\\-(?${divideWidth}))?',\n configKey: 'divideWidth',\n },\n {\n type: 'divide-y-reverse',\n members: 'divide\\\\-y\\\\-reverse',\n },\n {\n type: 'divide-x-reverse',\n members: 'divide\\\\-x\\\\-reverse',\n },\n ],\n },\n {\n type: 'Divide Color',\n members: 'divide\\\\-(?${divideColor})',\n configKey: 'divideColor',\n },\n {\n type: 'Divide Style',\n members: 'divide\\\\-(solid|dashed|dotted|double|none)',\n },\n {\n type: 'Outline Width',\n members: 'outline\\\\-(?${outlineWidth})',\n configKey: 'outlineWidth',\n },\n {\n type: 'Outline Color',\n members: 'outline\\\\-(?${outlineColor})',\n configKey: 'outlineColor',\n },\n {\n type: 'Outline Style',\n members: 'outline(\\\\-(none|dashed|dotted|double|hidden))?',\n },\n {\n type: 'Outline Offset',\n members:\n '(outline\\\\-offset\\\\-(?${outlineOffset})|\\\\-outline\\\\-offset\\\\-(?${-outlineOffset}))',\n configKey: 'outlineOffset',\n },\n {\n type: 'Ring Width',\n members: [\n {\n type: 'ring',\n members: 'ring(\\\\-(?${ringWidth}))?',\n configKey: 'ringWidth',\n },\n ],\n },\n {\n type: 'Ring Inset',\n members: [\n {\n type: 'ring-inset',\n members: 'ring\\\\-inset',\n },\n ],\n },\n {\n type: 'Ring Color',\n members: 'ring\\\\-(?${colors})',\n configKey: 'colors',\n },\n {\n type: 'Deprecated Ring Opacity',\n members: 'ring\\\\-opacity\\\\-(?${ringOpacity})',\n deprecated: true,\n configKey: 'ringOpacity',\n },\n {\n type: 'Ring Offset Width',\n members: 'ring\\\\-offset\\\\-(?${ringOffsetWidth})',\n configKey: 'ringOffsetWidth',\n },\n {\n type: 'Ring Offset Color',\n members: 'ring\\\\-offset\\\\-(?${colors})',\n configKey: 'colors',\n },\n ],\n },\n {\n type: 'Effects',\n members: [\n {\n type: 'Box Shadow',\n members: 'shadow(\\\\-(?${boxShadow}))?',\n configKey: 'boxShadow',\n },\n {\n type: 'Box Shadow Color',\n members: 'shadow(\\\\-(?${boxShadowColor}))?',\n configKey: 'boxShadowColor',\n },\n {\n type: 'Opacity',\n members: 'opacity\\\\-(?${opacity})',\n configKey: 'opacity',\n },\n {\n type: 'Mix Blend Mode',\n members:\n 'mix\\\\-blend\\\\-(normal|multiply|screen|overlay|darken|lighten|color\\\\-(burn|dodge)|(hard|soft)\\\\-light|difference|exclusion|hue|saturation|color|luminosity|plus\\\\-lighter)',\n },\n {\n type: 'Background Blend Mode',\n members:\n 'bg\\\\-blend\\\\-(normal|multiply|screen|overlay|darken|lighten|color\\\\-(dodge|burn)|(hard|soft)\\\\-light|difference|exclusion|hue|saturation|color|luminosity)',\n },\n ],\n },\n {\n type: 'Filters',\n members: [\n {\n type: 'Deprecated Filter',\n members: 'filter',\n deprecated: true,\n },\n {\n type: 'Blur',\n members: 'blur(\\\\-(?${blur}))?',\n configKey: 'blur',\n },\n {\n type: 'Brightness',\n members: 'brightness\\\\-(?${brightness})',\n configKey: 'brightness',\n },\n {\n type: 'Contrast',\n members: 'contrast\\\\-(?${contrast})',\n configKey: 'contrast',\n },\n {\n type: 'Drop Shadow',\n members: 'drop\\\\-shadow(\\\\-(?${dropShadow}))?',\n configKey: 'dropShadow',\n },\n {\n type: 'Grayscale',\n members: 'grayscale(\\\\-(?${grayscale}))?',\n configKey: 'grayscale',\n },\n {\n type: 'Hue Rotate',\n members: 'hue\\\\-rotate\\\\-(?${hueRotate})|\\\\-hue\\\\-rotate\\\\-(?${-hueRotate})',\n configKey: 'hueRotate',\n },\n {\n type: 'Invert',\n members: 'invert(\\\\-(?${invert}))?',\n configKey: 'invert',\n },\n {\n type: 'Saturate',\n members: 'saturate\\\\-(?${saturate})',\n configKey: 'saturate',\n },\n {\n type: 'Sepia',\n members: 'sepia(\\\\-(?${sepia}))?',\n configKey: 'sepia',\n },\n {\n type: 'Backdrop Blur',\n members: 'backdrop\\\\-blur(\\\\-(?${backdropBlur}))?',\n configKey: 'backdropBlur',\n },\n {\n type: 'Backdrop Brightness',\n members: 'backdrop\\\\-brightness\\\\-(?${backdropBrightness})',\n configKey: 'backdropBrightness',\n },\n {\n type: 'Backdrop Contrast',\n members: 'backdrop\\\\-contrast\\\\-(?${backdropContrast})',\n configKey: 'backdropContrast',\n },\n {\n type: 'Backdrop Grayscale',\n members: 'backdrop\\\\-grayscale(\\\\-(?${backdropGrayscale}))?',\n configKey: 'backdropGrayscale',\n },\n {\n type: 'Backdrop Hue Rotate',\n members:\n 'backdrop\\\\-hue\\\\-rotate\\\\-(?${backdropHueRotate})|\\\\-backdrop\\\\-hue\\\\-rotate\\\\-(?${-backdropHueRotate})',\n configKey: 'backdropHueRotate',\n },\n {\n type: 'Backdrop Invert',\n members: 'backdrop\\\\-invert(\\\\-(?${backdropInvert}))?',\n configKey: 'backdropInvert',\n },\n {\n type: 'Backdrop Opacity',\n members: 'backdrop\\\\-opacity\\\\-(?${backdropOpacity})',\n configKey: 'backdropOpacity',\n },\n {\n type: 'Backdrop Saturate',\n members: 'backdrop\\\\-saturate\\\\-(?${backdropSaturate})',\n configKey: 'backdropSaturate',\n },\n {\n type: 'Backdrop Sepia',\n members: 'backdrop\\\\-sepia(\\\\-(?${backdropSepia}))?',\n configKey: 'backdropSepia',\n },\n ],\n },\n {\n type: 'Tables',\n members: [\n {\n type: 'Border Collapse',\n members: 'border\\\\-(collapse|separate)',\n },\n {\n type: 'Border Spacing',\n members: [\n {\n type: 'border-spacing',\n members: 'border\\\\-spacing\\\\-(?${borderSpacing})',\n shorthand: 'all',\n body: 'border-spacing',\n configKey: 'borderSpacing',\n },\n {\n type: 'border-spacing-x',\n members: 'border\\\\-spacing\\\\-x\\\\-(?${borderSpacing})',\n shorthand: 'x',\n body: 'border-spacing-x',\n configKey: 'borderSpacing',\n },\n {\n type: 'border-spacing-y',\n members: 'border\\\\-spacing\\\\-y\\\\-(?${borderSpacing})',\n shorthand: 'y',\n body: 'border-spacing-y',\n configKey: 'borderSpacing',\n },\n ],\n },\n {\n type: 'Table Layout',\n members: 'table\\\\-(auto|fixed)',\n },\n ],\n },\n {\n type: 'Transitions & Animation',\n members: [\n {\n type: 'Transition Property',\n members: 'transition(\\\\-(?${transitionProperty}))?',\n configKey: 'transitionProperty',\n },\n {\n type: 'Transition Duration',\n members: 'duration(\\\\-(?${transitionDuration}))?',\n configKey: 'transitionDuration',\n },\n {\n type: 'Transition Timing Function',\n members: 'ease(\\\\-(?${transitionTimingFunction}))?',\n configKey: 'transitionTimingFunction',\n },\n {\n type: 'Transition Delay',\n members: 'delay\\\\-(?${transitionDelay})',\n configKey: 'transitionDelay',\n },\n {\n type: 'Animation',\n members: 'animate\\\\-(?${animation})',\n configKey: 'animation',\n },\n ],\n },\n {\n type: 'Transforms',\n members: [\n {\n type: 'Transform GPU',\n members: [\n {\n type: 'transform-gpu',\n members: 'transform\\\\-gpu',\n },\n ],\n },\n {\n type: 'Transform None',\n members: [\n {\n type: 'transform-none',\n members: 'transform\\\\-none',\n },\n ],\n },\n {\n type: 'Deprecated Transform',\n members: [\n {\n type: 'transform',\n members: 'transform',\n deprecated: true,\n },\n ],\n },\n {\n type: 'Scale',\n members: [\n {\n type: 'scale',\n members: 'scale\\\\-(?${scale})|\\\\-scale\\\\-(?${-scale})',\n shorthand: 'all',\n body: 'scale',\n configKey: 'scale',\n },\n {\n type: 'scale-y',\n members: 'scale\\\\-y\\\\-(?${scale})|\\\\-scale\\\\-y\\\\-(?${-scale})',\n shorthand: 'y',\n body: 'scale-y',\n configKey: 'scale',\n },\n {\n type: 'scale-x',\n members: 'scale\\\\-x\\\\-(?${scale})|\\\\-scale\\\\-x\\\\-(?${-scale})',\n shorthand: 'x',\n body: 'scale-x',\n configKey: 'scale',\n },\n ],\n },\n {\n type: 'Rotate',\n members: '(rotate\\\\-(?${rotate})|\\\\-rotate\\\\-(?${-rotate}))',\n configKey: 'rotate',\n },\n {\n type: 'Translate',\n members: [\n {\n type: 'translate-x',\n members: '(translate\\\\-x\\\\-(?${translate})|\\\\-translate\\\\-x\\\\-(?${-translate}))',\n configKey: 'translate',\n },\n {\n type: 'translate-y',\n members: '(translate\\\\-y\\\\-(?${translate})|\\\\-translate\\\\-y\\\\-(?${-translate}))',\n configKey: 'translate',\n },\n ],\n },\n {\n type: 'Skew',\n members: [\n {\n type: 'skew-x',\n members: '(skew\\\\-x\\\\-(?${skew})|\\\\-skew\\\\-x\\\\-(?${-skew}))',\n configKey: 'skew',\n },\n {\n type: 'skew-y',\n members: '(skew\\\\-y\\\\-(?${skew})|\\\\-skew\\\\-y\\\\-(?${-skew}))',\n configKey: 'skew',\n },\n ],\n },\n {\n type: 'Transform Origin',\n members: 'origin\\\\-(?${transformOrigin})',\n configKey: 'transformOrigin',\n },\n ],\n },\n {\n type: 'Interactivity',\n members: [\n {\n type: 'Accent Color',\n members: 'accent\\\\-(?${accentColor})',\n configKey: 'accentColor',\n },\n {\n type: 'Appearance',\n members: 'appearance\\\\-none',\n },\n {\n type: 'Cursor',\n members: 'cursor\\\\-(?${cursor})',\n configKey: 'cursor',\n },\n {\n type: 'Caret Color',\n members: 'caret\\\\-(?${colors})',\n configKey: 'colors',\n },\n {\n type: 'Pointer Events',\n members: 'pointer\\\\-events\\\\-(none|auto)',\n },\n {\n type: 'Resize',\n members: 'resize(\\\\-(none|x|y))?',\n },\n {\n type: 'Scroll Behavior',\n members: 'scroll\\\\-(auto|smooth)',\n },\n {\n type: 'Scroll Margin',\n members: 'scroll\\\\-(?${scrollMargin})',\n configKey: 'scrollMargin',\n members: [\n {\n type: 'scroll-m',\n members: 'scroll-m\\\\-(?${scrollMargin})|\\\\-scroll-m\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n {\n type: 'scroll-my',\n members: 'scroll-my\\\\-(?${scrollMargin})|\\\\-scroll-my\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n {\n type: 'scroll-mx',\n members: 'scroll-mx\\\\-(?${scrollMargin})|\\\\-scroll-mx\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n {\n type: 'scroll-mt',\n members: 'scroll-mt\\\\-(?${scrollMargin})|\\\\-scroll-mt\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n {\n type: 'scroll-mr',\n members: 'scroll-mr\\\\-(?${scrollMargin})|\\\\-scroll-mr\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n {\n type: 'scroll-mb',\n members: 'scroll-mb\\\\-(?${scrollMargin})|\\\\-scroll-mb\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n {\n type: 'scroll-ml',\n members: 'scroll-ml\\\\-(?${scrollMargin})|\\\\-scroll-ml\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n ],\n },\n {\n type: 'Scroll Padding',\n members: 'scroll\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n members: [\n {\n type: 'scroll-p',\n members: 'scroll-p\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n {\n type: 'scroll-py',\n members: 'scroll-py\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n {\n type: 'scroll-px',\n members: 'scroll-px\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n {\n type: 'scroll-pt',\n members: 'scroll-pt\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n {\n type: 'scroll-pr',\n members: 'scroll-pr\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n {\n type: 'scroll-pb',\n members: 'scroll-pb\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n {\n type: 'scroll-pl',\n members: 'scroll-pl\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n ],\n },\n {\n type: 'Scroll Snap Align',\n members: 'snap\\\\-(start|end|center|align-none)',\n },\n {\n type: 'Scroll Snap Stop',\n members: 'snap\\\\-(normal|always)',\n },\n {\n type: 'Scroll Snap Type',\n members: 'snap\\\\-(none|x|y|both)',\n },\n {\n type: 'Scroll Snap Type Strictness',\n members: 'snap\\\\-(mandatory|proximity)',\n },\n {\n type: 'Touch Action',\n members: [\n {\n type: 'Touch Action Mode',\n members: 'touch\\\\-(auto|none|manipulation)',\n },\n {\n type: 'Touch Action X',\n members: 'touch\\\\-(pan\\\\-(x|left|right))',\n },\n {\n type: 'Touch Action Y',\n members: 'touch\\\\-(pan\\\\-(y|up|down))',\n },\n {\n type: 'Touch Action Pinch Zoom',\n members: 'touch\\\\-pinch\\\\-zoom',\n },\n ],\n },\n {\n type: 'User Select',\n members: 'select\\\\-(none|text|all|auto)',\n },\n {\n type: 'Will Change',\n members: 'will\\\\-change\\\\-(?${willChange})',\n configKey: 'willChange',\n },\n ],\n },\n {\n type: 'SVG',\n members: [\n {\n type: 'Fill',\n members: 'fill\\\\-(?${fill})',\n configKey: 'fill',\n },\n {\n type: 'Stroke',\n members: 'stroke\\\\-(?${stroke})',\n configKey: 'stroke',\n },\n {\n type: 'Stroke Width',\n members: 'stroke\\\\-(?${strokeWidth})',\n configKey: 'strokeWidth',\n },\n ],\n },\n {\n type: 'Accessibility',\n members: [\n {\n type: 'Screen Readers',\n members: '(not\\\\-)?sr\\\\-only',\n },\n {\n type: 'Forced Color Adjust',\n members: 'forced\\\\-color\\\\-adjust\\\\-(auto|none)',\n },\n ],\n },\n {\n type: 'Official Plugins',\n members: [\n {\n // TODO:\n // Support for custom prose classname like on\n // https://tailwindcss.com/docs/typography-plugin#changing-the-default-class-name\n // Adding custom color themes\n // https://tailwindcss.com/docs/typography-plugin#adding-custom-color-themes\n type: 'Typography',\n members: [\n {\n type: 'prose',\n members: '(not\\\\-)?prose',\n },\n {\n type: 'Prose Gray Scale',\n members: 'prose\\\\-(gray|slate|zinc|neutral|stone)',\n },\n {\n type: 'Prose Type Scale',\n members: 'prose\\\\-(sm|base|lg|2?xl)',\n },\n {\n type: 'Prose Dark Mode',\n members: 'prose\\\\-invert',\n },\n // These are modifiers and not the last part of the classname\n // {\n // type: 'Prose Element modifiers',\n // members:\n // 'prose\\\\-(headings|lead|h1|h2|h3|h4|p|a|blockquote|figure|figcaption|strong|em|code|pre|ol|ul|li|table|thead|tr|th|td|img|video|hr)',\n // },\n ],\n },\n // ('Forms' plugin has no related classnames, only selectors like `input[type='password']`)\n {\n type: 'Aspect Ratio',\n members: [\n {\n type: 'aspect-w',\n members: 'aspect\\\\-(none|w\\\\-(?${aspectRatio}))',\n },\n {\n type: 'aspect-h',\n members: 'aspect\\\\-h\\\\-(?${aspectRatio})',\n },\n ],\n },\n {\n type: 'Line Clamp',\n members: 'line\\\\-clamp\\\\-(none|(?${lineClamp}))',\n },\n ],\n },\n];\n","/**\n * @fileoverview Avoid using multiple Tailwind CSS classnames when not required (e.g. \"mx-3 my-3\" could be replaced by \"m-3\")\n * @author François Massart\n */\n'use strict';\n\nimport { groups as defaultGroups } from '../configs/groups';\nimport astUtil from '../util/ast';\nimport customConfig from '../util/customConfig';\nimport docsUrl from '../util/docsUrl';\nimport groupUtil from '../util/groupMethods';\nimport parserUtil from '../util/parser';\nimport getOption from '../util/settings';\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst SHORTHAND_CANDIDATE_CLASSNAMES_DETECTED_MSG = `Classnames '{{classnames}}' could be replaced by the '{{shorthand}}' shorthand!`;\n\nexport default {\n meta: {\n docs: {\n description: 'Enforces the usage of shorthand Tailwind CSS classnames',\n category: 'Best Practices',\n recommended: true,\n url: docsUrl('enforces-shorthand'),\n },\n messages: {\n shorthandCandidateDetected: SHORTHAND_CANDIDATE_CLASSNAMES_DETECTED_MSG,\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n const placeContentOptions = ['center', 'start', 'end', 'between', 'around', 'evenly', 'baseline', 'stretch'];\n const placeItemsOptions = ['start', 'end', 'center', 'stretch'];\n const placeSelfOptions = ['auto', 'start', 'end', 'center', 'stretch'];\n // These are shorthand candidates that do not share the same parent type\n const complexEquivalences = [\n {\n needles: ['overflow-hidden', 'text-ellipsis', 'whitespace-nowrap'],\n shorthand: 'truncate',\n mode: 'exact',\n },\n {\n needles: ['w-', 'h-'],\n shorthand: 'size-',\n mode: 'value',\n },\n ...placeContentOptions.map((opt) => {\n return {\n needles: [`content-${opt}`, `justify-${opt}`],\n shorthand: `place-content-${opt}`,\n mode: 'exact',\n };\n }),\n ...placeItemsOptions.map((opt) => {\n return {\n needles: [`items-${opt}`, `justify-items-${opt}`],\n shorthand: `place-items-${opt}`,\n mode: 'exact',\n };\n }),\n ...placeSelfOptions.map((opt) => {\n return {\n needles: [`self-${opt}`, `justify-self-${opt}`],\n shorthand: `place-self-${opt}`,\n mode: 'exact',\n };\n }),\n ];\n\n // Init assets\n const targetProperties = {\n Layout: ['Overflow', 'Overscroll Behavior', 'Top / Right / Bottom / Left'],\n 'Flexbox & Grid': ['Gap'],\n Spacing: ['Padding', 'Margin'],\n Sizing: ['Width', 'Height'],\n Borders: ['Border Radius', 'Border Width', 'Border Color'],\n Tables: ['Border Spacing'],\n Transforms: ['Scale'],\n Typography: ['Text Overflow', 'Whitespace'],\n };\n\n // We don't want to affect other rules by object reference\n const cloned = JSON.parse(JSON.stringify(defaultGroups));\n const targetGroups = cloned.filter((g) => Object.keys(targetProperties).includes(g.type));\n targetGroups.forEach((g) => {\n // Without using the clone, other rules would be affected by this `filter()`\n g.members = g.members.filter((sub) => targetProperties[g.type].includes(sub.type));\n });\n\n /**\n * Retrieve the main part of a classname base on its shorthand scope\n * @param {Object} targetGroups A specific subset of the groups\n * @param {String} parentType The name of the parent e.g. 'Border Radius'\n * @param {String} shorthand The searched shorthand e.g. 'all', 'y', 't', 'tr'\n * @returns\n */\n const getBodyByShorthand = (targetGroups, parentType, shorthand) => {\n const findByMemberType = (obj) => obj.members.find((m) => m.type === parentType);\n const mainGroup = targetGroups.find(findByMemberType);\n if (!mainGroup) {\n return '';\n }\n const typeGroup = mainGroup.members.find((m) => m.type === parentType);\n // const typeGroup = mainGroup.find(findByMemberType);\n if (!typeGroup) {\n return '';\n }\n const type = typeGroup.members.find((m) => m.shorthand === shorthand);\n return !type ? '' : type.body;\n };\n\n /**\n * Parse the classnames and report found shorthand candidates\n * @param {ASTNode} node The root node of the current parsing\n * @param {ASTNode} arg The child node of node\n * @returns {void}\n */\n const parseForShorthandCandidates = (node, arg = null) => {\n let originalClassNamesValue = null;\n let start = null;\n let end = null;\n let prefix = '';\n let suffix = '';\n const troubles = [];\n if (arg === null) {\n originalClassNamesValue = astUtil.extractValueFromNode(node);\n const range = astUtil.extractRangeFromNode(node);\n if (node.type === 'TextAttribute') {\n start = range[0];\n end = range[1];\n } else {\n start = range[0] + 1;\n end = range[1] - 1;\n }\n } else {\n switch (arg.type) {\n case 'Identifier':\n return;\n case 'TemplateLiteral':\n arg.expressions.forEach((exp) => {\n parseForShorthandCandidates(node, exp);\n });\n arg.quasis.forEach((quasis) => {\n parseForShorthandCandidates(node, quasis);\n });\n return;\n case 'ConditionalExpression':\n parseForShorthandCandidates(node, arg.consequent);\n parseForShorthandCandidates(node, arg.alternate);\n return;\n case 'LogicalExpression':\n parseForShorthandCandidates(node, arg.right);\n return;\n case 'ArrayExpression':\n arg.elements.forEach((el) => {\n parseForShorthandCandidates(node, el);\n });\n return;\n case 'ObjectExpression':\n const isUsedByClassNamesPlugin = node.callee && node.callee.name === 'classnames';\n const isVue = node.key && node.key.type === 'VDirectiveKey';\n arg.properties.forEach((prop) => {\n const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value;\n parseForShorthandCandidates(node, propVal);\n });\n return;\n case 'Property':\n parseForShorthandCandidates(node, arg.key);\n return;\n\n case 'Literal':\n originalClassNamesValue = arg.value;\n start = arg.range[0] + 1;\n end = arg.range[1] - 1;\n break;\n case 'TemplateElement':\n originalClassNamesValue = arg.value.raw;\n if (originalClassNamesValue === '') {\n return;\n }\n start = arg.range[0];\n end = arg.range[1];\n // https://github.com/eslint/eslint/issues/13360\n // The problem is that range computation includes the backticks (`test`)\n // but value.raw does not include them, so there is a mismatch.\n // start/end does not include the backticks, therefore it matches value.raw.\n const txt = context.getSourceCode().getText(arg);\n prefix = astUtil.getTemplateElementPrefix(txt, originalClassNamesValue);\n suffix = astUtil.getTemplateElementSuffix(txt, originalClassNamesValue);\n originalClassNamesValue = astUtil.getTemplateElementBody(txt, prefix, suffix);\n break;\n }\n }\n\n let { classNames, whitespaces, headSpace, tailSpace } =\n astUtil.extractClassnamesFromValue(originalClassNamesValue);\n\n if (classNames.length <= 1) {\n // Don't run sorting for a single or empty className\n return;\n }\n\n const parsed = [];\n\n classNames.forEach((className, index) => {\n parsed.push(groupUtil.parseClassname(className, targetGroups, mergedConfig, index));\n });\n\n const validated = [];\n\n // Handle sets of classnames with different parent types\n let remaining = parsed;\n for (const { needles: inputSet, shorthand: outputClassname, mode } of complexEquivalences) {\n if (remaining.length < inputSet.length) {\n continue;\n }\n\n // Matching classes\n const parsedElementsInInputSet = remaining.filter((remainingClass) => {\n if (mode === 'exact') {\n // Test if the name contains the target class, eg. 'text-ellipsis' inside 'md:text-ellipsis'...\n return inputSet.some((inputClass) => remainingClass.name.includes(inputClass));\n }\n // Test if the body of the class matches, eg. 'h-' inside 'h-10'\n if (mode === 'value') {\n const bodyMatch = inputSet.some(\n (inputClassPattern) => `${mergedConfig.prefix}${inputClassPattern}` === remainingClass.body\n );\n if ([undefined, null].includes(mergedConfig.theme.size)) {\n return false;\n }\n // w-screen + h-screen ≠ size-screen (Issue #307)\n const sizeKeys = Object.keys(mergedConfig.theme.size);\n const isSize = ['w-', 'h-'].includes(remainingClass.body);\n const isValidSize = sizeKeys.includes(remainingClass.value);\n const wValue = mergedConfig.theme.width[remainingClass.value];\n const hValue = mergedConfig.theme.height[remainingClass.value];\n const sizeValue = mergedConfig.theme.size[remainingClass.value];\n const fullMatch = wValue === hValue && wValue === sizeValue;\n return bodyMatch && !(isSize && !isValidSize && !fullMatch);\n }\n });\n\n const variantGroups = new Map();\n parsedElementsInInputSet.forEach((o) => {\n const val = mode === 'value' ? o.value : '';\n const v = `${o.variants}${o.important ? '!' : ''}${val}`;\n if (!variantGroups.has(v)) {\n variantGroups.set(\n v,\n parsedElementsInInputSet.filter(\n (c) => c.variants === o.variants && c.important === o.important && (val === '' || c.value === val)\n )\n );\n }\n });\n const validKeys = new Set();\n variantGroups.forEach((classes, key) => {\n let skip = false;\n // Make sure all required classes for the shorthand are present\n if (classes.length < inputSet.length) {\n skip = true;\n }\n // Make sure the classes share all the single/shared/same value\n if (mode === 'value' && new Set(classes.map((p) => p.value)).size !== 1) {\n skip = true;\n }\n if (!skip) {\n validKeys.add(key);\n }\n });\n validKeys.forEach((k) => {\n const candidates = variantGroups.get(k);\n const index = candidates[0].index;\n const variants = candidates[0].variants;\n const important = candidates[0].important ? '!' : '';\n const classValue = mode === 'value' ? candidates[0].value : '';\n\n const patchedClassname = `${variants}${important}${mergedConfig.prefix}${outputClassname}${classValue}`;\n troubles.push([candidates.map((c) => `${c.name}`), patchedClassname]);\n\n const validatedClassname = groupUtil.parseClassname(patchedClassname, targetGroups, mergedConfig, index);\n validated.push(validatedClassname);\n\n remaining = remaining.filter((p) => !candidates.includes(p));\n });\n }\n\n // Handle sets of classnames with the same parent type\n // Each group parentType\n const checkedGroups = [];\n remaining.forEach((classname, idx, arr) => {\n // Valid candidate\n if (classname.parentType === '') {\n validated.push(classname);\n } else if (!checkedGroups.includes(classname.parentType)) {\n checkedGroups.push(classname.parentType);\n const sameType = remaining.filter((cls) => cls.parentType === classname.parentType);\n // Comparing same parentType classnames\n const checkedVariantsValue = [];\n sameType.forEach((cls) => {\n const key = cls.variants + (cls.important ? '!' : '') + cls.value;\n if (!checkedVariantsValue.includes(key)) {\n checkedVariantsValue.push(key);\n const sameVariantAndValue = sameType.filter((v) => {\n return !(v.variants !== cls.variants || v.value !== cls.value || v.important !== cls.important);\n });\n if (sameVariantAndValue.length === 1) {\n validated.push(cls);\n } else if (sameVariantAndValue.length) {\n const supportCorners = ['Border Radius'].includes(classname.parentType);\n const hasTL =\n supportCorners && sameVariantAndValue.some((c) => ['tl', 't', 'all'].includes(c.shorthand));\n const hasTR =\n supportCorners && sameVariantAndValue.some((c) => ['tr', 't', 'all'].includes(c.shorthand));\n const hasBR =\n supportCorners && sameVariantAndValue.some((c) => ['br', 'b', 'all'].includes(c.shorthand));\n const hasBL =\n supportCorners && sameVariantAndValue.some((c) => ['bl', 'b', 'all'].includes(c.shorthand));\n const hasT = sameVariantAndValue.some((c) => c.shorthand === 't') || (hasTL && hasTR);\n const hasR = sameVariantAndValue.some((c) => c.shorthand === 'r') || (hasTR && hasBR);\n const hasB = sameVariantAndValue.some((c) => c.shorthand === 'b') || (hasBL && hasBR);\n const hasL = sameVariantAndValue.some((c) => c.shorthand === 'l') || (hasTL && hasBL);\n const hasX = sameVariantAndValue.some((c) => c.shorthand === 'x') || (hasL && hasR);\n const hasY = sameVariantAndValue.some((c) => c.shorthand === 'y') || (hasT && hasB);\n const hasAllProp = sameVariantAndValue.some((c) => c.shorthand === 'all');\n const hasAllPropNoCorner = hasY && hasX;\n const hasAllPropWithCorners = (hasL && hasR) || (hasT && hasB);\n const hasAllEquivalent = !supportCorners ? hasAllPropNoCorner : hasAllPropWithCorners;\n const hasAll = hasAllProp || hasAllEquivalent;\n const important = cls.important ? '!' : '';\n const isNegative = ('' + cls.value).substring(0, 1) === '-';\n const minus = isNegative ? '-' : '';\n const absoluteVal = isNegative ? ('' + cls.value).substring(1) : cls.value;\n\n if (hasAll) {\n const all = getBodyByShorthand(targetGroups, classname.parentType, 'all');\n const val = absoluteVal.length ? '-' + absoluteVal : '';\n const patchedName = `${cls.variants}${important}${minus}${mergedConfig.prefix}${all}${val}`;\n troubles.push([sameVariantAndValue.map((c) => c.name), patchedName]);\n cls.name = patchedName;\n cls.shorthand = 'all';\n validated.push(cls);\n } else if (hasY || hasX) {\n const xOrY = hasX ? 'x' : 'y';\n const xOrYType = getBodyByShorthand(targetGroups, classname.parentType, xOrY);\n const patchedName = `${cls.variants}${important}${minus}${mergedConfig.prefix}${xOrYType}${\n absoluteVal.length ? '-' + absoluteVal : ''\n }`;\n const toBeReplaced = sameVariantAndValue\n .filter((c) => {\n const candidates = hasX ? ['l', 'r'] : ['t', 'b'];\n return candidates.includes(c.shorthand);\n })\n .map((c) => c.name);\n const toBeKept = sameVariantAndValue.filter((c) => {\n const candidates = hasY ? ['l', 'r'] : ['t', 'b'];\n return candidates.includes(c.shorthand);\n });\n\n troubles.push([toBeReplaced, patchedName]);\n let replaced = false;\n sameVariantAndValue.forEach((ref, i) => {\n if (toBeKept.find((k) => k.name === ref.name)) {\n validated.push(ref);\n } else if (!replaced) {\n replaced = true;\n const cloned = JSON.parse(JSON.stringify(ref));\n cloned.name = patchedName;\n cloned.shorthand = xOrY;\n validated.push(cloned);\n }\n });\n } else if (supportCorners && (hasT || hasR || hasB || hasL)) {\n const side = hasT ? 't' : hasR ? 'r' : hasB ? 'b' : 'l';\n const sideBody = getBodyByShorthand(targetGroups, classname.parentType, side);\n const val = absoluteVal.length ? '-' + absoluteVal : '';\n const patchedName = `${cls.variants}${important}${minus}${mergedConfig.prefix}${sideBody}${val}`;\n const toBeReplaced = sameVariantAndValue\n .filter((c) => {\n const candidates = hasT ? ['tl', 'tr'] : hasR ? ['tr', 'br'] : hasB ? ['bl', 'br'] : ['tl', 'bl'];\n return candidates.includes(c.shorthand);\n })\n .map((c) => c.name);\n const toBeKept = sameVariantAndValue.filter((c) => {\n const candidates = hasT ? ['bl', 'br'] : hasR ? ['tl', 'bl'] : hasB ? ['tl', 'tr'] : ['tr', 'br'];\n return candidates.includes(c.shorthand);\n });\n\n troubles.push([toBeReplaced, patchedName]);\n let replaced = false;\n sameVariantAndValue.forEach((ref, i) => {\n if (toBeKept.find((k) => k.name === ref.name)) {\n validated.push(ref);\n } else if (!replaced) {\n replaced = true;\n const cloned = JSON.parse(JSON.stringify(ref));\n cloned.name = patchedName;\n cloned.shorthand = side;\n validated.push(cloned);\n }\n });\n } else {\n validated.push(...sameVariantAndValue);\n }\n }\n }\n });\n }\n });\n\n // Try to keep the original order\n validated.sort((a, b) => (a.index < b.index ? -1 : +1));\n\n // Generates the validated attribute value\n const union = validated.map((val) => val.leading + val.name + val.trailing);\n\n let validatedClassNamesValue = '';\n\n // Generates the validated attribute value\n if (union.length === 1) {\n validatedClassNamesValue += headSpace ? whitespaces[0] : '';\n validatedClassNamesValue += union[0];\n validatedClassNamesValue += tailSpace ? whitespaces[whitespaces.length - 1] : '';\n } else {\n for (let i = 0; i < union.length; i++) {\n const isLast = i === union.length - 1;\n const w = whitespaces[i] ?? '';\n const cls = union[i];\n validatedClassNamesValue += headSpace ? `${w}${cls}` : isLast ? `${cls}` : `${cls}${w}`;\n if (tailSpace && isLast) {\n validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? '';\n }\n }\n }\n\n troubles.forEach((issue) => {\n if (originalClassNamesValue !== validatedClassNamesValue) {\n validatedClassNamesValue = prefix + validatedClassNamesValue + suffix;\n context.report({\n node: node,\n messageId: 'shorthandCandidateDetected',\n data: {\n classnames: issue[0].join(', '),\n shorthand: issue[1],\n },\n fix: function (fixer) {\n return fixer.replaceTextRange([start, end], validatedClassNamesValue);\n },\n });\n }\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n parseForShorthandCandidates(node);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n parseForShorthandCandidates(node, node.value.expression);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n\n node.arguments.forEach((arg) => {\n parseForShorthandCandidates(node, arg);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n\n parseForShorthandCandidates(node, node.quasi);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n parseForShorthandCandidates(node);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n parseForShorthandCandidates(node, arg);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n parseForShorthandCandidates(node, prop);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","/**\n * @fileoverview Detect obsolete classnames when upgrading to Tailwind CSS v3\n * @author François Massart\n */\n'use strict';\n\nconst docsUrl = require('../util/docsUrl');\nconst customConfig = require('../util/customConfig');\nconst astUtil = require('../util/ast');\nconst groupUtil = require('../util/groupMethods');\nconst getOption = require('../util/settings');\nconst parserUtil = require('../util/parser');\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst CLASSNAME_NOT_NEEDED_MSG = `Classname '{{classnames}}' is not needed in Tailwind CSS v3!`;\nconst CLASSNAMES_NOT_NEEDED_MSG = `Classnames '{{classnames}}' are not needed in Tailwind CSS v3!`;\nconst CLASSNAME_CHANGED_MSG = `Classname '{{deprecated}}' should be updated to '{{updated}}' in Tailwind CSS v3!`;\nconst OPACITY_CLASS_DEPRECATED_MSG = `Classname '{{classname}}' should be replaced by an opacity suffix (eg. '/{{value}}')`;\n\nexport default {\n meta: {\n docs: {\n description: 'Detect obsolete classnames when upgrading to Tailwind CSS v3',\n category: 'Possible Errors',\n recommended: true,\n url: docsUrl('migration-from-tailwind-2'),\n },\n messages: {\n classnameNotNeeded: CLASSNAME_NOT_NEEDED_MSG,\n classnamesNotNeeded: CLASSNAMES_NOT_NEEDED_MSG,\n classnameChanged: CLASSNAME_CHANGED_MSG,\n classnameOpacityDeprecated: OPACITY_CLASS_DEPRECATED_MSG,\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n /**\n * Recursive function crawling into child nodes\n * @param {ASTNode} node The root node of the current parsing\n * @param {ASTNode} arg The child node of node\n * @returns {void}\n */\n const parseForObsoleteClassNames = (node, arg = null) => {\n let originalClassNamesValue = null;\n let start = null;\n let end = null;\n let prefix = '';\n let suffix = '';\n if (arg === null) {\n originalClassNamesValue = astUtil.extractValueFromNode(node);\n const range = astUtil.extractRangeFromNode(node);\n if (node.type === 'TextAttribute') {\n start = range[0];\n end = range[1];\n } else {\n start = range[0] + 1;\n end = range[1] - 1;\n }\n } else {\n switch (arg.type) {\n case 'Identifier':\n return;\n case 'TemplateLiteral':\n arg.expressions.forEach((exp) => {\n parseForObsoleteClassNames(node, exp);\n });\n arg.quasis.forEach((quasis) => {\n parseForObsoleteClassNames(node, quasis);\n });\n return;\n case 'ConditionalExpression':\n parseForObsoleteClassNames(node, arg.consequent);\n parseForObsoleteClassNames(node, arg.alternate);\n return;\n case 'LogicalExpression':\n parseForObsoleteClassNames(node, arg.right);\n return;\n case 'ArrayExpression':\n arg.elements.forEach((el) => {\n parseForObsoleteClassNames(node, el);\n });\n return;\n case 'ObjectExpression':\n arg.properties.forEach((prop) => {\n parseForObsoleteClassNames(node, prop.key);\n });\n return;\n case 'Property':\n parseForObsoleteClassNames(node, arg.key);\n return;\n case 'Literal':\n originalClassNamesValue = arg.value;\n start = arg.range[0] + 1;\n end = arg.range[1] - 1;\n break;\n case 'TemplateElement':\n originalClassNamesValue = arg.value.raw;\n if (originalClassNamesValue === '') {\n return;\n }\n start = arg.range[0];\n end = arg.range[1];\n // https://github.com/eslint/eslint/issues/13360\n // The problem is that range computation includes the backticks (`test`)\n // but value.raw does not include them, so there is a mismatch.\n // start/end does not include the backticks, therefore it matches value.raw.\n const txt = context.getSourceCode().getText(arg);\n prefix = astUtil.getTemplateElementPrefix(txt, originalClassNamesValue);\n suffix = astUtil.getTemplateElementSuffix(txt, originalClassNamesValue);\n originalClassNamesValue = astUtil.getTemplateElementBody(txt, prefix, suffix);\n break;\n }\n }\n\n let { classNames, whitespaces, headSpace, tailSpace } =\n astUtil.extractClassnamesFromValue(originalClassNamesValue);\n\n const notNeeded = [];\n const outdated = [];\n const deprecatedBgOpacity = [];\n const filtered = classNames.filter((cls) => {\n const suffix = groupUtil.getSuffix(cls, mergedConfig.separator);\n if (/^((backdrop\\-)?(filter|transform))$/i.test(suffix)) {\n notNeeded.push(cls);\n return false;\n }\n let overflowRes = /^overflow\\-(?clip|ellipsis)$/i.exec(suffix);\n if (overflowRes && overflowRes.groups && overflowRes.groups.value) {\n outdated.push([cls, cls.replace(/overflow\\-(clip|ellipsis)$/i, `text-${overflowRes.groups.value}`)]);\n }\n let growShrinkRes = /flex\\-(?grow|shrink)(\\-(?${flexVal}))?/i.exec(suffix);\n if (growShrinkRes && growShrinkRes.groups && growShrinkRes.groups.prop) {\n const prop = growShrinkRes.groups.prop;\n const flexVal = growShrinkRes.groups.flexVal;\n const optionalVal = flexVal ? `\\-${flexVal}` : '';\n const fixRegex = new RegExp(`flex\\-${prop}${optionalVal}`);\n outdated.push([cls, cls.replace(fixRegex, `${prop}${flexVal ? '-' + flexVal : ''}`)]);\n }\n let boxRes = /^decoration\\-(?clone|slice)$/i.exec(suffix);\n if (boxRes && boxRes.groups && boxRes.groups.value) {\n const boxVal = boxRes.groups.value;\n const fixRegex = new RegExp(`decoration\\-${boxVal}`);\n outdated.push([cls, cls.replace(fixRegex, `box-decoration\\-${boxVal}`)]);\n }\n let bgOpacityRes = /^(bg|border|ring)\\-opacity\\-(?\\d{1,})$/i.exec(suffix);\n if (bgOpacityRes && bgOpacityRes.groups && bgOpacityRes.groups.value) {\n const opacityVal = bgOpacityRes.groups.value;\n deprecatedBgOpacity.push([cls, opacityVal]);\n }\n let placeholderRes = /^placeholder\\-(?.{1,})$/i.exec(suffix);\n if (placeholderRes && placeholderRes.groups && placeholderRes.groups.value) {\n const placeholderVal = placeholderRes.groups.value;\n const fixPlaceholderRegex = new RegExp(`placeholder\\-${placeholderVal}$`);\n outdated.push([cls, cls.replace(fixPlaceholderRegex, `placeholder:text\\-${placeholderVal}`)]);\n }\n return true;\n });\n\n if (notNeeded.length) {\n let validatedClassNamesValue = '';\n for (let i = 0; i < filtered.length; i++) {\n const isLast = i === filtered.length - 1;\n const w = whitespaces[i] ?? '';\n const cls = filtered[i];\n validatedClassNamesValue += headSpace ? `${w}${cls}` : isLast ? `${cls}` : `${cls}${w}`;\n if (headSpace && tailSpace && isLast) {\n validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? '';\n }\n }\n validatedClassNamesValue = prefix + validatedClassNamesValue + suffix;\n context.report({\n node,\n messageId: notNeeded.length === 1 ? 'classnameNotNeeded' : 'classnamesNotNeeded',\n data: {\n classnames: notNeeded.join(', '),\n },\n fix: function (fixer) {\n return fixer.replaceTextRange([start, end], validatedClassNamesValue);\n },\n });\n }\n\n outdated.forEach((outdatedClass) => {\n let validatedClassNamesValue = '';\n for (let i = 0; i < filtered.length; i++) {\n const w = whitespaces[i] ?? '';\n const cls = filtered[i];\n validatedClassNamesValue += headSpace ? `${w}${cls}` : `${cls}${w}`;\n if (headSpace && tailSpace && i === filtered.length - 1) {\n validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? '';\n }\n }\n validatedClassNamesValue =\n prefix + validatedClassNamesValue.replace(outdatedClass[0], outdatedClass[1]) + suffix;\n context.report({\n node,\n messageId: 'classnameChanged',\n data: {\n deprecated: outdatedClass[0],\n updated: outdatedClass[1],\n },\n fix: function (fixer) {\n return fixer.replaceTextRange([start, end], validatedClassNamesValue);\n },\n });\n });\n deprecatedBgOpacity.forEach((bgClass) => {\n context.report({\n node,\n messageId: 'classnameOpacityDeprecated',\n data: {\n classname: bgClass[0],\n value: bgClass[1],\n },\n });\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n parseForObsoleteClassNames(node);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n parseForObsoleteClassNames(node, node.value.expression);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n node.arguments.forEach((arg) => {\n parseForObsoleteClassNames(node, arg);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n parseForObsoleteClassNames(node, node.quasi);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n parseForObsoleteClassNames(node);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n parseForObsoleteClassNames(node, arg);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n parseForObsoleteClassNames(node, prop);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","/**\n * @fileoverview Forbid using arbitrary values in classnames\n * @author François Massart\n */\n'use strict';\n\nconst docsUrl = require('../util/docsUrl');\nconst customConfig = require('../util/customConfig');\nconst astUtil = require('../util/ast');\nconst groupUtil = require('../util/groupMethods');\nconst getOption = require('../util/settings');\nconst parserUtil = require('../util/parser');\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst ARBITRARY_VALUE_DETECTED_MSG = `Arbitrary value detected in '{{classname}}'`;\n\nexport default {\n meta: {\n docs: {\n description: 'Forbid using arbitrary values in classnames',\n category: 'Best Practices',\n recommended: false,\n url: docsUrl('no-arbitrary-value'),\n },\n messages: {\n arbitraryValueDetected: ARBITRARY_VALUE_DETECTED_MSG,\n },\n fixable: null,\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n /**\n * Recursive function crawling into child nodes\n * @param {ASTNode} node The root node of the current parsing\n * @param {ASTNode} arg The child node of node\n * @returns {void}\n */\n const parseForArbitraryValues = (node, arg = null) => {\n let originalClassNamesValue = null;\n if (arg === null) {\n originalClassNamesValue = astUtil.extractValueFromNode(node);\n } else {\n switch (arg.type) {\n case 'Identifier':\n return;\n case 'TemplateLiteral':\n arg.expressions.forEach((exp) => {\n parseForArbitraryValues(node, exp);\n });\n arg.quasis.forEach((quasis) => {\n parseForArbitraryValues(node, quasis);\n });\n return;\n case 'ConditionalExpression':\n parseForArbitraryValues(node, arg.consequent);\n parseForArbitraryValues(node, arg.alternate);\n return;\n case 'LogicalExpression':\n parseForArbitraryValues(node, arg.right);\n return;\n case 'ArrayExpression':\n arg.elements.forEach((el) => {\n parseForArbitraryValues(node, el);\n });\n return;\n case 'ObjectExpression':\n const isUsedByClassNamesPlugin = node.callee && node.callee.name === 'classnames';\n const isVue = node.key && node.key.type === 'VDirectiveKey';\n arg.properties.forEach((prop) => {\n const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value;\n parseForArbitraryValues(node, propVal);\n });\n return;\n case 'Property':\n parseForArbitraryValues(node, arg.key);\n return;\n case 'Literal':\n originalClassNamesValue = arg.value;\n break;\n case 'TemplateElement':\n originalClassNamesValue = arg.value.raw;\n if (originalClassNamesValue === '') {\n return;\n }\n break;\n }\n }\n\n let { classNames } = astUtil.extractClassnamesFromValue(originalClassNamesValue);\n const forbidden = [];\n classNames.forEach((cls, idx) => {\n const parsed = groupUtil.parseClassname(cls, [], mergedConfig, idx);\n if (/\\[.*\\]/i.test(parsed.body)) {\n forbidden.push(parsed.name);\n }\n });\n\n forbidden.forEach((forbiddenClass) => {\n context.report({\n node,\n messageId: 'arbitraryValueDetected',\n data: {\n classname: forbiddenClass,\n },\n });\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n parseForArbitraryValues(node);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n parseForArbitraryValues(node, node.value.expression);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n node.arguments.forEach((arg) => {\n parseForArbitraryValues(node, arg);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n parseForArbitraryValues(node, node.quasi);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n parseForArbitraryValues(node, null);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n parseForArbitraryValues(node, arg);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n parseForArbitraryValues(node, prop);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","/**\n * @fileoverview Avoid contradicting Tailwind CSS classnames (e.g. \"w-3 w-5\")\n * @author François Massart\n */\n'use strict';\n\nimport { groups as defaultGroups } from '../configs/groups';\nimport astUtil from '../util/ast';\nimport customConfig from '../util/customConfig';\nimport docsUrl from '../util/docsUrl';\nimport groupUtil from '../util/groupMethods';\nimport parserUtil from '../util/parser';\nimport getOption from '../util/settings';\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst CONFLICTING_CLASSNAMES_DETECTED_MSG = `Classnames {{classnames}} are conflicting!`;\n\nexport default {\n meta: {\n docs: {\n description: 'Avoid contradicting Tailwind CSS classnames (e.g. \"w-3 w-5\")',\n category: 'Possible Errors',\n recommended: true,\n url: docsUrl('no-contradicting-classname'),\n },\n messages: {\n conflictingClassnames: CONFLICTING_CLASSNAMES_DETECTED_MSG,\n },\n fixable: null,\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const ignoredKeys = getOption(context, 'ignoredKeys');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n // Init assets before sorting\n const groups = groupUtil.getGroups(defaultGroups, mergedConfig);\n\n /**\n * Parse the classnames and report found conflicts\n * @param {Array} classNames\n * @param {ASTNode} node\n */\n const parseForContradictingClassNames = (classNames, node) => {\n // Init assets before sorting\n const sorted = groupUtil.initGroupSlots(groups);\n\n // Move each classname inside its dedicated group\n classNames.forEach((className) => {\n const idx = groupUtil.getGroupIndex(className, groups, mergedConfig.separator);\n if (idx > -1) {\n sorted[idx].push(className);\n }\n });\n\n // Only multiple classNames\n const sortedGroups = sorted.filter((slot) => slot.length > 1);\n const arbitraryPropsGroupIndex = sortedGroups.findIndex((slot) => {\n const suffix = groupUtil.getSuffix(slot[0], mergedConfig.separator);\n return groupUtil.getArbitraryProperty(suffix, mergedConfig.separator) !== '';\n });\n\n // Sorts each groups' classnames\n const ambiguousArbitraryValuesOrClasses = String.raw`(\\[(.*${mergedConfig.separator}))|(^((?!:).)*$)`;\n\n sortedGroups.forEach((group, groupIndex) => {\n const variants = [];\n group.forEach((cls) => {\n const prefix = groupUtil.getPrefix(cls, mergedConfig.separator);\n const name = cls.substr(prefix.length);\n if (groupIndex === arbitraryPropsGroupIndex) {\n // Arbitrary Props\n const arbitraryProp = groupUtil.getArbitraryProperty(name, mergedConfig.separator);\n const identifier = prefix + arbitraryProp;\n const idx = variants.findIndex((v) => identifier === v.prefix);\n if (idx === -1) {\n variants.push({\n prefix: identifier,\n name: [name],\n });\n } else {\n variants[idx].name.push(name);\n }\n } else {\n // \"Regular classNames\"\n const rePrefix = prefix === '' ? ambiguousArbitraryValuesOrClasses : '^' + prefix;\n const idx = variants.findIndex((v) => v.prefix === rePrefix);\n if (idx === -1) {\n variants.push({\n prefix: rePrefix,\n name: [name],\n });\n } else {\n variants[idx].name.push(name);\n }\n }\n });\n\n // Several classNames with the same prefix\n const potentialTroubles = variants.filter((v) => v.name.length > 1);\n if (potentialTroubles.length) {\n potentialTroubles.forEach((variantGroup) => {\n const re = new RegExp(variantGroup.prefix);\n const conflicting = group.filter((c) => re.test(c));\n context.report({\n node: node,\n messageId: 'conflictingClassnames',\n data: {\n classnames: conflicting.join(', '),\n },\n });\n });\n }\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n astUtil.parseNodeRecursive(node, null, parseForContradictingClassNames, true, false, ignoredKeys);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n astUtil.parseNodeRecursive(\n node,\n node.value.expression,\n parseForContradictingClassNames,\n true,\n false,\n ignoredKeys\n );\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n const allClassnamesForNode = [];\n const pushClasses = (classNames, targetNode) => {\n if (targetNode === null) {\n // Classnames should be parsed in isolation (e.g. conditional expressions)\n parseForContradictingClassNames(classNames, node);\n } else {\n // Gather the classes prior to validation\n allClassnamesForNode.push(...classNames);\n }\n };\n node.arguments.forEach((arg) => {\n astUtil.parseNodeRecursive(node, arg, pushClasses, true, false, ignoredKeys);\n });\n parseForContradictingClassNames(allClassnamesForNode, node);\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n\n const allClassnamesForNode = [];\n const pushClasses = (classNames, targetNode) => {\n if (targetNode === null) {\n // Classnames should be parsed in isolation (e.g. conditional expressions)\n parseForContradictingClassNames(classNames, node);\n } else {\n // Gather the classes prior to validation\n allClassnamesForNode.push(...classNames);\n }\n };\n astUtil.parseNodeRecursive(node, node.quasi, pushClasses, true, false, ignoredKeys);\n parseForContradictingClassNames(allClassnamesForNode, node);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n astUtil.parseNodeRecursive(node, null, parseForContradictingClassNames, true, false, ignoredKeys);\n break;\n case astUtil.isArrayExpression(node):\n const allClassnamesForNode = [];\n const pushClasses = (classNames, targetNode) => {\n if (targetNode === null) {\n // Classnames should be parsed in isolation (e.g. conditional expressions)\n parseForContradictingClassNames(classNames, node);\n } else {\n // Gather the classes prior to validation\n allClassnamesForNode.push(...classNames);\n }\n };\n node.value.expression.elements.forEach((el) => {\n astUtil.parseNodeRecursive(node, el, pushClasses, true, false, ignoredKeys);\n });\n parseForContradictingClassNames(allClassnamesForNode, node);\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n astUtil.parseNodeRecursive(node, prop, parseForContradictingClassNames, false, false, ignoredKeys);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","'use strict';\n\nconst fg = require('fast-glob');\nconst fs = require('fs');\nconst postcss = require('postcss');\nconst lastClassFromSelectorRegexp = /\\.([^\\.\\,\\s\\n\\:\\(\\)\\[\\]\\'~\\+\\>\\*\\\\]*)/gim;\nconst removeDuplicatesFromArray = require('./removeDuplicatesFromArray');\n\nconst cssFilesInfos = new Map();\nlet lastUpdate = null;\nlet classnamesFromFiles = [];\n\n/**\n * Read CSS files and extract classnames\n * @param {Array} patterns Glob patterns to locate files\n * @param {Number} refreshRate Interval\n * @returns {Array} List of classnames\n */\nconst generateClassnamesListSync = (patterns, refreshRate = 5_000) => {\n const now = Date.now();\n const isExpired = lastUpdate === null || now - lastUpdate > refreshRate;\n\n if (!isExpired) {\n // console.log(`generateClassnamesListSync from cache (${classnamesFromFiles.length} classes)`);\n return classnamesFromFiles;\n }\n\n // console.log('generateClassnamesListSync EXPIRED');\n // Update classnames from CSS files\n lastUpdate = now;\n const filesToBeRemoved = new Set([...cssFilesInfos.keys()]);\n const files = fg.sync(patterns, { suppressErrors: true, stats: true });\n for (const file of files) {\n let mtime = '';\n let canBeSkipped = cssFilesInfos.has(file.path);\n if (canBeSkipped) {\n // This file is still used\n filesToBeRemoved.delete(file.path);\n // Check modification date\n const stats = fs.statSync(file.path);\n mtime = `${stats.mtime || ''}`;\n canBeSkipped = cssFilesInfos.get(file.path).mtime === mtime;\n }\n if (canBeSkipped) {\n // File did not change since last run\n continue;\n }\n // Parse CSS file\n const data = fs.readFileSync(file.path, 'utf-8');\n const root = postcss.parse(data);\n let detectedClassnames = new Set();\n root.walkRules((rule) => {\n const matches = [...rule.selector.matchAll(lastClassFromSelectorRegexp)];\n const classnames = matches.map((arr) => arr[1]);\n detectedClassnames = new Set([...detectedClassnames, ...classnames]);\n });\n // Save the detected classnames\n cssFilesInfos.set(file.path, {\n mtime: mtime,\n classNames: [...detectedClassnames],\n });\n }\n // Remove erased CSS from the Map\n const deletedFiles = [...filesToBeRemoved];\n for (let i = 0; i < deletedFiles.length; i++) {\n cssFilesInfos.delete(deletedFiles[i]);\n }\n // Build the final list\n classnamesFromFiles = [];\n cssFilesInfos.forEach((css) => {\n classnamesFromFiles = [...classnamesFromFiles, ...css.classNames];\n });\n // Unique classnames\n return removeDuplicatesFromArray(classnamesFromFiles);\n};\n\nexport default generateClassnamesListSync;\n","var generateRulesFallback = require('tailwindcss/lib/lib/generateRules').generateRules;\n\nfunction generate(className, context) {\n // const order = generateRulesFallback(new Set([className]), context).sort(([a], [z]) => bigSign(z - a))[0]?.[0] ?? null;\n const gen = generateRulesFallback(new Set([className]), context);\n // console.debug(gen);\n return gen;\n}\n\nexport default generate;\n","/**\n * @fileoverview Detect classnames which do not belong to Tailwind CSS\n * @author no-custom-classname\n */\n'use strict';\n\nimport { groups as defaultGroups } from '../configs/groups';\nimport astUtil from '../util/ast';\nimport getClassnamesFromCSS from '../util/cssFiles';\nimport customConfig from '../util/customConfig';\nimport docsUrl from '../util/docsUrl';\nimport generated from '../util/generated';\nimport groupUtil from '../util/groupMethods';\nimport parserUtil from '../util/parser';\nimport getOption from '../util/settings';\nconst createContextFallback = require('tailwindcss/lib/lib/setupContextUtils').createContext;\nconst escapeRegex = require('../util/regex').escapeRegex;\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst CUSTOM_CLASSNAME_DETECTED_MSG = `Classname '{{classname}}' is not a Tailwind CSS class!`;\n\n// Group/peer names can be arbitrarily named and are not\n// generated by generateRules. Using a custom regexp to\n// validate these avoids false reports.\nconst getGroupNameRegex = (prefix = '') =>\n new RegExp(`^${escapeRegex(prefix)}(group|peer)\\/[\\\\w\\\\$\\\\#\\\\@\\\\%\\\\^\\\\&\\\\*\\\\_\\\\-]+$`, 'i');\n\nconst contextFallbackCache = new WeakMap();\n\nexport default {\n meta: {\n docs: {\n description: 'Detect classnames which do not belong to Tailwind CSS',\n category: 'Best Practices',\n recommended: false,\n url: docsUrl('no-custom-classname'),\n },\n messages: {\n customClassnameDetected: CUSTOM_CLASSNAME_DETECTED_MSG,\n },\n fixable: null,\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n cssFiles: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n cssFilesRefreshRate: {\n type: 'number',\n // default: 5_000,\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n whitelist: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const ignoredKeys = getOption(context, 'ignoredKeys');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const cssFiles = getOption(context, 'cssFiles');\n const cssFilesRefreshRate = getOption(context, 'cssFilesRefreshRate');\n const whitelist = getOption(context, 'whitelist');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n const contextFallback = // Set the created contextFallback in the cache if it does not exist yet.\n (\n contextFallbackCache.has(mergedConfig)\n ? contextFallbackCache\n : contextFallbackCache.set(mergedConfig, createContextFallback(mergedConfig))\n ).get(mergedConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n // Init assets before sorting\n const groups = groupUtil.getGroups(defaultGroups, mergedConfig);\n const classnamesFromFiles = getClassnamesFromCSS(cssFiles, cssFilesRefreshRate);\n const groupNameRegex = getGroupNameRegex(mergedConfig.prefix);\n\n /**\n * Parse the classnames and report found conflicts\n * @param {Array} classNames\n * @param {ASTNode} node\n */\n const parseForCustomClassNames = (classNames, node) => {\n classNames.forEach((className) => {\n const gen = generated(className, contextFallback);\n if (gen.length) {\n return; // Lazier is faster... processing next className!\n }\n const idx = groupUtil.getGroupIndex(className, groups, mergedConfig.separator);\n if (idx >= 0) {\n return; // Lazier is faster... processing next className!\n }\n const whitelistIdx = groupUtil.getGroupIndex(className, whitelist, mergedConfig.separator);\n if (whitelistIdx >= 0) {\n return; // Lazier is faster... processing next className!\n }\n const fromFilesIdx = groupUtil.getGroupIndex(className, classnamesFromFiles, mergedConfig.separator);\n if (fromFilesIdx >= 0) {\n return; // Lazier is faster... processing next className!\n }\n if (groupNameRegex.test(className)) {\n return; // Lazier is faster... processing next className!\n }\n\n // No match found\n context.report({\n node,\n messageId: 'customClassnameDetected',\n data: {\n classname: className,\n },\n });\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n astUtil.parseNodeRecursive(node, null, parseForCustomClassNames, false, false, ignoredKeys);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n astUtil.parseNodeRecursive(node, node.value.expression, parseForCustomClassNames, false, false, ignoredKeys);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n node.arguments.forEach((arg) => {\n astUtil.parseNodeRecursive(node, arg, parseForCustomClassNames, false, false, ignoredKeys);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n astUtil.parseNodeRecursive(node, node.quasi, parseForCustomClassNames, false, false, ignoredKeys);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n astUtil.parseNodeRecursive(node, null, parseForCustomClassNames, false, false, ignoredKeys);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n astUtil.parseNodeRecursive(node, arg, parseForCustomClassNames, false, false, ignoredKeys);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n astUtil.parseNodeRecursive(node, prop, parseForCustomClassNames, false, false, ignoredKeys);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","/**\n * @fileoverview Detect arbitrary classnames which have an existing equivalent preset in the configuration\n * @author François Massart\n */\n'use strict';\n\nimport { groups as defaultGroups } from '../configs/groups';\nimport astUtil from '../util/ast';\nimport customConfig from '../util/customConfig';\nimport docsUrl from '../util/docsUrl';\nimport groupUtil from '../util/groupMethods';\nimport parserUtil from '../util/parser';\nimport getOption from '../util/settings';\nimport length from '../util/types/length';\n\nconst validZeroRegEx = length.validZeroRegEx;\n\n// TODO get the correct value of start and end\n// TODO make rule fixable when only 1 match\n// TODO propose several fixes when multiple matches + priority to exact match\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst UNNECESSARY_ARBITRARY_VALUE_DETECTED_MSG = `The arbitrary class '{{classname}}' could be replaced by '{{presets}}'`;\n\nexport default {\n meta: {\n docs: {\n description: 'Forbid using arbitrary values in classnames when an equivalent preset exists',\n category: 'Best Practices',\n recommended: true,\n url: docsUrl('no-unnecessary-arbitrary-value'),\n },\n messages: {\n unnecessaryArbitraryValueDetected: UNNECESSARY_ARBITRARY_VALUE_DETECTED_MSG,\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n const groups = groupUtil.getGroups(defaultGroups, mergedConfig);\n const configKeys = groupUtil.getGroupConfigKeys(defaultGroups);\n let parentTemplateLiteral = null;\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n /**\n * Recursive function crawling into child nodes\n * @param {ASTNode} node The root node of the current parsing\n * @param {ASTNode} arg The child node of node\n * @returns {void}\n */\n const parseForArbitraryValues = (node, arg = null) => {\n let start = null;\n let end = null;\n let originalClassNamesValue = null;\n if (arg === null) {\n originalClassNamesValue = astUtil.extractValueFromNode(node);\n const range = astUtil.extractRangeFromNode(node);\n if (node.type === 'TextAttribute') {\n start = range[0];\n end = range[1];\n } else {\n start = range[0] + 1;\n end = range[1] - 1;\n }\n } else {\n switch (arg.type) {\n case 'Identifier':\n return;\n case 'TemplateLiteral':\n parentTemplateLiteral = arg;\n arg.expressions.forEach((exp) => {\n parseForArbitraryValues(node, exp);\n });\n arg.quasis.forEach((quasis) => {\n parseForArbitraryValues(node, quasis);\n });\n parentTemplateLiteral = null;\n return;\n case 'ConditionalExpression':\n parseForArbitraryValues(node, arg.consequent);\n parseForArbitraryValues(node, arg.alternate);\n return;\n case 'LogicalExpression':\n parseForArbitraryValues(node, arg.right);\n return;\n case 'ArrayExpression':\n arg.elements.forEach((el) => {\n parseForArbitraryValues(node, el);\n });\n return;\n case 'ObjectExpression':\n const isUsedByClassNamesPlugin = node.callee && node.callee.name === 'classnames';\n const isVue = node.key && node.key.type === 'VDirectiveKey';\n arg.properties.forEach((prop) => {\n const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value;\n parseForArbitraryValues(node, propVal);\n });\n return;\n case 'Property':\n parseForArbitraryValues(node, arg.key);\n start = arg.range[0] + 1;\n end = arg.range[1] - 1;\n return;\n case 'Literal':\n originalClassNamesValue = arg.value;\n start = arg.range[0] + 1;\n end = arg.range[1] - 1;\n break;\n case 'TemplateElement':\n originalClassNamesValue = arg.value.raw;\n if (originalClassNamesValue === '') {\n return;\n }\n start = arg.range[0];\n end = arg.range[1];\n if (parentTemplateLiteral) {\n if (parentTemplateLiteral.range[0] === start) {\n start += 1; // Skip opening backtick\n } else {\n start += 1; // Skip closing }\n }\n if (parentTemplateLiteral.range[1] === end) {\n end -= 1; // Skip closing backtick\n } else {\n end -= 2; // Skip opening ${\n }\n }\n break;\n }\n }\n\n const arbitraryRegEx = /^(?.*)\\[(?.*)\\]$/i;\n const { classNames } = astUtil.extractClassnamesFromValue(originalClassNamesValue);\n const arbitraryClassnames = classNames.filter((c) => arbitraryRegEx.test(c));\n\n if (arbitraryClassnames.length === 0) {\n return;\n }\n\n const unnecessaryArbitraryClasses = [];\n const existingSubstitutes = [];\n\n arbitraryClassnames.forEach((arbitraryClass, idx) => {\n const parsed = groupUtil.parseClassname(arbitraryClass, [], mergedConfig, idx);\n const res = arbitraryRegEx.exec(parsed.name);\n if (res && res.groups && res.groups.backBone && res.groups.arbitraryValue) {\n const backBone = res.groups.backBone;\n const arbitraryValue = res.groups.arbitraryValue;\n const groupIdx = groupUtil.getGroupIndex(arbitraryClass, groups, mergedConfig.separator);\n if ([groups[groupIdx], parsed.body, arbitraryValue].includes(undefined)) {\n return false;\n }\n const canBeNegative = groups[groupIdx].indexOf('?') !== -1;\n const isNegativeClass = parsed.body.indexOf('-') === 0;\n const isNegativeValue = arbitraryValue.indexOf('-') === 0;\n const configurationKey = configKeys[groupIdx];\n const configuration = mergedConfig.theme[configurationKey];\n if ([undefined, null].includes(configuration)) {\n return false;\n }\n const configurationKeys = Object.keys(configuration);\n const zeroValueWithOrWithoutUnitsPattern = new RegExp(validZeroRegEx, 'i');\n const isZeroArbitraryValue = zeroValueWithOrWithoutUnitsPattern.test(arbitraryValue);\n const negativeSubstitutes = [];\n const matchingConfigurationKeys = configurationKeys.filter((key) => {\n const configValue = configuration[key];\n if (isZeroArbitraryValue && zeroValueWithOrWithoutUnitsPattern.test(configValue)) {\n // Both config and tested values are 0 based (with or without units)\n negativeSubstitutes.push(false);\n return true;\n }\n // Negative possibilities\n if (canBeNegative) {\n const absoluteValue = isNegativeValue ? arbitraryValue.substring(1) : arbitraryValue;\n const computedAsNegative = isNegativeClass !== isNegativeValue;\n if (`${configValue}` === `${absoluteValue}`) {\n negativeSubstitutes.push(computedAsNegative);\n return true;\n }\n return false;\n }\n // Default\n if (`${configValue}` === `${arbitraryValue}`) {\n negativeSubstitutes.push(false);\n return true;\n }\n return false;\n });\n if (matchingConfigurationKeys.length) {\n unnecessaryArbitraryClasses.push(parsed.name);\n existingSubstitutes.push(\n matchingConfigurationKeys.map((key, idx) => {\n let patchedBody = backBone.substring(parsed.variants.length);\n patchedBody = patchedBody.charAt(0) === '-' ? patchedBody.substring(1) : patchedBody;\n const noneOrMinus = negativeSubstitutes[idx] ? '-' : '';\n if (key === 'DEFAULT') {\n return parsed.variants + noneOrMinus + patchedBody.substring(0, patchedBody.length - 1);\n }\n return parsed.variants + noneOrMinus + patchedBody + key;\n })\n );\n }\n }\n });\n\n // TODO Group by range and bundle the fix\n const fixables = {};\n unnecessaryArbitraryClasses.forEach((forbiddenClass, idx) => {\n if (existingSubstitutes[idx].length === 1) {\n const rangeKey = `s${start}e${end}`;\n if (!fixables[rangeKey]) {\n fixables[rangeKey] = [];\n }\n const fixer = {\n unjustified: forbiddenClass,\n substitute: existingSubstitutes[idx][0],\n };\n fixables[rangeKey].push(fixer);\n } else {\n context.report({\n node,\n messageId: 'unnecessaryArbitraryValueDetected',\n data: {\n classname: forbiddenClass,\n presets: existingSubstitutes[idx].join(\"' or '\"),\n },\n });\n }\n });\n Object.keys(fixables).forEach((rangeKey) => {\n const batchFixes = fixables[rangeKey];\n let patched = originalClassNamesValue;\n const forbiddenClasses = [];\n const substitutes = [];\n for (let idx = 0; idx < batchFixes.length; idx++) {\n // BUG replace could affect same class with distinct variants... eg. h-0 might affect min-h-0\n const unjustified = batchFixes[idx].unjustified;\n forbiddenClasses.push(unjustified);\n const substitute = batchFixes[idx].substitute;\n substitutes.push(substitute);\n patched = patched.replace(unjustified, substitute);\n }\n context.report({\n node,\n messageId: 'unnecessaryArbitraryValueDetected',\n data: {\n classname: forbiddenClasses.join(', '),\n presets: substitutes.join(', '),\n },\n fix: function (fixer) {\n return fixer.replaceTextRange([start, end], patched);\n },\n });\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n parseForArbitraryValues(node);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n parseForArbitraryValues(node, node.value.expression);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n node.arguments.forEach((arg) => {\n parseForArbitraryValues(node, arg);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name)) {\n return;\n }\n parseForArbitraryValues(node, node.quasi);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n parseForArbitraryValues(node, null);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n parseForArbitraryValues(node, arg);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n parseForArbitraryValues(node, prop);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","import classnamesOrder from './classnames-order';\nimport enforcesNegativeArbitraryValues from './enforces-negative-arbitrary-values';\nimport enforcesShorthand from './enforces-shorthand';\nimport migrationFromTailwind2 from './migration-from-tailwind-2';\nimport noArbitraryValue from './no-arbitrary-value';\nimport noContradictingClassname from './no-contradicting-classname';\nimport noCustomClassname from './no-custom-classname';\nimport noUnnecessaryArbitraryValue from './no-unnecessary-arbitrary-value';\n\nexport const rules = {\n 'classnames-order': classnamesOrder,\n 'enforces-negative-arbitrary-values': enforcesNegativeArbitraryValues,\n 'enforces-shorthand': enforcesShorthand,\n 'migration-from-tailwind-2': migrationFromTailwind2,\n 'no-arbitrary-value': noArbitraryValue,\n 'no-contradicting-classname': noContradictingClassname,\n 'no-custom-classname': noCustomClassname,\n 'no-unnecessary-arbitrary-value': noUnnecessaryArbitraryValue,\n};\n","{\n \"name\": \"eslint-plugin-tailwindcss\",\n \"version\": \"3.18.0\",\n \"description\": \"Rules enforcing best practices while using Tailwind CSS\",\n \"type\": \"module\",\n \"keywords\": [\n \"eslint\",\n \"eslintplugin\",\n \"eslint-plugin\",\n \"tailwind\",\n \"tailwindcss\"\n ],\n \"author\": \"François Massart\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/francoismassart/eslint-plugin-tailwindcss\"\n },\n \"homepage\": \"https://github.com/francoismassart/eslint-plugin-tailwindcss\",\n \"bugs\": \"https://github.com/francoismassart/eslint-plugin-tailwindcss/issues\",\n \"main\": \"lib/index.js\",\n \"scripts\": {\n \"test\": \"npm run test:base && npm run test:integration\",\n \"test:base\": \"mocha \\\"tests/lib/**/*.js\\\"\",\n \"test:integration\": \"mocha \\\"tests/integrations/*.js\\\" --timeout 60000\",\n \"build\": \"tsc --build\",\n \"build:diagnostics\": \"tsc --build --diagnostics\",\n \"watch\": \"tsc --watch\",\n \"tsup\": \"tsup ./src/index.ts --outDir lib/\",\n \"tsup:watch\": \"tsup ./src/index.ts --watch --outDir lib/\",\n \"docs:init\": \"eslint-doc-generator --init-rule-docs\",\n \"docs:update\": \"eslint-doc-generator\"\n },\n \"files\": [\n \"lib\"\n ],\n \"peerDependencies\": {\n \"tailwindcss\": \"^4.0.0\"\n },\n \"dependencies\": {\n \"@typescript-eslint/utils\": \"^7.13.0\",\n \"eslint\": \"^8.56.0\",\n \"fast-glob\": \"^3.2.5\",\n \"postcss\": \"^8.4.4\"\n },\n \"devDependencies\": {\n \"@angular-eslint/template-parser\": \"^15.2.0\",\n \"@tailwindcss/aspect-ratio\": \"^0.4.2\",\n \"@tailwindcss/forms\": \"^0.5.3\",\n \"@tailwindcss/line-clamp\": \"^0.4.2\",\n \"@tailwindcss/typography\": \"^0.5.8\",\n \"@types/eslint\": \"^8.56.10\",\n \"@types/jest\": \"^29.5.12\",\n \"@types/node\": \"^18.12.0\",\n \"@typescript-eslint/parser\": \"^7.13.0\",\n \"@typescript-eslint/rule-tester\": \"^7.13.0\",\n \"autoprefixer\": \"^10.4.0\",\n \"daisyui\": \"^2.6.4\",\n \"eslint\": \"^8.57.0\",\n \"eslint-doc-generator\": \"^1.7.1\",\n \"mocha\": \"^10.2.0\",\n \"semver\": \"^7.6.0\",\n \"tailwindcss\": \"^4.0.0\",\n \"tsup\": \"^8.1.0\",\n \"typescript\": \"^5.4.5\",\n \"vue-eslint-parser\": \"^9.4.2\"\n },\n \"packageManager\": \"npm@10.2.5+sha256.8002e3e7305d2abd4016e1368af48d49b066c269079eeb10a56e7d6598acfdaa\",\n \"engines\": {\n \"node\": \">=18.12.0\"\n },\n \"license\": \"MIT\"\n}\n","/**\n * @fileoverview Rules enforcing best practices while using Tailwind CSS\n * @author François Massart\n */\n'use strict';\n\nimport { RuleModule } from '@typescript-eslint/utils/ts-eslint';\nimport { type ESLint } from 'eslint';\nimport { configs } from './configs';\nimport { rules } from './rules';\n\n//------------------------------------------------------------------------------\n// Plugin Definition\n//------------------------------------------------------------------------------\n\ntype RuleKey = keyof typeof rules;\n\ninterface Plugin extends Omit {\n rules: Record>;\n}\n\nconst { name, version } = await import('../package.json');\n\n// import all rules in lib/rules\nconst plugin: Plugin = {\n meta: {\n name,\n version,\n },\n rules,\n configs,\n};\nexport default plugin;\n"],"mappings":"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AA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AA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","names":["name","removeDuplicatesFromArray","order","name","mergedConfig","name","groups","name","mergedConfig","name","mergedConfig","targetGroups","cloned","name","docsUrl","getOption","mergedConfig","suffix","name","docsUrl","customConfig","astUtil","groupUtil","getOption","parserUtil","mergedConfig","name","mergedConfig","groups","name","fs","removeDuplicatesFromArray","createContextFallback","escapeRegex","contextFallbackCache","mergedConfig","groups","classnamesFromFiles","name","validZeroRegEx","mergedConfig","groups","idx","name","init_rules","plugin","init_rules"]} \ No newline at end of file diff --git a/lib/util/removeDuplicatesFromArray.js b/lib/util/removeDuplicatesFromArray.js deleted file mode 100644 index 6301fe4a..00000000 --- a/lib/util/removeDuplicatesFromArray.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -function removeDuplicatesFromArray(arr) { - return [...new Set(arr)]; -} - -module.exports = removeDuplicatesFromArray; diff --git a/package-lock.json b/package-lock.json index 08c57dd4..64ffbd71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,8 @@ "version": "3.18.0", "license": "MIT", "dependencies": { + "@typescript-eslint/utils": "^7.13.0", + "eslint": "^8.56.0", "fast-glob": "^3.2.5", "postcss": "^8.4.4" }, @@ -18,28 +20,33 @@ "@tailwindcss/forms": "^0.5.3", "@tailwindcss/line-clamp": "^0.4.2", "@tailwindcss/typography": "^0.5.8", - "@typescript-eslint/parser": "^5.50.0", + "@types/eslint": "^8.56.10", + "@types/jest": "^29.5.12", + "@types/node": "^18.12.0", + "@typescript-eslint/parser": "^7.13.0", + "@typescript-eslint/rule-tester": "^7.13.0", "autoprefixer": "^10.4.0", "daisyui": "^2.6.4", "eslint": "^8.57.0", + "eslint-doc-generator": "^1.7.1", "mocha": "^10.2.0", "semver": "^7.6.0", - "tailwindcss": "^3.4.0", - "typescript": "4.3.5", + "tailwindcss": "^4.0.0", + "tsup": "^8.1.0", + "typescript": "^5.4.5", "vue-eslint-parser": "^9.4.2" }, "engines": { "node": ">=18.12.0" }, "peerDependencies": { - "tailwindcss": "^3.4.0" + "tailwindcss": "^4.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -76,11 +83,433 @@ "typescript": "*" } }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -95,7 +524,6 @@ "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -104,7 +532,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -127,7 +554,6 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -136,7 +562,6 @@ "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -150,7 +575,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, "engines": { "node": ">=12.22" }, @@ -162,94 +586,487 @@ "node_modules/@humanwhocodes/object-schema": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.0.tgz", + "integrity": "sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.0.tgz", + "integrity": "sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.0.tgz", + "integrity": "sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.0.tgz", + "integrity": "sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.0.tgz", + "integrity": "sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.0.tgz", + "integrity": "sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.0.tgz", + "integrity": "sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.0.tgz", + "integrity": "sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.0.tgz", + "integrity": "sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.0.tgz", + "integrity": "sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.0.tgz", + "integrity": "sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.0.tgz", + "integrity": "sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.0.tgz", + "integrity": "sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw==", + "cpu": [ + "riscv64" + ], "dev": true, - "engines": { - "node": ">=6.0.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.0.tgz", + "integrity": "sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw==", + "cpu": [ + "s390x" + ], "dev": true, - "engines": { - "node": ">=6.0.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.0.tgz", + "integrity": "sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.0.tgz", + "integrity": "sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.0.tgz", + "integrity": "sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.0.tgz", + "integrity": "sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.0.tgz", + "integrity": "sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true }, "node_modules/@tailwindcss/aspect-ratio": { "version": "0.4.2", @@ -296,26 +1113,119 @@ "tailwindcss": ">=3.0.0 || insiders" } }, + "node_modules/@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.19.74", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.74.tgz", + "integrity": "sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, "node_modules/@typescript-eslint/parser": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", - "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -323,17 +1233,41 @@ } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", + "node_modules/@typescript-eslint/rule-tester": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-7.18.0.tgz", + "integrity": "sha512-ClrFQlwen9pJcYPIBLuarzBpONQAwjmJ0+YUjAo1TGzoZFJPyUK/A7bb4Mps0u+SMJJnFXbfMN8I9feQDf0O5A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0" + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "ajv": "^6.12.6", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "4.6.2", + "semver": "^7.6.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@eslint/eslintrc": ">=2", + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -341,12 +1275,11 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -354,21 +1287,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", - "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -380,17 +1313,59 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dependencies": { - "@typescript-eslint/types": "5.50.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -400,14 +1375,12 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -419,7 +1392,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -428,7 +1400,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -453,11 +1424,24 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -486,14 +1470,12 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, "engines": { "node": ">=8" } @@ -528,8 +1510,7 @@ "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "node_modules/binary-extensions": { "version": "2.2.0", @@ -540,11 +1521,17 @@ "node": ">=8" } }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -590,11 +1577,34 @@ "url": "https://opencollective.com/browserslist" } }, + "node_modules/bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "dev": true, + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -634,7 +1644,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -646,44 +1655,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/chalk/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/chalk/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -692,7 +1667,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -721,10 +1695,25 @@ "readdirp": "~3.6.0" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" } }, "node_modules/cliui": { @@ -751,27 +1740,10 @@ "node": ">=12.5.0" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/color-string": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", - "dev": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { + "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -779,11 +1751,20 @@ "node": ">=7.0.0" } }, - "node_modules/color/node_modules/color-name": { + "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "node_modules/commander": { "version": "4.1.1", @@ -797,14 +1778,47 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/consola": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -852,11 +1866,96 @@ "postcss": "^8.1.6" } }, + "node_modules/daisyui/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/daisyui/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/daisyui/node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/daisyui/node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -884,8 +1983,16 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/didyoumean": { "version": "1.2.2", @@ -902,11 +2009,19 @@ "node": ">=0.3.1" } }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -924,7 +2039,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -932,6 +2046,39 @@ "node": ">=6.0.0" } }, + "node_modules/dot-prop": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-7.2.0.tgz", + "integrity": "sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==", + "dev": true, + "dependencies": { + "type-fest": "^2.11.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/electron-to-chromium": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.15.tgz", @@ -944,6 +2091,55 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -957,7 +2153,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -969,7 +2164,6 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -1010,21 +2204,214 @@ "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, - "bin": { - "eslint": "bin/eslint.js" + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-doc-generator": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/eslint-doc-generator/-/eslint-doc-generator-1.7.1.tgz", + "integrity": "sha512-i1Zjl+Xcy712SZhbceCeMVaIdhbFqY27i8d7f9gyb9P/6AQNnPA0VCWynAFVGYa0hpeR5kwUI09+GBELgC2nnA==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.38.1", + "ajv": "^8.11.2", + "boolean": "^3.2.0", + "commander": "^10.0.0", + "cosmiconfig": "^8.0.0", + "deepmerge": "^4.2.2", + "dot-prop": "^7.2.0", + "jest-diff": "^29.2.1", + "json-schema-traverse": "^1.0.0", + "markdown-table": "^3.0.3", + "no-case": "^3.0.4", + "type-fest": "^3.0.0" + }, + "bin": { + "eslint-doc-generator": "dist/bin/eslint-doc-generator.js" + }, + "engines": { + "node": "^14.18.0 || ^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "eslint": ">= 7" + } + }, + "node_modules/eslint-doc-generator/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-doc-generator/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-doc-generator/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-doc-generator/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-doc-generator/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-doc-generator/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint-doc-generator/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/eslint-doc-generator/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8.0.0" + } + }, + "node_modules/eslint-doc-generator/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-doc-generator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/eslint-doc-generator/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -1040,7 +2427,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -1052,7 +2438,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -1064,7 +2449,6 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -1081,7 +2465,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -1093,7 +2476,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -1105,7 +2487,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "engines": { "node": ">=4.0" } @@ -1114,16 +2495,30 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.2", @@ -1143,14 +2538,28 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] }, "node_modules/fastparse": { "version": "1.1.2", @@ -1170,7 +2579,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -1193,7 +2601,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -1218,7 +2625,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -1230,8 +2636,23 @@ "node_modules/flatted": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/fraction.js": { "version": "4.1.2", @@ -1249,8 +2670,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { "version": "2.3.2", @@ -1267,10 +2687,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/get-caller-file": { "version": "2.0.5", @@ -1285,7 +2708,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1316,7 +2738,6 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -1331,7 +2752,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -1347,22 +2767,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4" } }, "node_modules/he": { @@ -1378,7 +2803,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, "engines": { "node": ">= 4" } @@ -1387,7 +2811,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1403,7 +2826,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -1412,7 +2834,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -1421,7 +2842,12 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "node_modules/is-binary-path": { @@ -1437,12 +2863,15 @@ } }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1488,7 +2917,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1517,23 +2945,127 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "bin": { "jiti": "bin/jiti.js" } }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -1541,23 +3073,26 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -1567,12 +3102,15 @@ } }, "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { @@ -1581,11 +3119,19 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -1617,7 +3163,12 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true }, "node_modules/log-symbols": { @@ -1636,11 +3187,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -1648,6 +3207,16 @@ "node": ">=10" } }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -1657,11 +3226,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -1681,7 +3250,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1689,6 +3257,15 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", @@ -1795,8 +3372,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mz": { "version": "2.7.0", @@ -1810,9 +3386,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", @@ -1829,8 +3405,17 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } }, "node_modules/node-releases": { "version": "2.0.1", @@ -1878,7 +3463,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "dependencies": { "wrappy": "1" } @@ -1887,7 +3471,6 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -1904,7 +3487,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -1919,7 +3501,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -1930,11 +3511,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -1942,11 +3528,28 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -1955,7 +3558,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1964,7 +3566,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -1975,19 +3576,40 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -2010,18 +3632,18 @@ } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { "node": ">= 6" } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "funding": [ { "type": "opencollective", @@ -2037,9 +3659,9 @@ } ], "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -2082,21 +3704,27 @@ } }, "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" }, "engines": { "node": ">= 14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" @@ -2108,31 +3736,37 @@ "ts-node": { "optional": true } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "postcss-selector-parser": "^6.0.11" + "postcss-selector-parser": "^6.1.1" }, "engines": { "node": ">=12.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.2.14" } }, "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", - "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -2165,16 +3799,40 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "engines": { "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -2207,6 +3865,12 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -2237,19 +3901,31 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2258,7 +3934,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -2276,7 +3951,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -2287,6 +3961,44 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.0.tgz", + "integrity": "sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.32.0", + "@rollup/rollup-android-arm64": "4.32.0", + "@rollup/rollup-darwin-arm64": "4.32.0", + "@rollup/rollup-darwin-x64": "4.32.0", + "@rollup/rollup-freebsd-arm64": "4.32.0", + "@rollup/rollup-freebsd-x64": "4.32.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.32.0", + "@rollup/rollup-linux-arm-musleabihf": "4.32.0", + "@rollup/rollup-linux-arm64-gnu": "4.32.0", + "@rollup/rollup-linux-arm64-musl": "4.32.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.32.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.32.0", + "@rollup/rollup-linux-riscv64-gnu": "4.32.0", + "@rollup/rollup-linux-s390x-gnu": "4.32.0", + "@rollup/rollup-linux-x64-gnu": "4.32.0", + "@rollup/rollup-linux-x64-musl": "4.32.0", + "@rollup/rollup-win32-arm64-msvc": "4.32.0", + "@rollup/rollup-win32-ia32-msvc": "4.32.0", + "@rollup/rollup-win32-x64-msvc": "4.32.0", + "fsevents": "~2.3.2" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -2333,7 +4045,6 @@ "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -2357,7 +4068,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -2369,11 +4079,22 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -2393,19 +4114,51 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -2420,7 +4173,34 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -2436,7 +4216,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -2445,14 +4224,14 @@ } }, "node_modules/sucrase": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", - "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "7.1.6", + "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", @@ -2463,24 +4242,48 @@ "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2499,117 +4302,287 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", - "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.0.tgz", + "integrity": "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true + }, + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "dev": true, + "dependencies": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=12.0.0" } }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, + "node_modules/tsup": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.3.5.tgz", + "integrity": "sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==", + "dev": true, + "dependencies": { + "bundle-require": "^5.0.0", + "cac": "^6.7.14", + "chokidar": "^4.0.1", + "consola": "^3.2.3", + "debug": "^4.3.7", + "esbuild": "^0.24.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.24.0", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.1", + "tinyglobby": "^0.2.9", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/tsup/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", - "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", + "node_modules/tsup/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "ms": "^2.1.3" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "node_modules/tsup/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "node_modules/tsup/node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "any-promise": "^1.0.0" + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "node_modules/tsup/node_modules/readdirp": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, "engines": { - "node": ">=0.8" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, + "node_modules/tsup/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { - "node": ">=8.0" + "node": ">=8" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", @@ -2625,11 +4598,16 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -2641,7 +4619,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -2650,23 +4627,27 @@ } }, "node_modules/typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", - "dev": true, + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -2701,11 +4682,27 @@ "eslint": ">=6.0.0" } }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -2739,44 +4736,28 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/y18n": { "version": "5.0.8", @@ -2790,14 +4771,16 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", - "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "dev": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } @@ -2834,63 +4817,252 @@ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" + }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true + }, + "@angular-eslint/bundled-angular-compiler": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-15.2.0.tgz", + "integrity": "sha512-a0bfXxYyGoWJHrVQ4QER0HdRgselcTtJeyqiFPAxID2ZxF0IBGKLNTtugUTXekEmiLev8yGLX9TqAtthN57fEg==", + "dev": true + }, + "@angular-eslint/template-parser": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-15.2.0.tgz", + "integrity": "sha512-xnnxPfV/G0Ll3B0HGrF1ucsc/DHmNE6UhhmWxYPTERq0McbZGRiATa66hCoOZ/Rdylun4ogBfsRKAG8XxEvlvw==", + "dev": true, + "requires": { + "@angular-eslint/bundled-angular-compiler": "15.2.0", + "eslint-scope": "^7.0.0" + } + }, + "@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true + }, + "@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "dev": true, + "optional": true }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true + "optional": true }, - "@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true + "@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "dev": true, + "optional": true }, - "@angular-eslint/bundled-angular-compiler": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-15.2.0.tgz", - "integrity": "sha512-a0bfXxYyGoWJHrVQ4QER0HdRgselcTtJeyqiFPAxID2ZxF0IBGKLNTtugUTXekEmiLev8yGLX9TqAtthN57fEg==", - "dev": true + "@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "dev": true, + "optional": true }, - "@angular-eslint/template-parser": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-15.2.0.tgz", - "integrity": "sha512-xnnxPfV/G0Ll3B0HGrF1ucsc/DHmNE6UhhmWxYPTERq0McbZGRiATa66hCoOZ/Rdylun4ogBfsRKAG8XxEvlvw==", + "@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "15.2.0", - "eslint-scope": "^7.0.0" - } + "optional": true }, "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, "requires": { "eslint-visitor-keys": "^3.3.0" } @@ -2898,14 +5070,12 @@ "@eslint-community/regexpp": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==" }, "@eslint/eslintrc": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2921,14 +5091,12 @@ "@eslint/js": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==" }, "@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, "requires": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -2938,60 +5106,147 @@ "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" }, "@humanwhocodes/object-schema": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "requires": { + "jest-get-type": "^29.6.3" + } + }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@nodelib/fs.scandir": { @@ -3017,6 +5272,152 @@ "fastq": "^1.6.0" } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.0.tgz", + "integrity": "sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.0.tgz", + "integrity": "sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.0.tgz", + "integrity": "sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.0.tgz", + "integrity": "sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-freebsd-arm64": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.0.tgz", + "integrity": "sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-freebsd-x64": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.0.tgz", + "integrity": "sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.0.tgz", + "integrity": "sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.0.tgz", + "integrity": "sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.0.tgz", + "integrity": "sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.0.tgz", + "integrity": "sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.0.tgz", + "integrity": "sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.0.tgz", + "integrity": "sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.0.tgz", + "integrity": "sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.0.tgz", + "integrity": "sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.0.tgz", + "integrity": "sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.0.tgz", + "integrity": "sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.0.tgz", + "integrity": "sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.0.tgz", + "integrity": "sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.0.tgz", + "integrity": "sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA==", + "dev": true, + "optional": true + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "@tailwindcss/aspect-ratio": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@tailwindcss/aspect-ratio/-/aspect-ratio-0.4.2.tgz", @@ -3052,83 +5453,212 @@ "postcss-selector-parser": "6.0.10" } }, + "@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@types/node": { + "version": "18.19.74", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.74.tgz", + "integrity": "sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, "@typescript-eslint/parser": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", - "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4" } }, - "@typescript-eslint/scope-manager": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", + "@typescript-eslint/rule-tester": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-7.18.0.tgz", + "integrity": "sha512-ClrFQlwen9pJcYPIBLuarzBpONQAwjmJ0+YUjAo1TGzoZFJPyUK/A7bb4Mps0u+SMJJnFXbfMN8I9feQDf0O5A==", "dev": true, "requires": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0" + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "ajv": "^6.12.6", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "4.6.2", + "semver": "^7.6.0" + } + }, + "@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "requires": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" } }, "@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", - "dev": true + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==" }, "@typescript-eslint/typescript-estree": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", - "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "requires": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "requires": { - "@typescript-eslint/types": "5.50.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" } }, "@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "requires": {} }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3145,8 +5675,15 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } }, "any-promise": { "version": "1.3.0", @@ -3173,14 +5710,12 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "autoprefixer": { "version": "10.4.0", @@ -3199,8 +5734,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "binary-extensions": { "version": "2.2.0", @@ -3208,11 +5742,16 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3245,11 +5784,25 @@ "picocolors": "^1.0.0" } }, + "bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "dev": true, + "requires": { + "load-tsconfig": "^0.2.3" + } + }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camelcase": { "version": "6.3.0", @@ -3273,47 +5826,20 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -3336,6 +5862,12 @@ "readdirp": "~3.6.0" } }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -3355,30 +5887,20 @@ "requires": { "color-convert": "^2.0.1", "color-string": "^1.9.0" - }, - "dependencies": { - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { "version": "1.9.0", @@ -3399,14 +5921,30 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "consola": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", "dev": true }, + "cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "requires": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3439,13 +5977,81 @@ "css-selector-tokenizer": "^0.8.0", "postcss-js": "^4.0.0", "tailwindcss": "^3.0" + }, + "dependencies": { + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + } } }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -3459,7 +6065,12 @@ "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, "didyoumean": { @@ -3474,11 +6085,16 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "requires": { "path-type": "^4.0.0" } @@ -3493,11 +6109,33 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, "requires": { "esutils": "^2.0.2" } }, + "dot-prop": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-7.2.0.tgz", + "integrity": "sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==", + "dev": true, + "requires": { + "type-fest": "^2.11.2" + }, + "dependencies": { + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true + } + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "electron-to-chromium": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.15.tgz", @@ -3510,6 +6148,48 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -3519,14 +6199,12 @@ "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3572,18 +6250,141 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "requires": { "is-glob": "^4.0.3" } } } }, + "eslint-doc-generator": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/eslint-doc-generator/-/eslint-doc-generator-1.7.1.tgz", + "integrity": "sha512-i1Zjl+Xcy712SZhbceCeMVaIdhbFqY27i8d7f9gyb9P/6AQNnPA0VCWynAFVGYa0hpeR5kwUI09+GBELgC2nnA==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "^5.38.1", + "ajv": "^8.11.2", + "boolean": "^3.2.0", + "commander": "^10.0.0", + "cosmiconfig": "^8.0.0", + "deepmerge": "^4.2.2", + "dot-prop": "^7.2.0", + "jest-diff": "^29.2.1", + "json-schema-traverse": "^1.0.0", + "markdown-table": "^3.0.3", + "no-case": "^3.0.4", + "type-fest": "^3.0.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true + } + } + }, "eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -3592,14 +6393,12 @@ "eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" }, "espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, "requires": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -3610,7 +6409,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, "requires": { "estraverse": "^5.1.0" } @@ -3619,7 +6417,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "requires": { "estraverse": "^5.2.0" } @@ -3627,20 +6424,30 @@ "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + } }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { "version": "3.3.2", @@ -3657,13 +6464,17 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true }, "fastparse": { @@ -3684,7 +6495,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, "requires": { "flat-cache": "^3.0.4" } @@ -3701,7 +6511,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3717,7 +6526,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -3726,8 +6534,17 @@ "flatted": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" + }, + "foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } }, "fraction.js": { "version": "4.1.2", @@ -3738,8 +6555,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", @@ -3749,9 +6565,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "get-caller-file": { @@ -3764,7 +6580,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3786,7 +6601,6 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, "requires": { "type-fest": "^0.20.2" } @@ -3795,7 +6609,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -3805,19 +6618,24 @@ "slash": "^3.0.0" } }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, "graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "function-bind": "^1.1.2" } }, "he": { @@ -3829,14 +6647,12 @@ "ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==" }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3845,14 +6661,12 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -3861,7 +6675,12 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "is-binary-path": { @@ -3874,12 +6693,12 @@ } }, "is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.2" } }, "is-extglob": { @@ -3909,8 +6728,7 @@ "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" }, "is-plain-obj": { "version": "2.1.0", @@ -3927,50 +6745,134 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + } + }, + "jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, + "jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + } + }, + "jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, "jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true + }, + "joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true }, "lines-and-columns": { @@ -3979,11 +6881,16 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "requires": { "p-locate": "^5.0.0" } @@ -4009,7 +6916,12 @@ "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true }, "log-symbols": { @@ -4022,26 +6934,40 @@ "is-unicode-supported": "^0.1.0" } }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } }, + "markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -4055,11 +6981,16 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + }, "mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", @@ -4139,8 +7070,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "mz": { "version": "2.7.0", @@ -4154,15 +7084,24 @@ } }, "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } }, "node-releases": { "version": "2.0.1", @@ -4198,7 +7137,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -4207,7 +7145,6 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, "requires": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -4221,7 +7158,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "requires": { "yocto-queue": "^0.1.0" } @@ -4230,37 +7166,50 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "requires": { "p-limit": "^3.0.2" } }, + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" } }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", @@ -4268,16 +7217,33 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + } + } + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "picomatch": { "version": "2.3.1", @@ -4291,19 +7257,19 @@ "dev": true }, "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true }, "postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" } }, "postcss-import": { @@ -4327,28 +7293,28 @@ } }, "postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", "dev": true, "requires": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" } }, "postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.11" + "postcss-selector-parser": "^6.1.1" }, "dependencies": { "postcss-selector-parser": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", - "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -4376,14 +7342,31 @@ "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } }, "punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" }, "queue-microtask": { "version": "1.2.3", @@ -4399,6 +7382,12 @@ "safe-buffer": "^5.1.0" } }, + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -4423,13 +7412,19 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "requires": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -4437,8 +7432,7 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, "reusify": { "version": "1.0.4", @@ -4449,11 +7443,39 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "requires": { "glob": "^7.1.3" } }, + "rollup": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.0.tgz", + "integrity": "sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.32.0", + "@rollup/rollup-android-arm64": "4.32.0", + "@rollup/rollup-darwin-arm64": "4.32.0", + "@rollup/rollup-darwin-x64": "4.32.0", + "@rollup/rollup-freebsd-arm64": "4.32.0", + "@rollup/rollup-freebsd-x64": "4.32.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.32.0", + "@rollup/rollup-linux-arm-musleabihf": "4.32.0", + "@rollup/rollup-linux-arm64-gnu": "4.32.0", + "@rollup/rollup-linux-arm64-musl": "4.32.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.32.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.32.0", + "@rollup/rollup-linux-riscv64-gnu": "4.32.0", + "@rollup/rollup-linux-s390x-gnu": "4.32.0", + "@rollup/rollup-linux-x64-gnu": "4.32.0", + "@rollup/rollup-linux-x64-musl": "4.32.0", + "@rollup/rollup-win32-arm64-msvc": "4.32.0", + "@rollup/rollup-win32-ia32-msvc": "4.32.0", + "@rollup/rollup-win32-x64-msvc": "4.32.0", + "@types/estree": "1.0.6", + "fsevents": "~2.3.2" + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -4472,7 +7494,6 @@ "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -4490,7 +7511,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -4498,7 +7518,12 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true }, "simple-swizzle": { @@ -4521,13 +7546,38 @@ "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "requires": { + "whatwg-url": "^7.0.0" + } }, "source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } }, "string-width": { "version": "4.2.2", @@ -4540,10 +7590,29 @@ "strip-ansi": "^6.0.0" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -4552,36 +7621,53 @@ "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "sucrase": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", - "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "7.1.6", + "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "brace-expansion": "^2.0.1" } } } @@ -4593,61 +7679,15 @@ "dev": true }, "tailwindcss": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", - "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==", - "dev": true, - "requires": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "postcss-selector-parser": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", - "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - } - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.0.tgz", + "integrity": "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ==", + "dev": true }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "thenify": { "version": "3.3.1", @@ -4667,6 +7707,37 @@ "thenify": ">= 3.1.0 < 4" } }, + "tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true + }, + "tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "dev": true, + "requires": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, + "dependencies": { + "fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true + } + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4675,6 +7746,27 @@ "is-number": "^7.0.0" } }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "requires": {} + }, "ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -4682,11 +7774,82 @@ "dev": true }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, + "tsup": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.3.5.tgz", + "integrity": "sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==", + "dev": true, + "requires": { + "bundle-require": "^5.0.0", + "cac": "^6.7.14", + "chokidar": "^4.0.1", + "consola": "^3.2.3", + "debug": "^4.3.7", + "esbuild": "^0.24.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.24.0", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.1", + "tinyglobby": "^0.2.9", + "tree-kill": "^1.2.2" + }, + "dependencies": { + "chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "requires": { + "readdirp": "^4.0.1" + } + }, + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "requires": { + "lilconfig": "^3.1.1" + } + }, + "readdirp": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, "tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", @@ -4694,13 +7857,20 @@ "dev": true, "requires": { "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "requires": { "prelude-ls": "^1.2.1" } @@ -4708,20 +7878,23 @@ "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" }, "typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==" + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -4747,11 +7920,27 @@ "semver": "^7.3.6" } }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -4771,39 +7960,23 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "y18n": { "version": "5.0.8", @@ -4814,13 +7987,12 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", - "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "dev": true }, "yargs": { @@ -4859,8 +8031,7 @@ "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/package.json b/package.json index 85edb84e..20dcf1bd 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "eslint-plugin-tailwindcss", "version": "3.18.0", "description": "Rules enforcing best practices while using Tailwind CSS", + "type": "module", "keywords": [ "eslint", "eslintplugin", @@ -20,15 +21,24 @@ "scripts": { "test": "npm run test:base && npm run test:integration", "test:base": "mocha \"tests/lib/**/*.js\"", - "test:integration": "mocha \"tests/integrations/*.js\" --timeout 60000" + "test:integration": "mocha \"tests/integrations/*.js\" --timeout 60000", + "build": "tsc --build", + "build:diagnostics": "tsc --build --diagnostics", + "watch": "tsc --watch", + "tsup": "tsup ./src/index.ts --outDir lib/", + "tsup:watch": "tsup ./src/index.ts --watch --outDir lib/", + "docs:init": "eslint-doc-generator --init-rule-docs", + "docs:update": "eslint-doc-generator" }, "files": [ "lib" ], "peerDependencies": { - "tailwindcss": "^3.4.0" + "tailwindcss": "^4.0.0" }, "dependencies": { + "@typescript-eslint/utils": "^7.13.0", + "eslint": "^8.56.0", "fast-glob": "^3.2.5", "postcss": "^8.4.4" }, @@ -38,14 +48,20 @@ "@tailwindcss/forms": "^0.5.3", "@tailwindcss/line-clamp": "^0.4.2", "@tailwindcss/typography": "^0.5.8", - "@typescript-eslint/parser": "^5.50.0", + "@types/eslint": "^8.56.10", + "@types/jest": "^29.5.12", + "@types/node": "^18.12.0", + "@typescript-eslint/parser": "^7.13.0", + "@typescript-eslint/rule-tester": "^7.13.0", "autoprefixer": "^10.4.0", "daisyui": "^2.6.4", "eslint": "^8.57.0", + "eslint-doc-generator": "^1.7.1", "mocha": "^10.2.0", "semver": "^7.6.0", - "tailwindcss": "^3.4.0", - "typescript": "4.3.5", + "tailwindcss": "^4.0.0", + "tsup": "^8.1.0", + "typescript": "^5.4.5", "vue-eslint-parser": "^9.4.2" }, "packageManager": "npm@10.2.5+sha256.8002e3e7305d2abd4016e1368af48d49b066c269079eeb10a56e7d6598acfdaa", diff --git a/lib/.prettierrc.json b/src/.prettierrc.json similarity index 100% rename from lib/.prettierrc.json rename to src/.prettierrc.json diff --git a/lib/config/flat-recommended.js b/src/configs/flat-recommended.ts similarity index 80% rename from lib/config/flat-recommended.js rename to src/configs/flat-recommended.ts index d6d103c9..f36e0a6c 100644 --- a/lib/config/flat-recommended.js +++ b/src/configs/flat-recommended.ts @@ -5,14 +5,16 @@ */ 'use strict'; -const rules = require('./rules'); +import rules from './rules'; -module.exports = [ +const plugin = await import('../index'); + +export default [ { name: 'tailwindcss:base', plugins: { get tailwindcss() { - return require('../index'); + return plugin; }, }, languageOptions: { diff --git a/lib/config/groups.js b/src/configs/groups.ts similarity index 99% rename from lib/config/groups.js rename to src/configs/groups.ts index 8ab91d53..8456756b 100644 --- a/lib/config/groups.js +++ b/src/configs/groups.ts @@ -5,7 +5,7 @@ * @see https://tailwindcss.com/docs * @author François Massart */ -module.exports.groups = [ +export const groups = [ { type: 'Core Concepts', members: [ diff --git a/src/configs/index.ts b/src/configs/index.ts new file mode 100644 index 00000000..38cadf63 --- /dev/null +++ b/src/configs/index.ts @@ -0,0 +1,7 @@ +import flatRecommended from './flat-recommended'; +import recommended from './recommended'; + +export const configs = { + recommended, + 'flat/recommended': flatRecommended, +}; diff --git a/lib/config/recommended.js b/src/configs/recommended.ts similarity index 84% rename from lib/config/recommended.js rename to src/configs/recommended.ts index be940366..d37003ee 100644 --- a/lib/config/recommended.js +++ b/src/configs/recommended.ts @@ -5,9 +5,9 @@ */ 'use strict'; -const rules = require('./rules'); +import rules from './rules'; -module.exports = { +export default { plugins: ['tailwindcss'], parserOptions: { ecmaFeatures: { diff --git a/lib/config/rules.js b/src/configs/rules.ts similarity index 96% rename from lib/config/rules.js rename to src/configs/rules.ts index 2399d016..6969a4bc 100644 --- a/lib/config/rules.js +++ b/src/configs/rules.ts @@ -3,7 +3,7 @@ * @author François Massart */ -module.exports = { +export default { 'tailwindcss/classnames-order': 'warn', 'tailwindcss/enforces-negative-arbitrary-values': 'warn', 'tailwindcss/enforces-shorthand': 'warn', diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..6a462a6e --- /dev/null +++ b/src/index.ts @@ -0,0 +1,33 @@ +/** + * @fileoverview Rules enforcing best practices while using Tailwind CSS + * @author François Massart + */ +'use strict'; + +import { RuleModule } from '@typescript-eslint/utils/ts-eslint'; +import { type ESLint } from 'eslint'; +import { configs } from './configs'; +import { rules } from './rules'; + +//------------------------------------------------------------------------------ +// Plugin Definition +//------------------------------------------------------------------------------ + +type RuleKey = keyof typeof rules; + +interface Plugin extends Omit { + rules: Record>; +} + +const { name, version } = await import('../package.json'); + +// import all rules in lib/rules +const plugin: Plugin = { + meta: { + name, + version, + }, + rules, + configs, +}; +export default plugin; diff --git a/lib/rules/classnames-order.js b/src/rules/classnames-order.ts similarity index 95% rename from lib/rules/classnames-order.js rename to src/rules/classnames-order.ts index e7e35732..d3ffd426 100644 --- a/lib/rules/classnames-order.js +++ b/src/rules/classnames-order.ts @@ -4,13 +4,13 @@ */ 'use strict'; -const docsUrl = require('../util/docsUrl'); -const customConfig = require('../util/customConfig'); -const astUtil = require('../util/ast'); -const removeDuplicatesFromClassnamesAndWhitespaces = require('../util/removeDuplicatesFromClassnamesAndWhitespaces'); -const getOption = require('../util/settings'); -const parserUtil = require('../util/parser'); -const order = require('../util/prettier/order'); +import astUtil from '../util/ast'; +import customConfig from '../util/customConfig'; +import docsUrl from '../util/docsUrl'; +import parserUtil from '../util/parser'; +import order from '../util/prettier/order'; +import removeDuplicatesFromClassnamesAndWhitespaces from '../util/removeDuplicatesFromClassnamesAndWhitespaces'; +import getOption from '../util/settings'; const createContextFallback = require('tailwindcss/lib/lib/setupContextUtils').createContext; //------------------------------------------------------------------------------ @@ -23,7 +23,7 @@ const INVALID_CLASSNAMES_ORDER_MSG = 'Invalid Tailwind CSS classnames order'; const contextFallbackCache = new WeakMap(); -module.exports = { +export default { meta: { docs: { description: 'Enforce a consistent and logical order of the Tailwind CSS classnames', diff --git a/lib/rules/enforces-negative-arbitrary-values.js b/src/rules/enforces-negative-arbitrary-values.ts similarity index 96% rename from lib/rules/enforces-negative-arbitrary-values.js rename to src/rules/enforces-negative-arbitrary-values.ts index 12189935..4a230a67 100644 --- a/lib/rules/enforces-negative-arbitrary-values.js +++ b/src/rules/enforces-negative-arbitrary-values.ts @@ -4,12 +4,12 @@ */ 'use strict'; -const docsUrl = require('../util/docsUrl'); -const customConfig = require('../util/customConfig'); -const astUtil = require('../util/ast'); -const groupUtil = require('../util/groupMethods'); -const getOption = require('../util/settings'); -const parserUtil = require('../util/parser'); +import astUtil from '../util/ast'; +import customConfig from '../util/customConfig'; +import docsUrl from '../util/docsUrl'; +import groupUtil from '../util/groupMethods'; +import parserUtil from '../util/parser'; +import getOption from '../util/settings'; //------------------------------------------------------------------------------ // Rule Definition @@ -19,7 +19,7 @@ const parserUtil = require('../util/parser'); // messageId will still be usable in tests. const NEGATIVE_ARBITRARY_VALUE = `Arbitrary value classname '{{classname}}' should not start with a dash (-)`; -module.exports = { +export default { meta: { docs: { description: 'Warns about dash prefixed classnames using arbitrary values', diff --git a/lib/rules/enforces-shorthand.js b/src/rules/enforces-shorthand.ts similarity index 98% rename from lib/rules/enforces-shorthand.js rename to src/rules/enforces-shorthand.ts index 61e84ac2..36db2497 100644 --- a/lib/rules/enforces-shorthand.js +++ b/src/rules/enforces-shorthand.ts @@ -4,13 +4,13 @@ */ 'use strict'; -const docsUrl = require('../util/docsUrl'); -const defaultGroups = require('../config/groups').groups; -const customConfig = require('../util/customConfig'); -const astUtil = require('../util/ast'); -const groupUtil = require('../util/groupMethods'); -const getOption = require('../util/settings'); -const parserUtil = require('../util/parser'); +import { groups as defaultGroups } from '../configs/groups'; +import astUtil from '../util/ast'; +import customConfig from '../util/customConfig'; +import docsUrl from '../util/docsUrl'; +import groupUtil from '../util/groupMethods'; +import parserUtil from '../util/parser'; +import getOption from '../util/settings'; //------------------------------------------------------------------------------ // Rule Definition @@ -20,7 +20,7 @@ const parserUtil = require('../util/parser'); // messageId will still be usable in tests. const SHORTHAND_CANDIDATE_CLASSNAMES_DETECTED_MSG = `Classnames '{{classnames}}' could be replaced by the '{{shorthand}}' shorthand!`; -module.exports = { +export default { meta: { docs: { description: 'Enforces the usage of shorthand Tailwind CSS classnames', diff --git a/src/rules/index.ts b/src/rules/index.ts new file mode 100644 index 00000000..0b298ac6 --- /dev/null +++ b/src/rules/index.ts @@ -0,0 +1,19 @@ +import classnamesOrder from './classnames-order'; +import enforcesNegativeArbitraryValues from './enforces-negative-arbitrary-values'; +import enforcesShorthand from './enforces-shorthand'; +import migrationFromTailwind2 from './migration-from-tailwind-2'; +import noArbitraryValue from './no-arbitrary-value'; +import noContradictingClassname from './no-contradicting-classname'; +import noCustomClassname from './no-custom-classname'; +import noUnnecessaryArbitraryValue from './no-unnecessary-arbitrary-value'; + +export const rules = { + 'classnames-order': classnamesOrder, + 'enforces-negative-arbitrary-values': enforcesNegativeArbitraryValues, + 'enforces-shorthand': enforcesShorthand, + 'migration-from-tailwind-2': migrationFromTailwind2, + 'no-arbitrary-value': noArbitraryValue, + 'no-contradicting-classname': noContradictingClassname, + 'no-custom-classname': noCustomClassname, + 'no-unnecessary-arbitrary-value': noUnnecessaryArbitraryValue, +}; diff --git a/lib/rules/migration-from-tailwind-2.js b/src/rules/migration-from-tailwind-2.ts similarity index 99% rename from lib/rules/migration-from-tailwind-2.js rename to src/rules/migration-from-tailwind-2.ts index 5de0f0f7..4261efd1 100644 --- a/lib/rules/migration-from-tailwind-2.js +++ b/src/rules/migration-from-tailwind-2.ts @@ -22,7 +22,7 @@ const CLASSNAMES_NOT_NEEDED_MSG = `Classnames '{{classnames}}' are not needed in const CLASSNAME_CHANGED_MSG = `Classname '{{deprecated}}' should be updated to '{{updated}}' in Tailwind CSS v3!`; const OPACITY_CLASS_DEPRECATED_MSG = `Classname '{{classname}}' should be replaced by an opacity suffix (eg. '/{{value}}')`; -module.exports = { +export default { meta: { docs: { description: 'Detect obsolete classnames when upgrading to Tailwind CSS v3', diff --git a/lib/rules/no-arbitrary-value.js b/src/rules/no-arbitrary-value.ts similarity index 99% rename from lib/rules/no-arbitrary-value.js rename to src/rules/no-arbitrary-value.ts index 71cf4595..7a0ef71a 100644 --- a/lib/rules/no-arbitrary-value.js +++ b/src/rules/no-arbitrary-value.ts @@ -19,7 +19,7 @@ const parserUtil = require('../util/parser'); // messageId will still be usable in tests. const ARBITRARY_VALUE_DETECTED_MSG = `Arbitrary value detected in '{{classname}}'`; -module.exports = { +export default { meta: { docs: { description: 'Forbid using arbitrary values in classnames', diff --git a/lib/rules/no-contradicting-classname.js b/src/rules/no-contradicting-classname.ts similarity index 96% rename from lib/rules/no-contradicting-classname.js rename to src/rules/no-contradicting-classname.ts index c7ce96c5..008b8c5f 100644 --- a/lib/rules/no-contradicting-classname.js +++ b/src/rules/no-contradicting-classname.ts @@ -4,13 +4,13 @@ */ 'use strict'; -const docsUrl = require('../util/docsUrl'); -const defaultGroups = require('../config/groups').groups; -const customConfig = require('../util/customConfig'); -const astUtil = require('../util/ast'); -const groupUtil = require('../util/groupMethods'); -const getOption = require('../util/settings'); -const parserUtil = require('../util/parser'); +import { groups as defaultGroups } from '../configs/groups'; +import astUtil from '../util/ast'; +import customConfig from '../util/customConfig'; +import docsUrl from '../util/docsUrl'; +import groupUtil from '../util/groupMethods'; +import parserUtil from '../util/parser'; +import getOption from '../util/settings'; //------------------------------------------------------------------------------ // Rule Definition @@ -20,7 +20,7 @@ const parserUtil = require('../util/parser'); // messageId will still be usable in tests. const CONFLICTING_CLASSNAMES_DETECTED_MSG = `Classnames {{classnames}} are conflicting!`; -module.exports = { +export default { meta: { docs: { description: 'Avoid contradicting Tailwind CSS classnames (e.g. "w-3 w-5")', diff --git a/lib/rules/no-custom-classname.js b/src/rules/no-custom-classname.ts similarity index 94% rename from lib/rules/no-custom-classname.js rename to src/rules/no-custom-classname.ts index 97216be9..df5180eb 100644 --- a/lib/rules/no-custom-classname.js +++ b/src/rules/no-custom-classname.ts @@ -4,16 +4,16 @@ */ 'use strict'; -const docsUrl = require('../util/docsUrl'); -const defaultGroups = require('../config/groups').groups; -const customConfig = require('../util/customConfig'); -const astUtil = require('../util/ast'); -const groupUtil = require('../util/groupMethods'); -const getOption = require('../util/settings'); -const parserUtil = require('../util/parser'); -const getClassnamesFromCSS = require('../util/cssFiles'); +import { groups as defaultGroups } from '../configs/groups'; +import astUtil from '../util/ast'; +import getClassnamesFromCSS from '../util/cssFiles'; +import customConfig from '../util/customConfig'; +import docsUrl from '../util/docsUrl'; +import generated from '../util/generated'; +import groupUtil from '../util/groupMethods'; +import parserUtil from '../util/parser'; +import getOption from '../util/settings'; const createContextFallback = require('tailwindcss/lib/lib/setupContextUtils').createContext; -const generated = require('../util/generated'); const escapeRegex = require('../util/regex').escapeRegex; //------------------------------------------------------------------------------ @@ -32,7 +32,7 @@ const getGroupNameRegex = (prefix = '') => const contextFallbackCache = new WeakMap(); -module.exports = { +export default { meta: { docs: { description: 'Detect classnames which do not belong to Tailwind CSS', diff --git a/lib/rules/no-unnecessary-arbitrary-value.js b/src/rules/no-unnecessary-arbitrary-value.ts similarity index 96% rename from lib/rules/no-unnecessary-arbitrary-value.js rename to src/rules/no-unnecessary-arbitrary-value.ts index 58904f8a..b3f95461 100644 --- a/lib/rules/no-unnecessary-arbitrary-value.js +++ b/src/rules/no-unnecessary-arbitrary-value.ts @@ -4,14 +4,16 @@ */ 'use strict'; -const docsUrl = require('../util/docsUrl'); -const customConfig = require('../util/customConfig'); -const astUtil = require('../util/ast'); -const groupUtil = require('../util/groupMethods'); -const getOption = require('../util/settings'); -const parserUtil = require('../util/parser'); -const { validZeroRegEx } = require('../util/types/length'); -const defaultGroups = require('../config/groups').groups; +import { groups as defaultGroups } from '../configs/groups'; +import astUtil from '../util/ast'; +import customConfig from '../util/customConfig'; +import docsUrl from '../util/docsUrl'; +import groupUtil from '../util/groupMethods'; +import parserUtil from '../util/parser'; +import getOption from '../util/settings'; +import length from '../util/types/length'; + +const validZeroRegEx = length.validZeroRegEx; // TODO get the correct value of start and end // TODO make rule fixable when only 1 match @@ -25,7 +27,7 @@ const defaultGroups = require('../config/groups').groups; // messageId will still be usable in tests. const UNNECESSARY_ARBITRARY_VALUE_DETECTED_MSG = `The arbitrary class '{{classname}}' could be replaced by '{{presets}}'`; -module.exports = { +export default { meta: { docs: { description: 'Forbid using arbitrary values in classnames when an equivalent preset exists', diff --git a/lib/util/ast.js b/src/util/ast.ts similarity index 95% rename from lib/util/ast.js rename to src/util/ast.ts index a6ed24d3..962ce9c4 100644 --- a/lib/util/ast.js +++ b/src/util/ast.ts @@ -4,7 +4,7 @@ 'use strict'; -const { separatorRegEx } = require('./regex'); +import { separatorRegEx } from './regex'; // context.parserPath // /.../eslint-plugin-tailwindcss/node_modules/espree/espree.js // /.../eslint-plugin-tailwindcss/node_modules/@angular-eslint/template-parser/dist/index.js @@ -96,7 +96,12 @@ function isVLiteralValue(node) { * @returns {Boolean} */ function isArrayExpression(node) { - return node.value && node.value.type === 'VExpressionContainer' && node.value.expression && node.value.expression.type === 'ArrayExpression'; + return ( + node.value && + node.value.type === 'VExpressionContainer' && + node.value.expression && + node.value.expression.type === 'ArrayExpression' + ); } /** @@ -106,7 +111,12 @@ function isArrayExpression(node) { * @returns {Boolean} */ function isObjectExpression(node) { - return node.value && node.value.type === 'VExpressionContainer' && node.value.expression && node.value.expression.type === 'ObjectExpression'; + return ( + node.value && + node.value.type === 'VExpressionContainer' && + node.value.expression && + node.value.expression.type === 'ObjectExpression' + ); } /** @@ -299,7 +309,8 @@ function parseNodeRecursive(rootNode, childNode, cb, skipConditional = false, is return; case 'ObjectExpression': childNode.properties.forEach((prop) => { - const isUsedByClassNamesPlugin = (rootNode.callee && rootNode.callee.name === 'classnames') || rootNode.type === 'VAttribute'; + const isUsedByClassNamesPlugin = + (rootNode.callee && rootNode.callee.name === 'classnames') || rootNode.type === 'VAttribute'; if (prop.type === 'SpreadElement') { // Ignore spread elements @@ -367,7 +378,7 @@ function getTemplateElementBody(text, prefix, suffix) { return arr.join(suffix); } -module.exports = { +export default { calleeToString, extractRangeFromNode, extractValueFromNode, diff --git a/lib/util/cssFiles.js b/src/util/cssFiles.ts similarity index 98% rename from lib/util/cssFiles.js rename to src/util/cssFiles.ts index 324a42b9..7b84a3f8 100644 --- a/lib/util/cssFiles.js +++ b/src/util/cssFiles.ts @@ -74,4 +74,4 @@ const generateClassnamesListSync = (patterns, refreshRate = 5_000) => { return removeDuplicatesFromArray(classnamesFromFiles); }; -module.exports = generateClassnamesListSync; +export default generateClassnamesListSync; diff --git a/lib/util/customConfig.js b/src/util/customConfig.ts similarity index 79% rename from lib/util/customConfig.js rename to src/util/customConfig.ts index 1ab15994..f06f84c4 100644 --- a/lib/util/customConfig.js +++ b/src/util/customConfig.ts @@ -1,9 +1,9 @@ 'use strict'; -const fs = require('fs'); -const path = require('path'); -const resolveConfig = require('tailwindcss/resolveConfig'); -let twLoadConfig; +import fs from 'fs'; +import path from 'path'; +import resolveConfig from 'tailwindcss/resolveConfig'; +let twLoadConfig: { loadConfig: (arg0: any) => any } | null; try { twLoadConfig = require('tailwindcss/lib/lib/load-config'); @@ -12,17 +12,17 @@ try { } const CHECK_REFRESH_RATE = 1_000; -let previousConfig = null; -let lastCheck = null; -let mergedConfig = null; -let lastModifiedDate = null; +let previousConfig: null = null; +let lastCheck: number | null = null; +let mergedConfig: null = null; +let lastModifiedDate: string | null = null; /** * @see https://stackoverflow.com/questions/9210542/node-js-require-cache-possible-to-invalidate * @param {string} module The path to the module * @returns the module's export */ -function requireUncached(module) { +function requireUncached(module: string) { delete require.cache[require.resolve(module)]; if (twLoadConfig === null) { // Using native loading @@ -38,7 +38,7 @@ function requireUncached(module) { * @param {string|Object} config * @returns `null` when unchanged, `{}` when not found */ -function loadConfig(config) { +function loadConfig(config: string | null) { let loadedConfig = null; if (typeof config === 'string') { const resolvedPath = path.isAbsolute(config) ? config : path.join(path.resolve(), config); @@ -70,7 +70,7 @@ function loadConfig(config) { } } -function convertConfigToString(config) { +function convertConfigToString(config: any) { switch (typeof config) { case 'string': return config; @@ -81,10 +81,10 @@ function convertConfigToString(config) { } } -function resolve(twConfig) { +function resolve(twConfig: any) { const newConfig = convertConfigToString(twConfig) !== convertConfigToString(previousConfig); const now = Date.now(); - const expired = now - lastCheck > CHECK_REFRESH_RATE; + const expired = now - (lastCheck ?? 0) > CHECK_REFRESH_RATE; if (newConfig || expired) { previousConfig = twConfig; lastCheck = now; @@ -97,6 +97,6 @@ function resolve(twConfig) { return mergedConfig; } -module.exports = { +export default { resolve, }; diff --git a/lib/util/docsUrl.js b/src/util/docsUrl.ts similarity index 78% rename from lib/util/docsUrl.js rename to src/util/docsUrl.ts index 496e42cd..75d62276 100644 --- a/lib/util/docsUrl.js +++ b/src/util/docsUrl.ts @@ -1,8 +1,8 @@ 'use strict'; // Copied from https://github.com/yannickcr/eslint-plugin-react/blob/master/lib/util/docsUrl.js -function docsUrl(ruleName) { +function docsUrl(ruleName: string) { return `https://github.com/francoismassart/eslint-plugin-tailwindcss/tree/master/docs/rules/${ruleName}.md`; } -module.exports = docsUrl; +export default docsUrl; diff --git a/lib/util/generated.js b/src/util/generated.ts similarity index 93% rename from lib/util/generated.js rename to src/util/generated.ts index 708f14e4..aef79d85 100644 --- a/lib/util/generated.js +++ b/src/util/generated.ts @@ -7,4 +7,4 @@ function generate(className, context) { return gen; } -module.exports = generate; +export default generate; diff --git a/lib/util/groupMethods.js b/src/util/groupMethods.ts similarity index 90% rename from lib/util/groupMethods.js rename to src/util/groupMethods.ts index ac1bed8e..0f147bf4 100644 --- a/lib/util/groupMethods.js +++ b/src/util/groupMethods.ts @@ -18,9 +18,9 @@ // // font-[family/weight] -const angle = require('./types/angle'); -const color = require('./types/color'); -const length = require('./types/length'); +import angle from './types/angle'; +import color from './types/color'; +import length from './types/length'; /** * Escape special chars for regular expressions @@ -28,7 +28,7 @@ const length = require('./types/length'); * @param {String} str Regular expression to be escaped * @returns {String} Escaped version */ -function escapeSpecialChars(str) { +function escapeSpecialChars(str: string) { return str.replace(/\W/g, '\\$&'); } @@ -38,7 +38,7 @@ function escapeSpecialChars(str) { * @param {Object} config Tailwind CSS Config * @returns {String} The suffix or an empty string */ -function generateOptionalOpacitySuffix(config) { +function generateOptionalOpacitySuffix(config: { theme: { [x: string]: {} } }) { const opacityKeys = !config.theme['opacity'] ? [] : Object.keys(config.theme['opacity']); opacityKeys.push('\\[(\\d*\\.?\\d*)%?\\]'); return `(\\/(${opacityKeys.join('|')}))?`; @@ -53,14 +53,19 @@ function generateOptionalOpacitySuffix(config) { * @param {Boolean} isNegative If the value is negative * @returns {String} Generated part of regex exposing the possible values */ -function generateOptions(propName, keys, config, isNegative = false) { +function generateOptions( + propName: string | number, + keys: any[], + config: { darkMode: string | any[]; theme: { [x: string]: { [x: string]: any }; colors: { [x: string]: any } } }, + isNegative = false +) { const opacitySuffixes = generateOptionalOpacitySuffix(config); const genericArbitraryOption = '\\[(.*)\\]'; - const defaultKeyIndex = keys.findIndex((v) => v === 'DEFAULT'); + const defaultKeyIndex = keys.findIndex((v: string) => v === 'DEFAULT'); if (defaultKeyIndex > -1) { keys.splice(defaultKeyIndex, 1); } - const escapedKeys = keys.map((k) => escapeSpecialChars(k)); + const escapedKeys = keys.map((k: string) => escapeSpecialChars(k)); switch (propName) { case 'dark': // Optional `dark` class @@ -96,7 +101,7 @@ function generateOptions(propName, keys, config, isNegative = false) { // Colors can use segments like 'indigo' and 'indigo-light' // https://tailwindcss.com/docs/customizing-colors#color-object-syntax const options = []; - keys.forEach((k) => { + keys.forEach((k: string) => { const color = config.theme[propName][k] || config.theme.colors[k]; if (typeof color === 'string') { options.push(escapeSpecialChars(k) + opacitySuffixes); @@ -287,7 +292,7 @@ const cachedRegexes = new WeakMap(); * @param {Object} config The merged Tailwind CSS config * @returns {String} Patched version with config values and additional parameters */ -function patchRegex(re, config) { +function patchRegex(re: string, config): string { if (!cachedRegexes.has(config)) { cachedRegexes.set(config, {}); } @@ -376,18 +381,18 @@ function patchRegex(re, config) { * @param {Object} twConfig The merged config of Tailwind CSS * @returns {Array} Flatten array */ -function getGroups(groupsConfig, twConfig = null) { - const groups = []; - groupsConfig.forEach((group) => { +function getGroups(groupsConfig: any[], twConfig = null) { + const groups: any[] = []; + groupsConfig.forEach((group: { members: any[] }) => { // e.g. SIZING or SPACING - group.members.forEach((prop) => { + group.members.forEach((prop: { members: any[] }) => { // e.g. Width or Padding if (typeof prop.members === 'string') { // Unique property, like `width` limited to one value groups.push(prop.members); } else { // Multiple properties, like `padding`, `padding-top`... - prop.members.forEach((subprop) => { + prop.members.forEach((subprop: { members: any }) => { groups.push(subprop.members); }); } @@ -405,9 +410,9 @@ function getGroups(groupsConfig, twConfig = null) { * @param {Array} groups The array of objects containing the regex * @returns {Array} Array of empty arrays */ -function initGroupSlots(groups) { - const slots = []; - groups.forEach((g) => slots.push([])); +function initGroupSlots(groups: any[]) { + const slots: never[][] = []; + groups.forEach((g: any) => slots.push([])); return slots; } @@ -419,9 +424,9 @@ function initGroupSlots(groups) { * @param {String} separator The delimiter to be used between variants * @returns {Array} Array of empty arrays */ -function getGroupIndex(name, arr, separator = ':') { +function getGroupIndex(name: any, arr: any[], separator = ':') { const classSuffix = getSuffix(name, separator); - let idx = arr.findIndex((pattern) => { + let idx = arr.findIndex((pattern: any) => { const classRe = new RegExp(`^(${pattern})$`); return classRe.test(classSuffix); }, classSuffix); @@ -435,18 +440,18 @@ function getGroupIndex(name, arr, separator = ':') { * @param {Object} twConfig The merged config of Tailwind CSS * @returns {Array} Flatten array */ -function getGroupConfigKeys(groupsConfig) { - const groups = []; - groupsConfig.forEach((group) => { +function getGroupConfigKeys(groupsConfig: any[]) { + const groups: any[] = []; + groupsConfig.forEach((group: { members: any[] }) => { // e.g. SIZING or SPACING - group.members.forEach((prop) => { + group.members.forEach((prop: { members: any[]; configKey: any }) => { // e.g. Width or Padding if (typeof prop.members === 'string') { // Unique property, like `width` limited to one value groups.push(prop.configKey ? prop.configKey : null); } else { // Multiple properties, like `padding`, `padding-top`... - prop.members.forEach((subprop) => { + prop.members.forEach((subprop: { configKey: any }) => { groups.push(subprop.configKey ? subprop.configKey : null); }); } @@ -462,7 +467,7 @@ function getGroupConfigKeys(groupsConfig) { * @param {String} separator The separator character as in config * @returns {String} The prefix */ -function getPrefix(name, separator) { +function getPrefix(name: string, separator: string | any[]) { const rootSeparator = String.raw`(? findInGroup(name, v, config, group.type)); + const innerGroup = group.members.find((v: any) => findInGroup(name, v, config, group.type)); if (!innerGroup) { return null; } else { @@ -557,7 +562,7 @@ function findInGroup(name, group, config, parentType = null) { * @param {Number} index The index * @returns {Object} Parsed infos */ -function parseClassname(name, arr, config, index = null) { +function parseClassname(name: string, arr: any[], config: { separator: string | undefined }, index = null) { const leadingRe = new RegExp('^(?\\s*)'); const trailingRe = new RegExp('(?\\s*)$'); let leading = ''; @@ -575,7 +580,7 @@ function parseClassname(name, arr, config, index = null) { const variants = getPrefix(core, config.separator); const classSuffix = getSuffix(core, config.separator); let slot = null; - arr.forEach((group) => { + arr.forEach((group: any) => { if (slot === null) { const found = findInGroup(classSuffix, group, config); if (found) { @@ -601,7 +606,7 @@ function parseClassname(name, arr, config, index = null) { }; } -module.exports = { +export default { initGroupSlots, getArbitraryProperty, getGroups, diff --git a/lib/util/parser.js b/src/util/parser.ts similarity index 82% rename from lib/util/parser.js rename to src/util/parser.ts index 82d13dfc..4f921401 100644 --- a/lib/util/parser.js +++ b/src/util/parser.ts @@ -5,7 +5,7 @@ * @param {Function} scriptVisitor * @returns */ -function defineTemplateBodyVisitor(context, templateBodyVisitor, scriptVisitor) { +function defineTemplateBodyVisitor(context: object, templateBodyVisitor: Function, scriptVisitor: Function) { const parserServices = getParserServices(context); if (parserServices == null || parserServices.defineTemplateBodyVisitor == null) { // Default parser @@ -21,10 +21,10 @@ function defineTemplateBodyVisitor(context, templateBodyVisitor, scriptVisitor) * This function is API compatible with eslint v8.x and eslint v9 or later. * @see https://eslint.org/blog/2023/09/preparing-custom-rules-eslint-v9/#from-context-to-sourcecode */ -function getParserServices(context) { +function getParserServices(context: { sourceCode?: any; parserServices?: any }) { return context.sourceCode ? context.sourceCode.parserServices : context.parserServices; } -module.exports = { +export default { defineTemplateBodyVisitor, }; diff --git a/lib/util/prettier/order.js b/src/util/prettier/order.ts similarity index 86% rename from lib/util/prettier/order.js rename to src/util/prettier/order.ts index 04d76a7c..1847ffc8 100644 --- a/lib/util/prettier/order.js +++ b/src/util/prettier/order.ts @@ -1,16 +1,16 @@ -const { separatorRegEx } = require('../regex'); +import { separatorRegEx } from '../regex'; -function bigSign(bigIntValue) { +function bigSign(bigIntValue: number) { return (bigIntValue > 0n) - (bigIntValue < 0n); } -function prefixCandidate(context, selector) { +function prefixCandidate(context: { tailwindConfig: { prefix: any } }, selector: string) { let prefix = context.tailwindConfig.prefix; return typeof prefix === 'function' ? prefix(selector) : prefix + selector; } // Polyfill for older Tailwind CSS versions -function getClassOrderPolyfill(classes, { env }) { +function getClassOrderPolyfill(classes: string[], { env }: { env: any }) { // A list of utilities that are used by certain Tailwind CSS utilities but // that don't exist on their own. This will result in them "not existing" and // sorting could be weird since you still require them in order to make the @@ -35,7 +35,7 @@ function getClassOrderPolyfill(classes, { env }) { return classNamesWithOrder; } -function sortClasses(classStr, { env, ignoreFirst = false, ignoreLast = false }) { +function sortClasses(classStr: string, { env, ignoreFirst = false, ignoreLast = false }: { env: { context: any } }) { if (typeof classStr !== 'string' || classStr === '') { return classStr; } @@ -93,9 +93,9 @@ function sortClasses(classStr, { env, ignoreFirst = false, ignoreLast = false }) * @param context * @returns {Array} the ordered classnames */ -function order(unordered, context) { +function order(unordered: any[], context: any) { const sorted = sortClasses(unordered.join(' '), { env: { context: context } }); return sorted; } -module.exports = order; +export default order; diff --git a/lib/util/regex.js b/src/util/regex.ts similarity index 75% rename from lib/util/regex.js rename to src/util/regex.ts index 78189ace..52a9ccd8 100644 --- a/lib/util/regex.js +++ b/src/util/regex.ts @@ -4,13 +4,10 @@ * @param {string} input * @returns {string} */ -function escapeRegex(input) { +function escapeRegex(input: string): string { return input.replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&'); } const separatorRegEx = /([\t\n\f\r ]+)/; -module.exports = { - escapeRegex, - separatorRegEx, -}; +export { escapeRegex, separatorRegEx }; diff --git a/src/util/removeDuplicatesFromArray.ts b/src/util/removeDuplicatesFromArray.ts new file mode 100644 index 00000000..75add769 --- /dev/null +++ b/src/util/removeDuplicatesFromArray.ts @@ -0,0 +1,7 @@ +'use strict'; + +function removeDuplicatesFromArray(arr: Iterable | null | undefined) { + return [...new Set(arr)]; +} + +export default removeDuplicatesFromArray; diff --git a/lib/util/removeDuplicatesFromClassnamesAndWhitespaces.js b/src/util/removeDuplicatesFromClassnamesAndWhitespaces.ts similarity index 69% rename from lib/util/removeDuplicatesFromClassnamesAndWhitespaces.js rename to src/util/removeDuplicatesFromClassnamesAndWhitespaces.ts index f660273c..bbd46c00 100644 --- a/lib/util/removeDuplicatesFromClassnamesAndWhitespaces.js +++ b/src/util/removeDuplicatesFromClassnamesAndWhitespaces.ts @@ -1,6 +1,11 @@ 'use strict'; -function removeDuplicatesFromClassnamesAndWhitespaces(orderedClassNames, whitespaces, headSpace, tailSpace) { +function removeDuplicatesFromClassnamesAndWhitespaces( + orderedClassNames: string[], + whitespaces: string[], + headSpace: boolean, + tailSpace: boolean +) { let previous = orderedClassNames[0]; const offset = (!headSpace && !tailSpace) || tailSpace ? -1 : 0; for (let i = 1; i < orderedClassNames.length; i++) { @@ -15,4 +20,4 @@ function removeDuplicatesFromClassnamesAndWhitespaces(orderedClassNames, whitesp } } -module.exports = removeDuplicatesFromClassnamesAndWhitespaces; +export default removeDuplicatesFromClassnamesAndWhitespaces; diff --git a/lib/util/settings.js b/src/util/settings.ts similarity index 91% rename from lib/util/settings.js rename to src/util/settings.ts index 9c24567f..633b6dac 100644 --- a/lib/util/settings.js +++ b/src/util/settings.ts @@ -1,5 +1,5 @@ 'use strict'; -let resolveDefaultConfigPathAlias; +let resolveDefaultConfigPathAlias: (() => any) | null; try { const { resolveDefaultConfigPath } = require('tailwindcss/lib/util/resolveConfigPath'); @@ -8,7 +8,7 @@ try { resolveDefaultConfigPathAlias = null; } -function getOption(context, name) { +function getOption(context, name: string) { // Options (defined at rule level) const options = context.options[0] || {}; if (options[name] != undefined) { @@ -47,4 +47,4 @@ function getOption(context, name) { } } -module.exports = getOption; +export default getOption; diff --git a/lib/util/types/angle.js b/src/util/types/angle.ts similarity index 92% rename from lib/util/types/angle.js rename to src/util/types/angle.ts index 3073b834..fe38b15d 100644 --- a/lib/util/types/angle.js +++ b/src/util/types/angle.ts @@ -6,6 +6,6 @@ const mergedAngleValues = [ `var\\(\\-\\-[A-Za-z\\-]{1,}\\)`, ]; -module.exports = { +export default { mergedAngleValues, }; diff --git a/lib/util/types/color.js b/src/util/types/color.ts similarity index 99% rename from lib/util/types/color.js rename to src/util/types/color.ts index a6e1452a..d629e091 100644 --- a/lib/util/types/color.js +++ b/src/util/types/color.ts @@ -180,7 +180,7 @@ const colorValues = [hexRGBA, RGBIntegers, RGBPercentages, supportedRGBA, suppor const mergedColorValues = [...cssNamedColors, ...colorValues]; -module.exports = { +export default { cssNamedColors, colorValues, mergedColorValues, diff --git a/lib/util/types/length.js b/src/util/types/length.ts similarity index 94% rename from lib/util/types/length.js rename to src/util/types/length.ts index f71511e6..92999c74 100644 --- a/lib/util/types/length.js +++ b/src/util/types/length.ts @@ -1,4 +1,4 @@ -const removeDuplicatesFromArray = require('../removeDuplicatesFromArray'); +import removeDuplicatesFromArray from '../removeDuplicatesFromArray'; // Units const fontUnits = ['cap', 'ch', 'em', 'ex', 'ic', 'lh', 'rem', 'rlh']; @@ -34,13 +34,13 @@ const anyCalcRegEx = `\\[calc\\(.{1,}\\)\\]`; const validZeroRegEx = `^(0(\\.0{1,})?|\\.0{1,})(${mergedUnits.join('|')})?$`; -module.exports = { +export default { + anyCalcRegEx, + mergedLengthValues, mergedUnits, - selectedUnits, mergedUnitsRegEx, - selectedUnitsRegEx, - anyCalcRegEx, mergedValues, - mergedLengthValues, + selectedUnits, + selectedUnitsRegEx, validZeroRegEx, }; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..04b44325 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "allowJs": true, + "declaration": false, + "declarationMap": false, + "esModuleInterop": true, + "module": "ESNext", + "moduleResolution": "bundler", + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "sourceMap": false, + "target": "ES2020", + "rootDir": "src/", + "outDir": "lib" + }, + "include": ["src/**/*.ts", "src/**/*.js"], + "exclude": ["node_modules"] +} diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 00000000..c3563e3c --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts"], + outDir: "lib", + splitting: false, + sourcemap: true, + clean: true, + target: "esnext", + format: ["esm"], +}); From c8614ae58f2b3af01c5d5760478fe11260c2e37f Mon Sep 17 00:00:00 2001 From: Imamuzzaki Abu Salam Date: Fri, 24 Jan 2025 21:44:14 +0700 Subject: [PATCH 2/4] chore: remove lib we're only going to include `lib` in the npm packages, not the git repo --- lib/index.js | 5311 ---------------------------------------------- lib/index.js.map | 1 - 2 files changed, 5312 deletions(-) delete mode 100644 lib/index.js delete mode 100644 lib/index.js.map diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 7faad006..00000000 --- a/lib/index.js +++ /dev/null @@ -1,5311 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { - get: (a, b) => (typeof require !== "undefined" ? require : a)[b] -}) : x)(function(x) { - if (typeof require !== "undefined") return require.apply(this, arguments); - throw Error('Dynamic require of "' + x + '" is not supported'); -}); -var __esm = (fn, res) => function __init() { - return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; -}; -var __commonJS = (cb, mod) => function __require2() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __export = (target, all) => { - for (var name2 in all) - __defProp(target, name2, { get: all[name2], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// src/configs/rules.ts -var rules_default; -var init_rules = __esm({ - "src/configs/rules.ts"() { - "use strict"; - rules_default = { - "tailwindcss/classnames-order": "warn", - "tailwindcss/enforces-negative-arbitrary-values": "warn", - "tailwindcss/enforces-shorthand": "warn", - "tailwindcss/migration-from-tailwind-2": "warn", - "tailwindcss/no-arbitrary-value": "off", - "tailwindcss/no-custom-classname": "warn", - "tailwindcss/no-contradicting-classname": "error", - "tailwindcss/no-unnecessary-arbitrary-value": "warn" - }; - } -}); - -// src/configs/flat-recommended.ts -var plugin, flat_recommended_default; -var init_flat_recommended = __esm({ - async "src/configs/flat-recommended.ts"() { - "use strict"; - init_rules(); - plugin = await init_index().then(() => index_exports); - flat_recommended_default = [ - { - name: "tailwindcss:base", - plugins: { - get tailwindcss() { - return plugin; - } - }, - languageOptions: { - parserOptions: { - ecmaFeatures: { - jsx: true - } - } - } - }, - { - name: "tailwindcss:rules", - rules: rules_default - } - ]; - } -}); - -// src/configs/recommended.ts -var recommended_default; -var init_recommended = __esm({ - "src/configs/recommended.ts"() { - "use strict"; - init_rules(); - recommended_default = { - plugins: ["tailwindcss"], - parserOptions: { - ecmaFeatures: { - jsx: true - } - }, - rules: rules_default - }; - } -}); - -// src/configs/index.ts -var configs; -var init_configs = __esm({ - async "src/configs/index.ts"() { - "use strict"; - await init_flat_recommended(); - init_recommended(); - configs = { - recommended: recommended_default, - "flat/recommended": flat_recommended_default - }; - } -}); - -// src/util/regex.ts -var regex_exports = {}; -__export(regex_exports, { - escapeRegex: () => escapeRegex, - separatorRegEx: () => separatorRegEx -}); -function escapeRegex(input) { - return input.replace(/[/\-\\^$*+?.()|[\]{}]/g, "\\$&"); -} -var separatorRegEx; -var init_regex = __esm({ - "src/util/regex.ts"() { - "use strict"; - separatorRegEx = /([\t\n\f\r ]+)/; - } -}); - -// src/util/removeDuplicatesFromArray.ts -var removeDuplicatesFromArray_exports = {}; -__export(removeDuplicatesFromArray_exports, { - default: () => removeDuplicatesFromArray_default -}); -function removeDuplicatesFromArray(arr) { - return [...new Set(arr)]; -} -var removeDuplicatesFromArray_default; -var init_removeDuplicatesFromArray = __esm({ - "src/util/removeDuplicatesFromArray.ts"() { - "use strict"; - removeDuplicatesFromArray_default = removeDuplicatesFromArray; - } -}); - -// src/util/ast.ts -var ast_exports = {}; -__export(ast_exports, { - default: () => ast_default -}); -function calleeToString(calleeNode) { - if (calleeNode.type === "Identifier") { - return calleeNode.name; - } - if (calleeNode.type === "MemberExpression") { - return `${calleeNode.object.name}.${calleeNode.property.name}`; - } -} -function isClassAttribute(node, classRegex) { - if (!node.name) { - return false; - } - let name2 = ""; - switch (node.type) { - case "TextAttribute": - name2 = node.name; - break; - case "JSXAttribute": - if (node.name.type === "JSXNamespacedName") { - const ns = node.name.namespace.name || ""; - name2 = (ns.length ? ns + ":" : "") + node.name.name.name; - } else { - name2 = node.name.name; - } - break; - default: - name2 = node.name.name; - } - return new RegExp(classRegex).test(name2); -} -function isVueClassAttribute(node, classRegex) { - const re = new RegExp(classRegex); - let name2 = ""; - switch (true) { - case (node.key && node.key.name && re.test(node.key.name)): - return true; - case (node.key && node.key.name && node.key.name.name && node.key.argument && node.key.argument.name && /^bind$/.test(node.key.name.name) && re.test(node.key.argument.name)): - return true; - default: - return false; - } -} -function isVLiteralValue(node) { - return node.value && node.value.type === "VLiteral"; -} -function isArrayExpression(node) { - return node.value && node.value.type === "VExpressionContainer" && node.value.expression && node.value.expression.type === "ArrayExpression"; -} -function isObjectExpression(node) { - return node.value && node.value.type === "VExpressionContainer" && node.value.expression && node.value.expression.type === "ObjectExpression"; -} -function isVueValidAttributeValue(node) { - switch (true) { - case isVLiteralValue(node): - // Simple string - case isArrayExpression(node): - // ['tw-unknown-class'] - case isObjectExpression(node): - return true; - default: - return false; - } -} -function isLiteralAttributeValue(node) { - if (node.type === "TextAttribute" && node.name === "class" && typeof node.value === "string") { - return true; - } - if (node.value) { - switch (node.value.type) { - case "Literal": - return !/\{|\?|\}/.test(node.value.value); - case "JSXExpressionContainer": - return node.value.expression.type === "Literal"; - } - } - return false; -} -function isValidJSXAttribute(node, classRegex) { - if (!isClassAttribute(node, classRegex)) { - return false; - } - if (!isLiteralAttributeValue(node)) { - return false; - } - return true; -} -function isValidVueAttribute(node, classRegex) { - if (!isVueClassAttribute(node, classRegex)) { - return false; - } - if (!isVueValidAttributeValue(node)) { - return false; - } - return true; -} -function extractRangeFromNode(node) { - if (node.type === "TextAttribute" && node.name === "class") { - return [node.valueSpan.fullStart.offset, node.valueSpan.end.offset]; - } - if (node.value === void 0) { - return [0, 0]; - } - switch (node.value.type) { - case "JSXExpressionContainer": - return node.value.expression.range; - default: - return node.value.range; - } -} -function extractValueFromNode(node) { - if (node.type === "TextAttribute" && node.name === "class") { - return node.value; - } - if (node.value === void 0) { - return node.value; - } - switch (node.value.type) { - case "JSXExpressionContainer": - return node.value.expression.value; - case "VExpressionContainer": - switch (node.value.expression.type) { - case "ArrayExpression": - return node.value.expression.elements; - case "ObjectExpression": - return node.value.expression.properties; - } - return node.value.expression.value; - default: - return node.value.value; - } -} -function extractClassnamesFromValue(classStr) { - if (typeof classStr !== "string") { - return { classNames: [], whitespaces: [], headSpace: false, tailSpace: false }; - } - let parts = classStr.split(separatorRegEx); - if (parts[0] === "") { - parts.shift(); - } - if (parts[parts.length - 1] === "") { - parts.pop(); - } - let headSpace = separatorRegEx.test(parts[0]); - let tailSpace = separatorRegEx.test(parts[parts.length - 1]); - const isClass = (_, i) => headSpace ? i % 2 !== 0 : i % 2 === 0; - const isNotClass = (_, i) => headSpace ? i % 2 === 0 : i % 2 !== 0; - let classNames = parts.filter(isClass); - let whitespaces = parts.filter(isNotClass); - return { classNames, whitespaces, headSpace, tailSpace }; -} -function parseNodeRecursive(rootNode, childNode, cb, skipConditional = false, isolate = false, ignoredKeys = []) { - let originalClassNamesValue; - let classNames; - if (childNode === null) { - originalClassNamesValue = extractValueFromNode(rootNode); - ({ classNames } = extractClassnamesFromValue(originalClassNamesValue)); - classNames = removeDuplicatesFromArray2(classNames); - if (classNames.length === 0) { - return; - } - cb(classNames, rootNode); - } else if (childNode === void 0) { - return; - } else { - const forceIsolation = skipConditional ? true : isolate; - let trim = false; - switch (childNode.type) { - case "TemplateLiteral": - childNode.expressions.forEach((exp) => { - parseNodeRecursive(rootNode, exp, cb, skipConditional, forceIsolation, ignoredKeys); - }); - childNode.quasis.forEach((quasis) => { - parseNodeRecursive(rootNode, quasis, cb, skipConditional, isolate, ignoredKeys); - }); - return; - case "ConditionalExpression": - parseNodeRecursive(rootNode, childNode.consequent, cb, skipConditional, forceIsolation, ignoredKeys); - parseNodeRecursive(rootNode, childNode.alternate, cb, skipConditional, forceIsolation, ignoredKeys); - return; - case "LogicalExpression": - parseNodeRecursive(rootNode, childNode.right, cb, skipConditional, forceIsolation, ignoredKeys); - return; - case "ArrayExpression": - childNode.elements.forEach((el) => { - parseNodeRecursive(rootNode, el, cb, skipConditional, forceIsolation, ignoredKeys); - }); - return; - case "ObjectExpression": - childNode.properties.forEach((prop) => { - const isUsedByClassNamesPlugin = rootNode.callee && rootNode.callee.name === "classnames" || rootNode.type === "VAttribute"; - if (prop.type === "SpreadElement") { - return; - } - if (prop.key.type === "Identifier" && ignoredKeys.includes(prop.key.name)) { - return; - } - parseNodeRecursive( - rootNode, - isUsedByClassNamesPlugin ? prop.key : prop.value, - cb, - skipConditional, - forceIsolation, - ignoredKeys - ); - }); - return; - case "Property": - parseNodeRecursive(rootNode, childNode.key, cb, skipConditional, forceIsolation, ignoredKeys); - return; - case "Literal": - trim = true; - originalClassNamesValue = childNode.value; - break; - case "TemplateElement": - originalClassNamesValue = childNode.value.raw; - break; - } - ({ classNames } = extractClassnamesFromValue(originalClassNamesValue)); - classNames = removeDuplicatesFromArray2(classNames); - if (classNames.length === 0) { - return; - } - const targetNode = isolate ? null : rootNode; - cb(classNames, targetNode); - } -} -function getTemplateElementPrefix(text, raw) { - const idx = text.indexOf(raw); - if (idx === 0) { - return ""; - } - return text.split(raw).shift(); -} -function getTemplateElementSuffix(text, raw) { - if (text.indexOf(raw) === -1) { - return ""; - } - return text.split(raw).pop(); -} -function getTemplateElementBody(text, prefix, suffix) { - let arr = text.split(prefix); - arr.shift(); - let body = arr.join(prefix); - arr = body.split(suffix); - arr.pop(); - return arr.join(suffix); -} -var removeDuplicatesFromArray2, ast_default; -var init_ast = __esm({ - "src/util/ast.ts"() { - "use strict"; - init_regex(); - removeDuplicatesFromArray2 = (init_removeDuplicatesFromArray(), __toCommonJS(removeDuplicatesFromArray_exports)); - ast_default = { - calleeToString, - extractRangeFromNode, - extractValueFromNode, - extractClassnamesFromValue, - isClassAttribute, - isLiteralAttributeValue, - isArrayExpression, - isObjectExpression, - isValidJSXAttribute, - isValidVueAttribute, - isVLiteralValue, - parseNodeRecursive, - getTemplateElementPrefix, - getTemplateElementSuffix, - getTemplateElementBody - }; - } -}); - -// src/util/customConfig.ts -var customConfig_exports = {}; -__export(customConfig_exports, { - default: () => customConfig_default -}); -import fs from "fs"; -import path from "path"; -import resolveConfig from "tailwindcss/resolveConfig"; -function requireUncached(module) { - delete __require.cache[__require.resolve(module)]; - if (twLoadConfig === null) { - return __require(module); - } else { - return twLoadConfig.loadConfig(module); - } -} -function loadConfig(config) { - let loadedConfig = null; - if (typeof config === "string") { - const resolvedPath = path.isAbsolute(config) ? config : path.join(path.resolve(), config); - try { - const stats = fs.statSync(resolvedPath); - const mtime = `${stats.mtime || ""}`; - if (stats === null) { - loadedConfig = {}; - } else if (lastModifiedDate !== mtime) { - lastModifiedDate = mtime; - loadedConfig = requireUncached(resolvedPath); - } else { - loadedConfig = null; - } - } catch (err) { - loadedConfig = {}; - } finally { - return loadedConfig; - } - } else { - if (typeof config === "object" && config !== null) { - return config; - } - return {}; - } -} -function convertConfigToString(config) { - switch (typeof config) { - case "string": - return config; - case "object": - return JSON.stringify(config); - default: - return config.toString(); - } -} -function resolve(twConfig) { - const newConfig = convertConfigToString(twConfig) !== convertConfigToString(previousConfig); - const now = Date.now(); - const expired = now - (lastCheck ?? 0) > CHECK_REFRESH_RATE; - if (newConfig || expired) { - previousConfig = twConfig; - lastCheck = now; - const userConfig = loadConfig(twConfig); - if (userConfig !== null) { - mergedConfig = resolveConfig(userConfig); - } - } - return mergedConfig; -} -var twLoadConfig, CHECK_REFRESH_RATE, previousConfig, lastCheck, mergedConfig, lastModifiedDate, customConfig_default; -var init_customConfig = __esm({ - "src/util/customConfig.ts"() { - "use strict"; - try { - twLoadConfig = __require("tailwindcss/lib/lib/load-config"); - } catch (err) { - twLoadConfig = null; - } - CHECK_REFRESH_RATE = 1e3; - previousConfig = null; - lastCheck = null; - mergedConfig = null; - lastModifiedDate = null; - customConfig_default = { - resolve - }; - } -}); - -// src/util/docsUrl.ts -var docsUrl_exports = {}; -__export(docsUrl_exports, { - default: () => docsUrl_default -}); -function docsUrl(ruleName) { - return `https://github.com/francoismassart/eslint-plugin-tailwindcss/tree/master/docs/rules/${ruleName}.md`; -} -var docsUrl_default; -var init_docsUrl = __esm({ - "src/util/docsUrl.ts"() { - "use strict"; - docsUrl_default = docsUrl; - } -}); - -// src/util/parser.ts -var parser_exports = {}; -__export(parser_exports, { - default: () => parser_default -}); -function defineTemplateBodyVisitor(context, templateBodyVisitor, scriptVisitor) { - const parserServices = getParserServices(context); - if (parserServices == null || parserServices.defineTemplateBodyVisitor == null) { - return scriptVisitor; - } - return parserServices.defineTemplateBodyVisitor(templateBodyVisitor, scriptVisitor); -} -function getParserServices(context) { - return context.sourceCode ? context.sourceCode.parserServices : context.parserServices; -} -var parser_default; -var init_parser = __esm({ - "src/util/parser.ts"() { - "use strict"; - parser_default = { - defineTemplateBodyVisitor - }; - } -}); - -// src/util/prettier/order.ts -function bigSign(bigIntValue) { - return (bigIntValue > 0n) - (bigIntValue < 0n); -} -function prefixCandidate(context, selector) { - let prefix = context.tailwindConfig.prefix; - return typeof prefix === "function" ? prefix(selector) : prefix + selector; -} -function getClassOrderPolyfill(classes, { env }) { - let parasiteUtilities = /* @__PURE__ */ new Set([prefixCandidate(env.context, "group"), prefixCandidate(env.context, "peer")]); - let classNamesWithOrder = []; - for (let className of classes) { - let order2 = env.generateRules(/* @__PURE__ */ new Set([className]), env.context).sort(([a], [z]) => bigSign(z - a))[0]?.[0] ?? null; - if (order2 === null && parasiteUtilities.has(className)) { - order2 = env.context.layerOrder.components; - } - classNamesWithOrder.push([className, order2]); - } - return classNamesWithOrder; -} -function sortClasses(classStr, { env, ignoreFirst = false, ignoreLast = false }) { - if (typeof classStr !== "string" || classStr === "") { - return classStr; - } - if (classStr.includes("{{")) { - return classStr; - } - let result = ""; - let parts = classStr.split(separatorRegEx); - let classes = parts.filter((_, i) => i % 2 === 0); - let whitespace = parts.filter((_, i) => i % 2 !== 0); - if (classes[classes.length - 1] === "") { - classes.pop(); - } - let prefix = ""; - if (ignoreFirst) { - prefix = `${classes.shift() ?? ""}${whitespace.shift() ?? ""}`; - } - let suffix = ""; - if (ignoreLast) { - suffix = `${whitespace.pop() ?? ""}${classes.pop() ?? ""}`; - } - let classNamesWithOrder = env.context.getClassOrder ? env.context.getClassOrder(classes) : getClassOrderPolyfill(classes, { env }); - classes = classNamesWithOrder.sort(([, a], [, z]) => { - if (a === z) return 0; - if (a === null) return -1; - if (z === null) return 1; - return bigSign(a - z); - }).map(([className]) => className); - for (let i = 0; i < classes.length; i++) { - result += `${classes[i]}${whitespace[i] ?? ""}`; - } - return prefix + result + suffix; -} -function order(unordered, context) { - const sorted = sortClasses(unordered.join(" "), { env: { context } }); - return sorted; -} -var order_default; -var init_order = __esm({ - "src/util/prettier/order.ts"() { - "use strict"; - init_regex(); - order_default = order; - } -}); - -// src/util/removeDuplicatesFromClassnamesAndWhitespaces.ts -function removeDuplicatesFromClassnamesAndWhitespaces(orderedClassNames, whitespaces, headSpace, tailSpace) { - let previous = orderedClassNames[0]; - const offset = !headSpace && !tailSpace || tailSpace ? -1 : 0; - for (let i = 1; i < orderedClassNames.length; i++) { - const cls = orderedClassNames[i]; - if (cls === previous) { - orderedClassNames.splice(i, 1); - whitespaces.splice(i + offset, 1); - i--; - } - previous = cls; - } -} -var removeDuplicatesFromClassnamesAndWhitespaces_default; -var init_removeDuplicatesFromClassnamesAndWhitespaces = __esm({ - "src/util/removeDuplicatesFromClassnamesAndWhitespaces.ts"() { - "use strict"; - removeDuplicatesFromClassnamesAndWhitespaces_default = removeDuplicatesFromClassnamesAndWhitespaces; - } -}); - -// src/util/settings.ts -var settings_exports = {}; -__export(settings_exports, { - default: () => settings_default -}); -function getOption(context, name2) { - const options = context.options[0] || {}; - if (options[name2] != void 0) { - return options[name2]; - } - if (context.settings && context.settings.tailwindcss && context.settings.tailwindcss[name2] != void 0) { - return context.settings.tailwindcss[name2]; - } - switch (name2) { - case "callees": - return ["classnames", "clsx", "ctl", "cva", "tv"]; - case "ignoredKeys": - return ["compoundVariants", "defaultVariants"]; - case "classRegex": - return "^class(Name)?$"; - case "config": - if (resolveDefaultConfigPathAlias === null) { - return "tailwind.config.js"; - } else { - return resolveDefaultConfigPathAlias(); - } - case "cssFiles": - return ["**/*.css", "!**/node_modules", "!**/.*", "!**/dist", "!**/build"]; - case "cssFilesRefreshRate": - return 5e3; - case "removeDuplicates": - return true; - case "skipClassAttribute": - return false; - case "tags": - return []; - case "whitelist": - return []; - } -} -var resolveDefaultConfigPathAlias, settings_default; -var init_settings = __esm({ - "src/util/settings.ts"() { - "use strict"; - try { - const { resolveDefaultConfigPath } = __require("tailwindcss/lib/util/resolveConfigPath"); - resolveDefaultConfigPathAlias = resolveDefaultConfigPath; - } catch (err) { - resolveDefaultConfigPathAlias = null; - } - settings_default = getOption; - } -}); - -// src/rules/classnames-order.ts -var createContextFallback, INVALID_CLASSNAMES_ORDER_MSG, contextFallbackCache, classnames_order_default; -var init_classnames_order = __esm({ - "src/rules/classnames-order.ts"() { - "use strict"; - init_ast(); - init_customConfig(); - init_docsUrl(); - init_parser(); - init_order(); - init_removeDuplicatesFromClassnamesAndWhitespaces(); - init_settings(); - createContextFallback = __require("tailwindcss/lib/lib/setupContextUtils").createContext; - INVALID_CLASSNAMES_ORDER_MSG = "Invalid Tailwind CSS classnames order"; - contextFallbackCache = /* @__PURE__ */ new WeakMap(); - classnames_order_default = { - meta: { - docs: { - description: "Enforce a consistent and logical order of the Tailwind CSS classnames", - category: "Stylistic Issues", - recommended: false, - url: docsUrl_default("classnames-order") - }, - messages: { - invalidOrder: INVALID_CLASSNAMES_ORDER_MSG - }, - fixable: "code", - schema: [ - { - type: "object", - properties: { - callees: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - ignoredKeys: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - config: { - // returned from `loadConfig()` utility - type: ["string", "object"] - }, - removeDuplicates: { - // default: true, - type: "boolean" - }, - tags: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - } - } - } - ] - }, - create: function(context) { - const callees = settings_default(context, "callees"); - const skipClassAttribute = settings_default(context, "skipClassAttribute"); - const tags = settings_default(context, "tags"); - const twConfig = settings_default(context, "config"); - const classRegex = settings_default(context, "classRegex"); - const removeDuplicates = settings_default(context, "removeDuplicates"); - const mergedConfig2 = customConfig_default.resolve(twConfig); - const contextFallback = ( - // Set the created contextFallback in the cache if it does not exist yet. - (contextFallbackCache.has(mergedConfig2) ? contextFallbackCache : contextFallbackCache.set(mergedConfig2, createContextFallback(mergedConfig2))).get(mergedConfig2) - ); - const sortNodeArgumentValue = (node, arg = null) => { - let originalClassNamesValue = null; - let start = null; - let end = null; - let prefix = ""; - let suffix = ""; - if (arg === null) { - originalClassNamesValue = ast_default.extractValueFromNode(node); - const range = ast_default.extractRangeFromNode(node); - if (node.type === "TextAttribute") { - start = range[0]; - end = range[1]; - } else { - start = range[0] + 1; - end = range[1] - 1; - } - } else { - switch (arg.type) { - case "Identifier": - return; - case "TemplateLiteral": - arg.expressions.forEach((exp) => { - sortNodeArgumentValue(node, exp); - }); - arg.quasis.forEach((quasis) => { - sortNodeArgumentValue(node, quasis); - }); - return; - case "ConditionalExpression": - sortNodeArgumentValue(node, arg.consequent); - sortNodeArgumentValue(node, arg.alternate); - return; - case "LogicalExpression": - sortNodeArgumentValue(node, arg.right); - return; - case "ArrayExpression": - arg.elements.forEach((el) => { - sortNodeArgumentValue(node, el); - }); - return; - case "ObjectExpression": - const isUsedByClassNamesPlugin = node.callee && node.callee.name === "classnames"; - const isVue = node.key && node.key.type === "VDirectiveKey"; - arg.properties.forEach((prop) => { - const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value; - sortNodeArgumentValue(node, propVal); - }); - return; - case "Property": - sortNodeArgumentValue(node, arg.key); - break; - case "Literal": - originalClassNamesValue = arg.value; - start = arg.range[0] + 1; - end = arg.range[1] - 1; - break; - case "TemplateElement": - originalClassNamesValue = arg.value.raw; - if (originalClassNamesValue === "") { - return; - } - start = arg.range[0]; - end = arg.range[1]; - const txt = context.getSourceCode().getText(arg); - prefix = ast_default.getTemplateElementPrefix(txt, originalClassNamesValue); - suffix = ast_default.getTemplateElementSuffix(txt, originalClassNamesValue); - originalClassNamesValue = ast_default.getTemplateElementBody(txt, prefix, suffix); - break; - } - } - let { classNames, whitespaces, headSpace, tailSpace } = ast_default.extractClassnamesFromValue(originalClassNamesValue); - if (classNames.length <= 1) { - return; - } - let orderedClassNames = order_default(classNames, contextFallback).split(" "); - if (removeDuplicates) { - removeDuplicatesFromClassnamesAndWhitespaces_default(orderedClassNames, whitespaces, headSpace, tailSpace); - } - let validatedClassNamesValue = ""; - for (let i = 0; i < orderedClassNames.length; i++) { - const w = whitespaces[i] ?? ""; - const cls = orderedClassNames[i]; - validatedClassNamesValue += headSpace ? `${w}${cls}` : `${cls}${w}`; - if (headSpace && tailSpace && i === orderedClassNames.length - 1) { - validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? ""; - } - } - if (originalClassNamesValue !== validatedClassNamesValue) { - validatedClassNamesValue = prefix + validatedClassNamesValue + suffix; - context.report({ - node, - messageId: "invalidOrder", - fix: function(fixer) { - return fixer.replaceTextRange([start, end], validatedClassNamesValue); - } - }); - } - }; - const attributeVisitor = function(node) { - if (!ast_default.isClassAttribute(node, classRegex) || skipClassAttribute) { - return; - } - if (ast_default.isLiteralAttributeValue(node)) { - sortNodeArgumentValue(node); - } else if (node.value && node.value.type === "JSXExpressionContainer") { - sortNodeArgumentValue(node, node.value.expression); - } - }; - const callExpressionVisitor = function(node) { - const calleeStr = ast_default.calleeToString(node.callee); - if (callees.findIndex((name2) => calleeStr === name2) === -1) { - return; - } - node.arguments.forEach((arg) => { - sortNodeArgumentValue(node, arg); - }); - }; - const scriptVisitor = { - JSXAttribute: attributeVisitor, - TextAttribute: attributeVisitor, - CallExpression: callExpressionVisitor, - TaggedTemplateExpression: function(node) { - if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { - return; - } - sortNodeArgumentValue(node, node.quasi); - } - }; - const templateVisitor = { - CallExpression: callExpressionVisitor, - /* - Tagged templates inside data bindings - https://github.com/vuejs/vue/issues/9721 - */ - VAttribute: function(node) { - switch (true) { - case !ast_default.isValidVueAttribute(node, classRegex): - return; - case ast_default.isVLiteralValue(node): - sortNodeArgumentValue(node, null); - break; - case ast_default.isArrayExpression(node): - node.value.expression.elements.forEach((arg) => { - sortNodeArgumentValue(node, arg); - }); - break; - case ast_default.isObjectExpression(node): - node.value.expression.properties.forEach((prop) => { - sortNodeArgumentValue(node, prop); - }); - break; - } - } - }; - return parser_default.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); - } - }; - } -}); - -// src/util/types/angle.ts -var units, mergedAngleValues, angle_default; -var init_angle = __esm({ - "src/util/types/angle.ts"() { - "use strict"; - units = ["deg", "grad", "rad", "turn"]; - mergedAngleValues = [ - `\\-?(\\d{1,}(\\.\\d{1,})?|\\.\\d{1,})(${units.join("|")})`, - `calc\\(.{1,}\\)`, - `var\\(\\-\\-[A-Za-z\\-]{1,}\\)` - ]; - angle_default = { - mergedAngleValues - }; - } -}); - -// src/util/types/color.ts -var cssNamedColors, hexRGBA, RGBIntegers, RGBPercentages, supportedRGBA, RGBAPercentages, optionalColorPrefixedVar, mandatoryColorPrefixed, notHSLAPlusWildcard, supportedHSL, colorValues, mergedColorValues, color_default; -var init_color = __esm({ - "src/util/types/color.ts"() { - "use strict"; - cssNamedColors = [ - "indianred", - "lightcoral", - "salmon", - "darksalmon", - "lightsalmon", - "crimson", - "red", - "firebrick", - "darkred", - "pink", - "lightpink", - "hotpink", - "deeppink", - "mediumvioletred", - "palevioletred", - "coral", - "tomato", - "orangered", - "darkorange", - "orange", - "gold", - "yellow", - "lightyellow", - "lemonchiffon", - "lightgoldenrodyellow", - "papayawhip", - "moccasin", - "peachpuff", - "palegoldenrod", - "khaki", - "darkkhaki", - "lavender", - "thistle", - "plum", - "violet", - "orchid", - "fuchsia", - "magenta", - "mediumorchid", - "mediumpurple", - "blueviolet", - "darkviolet", - "darkorchid", - "darkmagenta", - "purple", - "rebeccapurple", - "indigo", - "mediumslateblue", - "slateblue", - "darkslateblue", - "greenyellow", - "chartreuse", - "lawngreen", - "lime", - "limegreen", - "palegreen", - "lightgreen", - "mediumspringgreen", - "springgreen", - "mediumseagreen", - "seagreen", - "forestgreen", - "green", - "darkgreen", - "yellowgreen", - "olivedrab", - "olive", - "darkolivegreen", - "mediumaquamarine", - "darkseagreen", - "lightseagreen", - "darkcyan", - "teal", - "aqua", - "cyan", - "lightcyan", - "paleturquoise", - "aquamarine", - "turquoise", - "mediumturquoise", - "darkturquoise", - "cadetblue", - "steelblue", - "lightsteelblue", - "powderblue", - "lightblue", - "skyblue", - "lightskyblue", - "deepskyblue", - "dodgerblue", - "cornflowerblue", - "royalblue", - "blue", - "mediumblue", - "darkblue", - "navy", - "midnightblue", - "cornsilk", - "blanchedalmond", - "bisque", - "navajowhite", - "wheat", - "burlywood", - "tan", - "rosybrown", - "sandybrown", - "goldenrod", - "darkgoldenrod", - "peru", - "chocolate", - "saddlebrown", - "sienna", - "brown", - "maroon", - "white", - "snow", - "honeydew", - "mintcream", - "azure", - "aliceblue", - "ghostwhite", - "whitesmoke", - "seashell", - "beige", - "oldlace", - "floralwhite", - "ivory", - "antiquewhite", - "linen", - "lavenderblush", - "mistyrose", - "gainsboro", - "lightgray", - "lightgrey", - "silver", - "darkgray", - "darkgrey", - "gray", - "grey", - "dimgray", - "dimgrey", - "lightslategray", - "lightslategrey", - "slategray", - "slategrey", - "darkslategray", - "darkslategrey", - "black", - "transparent", - "currentColor" - ]; - hexRGBA = "\\#(([0-9A-Fa-f]{8})|([0-9A-Fa-f]{6})|([0-9A-Fa-f]{4})|([0-9A-Fa-f]{3}))"; - RGBIntegers = "rgb\\(\\d{1,3}\\,\\d{1,3}\\,\\d{1,3}\\)"; - RGBPercentages = "rgb\\(\\d{1,3}%\\,\\d{1,3}%\\,\\d{1,3}%\\)"; - supportedRGBA = "rgba\\(\\d{1,3}\\,\\d{1,3}\\,\\d{1,3}\\,\\d*(\\.\\d*)?%?\\)"; - RGBAPercentages = "rgba\\(\\d{1,3}%\\,\\d{1,3}%\\,\\d{1,3}%\\,\\d*(\\.\\d*)?%?\\)"; - optionalColorPrefixedVar = "(color\\:)?var\\(\\-\\-[A-Za-z\\-]{1,}\\)"; - mandatoryColorPrefixed = "color\\:(?!(hsla\\()).{1,}"; - notHSLAPlusWildcard = "(?!(hsla\\()).{1,}"; - supportedHSL = "hsl\\(\\d{1,3}%?\\,\\d{1,3}%?\\,\\d{1,3}%?\\)"; - colorValues = [hexRGBA, RGBIntegers, RGBPercentages, supportedRGBA, supportedHSL]; - mergedColorValues = [...cssNamedColors, ...colorValues]; - color_default = { - cssNamedColors, - colorValues, - mergedColorValues, - RGBAPercentages, - optionalColorPrefixedVar, - mandatoryColorPrefixed, - notHSLAPlusWildcard - }; - } -}); - -// src/util/types/length.ts -var fontUnits, viewportUnits, absoluteUnits, perInchUnits, otherUnits, mergedUnits, selectedUnits, absoluteValues, relativeValues, globalValues, mergedValues, mergedLengthValues, mergedUnitsRegEx, selectedUnitsRegEx, anyCalcRegEx, validZeroRegEx, length_default; -var init_length = __esm({ - "src/util/types/length.ts"() { - "use strict"; - init_removeDuplicatesFromArray(); - fontUnits = ["cap", "ch", "em", "ex", "ic", "lh", "rem", "rlh"]; - viewportUnits = ["vb", "vh", "vi", "vw", "vmin", "vmax"]; - absoluteUnits = ["px", "mm", "cm", "in", "pt", "pc"]; - perInchUnits = ["lin", "pt", "mm"]; - otherUnits = ["%"]; - mergedUnits = removeDuplicatesFromArray_default([ - ...fontUnits, - ...viewportUnits, - ...absoluteUnits, - ...perInchUnits, - ...otherUnits - ]); - selectedUnits = mergedUnits.filter((el) => { - return !["cap", "ic", "vb", "vi"].includes(el); - }); - absoluteValues = ["0", "xx\\-small", "x\\-small", "small", "medium", "large", "x\\-large", "xx\\-large"]; - relativeValues = ["larger", "smaller"]; - globalValues = ["inherit", "initial", "unset"]; - mergedValues = [...absoluteValues, ...relativeValues, ...globalValues]; - mergedLengthValues = [`\\-?\\d*\\.?\\d*(${mergedUnits.join("|")})`, ...mergedValues]; - mergedLengthValues.push("length\\:var\\(\\-\\-[a-z\\-]{1,}\\)"); - mergedUnitsRegEx = `\\[(\\d{1,}(\\.\\d{1,})?|(\\.\\d{1,})?)(${mergedUnits.join("|")})\\]`; - selectedUnitsRegEx = `\\[(\\d{1,}(\\.\\d{1,})?|(\\.\\d{1,})?)(${selectedUnits.join("|")})\\]`; - anyCalcRegEx = `\\[calc\\(.{1,}\\)\\]`; - validZeroRegEx = `^(0(\\.0{1,})?|\\.0{1,})(${mergedUnits.join("|")})?$`; - length_default = { - anyCalcRegEx, - mergedLengthValues, - mergedUnits, - mergedUnitsRegEx, - mergedValues, - selectedUnits, - selectedUnitsRegEx, - validZeroRegEx - }; - } -}); - -// src/util/groupMethods.ts -var groupMethods_exports = {}; -__export(groupMethods_exports, { - default: () => groupMethods_default -}); -function escapeSpecialChars(str) { - return str.replace(/\W/g, "\\$&"); -} -function generateOptionalOpacitySuffix(config) { - const opacityKeys = !config.theme["opacity"] ? [] : Object.keys(config.theme["opacity"]); - opacityKeys.push("\\[(\\d*\\.?\\d*)%?\\]"); - return `(\\/(${opacityKeys.join("|")}))?`; -} -function generateOptions(propName, keys, config, isNegative = false) { - const opacitySuffixes = generateOptionalOpacitySuffix(config); - const genericArbitraryOption = "\\[(.*)\\]"; - const defaultKeyIndex = keys.findIndex((v) => v === "DEFAULT"); - if (defaultKeyIndex > -1) { - keys.splice(defaultKeyIndex, 1); - } - const escapedKeys = keys.map((k) => escapeSpecialChars(k)); - switch (propName) { - case "dark": - if (config.darkMode === "class") { - return "dark"; - } else if (Array.isArray(config.darkMode) && config.darkMode.length === 2 && config.darkMode[0] === "class") { - let value = ""; - const res = /^\.(?[A-Z0-9\:\-\_\[\d\]]*)$/gi.exec(config.darkMode[1]); - if (res && res.groups) { - if (res.groups.classnameValue) { - value = res.groups.classnameValue; - } - } - return value; - } else { - return ""; - } - case "arbitraryProperties": - escapedKeys.push(genericArbitraryOption); - return "(" + escapedKeys.join("|") + ")"; - case "colors": - case "accentColor": - case "borderColor": - case "boxShadowColor": - case "divideColor": - case "fill": - case "outlineColor": - case "textColor": - case "stroke": - case "gradientColorStopPositions": - const options = []; - keys.forEach((k) => { - const color = config.theme[propName][k] || config.theme.colors[k]; - if (typeof color === "string") { - options.push(escapeSpecialChars(k) + opacitySuffixes); - } else { - const variants = Object.keys(color).map((colorKey) => escapeSpecialChars(colorKey)); - const defaultIndex = variants.findIndex((v) => v === "DEFAULT"); - const hasDefault = defaultIndex > -1; - if (hasDefault) { - variants.splice(defaultIndex, 1); - } - options.push(k + "(\\-(" + variants.join("|") + "))" + (hasDefault ? "?" : "") + opacitySuffixes); - } - }); - const arbitraryColors = [...color_default.mergedColorValues]; - switch (propName) { - case "fill": - arbitraryColors.push(`(?!(angle|length|list):).{1,}`); - break; - case "gradientColorStopPositions": - arbitraryColors.push(color_default.RGBAPercentages); - arbitraryColors.push(color_default.optionalColorPrefixedVar); - arbitraryColors.push(color_default.notHSLAPlusWildcard); - break; - case "textColor": - arbitraryColors.push(color_default.RGBAPercentages); - arbitraryColors.push(color_default.mandatoryColorPrefixed); - break; - default: - arbitraryColors.push(color_default.mandatoryColorPrefixed); - } - options.push(`\\[(${arbitraryColors.join("|")})\\]`); - return "(" + options.join("|") + ")"; - case "borderSpacing": - case "borderWidth": - case "divideWidth": - case "fontSize": - case "outlineWidth": - case "outlineOffset": - case "ringWidth": - case "ringOffsetWidth": - case "textUnderlineOffset": - escapedKeys.push(length_default.selectedUnitsRegEx); - escapedKeys.push(length_default.anyCalcRegEx); - escapedKeys.push(`\\[length\\:.{1,}\\]`); - return "(" + escapedKeys.join("|") + ")"; - case "strokeWidth": - escapedKeys.push(length_default.selectedUnitsRegEx); - escapedKeys.push(length_default.anyCalcRegEx); - escapedKeys.push(`\\[length\\:calc\\(.{1,}\\)\\]`); - escapedKeys.push(`\\[length\\:(.{1,})(${length_default.selectedUnits.join("|")})?\\]`); - return "(" + escapedKeys.join("|") + ")"; - case "gap": - case "height": - case "lineHeight": - case "maxHeight": - case "size": - case "maxWidth": - case "minHeight": - case "minWidth": - case "padding": - case "width": - case "blur": - case "brightness": - case "contrast": - case "grayscale": - case "invert": - case "saturate": - case "sepia": - case "backdropBlur": - case "backdropBrightness": - case "backdropContrast": - case "backdropGrayscale": - case "backdropInvert": - case "backdropOpacity": - case "backdropSaturate": - case "backdropSepia": - case "transitionDuration": - case "transitionTimingFunction": - case "transitionDelay": - case "animation": - case "transformOrigin": - case "scale": - case "cursor": - escapedKeys.push(length_default.mergedUnitsRegEx); - escapedKeys.push(`\\[(?!(angle|color|length|list):).{1,}\\]`); - return "(" + escapedKeys.join("|") + ")"; - case "backdropHueRotate": - case "hueRotate": - case "inset": - case "letterSpacing": - case "margin": - case "scrollMargin": - case "skew": - case "space": - case "textIndent": - case "translate": - escapedKeys.push(length_default.mergedUnitsRegEx); - escapedKeys.push(`\\[(?!(angle|color|length|list):).{1,}\\]`); - return "(" + escapedKeys.join("|") + ")"; - case "backgroundOpacity": - case "borderOpacity": - case "opacity": - case "ringOpacity": - escapedKeys.push(`\\[(0(\\.\\d{1,})?|\\.\\d{1,}|1)\\]`); - escapedKeys.push(length_default.anyCalcRegEx); - escapedKeys.push(`\\[var\\(\\-\\-[A-Za-z\\-]{1,}\\)\\]`); - return "(" + escapedKeys.join("|") + ")"; - case "rotate": - escapedKeys.push(`\\[(${angle_default.mergedAngleValues.join("|")})\\]`); - return "(" + escapedKeys.join("|") + ")"; - case "gridTemplateColumns": - case "gridColumn": - case "gridColumnStart": - case "gridColumnEnd": - case "gridTemplateRows": - case "gridRow": - case "gridRowStart": - case "gridRowEnd": - case "gridAutoColumns": - case "gridAutoRows": - escapedKeys.push(`\\[(?!(angle|color|length):).{1,}\\]`); - return "(" + escapedKeys.join("|") + ")"; - case "listStyleType": - escapedKeys.push(`\\[(?!(angle|color|length|list):).{1,}\\]`); - return "(" + escapedKeys.join("|") + ")"; - case "objectPosition": - escapedKeys.push(`\\[(?!(angle|color|length):).{1,}\\]`); - return "(" + escapedKeys.join("|") + ")"; - case "backgroundPosition": - case "boxShadow": - case "dropShadow": - case "transitionProperty": - escapedKeys.push(`\\[(?!((angle|color|length|list):)|#|var\\().{1,}\\]`); - return "(" + escapedKeys.join("|") + ")"; - case "backgroundSize": - escapedKeys.push(`\\[length:.{1,}\\]`); - return "(" + escapedKeys.join("|") + ")"; - case "backgroundImageUrl": - escapedKeys.push(`.{1,}`); - return "(" + escapedKeys.join("|") + ")"; - case "backgroundImage": - escapedKeys.push(`\\[url\\(.{1,}\\)\\]`); - return "(" + escapedKeys.join("|") + ")"; - case "order": - case "zIndex": - escapedKeys.push(genericArbitraryOption); - return "(" + escapedKeys.join("|") + ")"; - case "fontWeight": - case "typography": - case "lineClamp": - return "(" + escapedKeys.join("|") + ")"; - case "aspectRatio": - case "flexGrow": - case "flexShrink": - case "fontFamily": - case "flex": - case "borderRadius": - default: - escapedKeys.push(genericArbitraryOption); - return "(" + escapedKeys.join("|") + ")"; - } -} -function patchRegex(re, config) { - if (!cachedRegexes.has(config)) { - cachedRegexes.set(config, {}); - } - const cache = cachedRegexes.get(config); - if (re in cache) { - return cache[re]; - } - let patched = "\\!?"; - if (config.prefix.length) { - patched += escapeSpecialChars(config.prefix); - } - let replaced = re; - const propsRe = /\$\{(\-?[a-z]*)\}/gi; - const res = replaced.matchAll(propsRe); - const resArray = [...res]; - const props = resArray.map((arr) => arr[1]); - if (props.length === 0) { - return cache[re] = `${patched}(${replaced})`; - } - props.forEach((prop) => { - const token = new RegExp("\\$\\{" + prop + "\\}"); - const isNegative = prop.substr(0, 1) === "-"; - const absoluteProp = isNegative ? prop.substr(1) : prop; - if (prop === "dark") { - replaced = replaced.replace(token, generateOptions(absoluteProp, [], config, isNegative)); - return `${patched}(${replaced})`; - } else if (prop === "arbitraryProperties") { - replaced = replaced.replace( - new RegExp("\\$\\{" + absoluteProp + "\\}"), - generateOptions(absoluteProp, [], config, isNegative) - ); - return `${patched}(${replaced})`; - } else if (prop === "backgroundImageUrl") { - replaced = replaced.replace(new RegExp("\\$\\{" + prop + "\\}"), generateOptions(prop, [], config, false)); - return `${patched}(${replaced})`; - } else if (!config.theme || !config.theme[absoluteProp]) { - return; - } - const keys = Object.keys(config.theme[absoluteProp]).filter((key) => { - if (isNegative) { - const val = config.theme[absoluteProp][key]; - const isCalc = typeof val === "string" && val.indexOf("calc") === 0; - const num = parseFloat(val); - if (isCalc) { - return true; - } - if (isNaN(num)) { - return false; - } - } else if (key[0] === "-") { - return false; - } - return true; - }).map((key) => { - if (isNegative && key[0] === "-") { - return key.substring(1); - } - return key; - }); - if (keys.length === 0 || replaced.match(token) === null) { - return; - } - const opts = generateOptions(absoluteProp, keys, config, isNegative); - replaced = replaced.replace(token, opts); - }); - return cache[re] = `${patched}(${replaced})`; -} -function getGroups(groupsConfig, twConfig = null) { - const groups2 = []; - groupsConfig.forEach((group) => { - group.members.forEach((prop) => { - if (typeof prop.members === "string") { - groups2.push(prop.members); - } else { - prop.members.forEach((subprop) => { - groups2.push(subprop.members); - }); - } - }); - }); - if (twConfig === null) { - return groups2; - } - return groups2.map((re) => patchRegex(re, twConfig)); -} -function initGroupSlots(groups2) { - const slots = []; - groups2.forEach((g) => slots.push([])); - return slots; -} -function getGroupIndex(name2, arr, separator = ":") { - const classSuffix = getSuffix(name2, separator); - let idx = arr.findIndex((pattern) => { - const classRe = new RegExp(`^(${pattern})$`); - return classRe.test(classSuffix); - }, classSuffix); - return idx; -} -function getGroupConfigKeys(groupsConfig) { - const groups2 = []; - groupsConfig.forEach((group) => { - group.members.forEach((prop) => { - if (typeof prop.members === "string") { - groups2.push(prop.configKey ? prop.configKey : null); - } else { - prop.members.forEach((subprop) => { - groups2.push(subprop.configKey ? subprop.configKey : null); - }); - } - }); - }); - return groups2; -} -function getPrefix(name2, separator) { - const rootSeparator = String.raw`(? findInGroup(name2, v, config, group.type)); - if (!innerGroup) { - return null; - } else { - return findInGroup(name2, innerGroup, config, group.type); - } - } -} -function parseClassname(name2, arr, config, index = null) { - const leadingRe = new RegExp("^(?\\s*)"); - const trailingRe = new RegExp("(?\\s*)$"); - let leading = ""; - let core = ""; - let trailing = ""; - const leadingRes = leadingRe.exec(name2); - if (leadingRes && leadingRes.groups) { - leading = leadingRes.groups.leading || ""; - } - const trailingRes = trailingRe.exec(name2); - if (trailingRes && trailingRes.groups) { - trailing = trailingRes.groups.trailing || ""; - } - core = name2.substring(leading.length, name2.length - trailing.length); - const variants = getPrefix(core, config.separator); - const classSuffix = getSuffix(core, config.separator); - let slot = null; - arr.forEach((group) => { - if (slot === null) { - const found = findInGroup(classSuffix, group, config); - if (found) { - slot = found; - } - } - }); - const value = slot ? slot.value : ""; - const isNegative = value[0] === "-"; - const off = isNegative ? 1 : 0; - const body = core.substr(0, core.length - value.length + off).substr(variants.length + off); - return { - index, - name: core, - variants, - parentType: slot ? slot.group : "", - body, - value, - shorthand: slot && slot.shorthand ? slot.shorthand : "", - leading, - trailing, - important: body.substr(0, 1) === "!" - }; -} -var cachedRegexes, groupMethods_default; -var init_groupMethods = __esm({ - "src/util/groupMethods.ts"() { - "use strict"; - init_angle(); - init_color(); - init_length(); - cachedRegexes = /* @__PURE__ */ new WeakMap(); - groupMethods_default = { - initGroupSlots, - getArbitraryProperty, - getGroups, - getGroupIndex, - getGroupConfigKeys, - getPrefix, - getSuffix, - parseClassname - }; - } -}); - -// src/rules/enforces-negative-arbitrary-values.ts -var NEGATIVE_ARBITRARY_VALUE, enforces_negative_arbitrary_values_default; -var init_enforces_negative_arbitrary_values = __esm({ - "src/rules/enforces-negative-arbitrary-values.ts"() { - "use strict"; - init_ast(); - init_customConfig(); - init_docsUrl(); - init_groupMethods(); - init_parser(); - init_settings(); - NEGATIVE_ARBITRARY_VALUE = `Arbitrary value classname '{{classname}}' should not start with a dash (-)`; - enforces_negative_arbitrary_values_default = { - meta: { - docs: { - description: "Warns about dash prefixed classnames using arbitrary values", - category: "Best Practices", - recommended: true, - url: docsUrl_default("enforces-negative-arbitrary-values") - }, - messages: { - negativeArbitraryValue: NEGATIVE_ARBITRARY_VALUE - }, - fixable: null, - schema: [ - { - type: "object", - properties: { - callees: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - ignoredKeys: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - config: { - // returned from `loadConfig()` utility - type: ["string", "object"] - }, - tags: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - } - } - } - ] - }, - create: function(context) { - const callees = settings_default(context, "callees"); - const skipClassAttribute = settings_default(context, "skipClassAttribute"); - const tags = settings_default(context, "tags"); - const twConfig = settings_default(context, "config"); - const classRegex = settings_default(context, "classRegex"); - const mergedConfig2 = customConfig_default.resolve(twConfig); - const parseForNegativeArbitraryClassNames = (node, arg = null) => { - let originalClassNamesValue = null; - if (arg === null) { - originalClassNamesValue = ast_default.extractValueFromNode(node); - } else { - switch (arg.type) { - case "Identifier": - return; - case "TemplateLiteral": - arg.expressions.forEach((exp) => { - parseForNegativeArbitraryClassNames(node, exp); - }); - arg.quasis.forEach((quasis) => { - parseForNegativeArbitraryClassNames(node, quasis); - }); - return; - case "ConditionalExpression": - parseForNegativeArbitraryClassNames(node, arg.consequent); - parseForNegativeArbitraryClassNames(node, arg.alternate); - return; - case "LogicalExpression": - parseForNegativeArbitraryClassNames(node, arg.right); - return; - case "ArrayExpression": - arg.elements.forEach((el) => { - parseForNegativeArbitraryClassNames(node, el); - }); - return; - case "ObjectExpression": - const isUsedByClassNamesPlugin = node.callee && node.callee.name === "classnames"; - const isVue = node.key && node.key.type === "VDirectiveKey"; - arg.properties.forEach((prop) => { - const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value; - parseForNegativeArbitraryClassNames(node, propVal); - }); - return; - case "Property": - parseForNegativeArbitraryClassNames(node, arg.key); - return; - case "Literal": - originalClassNamesValue = arg.value; - break; - case "TemplateElement": - originalClassNamesValue = arg.value.raw; - if (originalClassNamesValue === "") { - return; - } - break; - } - } - let { classNames } = ast_default.extractClassnamesFromValue(originalClassNamesValue); - const detected = classNames.filter((cls) => { - const suffix = groupMethods_default.getSuffix(cls, mergedConfig2.separator); - const negArbitraryValRegEx = /^\-((inset|scale)(\-(y|x))?|top|right|bottom|left|top|z|order|(scroll\-)?m(y|x|t|r|l|b)?|(skew|space|translate)\-(y|x)|rotate|tracking|indent|(backdrop\-)?hue\-rotate)\-\[.*\]$/i; - return negArbitraryValRegEx.test(suffix); - }); - detected.forEach((className) => { - context.report({ - node, - messageId: "negativeArbitraryValue", - data: { - classname: className - } - }); - }); - }; - const attributeVisitor = function(node) { - if (!ast_default.isClassAttribute(node, classRegex) || skipClassAttribute) { - return; - } - if (ast_default.isLiteralAttributeValue(node)) { - parseForNegativeArbitraryClassNames(node); - } else if (node.value && node.value.type === "JSXExpressionContainer") { - parseForNegativeArbitraryClassNames(node, node.value.expression); - } - }; - const callExpressionVisitor = function(node) { - const calleeStr = ast_default.calleeToString(node.callee); - if (callees.findIndex((name2) => calleeStr === name2) === -1) { - return; - } - node.arguments.forEach((arg) => { - parseForNegativeArbitraryClassNames(node, arg); - }); - }; - const scriptVisitor = { - JSXAttribute: attributeVisitor, - TextAttribute: attributeVisitor, - CallExpression: callExpressionVisitor, - TaggedTemplateExpression: function(node) { - if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { - return; - } - parseForNegativeArbitraryClassNames(node, node.quasi); - } - }; - const templateVisitor = { - CallExpression: callExpressionVisitor, - /* - Tagged templates inside data bindings - https://github.com/vuejs/vue/issues/9721 - */ - VAttribute: function(node) { - switch (true) { - case !ast_default.isValidVueAttribute(node, classRegex): - return; - case ast_default.isVLiteralValue(node): - parseForNegativeArbitraryClassNames(node); - break; - case ast_default.isArrayExpression(node): - node.value.expression.elements.forEach((arg) => { - parseForNegativeArbitraryClassNames(node, arg); - }); - break; - case ast_default.isObjectExpression(node): - node.value.expression.properties.forEach((prop) => { - parseForNegativeArbitraryClassNames(node, prop); - }); - break; - } - } - }; - return parser_default.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); - } - }; - } -}); - -// src/configs/groups.ts -var groups; -var init_groups = __esm({ - "src/configs/groups.ts"() { - "use strict"; - groups = [ - { - type: "Core Concepts", - members: [ - { - type: "Hover, Focus, & Other States", - members: [ - { - type: "group", - members: "group" - }, - { - type: "peer", - members: "peer" - } - ] - }, - { - type: "Dark Mode", - members: "${dark}" - }, - { - type: "Arbitrary properties", - members: "${arbitraryProperties}" - } - ] - }, - { - type: "Layout", - members: [ - { - type: "Aspect Ratio", - members: "aspect\\-(?${aspectRatio})", - configKey: "aspectRatio" - }, - { - type: "Container", - members: "container" - }, - { - type: "Columns", - members: "columns\\-(?${columns})", - configKey: "columns" - }, - { - type: "Break After", - members: "break\\-after\\-(?auto|avoid|all|avoid\\-page|page|left|right|column)" - }, - { - type: "Break Before", - members: "break\\-before\\-(?auto|avoid|all|avoid\\-page|page|left|right|column)" - }, - { - type: "Break Inside", - members: "break\\-inside\\-(?auto|avoid|avoid\\-page|avoid\\-column)" - }, - { - type: "Box Decoration Break", - members: "box\\-decoration\\-(?clone|slice)" - }, - { - type: "Deprecated Box Decoration Break", - members: "decoration\\-(?clone|slice)", - deprecated: true - }, - { - type: "Box Sizing", - members: "box\\-(?border|content)" - }, - { - type: "Display", - members: "block|flex|grid|flow\\-root|contents|hidden|inline(\\-(block|flex|table|grid))?|table\\-(column|footer|header|row)\\-group|table(\\-(caption|row|cell|column))?|list\\-item" - }, - { - type: "Floats", - members: "float\\-(?right|left|none)" - }, - { - type: "Clear", - members: "clear\\-(?left|right|both|none)" - }, - { - type: "Isolation", - members: "(isolate|isolation\\-auto)" - }, - { - type: "Object Fit", - members: "object\\-(?contain|cover|fill|none|scale\\-down)" - }, - { - type: "Object Position", - members: "object\\-(?${objectPosition})", - configKey: "objectPosition" - }, - { - type: "Overflow", - members: [ - { - type: "overflow", - members: "overflow\\-(?auto|hidden|clip|visible|scroll)", - shorthand: "all", - body: "overflow" - }, - { - type: "overflow-x", - members: "overflow\\-x\\-(?auto|hidden|clip|visible|scroll)", - shorthand: "x", - body: "overflow-x" - }, - { - type: "overflow-y", - members: "overflow\\-y\\-(?auto|hidden|clip|visible|scroll)", - shorthand: "y", - body: "overflow-y" - } - ] - }, - { - type: "Overscroll Behavior", - members: [ - { - type: "overscroll", - members: "overscroll\\-(?auto|contain|none)", - shorthand: "all", - body: "overscroll" - }, - { - type: "overscroll-x", - members: "overscroll\\-x\\-(?auto|contain|none)", - shorthand: "x", - body: "overscroll-x" - }, - { - type: "overscroll-y", - members: "overscroll\\-y\\-(?auto|contain|none)", - shorthand: "y", - body: "overscroll-y" - } - ] - }, - { - type: "Position", - members: "static|fixed|absolute|relative|sticky" - }, - { - type: "Top / Right / Bottom / Left", - members: [ - { - type: "inset", - members: "(inset\\-(?${inset})|\\-inset\\-(?${-inset}))", - shorthand: "all", - body: "inset", - configKey: "inset" - }, - { - type: "inset-y", - members: "(inset\\-y\\-(?${inset})|\\-inset\\-y\\-(?${-inset}))", - shorthand: "y", - body: "inset-y", - configKey: "inset" - }, - { - type: "inset-x", - members: "(inset\\-x\\-(?${inset})|\\-inset\\-x\\-(?${-inset}))", - shorthand: "x", - body: "inset-x", - configKey: "inset" - }, - { - type: "top", - members: "(top\\-(?${inset})|\\-top\\-(?${-inset}))", - shorthand: "t", - body: "top", - configKey: "inset" - }, - { - type: "right", - members: "(right\\-(?${inset})|\\-right\\-(?${-inset}))", - shorthand: "r", - body: "right", - configKey: "inset" - }, - { - type: "bottom", - members: "(bottom\\-(?${inset})|\\-bottom\\-(?${-inset}))", - shorthand: "b", - body: "bottom", - configKey: "inset" - }, - { - type: "left", - members: "(left\\-(?${inset})|\\-left\\-(?${-inset}))", - shorthand: "l", - body: "left", - configKey: "inset" - } - ] - }, - { - type: "Visibility", - members: "(in)?visible|collapse" - }, - { - type: "Z-Index", - members: "(z\\-(?${zIndex})|\\-z\\-(?${-zIndex}))", - configKey: "zIndex" - } - ] - }, - { - type: "Flexbox & Grid", - members: [ - { - type: "Flex Basis", - members: "basis\\-(?${flexBasis})", - configKey: "flexBasis" - }, - { - type: "Flex Direction", - members: "flex\\-(row|col)(\\-reverse)?" - }, - { - type: "Flex Wrap", - members: "flex\\-(wrap(\\-reverse)?|nowrap)" - }, - { - type: "Flex", - members: "flex\\-(?${flex})", - configKey: "flex" - }, - { - type: "Flex Grow", - members: "grow(\\-(?${flexGrow}))?", - configKey: "flexGrow" - }, - { - type: "Deprecated Flex Grow", - members: "flex\\-grow(\\-(?${flexGrow}))?", - deprecated: true, - configKey: "flexGrow" - }, - { - type: "Flex Shrink", - members: "shrink(\\-(?${flexShrink}))?", - configKey: "flexShrink" - }, - { - type: "Deprecated Flex Shrink", - members: "flex\\-shrink(\\-(?${flexShrink}))?", - deprecated: true, - configKey: "flexShrink" - }, - { - type: "Order", - members: "(order\\-(?${order})|\\-order\\-(?${-order}))", - configKey: "order" - }, - { - type: "Grid Template Columns", - members: "grid\\-cols\\-(?${gridTemplateColumns})", - configKey: "gridTemplateColumns" - }, - { - type: "Grid Column Start / End", - members: [ - { - type: "grid-column", - members: "col\\-(?${gridColumn})", - configKey: "gridColumn" - }, - { - type: "grid-column-start", - members: "col\\-start\\-(?${gridColumnStart})", - configKey: "gridColumnStart" - }, - { - type: "grid-column-end", - members: "col\\-end\\-(?${gridColumnEnd})", - configKey: "gridColumnEnd" - } - ] - }, - { - type: "Grid Template Rows", - members: "grid\\-rows\\-(?${gridTemplateRows})", - configKey: "gridTemplateRows" - }, - { - type: "Grid Row Start / End", - members: [ - { - type: "grid-row", - members: "row\\-(?${gridRow})", - configKey: "gridRow" - }, - { - type: "grid-row-start", - members: "row\\-start\\-(?${gridRowStart})", - configKey: "gridRowStart" - }, - { - type: "grid-row-end", - members: "row\\-end\\-(?${gridRowEnd})", - configKey: "gridRowEnd" - } - ] - }, - { - type: "Grid Auto Flow", - members: "grid\\-flow\\-(dense|(row|col)(\\-dense)?)" - }, - { - type: "Grid Auto Columns", - members: "auto\\-cols\\-(?${gridAutoColumns})", - configKey: "gridAutoColumns" - }, - { - type: "Grid Auto Rows", - members: "auto\\-rows\\-(?${gridAutoRows})", - configKey: "gridAutoRows" - }, - { - type: "Gap", - members: [ - { - type: "gap", - members: "gap\\-(?${gap})", - shorthand: "all", - body: "gap", - configKey: "gap" - }, - { - type: "column-gap", - members: "gap\\-x\\-(?${gap})", - shorthand: "x", - body: "gap-x", - configKey: "gap" - }, - { - type: "row-gap", - members: "gap\\-y\\-(?${gap})", - shorthand: "y", - body: "gap-y", - configKey: "gap" - } - ] - }, - { - type: "Justify Content", - members: "justify\\-(start|end|center|between|around|evenly)" - }, - { - type: "Justify Items", - members: "justify\\-items\\-(start|end|center|stretch)" - }, - { - type: "Justify Self", - members: "justify\\-self\\-(auto|start|end|center|stretch)" - }, - { - type: "Align Content", - members: "content\\-(center|start|end|between|around|evenly|baseline)" - }, - { - type: "Align Items", - members: "items\\-(start|end|center|baseline|stretch)" - }, - { - type: "Align Self", - members: "self\\-(auto|start|end|center|stretch|baseline)" - }, - { - type: "Place Content", - members: "place\\-content\\-(center|start|end|between|around|evenly|stretch|baseline)" - }, - { - type: "Place Items", - members: "place\\-items\\-(start|end|center|stretch|baseline)" - }, - { - type: "Place Self", - members: "place\\-self\\-(auto|start|end|center|stretch)" - } - ] - }, - { - type: "Spacing", - members: [ - { - type: "Padding", - members: [ - { - type: "p", - members: "p\\-(?${padding})", - shorthand: "all", - body: "p", - configKey: "padding" - }, - { - type: "py", - members: "py\\-(?${padding})", - shorthand: "y", - body: "py", - configKey: "padding" - }, - { - type: "px", - members: "px\\-(?${padding})", - shorthand: "x", - body: "px", - configKey: "padding" - }, - { - type: "pt", - members: "pt\\-(?${padding})", - shorthand: "t", - body: "pt", - configKey: "padding" - }, - { - type: "pr", - members: "pr\\-(?${padding})", - shorthand: "r", - body: "pr", - configKey: "padding" - }, - { - type: "pb", - members: "pb\\-(?${padding})", - shorthand: "b", - body: "pb", - configKey: "padding" - }, - { - type: "pl", - members: "pl\\-(?${padding})", - shorthand: "l", - body: "pl", - configKey: "padding" - } - ] - }, - { - type: "Margin", - members: [ - { - type: "m", - members: "(m\\-(?${margin})|\\-m\\-(?${-margin}))", - shorthand: "all", - body: "m", - configKey: "margin" - }, - { - type: "my", - members: "(my\\-(?${margin})|\\-my\\-(?${-margin}))", - shorthand: "y", - body: "my", - configKey: "margin" - }, - { - type: "mx", - members: "(mx\\-(?${margin})|\\-mx\\-(?${-margin}))", - shorthand: "x", - body: "mx", - configKey: "margin" - }, - { - type: "mt", - members: "(mt\\-(?${margin})|\\-mt\\-(?${-margin}))", - shorthand: "t", - body: "mt", - configKey: "margin" - }, - { - type: "mr", - members: "(mr\\-(?${margin})|\\-mr\\-(?${-margin}))", - shorthand: "r", - body: "mr", - configKey: "margin" - }, - { - type: "mb", - members: "(mb\\-(?${margin})|\\-mb\\-(?${-margin}))", - shorthand: "b", - body: "mb", - configKey: "margin" - }, - { - type: "ml", - members: "(ml\\-(?${margin})|\\-ml\\-(?${-margin}))", - shorthand: "l", - body: "ml", - configKey: "margin" - } - ] - }, - { - type: "Space Between", - members: [ - { - type: "space-y", - members: "(space\\-y\\-(?${space})|\\-space\\-y\\-(?${-space}))", - configKey: "space" - }, - { - type: "space-x", - members: "(space\\-x\\-(?${space})|\\-space\\-x\\-(?${-space}))", - configKey: "space" - }, - { - type: "space-y-reverse", - members: "space\\-y\\-reverse" - }, - { - type: "space-x-reverse", - members: "space\\-x\\-reverse" - } - ] - } - ] - }, - { - type: "Sizing", - members: [ - { - type: "Width", - members: "w\\-(?${width})", - configKey: "width" - }, - { - type: "Min-Width", - members: "min\\-w\\-(?${minWidth})", - configKey: "minWidth" - }, - { - type: "Max-Width", - members: "max\\-w\\-(?${maxWidth})", - configKey: "maxWidth" - }, - { - type: "Height", - members: "h\\-(?${height})", - configKey: "height" - }, - { - type: "Min-Height", - members: "min\\-h\\-(?${minHeight})", - configKey: "minHeight" - }, - { - type: "Max-Height", - members: "max\\-h\\-(?${maxHeight})", - configKey: "maxHeight" - }, - { - type: "Size", - members: "size\\-(?${size})", - configKey: "size" - } - ] - }, - { - type: "Typography", - members: [ - { - type: "Font Family", - members: "font\\-(?${fontFamily})", - configKey: "fontFamily" - }, - { - type: "Font Size", - members: "text\\-(?${fontSize})", - configKey: "fontSize" - }, - { - type: "Font Smoothing", - members: "(subpixel\\-)?antialiased" - }, - { - type: "Font Style", - members: "(not\\-)?italic" - }, - { - type: "Font Weight", - members: "font\\-(?${fontWeight})", - configKey: "fontWeight" - }, - { - type: "Font Variant Numeric", - members: [ - { - type: "Normal Nums", - members: "normal\\-nums" - }, - { - type: "Ordinal", - members: "ordinal" - }, - { - type: "Slashed Zero", - members: "slashed-zero" - }, - { - type: "Style Nums", - members: "(lining|oldstyle)\\-nums" - }, - { - type: "Proportinal or Tabular", - members: "(proportional|tabular)\\-nums" - }, - { - type: "Fractions", - members: "(diagonal|stacked)\\-fractions" - } - ] - }, - { - type: "Letter Spacing", - members: "(tracking\\-(?${letterSpacing})|\\-tracking\\-(?${-letterSpacing}))", - configKey: "letterSpacing" - }, - // { - // type: 'Line Clamp', - // members: 'line\\-clamp\\-(?${lineClamp})', - // configKey: 'lineClamp', - // }, - { - type: "Line Height", - members: "leading\\-(?${lineHeight})", - configKey: "lineHeight" - }, - // { - // type: 'List Style Image', - // members: 'list\\-image\\-(?${listStyleImage})', - // configKey: 'listStyleImage', - // }, - { - type: "List Style Type", - members: "list\\-(?${listStyleType})", - configKey: "listStyleType" - }, - { - type: "List Style Position", - members: "list\\-(in|out)side" - }, - { - type: "Text Alignment", - members: "text\\-(left|center|right|justify|start|end)" - }, - { - type: "Text Color", - members: "text\\-(?${textColor})", - configKey: "colors" - }, - { - type: "Text Decoration", - members: "(no\\-)?underline|overline|line\\-through" - }, - { - type: "Text Decoration Color", - members: "decoration\\-(?${colors})", - configKey: "colors" - }, - { - type: "Text Decoration Style", - members: "decoration\\-(solid|double|dotted|dashed|wavy)" - }, - { - type: "Text Decoration Thickness", - members: "decoration\\-(?${textDecorationThickness})", - configKey: "textDecorationThickness" - }, - { - type: "Text Underline Offset", - members: "underline\\-offset\\-(?${textUnderlineOffset})", - configKey: "textUnderlineOffset" - }, - { - type: "Text Transform", - members: "(upper|lower|normal\\-)case|capitalize" - }, - { - type: "Text Overflow", - members: "truncate|text\\-(ellipsis|clip)" - }, - { - type: "Deprecated Text Overflow", - members: "overflow\\-(ellipsis|clip)", - deprecated: true - }, - { - type: "Text Wrap", - members: "text\\-(wrap|nowrap|balance|pretty)" - }, - { - type: "Text Indent", - members: "(indent\\-(?${textIndent})|\\-indent\\-(?${-textIndent}))", - configKey: "textIndent" - }, - { - type: "Vertical Alignment", - members: "align\\-(baseline|top|middle|bottom|text\\-(top|bottom)|sub|super)" - }, - { - type: "Whitespace", - members: "whitespace\\-(normal|nowrap|pre(\\-(line|wrap))?)" - }, - { - type: "Word Break", - members: "break\\-(normal|words|all|keep)" - }, - { - type: "Content", - members: "content\\-(?${content})", - configKey: "content" - } - ] - }, - { - type: "Backgrounds", - members: [ - { - type: "Background Image URL", - members: "bg\\-\\[(image\\:|url\\()(?${backgroundImageUrl})\\)\\]" - }, - { - type: "Background Attachment", - members: "bg\\-(fixed|local|scroll)" - }, - { - type: "Background Clip", - members: "bg\\-clip\\-(border|padding|content|text)" - }, - { - type: "Background Color", - members: "bg\\-(?${colors})", - configKey: "colors" - }, - { - type: "Deprecated Background Opacity", - members: "bg\\-opacity\\-(?${backgroundOpacity})", - deprecated: true - }, - { - type: "Background Origin", - members: "bg\\-origin\\-(border|padding|content)" - }, - { - type: "Background Position", - members: "bg\\-(?${backgroundPosition})", - configKey: "backgroundPosition" - }, - { - type: "Background Repeat", - members: "bg\\-(no\\-repeat|repeat(\\-(x|y|round|space))?)" - }, - { - type: "Background Size", - members: "bg\\-(?${backgroundSize})", - configKey: "backgroundSize" - }, - { - type: "Background Image", - members: "bg\\-(?${backgroundImage})", - configKey: "backgroundImage" - }, - { - type: "Gradient Color Stops", - members: [ - { - type: "from", - members: "from\\-(?${gradientColorStopPositions})", - configKey: "gradientColorStopPositions" - }, - { - type: "via", - members: "via\\-(?${gradientColorStopPositions})", - configKey: "gradientColorStopPositions" - }, - { - type: "to", - members: "to\\-(?${gradientColorStopPositions})", - configKey: "gradientColorStopPositions" - } - ] - } - ] - }, - { - type: "Borders", - members: [ - { - type: "Border Radius", - members: [ - { - type: "border-radius", - members: "rounded(\\-(?${borderRadius}))?", - shorthand: "all", - body: "rounded", - configKey: "borderRadius" - }, - { - type: "border-radius-top", - members: "rounded\\-t(\\-(?${borderRadius}))?", - shorthand: "t", - body: "rounded-t", - configKey: "borderRadius" - }, - { - type: "border-radius-right", - members: "rounded\\-r(\\-(?${borderRadius}))?", - shorthand: "r", - body: "rounded-r", - configKey: "borderRadius" - }, - { - type: "border-radius-bottom", - members: "rounded\\-b(\\-(?${borderRadius}))?", - shorthand: "b", - body: "rounded-b", - configKey: "borderRadius" - }, - { - type: "border-radius-left", - members: "rounded\\-l(\\-(?${borderRadius}))?", - shorthand: "l", - body: "rounded-l", - configKey: "borderRadius" - }, - { - type: "border-radius-top-left", - members: "rounded\\-tl(\\-(?${borderRadius}))?", - shorthand: "tl", - body: "rounded-tl", - configKey: "borderRadius" - }, - { - type: "border-radius-top-right", - members: "rounded\\-tr(\\-(?${borderRadius}))?", - shorthand: "tr", - body: "rounded-tr", - configKey: "borderRadius" - }, - { - type: "border-radius-bottom-right", - members: "rounded\\-br(\\-(?${borderRadius}))?", - shorthand: "br", - body: "rounded-br", - configKey: "borderRadius" - }, - { - type: "border-radius-bottom-left", - members: "rounded\\-bl(\\-(?${borderRadius}))?", - shorthand: "bl", - body: "rounded-bl", - configKey: "borderRadius" - } - ] - }, - { - type: "Border Width", - members: [ - { - type: "border-width", - members: "border(\\-(?${borderWidth}))?", - shorthand: "all", - body: "border", - configKey: "borderWidth" - }, - { - type: "border-y-width", - members: "border\\-y(\\-(?${borderWidth}))?", - shorthand: "y", - body: "border-y", - configKey: "borderWidth" - }, - { - type: "border-x-width", - members: "border\\-x(\\-(?${borderWidth}))?", - shorthand: "x", - body: "border-x", - configKey: "borderWidth" - }, - { - type: "border-top-width", - members: "border\\-t(\\-(?${borderWidth}))?", - shorthand: "t", - body: "border-t", - configKey: "borderWidth" - }, - { - type: "border-right-width", - members: "border\\-r(\\-(?${borderWidth}))?", - shorthand: "r", - body: "border-r", - configKey: "borderWidth" - }, - { - type: "border-bottom-width", - members: "border\\-b(\\-(?${borderWidth}))?", - shorthand: "b", - body: "border-b", - configKey: "borderWidth" - }, - { - type: "border-left-width", - members: "border\\-l(\\-(?${borderWidth}))?", - shorthand: "l", - body: "border-l", - configKey: "borderWidth" - } - ] - }, - { - type: "Border Color", - members: [ - { - type: "border-color", - members: "border\\-(?${borderColor})", - shorthand: "all", - body: "border", - configKey: "borderColor" - }, - { - type: "border-y-color", - members: "border\\-y\\-(?${borderColor})", - shorthand: "y", - body: "border-y", - configKey: "borderColor" - }, - { - type: "border-x-color", - members: "border\\-x\\-(?${borderColor})", - shorthand: "x", - body: "border-x", - configKey: "borderColor" - }, - { - type: "border-top-color", - members: "border\\-t\\-(?${borderColor})", - shorthand: "t", - body: "border-t", - configKey: "borderColor" - }, - { - type: "border-right-color", - members: "border\\-r\\-(?${borderColor})", - shorthand: "r", - body: "border-r", - configKey: "borderColor" - }, - { - type: "border-bottom-color", - members: "border\\-b\\-(?${borderColor})", - shorthand: "b", - body: "border-b", - configKey: "borderColor" - }, - { - type: "border-left-color", - members: "border\\-l\\-(?${borderColor})", - shorthand: "l", - body: "border-l", - configKey: "borderColor" - } - ] - }, - { - type: "Deprecated Border Opacity", - members: "border\\-opacity\\-(?${borderOpacity})", - deprecated: true, - configKey: "borderOpacity" - }, - { - type: "Border Style", - members: "border\\-(solid|dashed|dotted|double|hidden|none)" - }, - { - type: "Divide Width", - members: [ - { - type: "divide-y", - members: "divide\\-y(\\-(?${divideWidth}))?", - configKey: "divideWidth" - }, - { - type: "divide-x", - members: "divide\\-x(\\-(?${divideWidth}))?", - configKey: "divideWidth" - }, - { - type: "divide-y-reverse", - members: "divide\\-y\\-reverse" - }, - { - type: "divide-x-reverse", - members: "divide\\-x\\-reverse" - } - ] - }, - { - type: "Divide Color", - members: "divide\\-(?${divideColor})", - configKey: "divideColor" - }, - { - type: "Divide Style", - members: "divide\\-(solid|dashed|dotted|double|none)" - }, - { - type: "Outline Width", - members: "outline\\-(?${outlineWidth})", - configKey: "outlineWidth" - }, - { - type: "Outline Color", - members: "outline\\-(?${outlineColor})", - configKey: "outlineColor" - }, - { - type: "Outline Style", - members: "outline(\\-(none|dashed|dotted|double|hidden))?" - }, - { - type: "Outline Offset", - members: "(outline\\-offset\\-(?${outlineOffset})|\\-outline\\-offset\\-(?${-outlineOffset}))", - configKey: "outlineOffset" - }, - { - type: "Ring Width", - members: [ - { - type: "ring", - members: "ring(\\-(?${ringWidth}))?", - configKey: "ringWidth" - } - ] - }, - { - type: "Ring Inset", - members: [ - { - type: "ring-inset", - members: "ring\\-inset" - } - ] - }, - { - type: "Ring Color", - members: "ring\\-(?${colors})", - configKey: "colors" - }, - { - type: "Deprecated Ring Opacity", - members: "ring\\-opacity\\-(?${ringOpacity})", - deprecated: true, - configKey: "ringOpacity" - }, - { - type: "Ring Offset Width", - members: "ring\\-offset\\-(?${ringOffsetWidth})", - configKey: "ringOffsetWidth" - }, - { - type: "Ring Offset Color", - members: "ring\\-offset\\-(?${colors})", - configKey: "colors" - } - ] - }, - { - type: "Effects", - members: [ - { - type: "Box Shadow", - members: "shadow(\\-(?${boxShadow}))?", - configKey: "boxShadow" - }, - { - type: "Box Shadow Color", - members: "shadow(\\-(?${boxShadowColor}))?", - configKey: "boxShadowColor" - }, - { - type: "Opacity", - members: "opacity\\-(?${opacity})", - configKey: "opacity" - }, - { - type: "Mix Blend Mode", - members: "mix\\-blend\\-(normal|multiply|screen|overlay|darken|lighten|color\\-(burn|dodge)|(hard|soft)\\-light|difference|exclusion|hue|saturation|color|luminosity|plus\\-lighter)" - }, - { - type: "Background Blend Mode", - members: "bg\\-blend\\-(normal|multiply|screen|overlay|darken|lighten|color\\-(dodge|burn)|(hard|soft)\\-light|difference|exclusion|hue|saturation|color|luminosity)" - } - ] - }, - { - type: "Filters", - members: [ - { - type: "Deprecated Filter", - members: "filter", - deprecated: true - }, - { - type: "Blur", - members: "blur(\\-(?${blur}))?", - configKey: "blur" - }, - { - type: "Brightness", - members: "brightness\\-(?${brightness})", - configKey: "brightness" - }, - { - type: "Contrast", - members: "contrast\\-(?${contrast})", - configKey: "contrast" - }, - { - type: "Drop Shadow", - members: "drop\\-shadow(\\-(?${dropShadow}))?", - configKey: "dropShadow" - }, - { - type: "Grayscale", - members: "grayscale(\\-(?${grayscale}))?", - configKey: "grayscale" - }, - { - type: "Hue Rotate", - members: "hue\\-rotate\\-(?${hueRotate})|\\-hue\\-rotate\\-(?${-hueRotate})", - configKey: "hueRotate" - }, - { - type: "Invert", - members: "invert(\\-(?${invert}))?", - configKey: "invert" - }, - { - type: "Saturate", - members: "saturate\\-(?${saturate})", - configKey: "saturate" - }, - { - type: "Sepia", - members: "sepia(\\-(?${sepia}))?", - configKey: "sepia" - }, - { - type: "Backdrop Blur", - members: "backdrop\\-blur(\\-(?${backdropBlur}))?", - configKey: "backdropBlur" - }, - { - type: "Backdrop Brightness", - members: "backdrop\\-brightness\\-(?${backdropBrightness})", - configKey: "backdropBrightness" - }, - { - type: "Backdrop Contrast", - members: "backdrop\\-contrast\\-(?${backdropContrast})", - configKey: "backdropContrast" - }, - { - type: "Backdrop Grayscale", - members: "backdrop\\-grayscale(\\-(?${backdropGrayscale}))?", - configKey: "backdropGrayscale" - }, - { - type: "Backdrop Hue Rotate", - members: "backdrop\\-hue\\-rotate\\-(?${backdropHueRotate})|\\-backdrop\\-hue\\-rotate\\-(?${-backdropHueRotate})", - configKey: "backdropHueRotate" - }, - { - type: "Backdrop Invert", - members: "backdrop\\-invert(\\-(?${backdropInvert}))?", - configKey: "backdropInvert" - }, - { - type: "Backdrop Opacity", - members: "backdrop\\-opacity\\-(?${backdropOpacity})", - configKey: "backdropOpacity" - }, - { - type: "Backdrop Saturate", - members: "backdrop\\-saturate\\-(?${backdropSaturate})", - configKey: "backdropSaturate" - }, - { - type: "Backdrop Sepia", - members: "backdrop\\-sepia(\\-(?${backdropSepia}))?", - configKey: "backdropSepia" - } - ] - }, - { - type: "Tables", - members: [ - { - type: "Border Collapse", - members: "border\\-(collapse|separate)" - }, - { - type: "Border Spacing", - members: [ - { - type: "border-spacing", - members: "border\\-spacing\\-(?${borderSpacing})", - shorthand: "all", - body: "border-spacing", - configKey: "borderSpacing" - }, - { - type: "border-spacing-x", - members: "border\\-spacing\\-x\\-(?${borderSpacing})", - shorthand: "x", - body: "border-spacing-x", - configKey: "borderSpacing" - }, - { - type: "border-spacing-y", - members: "border\\-spacing\\-y\\-(?${borderSpacing})", - shorthand: "y", - body: "border-spacing-y", - configKey: "borderSpacing" - } - ] - }, - { - type: "Table Layout", - members: "table\\-(auto|fixed)" - } - ] - }, - { - type: "Transitions & Animation", - members: [ - { - type: "Transition Property", - members: "transition(\\-(?${transitionProperty}))?", - configKey: "transitionProperty" - }, - { - type: "Transition Duration", - members: "duration(\\-(?${transitionDuration}))?", - configKey: "transitionDuration" - }, - { - type: "Transition Timing Function", - members: "ease(\\-(?${transitionTimingFunction}))?", - configKey: "transitionTimingFunction" - }, - { - type: "Transition Delay", - members: "delay\\-(?${transitionDelay})", - configKey: "transitionDelay" - }, - { - type: "Animation", - members: "animate\\-(?${animation})", - configKey: "animation" - } - ] - }, - { - type: "Transforms", - members: [ - { - type: "Transform GPU", - members: [ - { - type: "transform-gpu", - members: "transform\\-gpu" - } - ] - }, - { - type: "Transform None", - members: [ - { - type: "transform-none", - members: "transform\\-none" - } - ] - }, - { - type: "Deprecated Transform", - members: [ - { - type: "transform", - members: "transform", - deprecated: true - } - ] - }, - { - type: "Scale", - members: [ - { - type: "scale", - members: "scale\\-(?${scale})|\\-scale\\-(?${-scale})", - shorthand: "all", - body: "scale", - configKey: "scale" - }, - { - type: "scale-y", - members: "scale\\-y\\-(?${scale})|\\-scale\\-y\\-(?${-scale})", - shorthand: "y", - body: "scale-y", - configKey: "scale" - }, - { - type: "scale-x", - members: "scale\\-x\\-(?${scale})|\\-scale\\-x\\-(?${-scale})", - shorthand: "x", - body: "scale-x", - configKey: "scale" - } - ] - }, - { - type: "Rotate", - members: "(rotate\\-(?${rotate})|\\-rotate\\-(?${-rotate}))", - configKey: "rotate" - }, - { - type: "Translate", - members: [ - { - type: "translate-x", - members: "(translate\\-x\\-(?${translate})|\\-translate\\-x\\-(?${-translate}))", - configKey: "translate" - }, - { - type: "translate-y", - members: "(translate\\-y\\-(?${translate})|\\-translate\\-y\\-(?${-translate}))", - configKey: "translate" - } - ] - }, - { - type: "Skew", - members: [ - { - type: "skew-x", - members: "(skew\\-x\\-(?${skew})|\\-skew\\-x\\-(?${-skew}))", - configKey: "skew" - }, - { - type: "skew-y", - members: "(skew\\-y\\-(?${skew})|\\-skew\\-y\\-(?${-skew}))", - configKey: "skew" - } - ] - }, - { - type: "Transform Origin", - members: "origin\\-(?${transformOrigin})", - configKey: "transformOrigin" - } - ] - }, - { - type: "Interactivity", - members: [ - { - type: "Accent Color", - members: "accent\\-(?${accentColor})", - configKey: "accentColor" - }, - { - type: "Appearance", - members: "appearance\\-none" - }, - { - type: "Cursor", - members: "cursor\\-(?${cursor})", - configKey: "cursor" - }, - { - type: "Caret Color", - members: "caret\\-(?${colors})", - configKey: "colors" - }, - { - type: "Pointer Events", - members: "pointer\\-events\\-(none|auto)" - }, - { - type: "Resize", - members: "resize(\\-(none|x|y))?" - }, - { - type: "Scroll Behavior", - members: "scroll\\-(auto|smooth)" - }, - { - type: "Scroll Margin", - members: "scroll\\-(?${scrollMargin})", - configKey: "scrollMargin", - members: [ - { - type: "scroll-m", - members: "scroll-m\\-(?${scrollMargin})|\\-scroll-m\\-(?${-scrollMargin})", - configKey: "scrollMargin" - }, - { - type: "scroll-my", - members: "scroll-my\\-(?${scrollMargin})|\\-scroll-my\\-(?${-scrollMargin})", - configKey: "scrollMargin" - }, - { - type: "scroll-mx", - members: "scroll-mx\\-(?${scrollMargin})|\\-scroll-mx\\-(?${-scrollMargin})", - configKey: "scrollMargin" - }, - { - type: "scroll-mt", - members: "scroll-mt\\-(?${scrollMargin})|\\-scroll-mt\\-(?${-scrollMargin})", - configKey: "scrollMargin" - }, - { - type: "scroll-mr", - members: "scroll-mr\\-(?${scrollMargin})|\\-scroll-mr\\-(?${-scrollMargin})", - configKey: "scrollMargin" - }, - { - type: "scroll-mb", - members: "scroll-mb\\-(?${scrollMargin})|\\-scroll-mb\\-(?${-scrollMargin})", - configKey: "scrollMargin" - }, - { - type: "scroll-ml", - members: "scroll-ml\\-(?${scrollMargin})|\\-scroll-ml\\-(?${-scrollMargin})", - configKey: "scrollMargin" - } - ] - }, - { - type: "Scroll Padding", - members: "scroll\\-(?${scrollPadding})", - configKey: "scrollPadding", - members: [ - { - type: "scroll-p", - members: "scroll-p\\-(?${scrollPadding})", - configKey: "scrollPadding" - }, - { - type: "scroll-py", - members: "scroll-py\\-(?${scrollPadding})", - configKey: "scrollPadding" - }, - { - type: "scroll-px", - members: "scroll-px\\-(?${scrollPadding})", - configKey: "scrollPadding" - }, - { - type: "scroll-pt", - members: "scroll-pt\\-(?${scrollPadding})", - configKey: "scrollPadding" - }, - { - type: "scroll-pr", - members: "scroll-pr\\-(?${scrollPadding})", - configKey: "scrollPadding" - }, - { - type: "scroll-pb", - members: "scroll-pb\\-(?${scrollPadding})", - configKey: "scrollPadding" - }, - { - type: "scroll-pl", - members: "scroll-pl\\-(?${scrollPadding})", - configKey: "scrollPadding" - } - ] - }, - { - type: "Scroll Snap Align", - members: "snap\\-(start|end|center|align-none)" - }, - { - type: "Scroll Snap Stop", - members: "snap\\-(normal|always)" - }, - { - type: "Scroll Snap Type", - members: "snap\\-(none|x|y|both)" - }, - { - type: "Scroll Snap Type Strictness", - members: "snap\\-(mandatory|proximity)" - }, - { - type: "Touch Action", - members: [ - { - type: "Touch Action Mode", - members: "touch\\-(auto|none|manipulation)" - }, - { - type: "Touch Action X", - members: "touch\\-(pan\\-(x|left|right))" - }, - { - type: "Touch Action Y", - members: "touch\\-(pan\\-(y|up|down))" - }, - { - type: "Touch Action Pinch Zoom", - members: "touch\\-pinch\\-zoom" - } - ] - }, - { - type: "User Select", - members: "select\\-(none|text|all|auto)" - }, - { - type: "Will Change", - members: "will\\-change\\-(?${willChange})", - configKey: "willChange" - } - ] - }, - { - type: "SVG", - members: [ - { - type: "Fill", - members: "fill\\-(?${fill})", - configKey: "fill" - }, - { - type: "Stroke", - members: "stroke\\-(?${stroke})", - configKey: "stroke" - }, - { - type: "Stroke Width", - members: "stroke\\-(?${strokeWidth})", - configKey: "strokeWidth" - } - ] - }, - { - type: "Accessibility", - members: [ - { - type: "Screen Readers", - members: "(not\\-)?sr\\-only" - }, - { - type: "Forced Color Adjust", - members: "forced\\-color\\-adjust\\-(auto|none)" - } - ] - }, - { - type: "Official Plugins", - members: [ - { - // TODO: - // Support for custom prose classname like on - // https://tailwindcss.com/docs/typography-plugin#changing-the-default-class-name - // Adding custom color themes - // https://tailwindcss.com/docs/typography-plugin#adding-custom-color-themes - type: "Typography", - members: [ - { - type: "prose", - members: "(not\\-)?prose" - }, - { - type: "Prose Gray Scale", - members: "prose\\-(gray|slate|zinc|neutral|stone)" - }, - { - type: "Prose Type Scale", - members: "prose\\-(sm|base|lg|2?xl)" - }, - { - type: "Prose Dark Mode", - members: "prose\\-invert" - } - // These are modifiers and not the last part of the classname - // { - // type: 'Prose Element modifiers', - // members: - // 'prose\\-(headings|lead|h1|h2|h3|h4|p|a|blockquote|figure|figcaption|strong|em|code|pre|ol|ul|li|table|thead|tr|th|td|img|video|hr)', - // }, - ] - }, - // ('Forms' plugin has no related classnames, only selectors like `input[type='password']`) - { - type: "Aspect Ratio", - members: [ - { - type: "aspect-w", - members: "aspect\\-(none|w\\-(?${aspectRatio}))" - }, - { - type: "aspect-h", - members: "aspect\\-h\\-(?${aspectRatio})" - } - ] - }, - { - type: "Line Clamp", - members: "line\\-clamp\\-(none|(?${lineClamp}))" - } - ] - } - ]; - } -}); - -// src/rules/enforces-shorthand.ts -var SHORTHAND_CANDIDATE_CLASSNAMES_DETECTED_MSG, enforces_shorthand_default; -var init_enforces_shorthand = __esm({ - "src/rules/enforces-shorthand.ts"() { - "use strict"; - init_groups(); - init_ast(); - init_customConfig(); - init_docsUrl(); - init_groupMethods(); - init_parser(); - init_settings(); - SHORTHAND_CANDIDATE_CLASSNAMES_DETECTED_MSG = `Classnames '{{classnames}}' could be replaced by the '{{shorthand}}' shorthand!`; - enforces_shorthand_default = { - meta: { - docs: { - description: "Enforces the usage of shorthand Tailwind CSS classnames", - category: "Best Practices", - recommended: true, - url: docsUrl_default("enforces-shorthand") - }, - messages: { - shorthandCandidateDetected: SHORTHAND_CANDIDATE_CLASSNAMES_DETECTED_MSG - }, - fixable: "code", - schema: [ - { - type: "object", - properties: { - callees: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - ignoredKeys: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - config: { - // returned from `loadConfig()` utility - type: ["string", "object"] - }, - tags: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - } - } - } - ] - }, - create: function(context) { - const callees = settings_default(context, "callees"); - const skipClassAttribute = settings_default(context, "skipClassAttribute"); - const tags = settings_default(context, "tags"); - const twConfig = settings_default(context, "config"); - const classRegex = settings_default(context, "classRegex"); - const mergedConfig2 = customConfig_default.resolve(twConfig); - const placeContentOptions = ["center", "start", "end", "between", "around", "evenly", "baseline", "stretch"]; - const placeItemsOptions = ["start", "end", "center", "stretch"]; - const placeSelfOptions = ["auto", "start", "end", "center", "stretch"]; - const complexEquivalences = [ - { - needles: ["overflow-hidden", "text-ellipsis", "whitespace-nowrap"], - shorthand: "truncate", - mode: "exact" - }, - { - needles: ["w-", "h-"], - shorthand: "size-", - mode: "value" - }, - ...placeContentOptions.map((opt) => { - return { - needles: [`content-${opt}`, `justify-${opt}`], - shorthand: `place-content-${opt}`, - mode: "exact" - }; - }), - ...placeItemsOptions.map((opt) => { - return { - needles: [`items-${opt}`, `justify-items-${opt}`], - shorthand: `place-items-${opt}`, - mode: "exact" - }; - }), - ...placeSelfOptions.map((opt) => { - return { - needles: [`self-${opt}`, `justify-self-${opt}`], - shorthand: `place-self-${opt}`, - mode: "exact" - }; - }) - ]; - const targetProperties = { - Layout: ["Overflow", "Overscroll Behavior", "Top / Right / Bottom / Left"], - "Flexbox & Grid": ["Gap"], - Spacing: ["Padding", "Margin"], - Sizing: ["Width", "Height"], - Borders: ["Border Radius", "Border Width", "Border Color"], - Tables: ["Border Spacing"], - Transforms: ["Scale"], - Typography: ["Text Overflow", "Whitespace"] - }; - const cloned = JSON.parse(JSON.stringify(groups)); - const targetGroups = cloned.filter((g) => Object.keys(targetProperties).includes(g.type)); - targetGroups.forEach((g) => { - g.members = g.members.filter((sub) => targetProperties[g.type].includes(sub.type)); - }); - const getBodyByShorthand = (targetGroups2, parentType, shorthand) => { - const findByMemberType = (obj) => obj.members.find((m) => m.type === parentType); - const mainGroup = targetGroups2.find(findByMemberType); - if (!mainGroup) { - return ""; - } - const typeGroup = mainGroup.members.find((m) => m.type === parentType); - if (!typeGroup) { - return ""; - } - const type = typeGroup.members.find((m) => m.shorthand === shorthand); - return !type ? "" : type.body; - }; - const parseForShorthandCandidates = (node, arg = null) => { - let originalClassNamesValue = null; - let start = null; - let end = null; - let prefix = ""; - let suffix = ""; - const troubles = []; - if (arg === null) { - originalClassNamesValue = ast_default.extractValueFromNode(node); - const range = ast_default.extractRangeFromNode(node); - if (node.type === "TextAttribute") { - start = range[0]; - end = range[1]; - } else { - start = range[0] + 1; - end = range[1] - 1; - } - } else { - switch (arg.type) { - case "Identifier": - return; - case "TemplateLiteral": - arg.expressions.forEach((exp) => { - parseForShorthandCandidates(node, exp); - }); - arg.quasis.forEach((quasis) => { - parseForShorthandCandidates(node, quasis); - }); - return; - case "ConditionalExpression": - parseForShorthandCandidates(node, arg.consequent); - parseForShorthandCandidates(node, arg.alternate); - return; - case "LogicalExpression": - parseForShorthandCandidates(node, arg.right); - return; - case "ArrayExpression": - arg.elements.forEach((el) => { - parseForShorthandCandidates(node, el); - }); - return; - case "ObjectExpression": - const isUsedByClassNamesPlugin = node.callee && node.callee.name === "classnames"; - const isVue = node.key && node.key.type === "VDirectiveKey"; - arg.properties.forEach((prop) => { - const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value; - parseForShorthandCandidates(node, propVal); - }); - return; - case "Property": - parseForShorthandCandidates(node, arg.key); - return; - case "Literal": - originalClassNamesValue = arg.value; - start = arg.range[0] + 1; - end = arg.range[1] - 1; - break; - case "TemplateElement": - originalClassNamesValue = arg.value.raw; - if (originalClassNamesValue === "") { - return; - } - start = arg.range[0]; - end = arg.range[1]; - const txt = context.getSourceCode().getText(arg); - prefix = ast_default.getTemplateElementPrefix(txt, originalClassNamesValue); - suffix = ast_default.getTemplateElementSuffix(txt, originalClassNamesValue); - originalClassNamesValue = ast_default.getTemplateElementBody(txt, prefix, suffix); - break; - } - } - let { classNames, whitespaces, headSpace, tailSpace } = ast_default.extractClassnamesFromValue(originalClassNamesValue); - if (classNames.length <= 1) { - return; - } - const parsed = []; - classNames.forEach((className, index) => { - parsed.push(groupMethods_default.parseClassname(className, targetGroups, mergedConfig2, index)); - }); - const validated = []; - let remaining = parsed; - for (const { needles: inputSet, shorthand: outputClassname, mode } of complexEquivalences) { - if (remaining.length < inputSet.length) { - continue; - } - const parsedElementsInInputSet = remaining.filter((remainingClass) => { - if (mode === "exact") { - return inputSet.some((inputClass) => remainingClass.name.includes(inputClass)); - } - if (mode === "value") { - const bodyMatch = inputSet.some( - (inputClassPattern) => `${mergedConfig2.prefix}${inputClassPattern}` === remainingClass.body - ); - if ([void 0, null].includes(mergedConfig2.theme.size)) { - return false; - } - const sizeKeys = Object.keys(mergedConfig2.theme.size); - const isSize = ["w-", "h-"].includes(remainingClass.body); - const isValidSize = sizeKeys.includes(remainingClass.value); - const wValue = mergedConfig2.theme.width[remainingClass.value]; - const hValue = mergedConfig2.theme.height[remainingClass.value]; - const sizeValue = mergedConfig2.theme.size[remainingClass.value]; - const fullMatch = wValue === hValue && wValue === sizeValue; - return bodyMatch && !(isSize && !isValidSize && !fullMatch); - } - }); - const variantGroups = /* @__PURE__ */ new Map(); - parsedElementsInInputSet.forEach((o) => { - const val = mode === "value" ? o.value : ""; - const v = `${o.variants}${o.important ? "!" : ""}${val}`; - if (!variantGroups.has(v)) { - variantGroups.set( - v, - parsedElementsInInputSet.filter( - (c) => c.variants === o.variants && c.important === o.important && (val === "" || c.value === val) - ) - ); - } - }); - const validKeys = /* @__PURE__ */ new Set(); - variantGroups.forEach((classes, key) => { - let skip = false; - if (classes.length < inputSet.length) { - skip = true; - } - if (mode === "value" && new Set(classes.map((p) => p.value)).size !== 1) { - skip = true; - } - if (!skip) { - validKeys.add(key); - } - }); - validKeys.forEach((k) => { - const candidates = variantGroups.get(k); - const index = candidates[0].index; - const variants = candidates[0].variants; - const important = candidates[0].important ? "!" : ""; - const classValue = mode === "value" ? candidates[0].value : ""; - const patchedClassname = `${variants}${important}${mergedConfig2.prefix}${outputClassname}${classValue}`; - troubles.push([candidates.map((c) => `${c.name}`), patchedClassname]); - const validatedClassname = groupMethods_default.parseClassname(patchedClassname, targetGroups, mergedConfig2, index); - validated.push(validatedClassname); - remaining = remaining.filter((p) => !candidates.includes(p)); - }); - } - const checkedGroups = []; - remaining.forEach((classname, idx, arr) => { - if (classname.parentType === "") { - validated.push(classname); - } else if (!checkedGroups.includes(classname.parentType)) { - checkedGroups.push(classname.parentType); - const sameType = remaining.filter((cls) => cls.parentType === classname.parentType); - const checkedVariantsValue = []; - sameType.forEach((cls) => { - const key = cls.variants + (cls.important ? "!" : "") + cls.value; - if (!checkedVariantsValue.includes(key)) { - checkedVariantsValue.push(key); - const sameVariantAndValue = sameType.filter((v) => { - return !(v.variants !== cls.variants || v.value !== cls.value || v.important !== cls.important); - }); - if (sameVariantAndValue.length === 1) { - validated.push(cls); - } else if (sameVariantAndValue.length) { - const supportCorners = ["Border Radius"].includes(classname.parentType); - const hasTL = supportCorners && sameVariantAndValue.some((c) => ["tl", "t", "all"].includes(c.shorthand)); - const hasTR = supportCorners && sameVariantAndValue.some((c) => ["tr", "t", "all"].includes(c.shorthand)); - const hasBR = supportCorners && sameVariantAndValue.some((c) => ["br", "b", "all"].includes(c.shorthand)); - const hasBL = supportCorners && sameVariantAndValue.some((c) => ["bl", "b", "all"].includes(c.shorthand)); - const hasT = sameVariantAndValue.some((c) => c.shorthand === "t") || hasTL && hasTR; - const hasR = sameVariantAndValue.some((c) => c.shorthand === "r") || hasTR && hasBR; - const hasB = sameVariantAndValue.some((c) => c.shorthand === "b") || hasBL && hasBR; - const hasL = sameVariantAndValue.some((c) => c.shorthand === "l") || hasTL && hasBL; - const hasX = sameVariantAndValue.some((c) => c.shorthand === "x") || hasL && hasR; - const hasY = sameVariantAndValue.some((c) => c.shorthand === "y") || hasT && hasB; - const hasAllProp = sameVariantAndValue.some((c) => c.shorthand === "all"); - const hasAllPropNoCorner = hasY && hasX; - const hasAllPropWithCorners = hasL && hasR || hasT && hasB; - const hasAllEquivalent = !supportCorners ? hasAllPropNoCorner : hasAllPropWithCorners; - const hasAll = hasAllProp || hasAllEquivalent; - const important = cls.important ? "!" : ""; - const isNegative = ("" + cls.value).substring(0, 1) === "-"; - const minus = isNegative ? "-" : ""; - const absoluteVal = isNegative ? ("" + cls.value).substring(1) : cls.value; - if (hasAll) { - const all = getBodyByShorthand(targetGroups, classname.parentType, "all"); - const val = absoluteVal.length ? "-" + absoluteVal : ""; - const patchedName = `${cls.variants}${important}${minus}${mergedConfig2.prefix}${all}${val}`; - troubles.push([sameVariantAndValue.map((c) => c.name), patchedName]); - cls.name = patchedName; - cls.shorthand = "all"; - validated.push(cls); - } else if (hasY || hasX) { - const xOrY = hasX ? "x" : "y"; - const xOrYType = getBodyByShorthand(targetGroups, classname.parentType, xOrY); - const patchedName = `${cls.variants}${important}${minus}${mergedConfig2.prefix}${xOrYType}${absoluteVal.length ? "-" + absoluteVal : ""}`; - const toBeReplaced = sameVariantAndValue.filter((c) => { - const candidates = hasX ? ["l", "r"] : ["t", "b"]; - return candidates.includes(c.shorthand); - }).map((c) => c.name); - const toBeKept = sameVariantAndValue.filter((c) => { - const candidates = hasY ? ["l", "r"] : ["t", "b"]; - return candidates.includes(c.shorthand); - }); - troubles.push([toBeReplaced, patchedName]); - let replaced = false; - sameVariantAndValue.forEach((ref, i) => { - if (toBeKept.find((k) => k.name === ref.name)) { - validated.push(ref); - } else if (!replaced) { - replaced = true; - const cloned2 = JSON.parse(JSON.stringify(ref)); - cloned2.name = patchedName; - cloned2.shorthand = xOrY; - validated.push(cloned2); - } - }); - } else if (supportCorners && (hasT || hasR || hasB || hasL)) { - const side = hasT ? "t" : hasR ? "r" : hasB ? "b" : "l"; - const sideBody = getBodyByShorthand(targetGroups, classname.parentType, side); - const val = absoluteVal.length ? "-" + absoluteVal : ""; - const patchedName = `${cls.variants}${important}${minus}${mergedConfig2.prefix}${sideBody}${val}`; - const toBeReplaced = sameVariantAndValue.filter((c) => { - const candidates = hasT ? ["tl", "tr"] : hasR ? ["tr", "br"] : hasB ? ["bl", "br"] : ["tl", "bl"]; - return candidates.includes(c.shorthand); - }).map((c) => c.name); - const toBeKept = sameVariantAndValue.filter((c) => { - const candidates = hasT ? ["bl", "br"] : hasR ? ["tl", "bl"] : hasB ? ["tl", "tr"] : ["tr", "br"]; - return candidates.includes(c.shorthand); - }); - troubles.push([toBeReplaced, patchedName]); - let replaced = false; - sameVariantAndValue.forEach((ref, i) => { - if (toBeKept.find((k) => k.name === ref.name)) { - validated.push(ref); - } else if (!replaced) { - replaced = true; - const cloned2 = JSON.parse(JSON.stringify(ref)); - cloned2.name = patchedName; - cloned2.shorthand = side; - validated.push(cloned2); - } - }); - } else { - validated.push(...sameVariantAndValue); - } - } - } - }); - } - }); - validated.sort((a, b) => a.index < b.index ? -1 : 1); - const union = validated.map((val) => val.leading + val.name + val.trailing); - let validatedClassNamesValue = ""; - if (union.length === 1) { - validatedClassNamesValue += headSpace ? whitespaces[0] : ""; - validatedClassNamesValue += union[0]; - validatedClassNamesValue += tailSpace ? whitespaces[whitespaces.length - 1] : ""; - } else { - for (let i = 0; i < union.length; i++) { - const isLast = i === union.length - 1; - const w = whitespaces[i] ?? ""; - const cls = union[i]; - validatedClassNamesValue += headSpace ? `${w}${cls}` : isLast ? `${cls}` : `${cls}${w}`; - if (tailSpace && isLast) { - validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? ""; - } - } - } - troubles.forEach((issue) => { - if (originalClassNamesValue !== validatedClassNamesValue) { - validatedClassNamesValue = prefix + validatedClassNamesValue + suffix; - context.report({ - node, - messageId: "shorthandCandidateDetected", - data: { - classnames: issue[0].join(", "), - shorthand: issue[1] - }, - fix: function(fixer) { - return fixer.replaceTextRange([start, end], validatedClassNamesValue); - } - }); - } - }); - }; - const attributeVisitor = function(node) { - if (!ast_default.isClassAttribute(node, classRegex) || skipClassAttribute) { - return; - } - if (ast_default.isLiteralAttributeValue(node)) { - parseForShorthandCandidates(node); - } else if (node.value && node.value.type === "JSXExpressionContainer") { - parseForShorthandCandidates(node, node.value.expression); - } - }; - const callExpressionVisitor = function(node) { - const calleeStr = ast_default.calleeToString(node.callee); - if (callees.findIndex((name2) => calleeStr === name2) === -1) { - return; - } - node.arguments.forEach((arg) => { - parseForShorthandCandidates(node, arg); - }); - }; - const scriptVisitor = { - JSXAttribute: attributeVisitor, - TextAttribute: attributeVisitor, - CallExpression: callExpressionVisitor, - TaggedTemplateExpression: function(node) { - if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { - return; - } - parseForShorthandCandidates(node, node.quasi); - } - }; - const templateVisitor = { - CallExpression: callExpressionVisitor, - /* - Tagged templates inside data bindings - https://github.com/vuejs/vue/issues/9721 - */ - VAttribute: function(node) { - switch (true) { - case !ast_default.isValidVueAttribute(node, classRegex): - return; - case ast_default.isVLiteralValue(node): - parseForShorthandCandidates(node); - break; - case ast_default.isArrayExpression(node): - node.value.expression.elements.forEach((arg) => { - parseForShorthandCandidates(node, arg); - }); - break; - case ast_default.isObjectExpression(node): - node.value.expression.properties.forEach((prop) => { - parseForShorthandCandidates(node, prop); - }); - break; - } - } - }; - return parser_default.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); - } - }; - } -}); - -// src/rules/migration-from-tailwind-2.ts -var docsUrl2, customConfig, astUtil, groupUtil, getOption2, parserUtil, CLASSNAME_NOT_NEEDED_MSG, CLASSNAMES_NOT_NEEDED_MSG, CLASSNAME_CHANGED_MSG, OPACITY_CLASS_DEPRECATED_MSG, migration_from_tailwind_2_default; -var init_migration_from_tailwind_2 = __esm({ - "src/rules/migration-from-tailwind-2.ts"() { - "use strict"; - docsUrl2 = (init_docsUrl(), __toCommonJS(docsUrl_exports)); - customConfig = (init_customConfig(), __toCommonJS(customConfig_exports)); - astUtil = (init_ast(), __toCommonJS(ast_exports)); - groupUtil = (init_groupMethods(), __toCommonJS(groupMethods_exports)); - getOption2 = (init_settings(), __toCommonJS(settings_exports)); - parserUtil = (init_parser(), __toCommonJS(parser_exports)); - CLASSNAME_NOT_NEEDED_MSG = `Classname '{{classnames}}' is not needed in Tailwind CSS v3!`; - CLASSNAMES_NOT_NEEDED_MSG = `Classnames '{{classnames}}' are not needed in Tailwind CSS v3!`; - CLASSNAME_CHANGED_MSG = `Classname '{{deprecated}}' should be updated to '{{updated}}' in Tailwind CSS v3!`; - OPACITY_CLASS_DEPRECATED_MSG = `Classname '{{classname}}' should be replaced by an opacity suffix (eg. '/{{value}}')`; - migration_from_tailwind_2_default = { - meta: { - docs: { - description: "Detect obsolete classnames when upgrading to Tailwind CSS v3", - category: "Possible Errors", - recommended: true, - url: docsUrl2("migration-from-tailwind-2") - }, - messages: { - classnameNotNeeded: CLASSNAME_NOT_NEEDED_MSG, - classnamesNotNeeded: CLASSNAMES_NOT_NEEDED_MSG, - classnameChanged: CLASSNAME_CHANGED_MSG, - classnameOpacityDeprecated: OPACITY_CLASS_DEPRECATED_MSG - }, - fixable: "code", - schema: [ - { - type: "object", - properties: { - callees: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - ignoredKeys: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - config: { - // returned from `loadConfig()` utility - type: ["string", "object"] - }, - tags: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - } - } - } - ] - }, - create: function(context) { - const callees = getOption2(context, "callees"); - const skipClassAttribute = getOption2(context, "skipClassAttribute"); - const tags = getOption2(context, "tags"); - const twConfig = getOption2(context, "config"); - const classRegex = getOption2(context, "classRegex"); - const mergedConfig2 = customConfig.resolve(twConfig); - const parseForObsoleteClassNames = (node, arg = null) => { - let originalClassNamesValue = null; - let start = null; - let end = null; - let prefix = ""; - let suffix = ""; - if (arg === null) { - originalClassNamesValue = astUtil.extractValueFromNode(node); - const range = astUtil.extractRangeFromNode(node); - if (node.type === "TextAttribute") { - start = range[0]; - end = range[1]; - } else { - start = range[0] + 1; - end = range[1] - 1; - } - } else { - switch (arg.type) { - case "Identifier": - return; - case "TemplateLiteral": - arg.expressions.forEach((exp) => { - parseForObsoleteClassNames(node, exp); - }); - arg.quasis.forEach((quasis) => { - parseForObsoleteClassNames(node, quasis); - }); - return; - case "ConditionalExpression": - parseForObsoleteClassNames(node, arg.consequent); - parseForObsoleteClassNames(node, arg.alternate); - return; - case "LogicalExpression": - parseForObsoleteClassNames(node, arg.right); - return; - case "ArrayExpression": - arg.elements.forEach((el) => { - parseForObsoleteClassNames(node, el); - }); - return; - case "ObjectExpression": - arg.properties.forEach((prop) => { - parseForObsoleteClassNames(node, prop.key); - }); - return; - case "Property": - parseForObsoleteClassNames(node, arg.key); - return; - case "Literal": - originalClassNamesValue = arg.value; - start = arg.range[0] + 1; - end = arg.range[1] - 1; - break; - case "TemplateElement": - originalClassNamesValue = arg.value.raw; - if (originalClassNamesValue === "") { - return; - } - start = arg.range[0]; - end = arg.range[1]; - const txt = context.getSourceCode().getText(arg); - prefix = astUtil.getTemplateElementPrefix(txt, originalClassNamesValue); - suffix = astUtil.getTemplateElementSuffix(txt, originalClassNamesValue); - originalClassNamesValue = astUtil.getTemplateElementBody(txt, prefix, suffix); - break; - } - } - let { classNames, whitespaces, headSpace, tailSpace } = astUtil.extractClassnamesFromValue(originalClassNamesValue); - const notNeeded = []; - const outdated = []; - const deprecatedBgOpacity = []; - const filtered = classNames.filter((cls) => { - const suffix2 = groupUtil.getSuffix(cls, mergedConfig2.separator); - if (/^((backdrop\-)?(filter|transform))$/i.test(suffix2)) { - notNeeded.push(cls); - return false; - } - let overflowRes = /^overflow\-(?clip|ellipsis)$/i.exec(suffix2); - if (overflowRes && overflowRes.groups && overflowRes.groups.value) { - outdated.push([cls, cls.replace(/overflow\-(clip|ellipsis)$/i, `text-${overflowRes.groups.value}`)]); - } - let growShrinkRes = /flex\-(?grow|shrink)(\-(?${flexVal}))?/i.exec(suffix2); - if (growShrinkRes && growShrinkRes.groups && growShrinkRes.groups.prop) { - const prop = growShrinkRes.groups.prop; - const flexVal = growShrinkRes.groups.flexVal; - const optionalVal = flexVal ? `-${flexVal}` : ""; - const fixRegex = new RegExp(`flex-${prop}${optionalVal}`); - outdated.push([cls, cls.replace(fixRegex, `${prop}${flexVal ? "-" + flexVal : ""}`)]); - } - let boxRes = /^decoration\-(?clone|slice)$/i.exec(suffix2); - if (boxRes && boxRes.groups && boxRes.groups.value) { - const boxVal = boxRes.groups.value; - const fixRegex = new RegExp(`decoration-${boxVal}`); - outdated.push([cls, cls.replace(fixRegex, `box-decoration-${boxVal}`)]); - } - let bgOpacityRes = /^(bg|border|ring)\-opacity\-(?\d{1,})$/i.exec(suffix2); - if (bgOpacityRes && bgOpacityRes.groups && bgOpacityRes.groups.value) { - const opacityVal = bgOpacityRes.groups.value; - deprecatedBgOpacity.push([cls, opacityVal]); - } - let placeholderRes = /^placeholder\-(?.{1,})$/i.exec(suffix2); - if (placeholderRes && placeholderRes.groups && placeholderRes.groups.value) { - const placeholderVal = placeholderRes.groups.value; - const fixPlaceholderRegex = new RegExp(`placeholder-${placeholderVal}$`); - outdated.push([cls, cls.replace(fixPlaceholderRegex, `placeholder:text-${placeholderVal}`)]); - } - return true; - }); - if (notNeeded.length) { - let validatedClassNamesValue = ""; - for (let i = 0; i < filtered.length; i++) { - const isLast = i === filtered.length - 1; - const w = whitespaces[i] ?? ""; - const cls = filtered[i]; - validatedClassNamesValue += headSpace ? `${w}${cls}` : isLast ? `${cls}` : `${cls}${w}`; - if (headSpace && tailSpace && isLast) { - validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? ""; - } - } - validatedClassNamesValue = prefix + validatedClassNamesValue + suffix; - context.report({ - node, - messageId: notNeeded.length === 1 ? "classnameNotNeeded" : "classnamesNotNeeded", - data: { - classnames: notNeeded.join(", ") - }, - fix: function(fixer) { - return fixer.replaceTextRange([start, end], validatedClassNamesValue); - } - }); - } - outdated.forEach((outdatedClass) => { - let validatedClassNamesValue = ""; - for (let i = 0; i < filtered.length; i++) { - const w = whitespaces[i] ?? ""; - const cls = filtered[i]; - validatedClassNamesValue += headSpace ? `${w}${cls}` : `${cls}${w}`; - if (headSpace && tailSpace && i === filtered.length - 1) { - validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? ""; - } - } - validatedClassNamesValue = prefix + validatedClassNamesValue.replace(outdatedClass[0], outdatedClass[1]) + suffix; - context.report({ - node, - messageId: "classnameChanged", - data: { - deprecated: outdatedClass[0], - updated: outdatedClass[1] - }, - fix: function(fixer) { - return fixer.replaceTextRange([start, end], validatedClassNamesValue); - } - }); - }); - deprecatedBgOpacity.forEach((bgClass) => { - context.report({ - node, - messageId: "classnameOpacityDeprecated", - data: { - classname: bgClass[0], - value: bgClass[1] - } - }); - }); - }; - const attributeVisitor = function(node) { - if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) { - return; - } - if (astUtil.isLiteralAttributeValue(node)) { - parseForObsoleteClassNames(node); - } else if (node.value && node.value.type === "JSXExpressionContainer") { - parseForObsoleteClassNames(node, node.value.expression); - } - }; - const callExpressionVisitor = function(node) { - const calleeStr = astUtil.calleeToString(node.callee); - if (callees.findIndex((name2) => calleeStr === name2) === -1) { - return; - } - node.arguments.forEach((arg) => { - parseForObsoleteClassNames(node, arg); - }); - }; - const scriptVisitor = { - JSXAttribute: attributeVisitor, - TextAttribute: attributeVisitor, - CallExpression: callExpressionVisitor, - TaggedTemplateExpression: function(node) { - if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { - return; - } - parseForObsoleteClassNames(node, node.quasi); - } - }; - const templateVisitor = { - CallExpression: callExpressionVisitor, - /* - Tagged templates inside data bindings - https://github.com/vuejs/vue/issues/9721 - */ - VAttribute: function(node) { - switch (true) { - case !astUtil.isValidVueAttribute(node, classRegex): - return; - case astUtil.isVLiteralValue(node): - parseForObsoleteClassNames(node); - break; - case astUtil.isArrayExpression(node): - node.value.expression.elements.forEach((arg) => { - parseForObsoleteClassNames(node, arg); - }); - break; - case astUtil.isObjectExpression(node): - node.value.expression.properties.forEach((prop) => { - parseForObsoleteClassNames(node, prop); - }); - break; - } - } - }; - return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); - } - }; - } -}); - -// src/rules/no-arbitrary-value.ts -var docsUrl3, customConfig2, astUtil2, groupUtil2, getOption3, parserUtil2, ARBITRARY_VALUE_DETECTED_MSG, no_arbitrary_value_default; -var init_no_arbitrary_value = __esm({ - "src/rules/no-arbitrary-value.ts"() { - "use strict"; - docsUrl3 = (init_docsUrl(), __toCommonJS(docsUrl_exports)); - customConfig2 = (init_customConfig(), __toCommonJS(customConfig_exports)); - astUtil2 = (init_ast(), __toCommonJS(ast_exports)); - groupUtil2 = (init_groupMethods(), __toCommonJS(groupMethods_exports)); - getOption3 = (init_settings(), __toCommonJS(settings_exports)); - parserUtil2 = (init_parser(), __toCommonJS(parser_exports)); - ARBITRARY_VALUE_DETECTED_MSG = `Arbitrary value detected in '{{classname}}'`; - no_arbitrary_value_default = { - meta: { - docs: { - description: "Forbid using arbitrary values in classnames", - category: "Best Practices", - recommended: false, - url: docsUrl3("no-arbitrary-value") - }, - messages: { - arbitraryValueDetected: ARBITRARY_VALUE_DETECTED_MSG - }, - fixable: null, - schema: [ - { - type: "object", - properties: { - callees: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - ignoredKeys: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - config: { - // returned from `loadConfig()` utility - type: ["string", "object"] - }, - tags: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - } - } - } - ] - }, - create: function(context) { - const callees = getOption3(context, "callees"); - const skipClassAttribute = getOption3(context, "skipClassAttribute"); - const tags = getOption3(context, "tags"); - const twConfig = getOption3(context, "config"); - const classRegex = getOption3(context, "classRegex"); - const mergedConfig2 = customConfig2.resolve(twConfig); - const parseForArbitraryValues = (node, arg = null) => { - let originalClassNamesValue = null; - if (arg === null) { - originalClassNamesValue = astUtil2.extractValueFromNode(node); - } else { - switch (arg.type) { - case "Identifier": - return; - case "TemplateLiteral": - arg.expressions.forEach((exp) => { - parseForArbitraryValues(node, exp); - }); - arg.quasis.forEach((quasis) => { - parseForArbitraryValues(node, quasis); - }); - return; - case "ConditionalExpression": - parseForArbitraryValues(node, arg.consequent); - parseForArbitraryValues(node, arg.alternate); - return; - case "LogicalExpression": - parseForArbitraryValues(node, arg.right); - return; - case "ArrayExpression": - arg.elements.forEach((el) => { - parseForArbitraryValues(node, el); - }); - return; - case "ObjectExpression": - const isUsedByClassNamesPlugin = node.callee && node.callee.name === "classnames"; - const isVue = node.key && node.key.type === "VDirectiveKey"; - arg.properties.forEach((prop) => { - const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value; - parseForArbitraryValues(node, propVal); - }); - return; - case "Property": - parseForArbitraryValues(node, arg.key); - return; - case "Literal": - originalClassNamesValue = arg.value; - break; - case "TemplateElement": - originalClassNamesValue = arg.value.raw; - if (originalClassNamesValue === "") { - return; - } - break; - } - } - let { classNames } = astUtil2.extractClassnamesFromValue(originalClassNamesValue); - const forbidden = []; - classNames.forEach((cls, idx) => { - const parsed = groupUtil2.parseClassname(cls, [], mergedConfig2, idx); - if (/\[.*\]/i.test(parsed.body)) { - forbidden.push(parsed.name); - } - }); - forbidden.forEach((forbiddenClass) => { - context.report({ - node, - messageId: "arbitraryValueDetected", - data: { - classname: forbiddenClass - } - }); - }); - }; - const attributeVisitor = function(node) { - if (!astUtil2.isClassAttribute(node, classRegex) || skipClassAttribute) { - return; - } - if (astUtil2.isLiteralAttributeValue(node)) { - parseForArbitraryValues(node); - } else if (node.value && node.value.type === "JSXExpressionContainer") { - parseForArbitraryValues(node, node.value.expression); - } - }; - const callExpressionVisitor = function(node) { - const calleeStr = astUtil2.calleeToString(node.callee); - if (callees.findIndex((name2) => calleeStr === name2) === -1) { - return; - } - node.arguments.forEach((arg) => { - parseForArbitraryValues(node, arg); - }); - }; - const scriptVisitor = { - JSXAttribute: attributeVisitor, - TextAttribute: attributeVisitor, - CallExpression: callExpressionVisitor, - TaggedTemplateExpression: function(node) { - if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { - return; - } - parseForArbitraryValues(node, node.quasi); - } - }; - const templateVisitor = { - CallExpression: callExpressionVisitor, - /* - Tagged templates inside data bindings - https://github.com/vuejs/vue/issues/9721 - */ - VAttribute: function(node) { - switch (true) { - case !astUtil2.isValidVueAttribute(node, classRegex): - return; - case astUtil2.isVLiteralValue(node): - parseForArbitraryValues(node, null); - break; - case astUtil2.isArrayExpression(node): - node.value.expression.elements.forEach((arg) => { - parseForArbitraryValues(node, arg); - }); - break; - case astUtil2.isObjectExpression(node): - node.value.expression.properties.forEach((prop) => { - parseForArbitraryValues(node, prop); - }); - break; - } - } - }; - return parserUtil2.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); - } - }; - } -}); - -// src/rules/no-contradicting-classname.ts -var CONFLICTING_CLASSNAMES_DETECTED_MSG, no_contradicting_classname_default; -var init_no_contradicting_classname = __esm({ - "src/rules/no-contradicting-classname.ts"() { - "use strict"; - init_groups(); - init_ast(); - init_customConfig(); - init_docsUrl(); - init_groupMethods(); - init_parser(); - init_settings(); - CONFLICTING_CLASSNAMES_DETECTED_MSG = `Classnames {{classnames}} are conflicting!`; - no_contradicting_classname_default = { - meta: { - docs: { - description: 'Avoid contradicting Tailwind CSS classnames (e.g. "w-3 w-5")', - category: "Possible Errors", - recommended: true, - url: docsUrl_default("no-contradicting-classname") - }, - messages: { - conflictingClassnames: CONFLICTING_CLASSNAMES_DETECTED_MSG - }, - fixable: null, - schema: [ - { - type: "object", - properties: { - callees: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - ignoredKeys: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - config: { - // returned from `loadConfig()` utility - type: ["string", "object"] - }, - tags: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - } - } - } - ] - }, - create: function(context) { - const callees = settings_default(context, "callees"); - const ignoredKeys = settings_default(context, "ignoredKeys"); - const skipClassAttribute = settings_default(context, "skipClassAttribute"); - const tags = settings_default(context, "tags"); - const twConfig = settings_default(context, "config"); - const classRegex = settings_default(context, "classRegex"); - const mergedConfig2 = customConfig_default.resolve(twConfig); - const groups2 = groupMethods_default.getGroups(groups, mergedConfig2); - const parseForContradictingClassNames = (classNames, node) => { - const sorted = groupMethods_default.initGroupSlots(groups2); - classNames.forEach((className) => { - const idx = groupMethods_default.getGroupIndex(className, groups2, mergedConfig2.separator); - if (idx > -1) { - sorted[idx].push(className); - } - }); - const sortedGroups = sorted.filter((slot) => slot.length > 1); - const arbitraryPropsGroupIndex = sortedGroups.findIndex((slot) => { - const suffix = groupMethods_default.getSuffix(slot[0], mergedConfig2.separator); - return groupMethods_default.getArbitraryProperty(suffix, mergedConfig2.separator) !== ""; - }); - const ambiguousArbitraryValuesOrClasses = String.raw`(\[(.*${mergedConfig2.separator}))|(^((?!:).)*$)`; - sortedGroups.forEach((group, groupIndex) => { - const variants = []; - group.forEach((cls) => { - const prefix = groupMethods_default.getPrefix(cls, mergedConfig2.separator); - const name2 = cls.substr(prefix.length); - if (groupIndex === arbitraryPropsGroupIndex) { - const arbitraryProp = groupMethods_default.getArbitraryProperty(name2, mergedConfig2.separator); - const identifier = prefix + arbitraryProp; - const idx = variants.findIndex((v) => identifier === v.prefix); - if (idx === -1) { - variants.push({ - prefix: identifier, - name: [name2] - }); - } else { - variants[idx].name.push(name2); - } - } else { - const rePrefix = prefix === "" ? ambiguousArbitraryValuesOrClasses : "^" + prefix; - const idx = variants.findIndex((v) => v.prefix === rePrefix); - if (idx === -1) { - variants.push({ - prefix: rePrefix, - name: [name2] - }); - } else { - variants[idx].name.push(name2); - } - } - }); - const potentialTroubles = variants.filter((v) => v.name.length > 1); - if (potentialTroubles.length) { - potentialTroubles.forEach((variantGroup) => { - const re = new RegExp(variantGroup.prefix); - const conflicting = group.filter((c) => re.test(c)); - context.report({ - node, - messageId: "conflictingClassnames", - data: { - classnames: conflicting.join(", ") - } - }); - }); - } - }); - }; - const attributeVisitor = function(node) { - if (!ast_default.isClassAttribute(node, classRegex) || skipClassAttribute) { - return; - } - if (ast_default.isLiteralAttributeValue(node)) { - ast_default.parseNodeRecursive(node, null, parseForContradictingClassNames, true, false, ignoredKeys); - } else if (node.value && node.value.type === "JSXExpressionContainer") { - ast_default.parseNodeRecursive( - node, - node.value.expression, - parseForContradictingClassNames, - true, - false, - ignoredKeys - ); - } - }; - const callExpressionVisitor = function(node) { - const calleeStr = ast_default.calleeToString(node.callee); - if (callees.findIndex((name2) => calleeStr === name2) === -1) { - return; - } - const allClassnamesForNode = []; - const pushClasses = (classNames, targetNode) => { - if (targetNode === null) { - parseForContradictingClassNames(classNames, node); - } else { - allClassnamesForNode.push(...classNames); - } - }; - node.arguments.forEach((arg) => { - ast_default.parseNodeRecursive(node, arg, pushClasses, true, false, ignoredKeys); - }); - parseForContradictingClassNames(allClassnamesForNode, node); - }; - const scriptVisitor = { - JSXAttribute: attributeVisitor, - TextAttribute: attributeVisitor, - CallExpression: callExpressionVisitor, - TaggedTemplateExpression: function(node) { - if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { - return; - } - const allClassnamesForNode = []; - const pushClasses = (classNames, targetNode) => { - if (targetNode === null) { - parseForContradictingClassNames(classNames, node); - } else { - allClassnamesForNode.push(...classNames); - } - }; - ast_default.parseNodeRecursive(node, node.quasi, pushClasses, true, false, ignoredKeys); - parseForContradictingClassNames(allClassnamesForNode, node); - } - }; - const templateVisitor = { - CallExpression: callExpressionVisitor, - /* - Tagged templates inside data bindings - https://github.com/vuejs/vue/issues/9721 - */ - VAttribute: function(node) { - switch (true) { - case !ast_default.isValidVueAttribute(node, classRegex): - return; - case ast_default.isVLiteralValue(node): - ast_default.parseNodeRecursive(node, null, parseForContradictingClassNames, true, false, ignoredKeys); - break; - case ast_default.isArrayExpression(node): - const allClassnamesForNode = []; - const pushClasses = (classNames, targetNode) => { - if (targetNode === null) { - parseForContradictingClassNames(classNames, node); - } else { - allClassnamesForNode.push(...classNames); - } - }; - node.value.expression.elements.forEach((el) => { - ast_default.parseNodeRecursive(node, el, pushClasses, true, false, ignoredKeys); - }); - parseForContradictingClassNames(allClassnamesForNode, node); - break; - case ast_default.isObjectExpression(node): - node.value.expression.properties.forEach((prop) => { - ast_default.parseNodeRecursive(node, prop, parseForContradictingClassNames, false, false, ignoredKeys); - }); - break; - } - } - }; - return parser_default.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); - } - }; - } -}); - -// src/util/cssFiles.ts -var fg, fs2, postcss, lastClassFromSelectorRegexp, removeDuplicatesFromArray3, cssFilesInfos, lastUpdate, classnamesFromFiles, generateClassnamesListSync, cssFiles_default; -var init_cssFiles = __esm({ - "src/util/cssFiles.ts"() { - "use strict"; - fg = __require("fast-glob"); - fs2 = __require("fs"); - postcss = __require("postcss"); - lastClassFromSelectorRegexp = /\.([^\.\,\s\n\:\(\)\[\]\'~\+\>\*\\]*)/gim; - removeDuplicatesFromArray3 = (init_removeDuplicatesFromArray(), __toCommonJS(removeDuplicatesFromArray_exports)); - cssFilesInfos = /* @__PURE__ */ new Map(); - lastUpdate = null; - classnamesFromFiles = []; - generateClassnamesListSync = (patterns, refreshRate = 5e3) => { - const now = Date.now(); - const isExpired = lastUpdate === null || now - lastUpdate > refreshRate; - if (!isExpired) { - return classnamesFromFiles; - } - lastUpdate = now; - const filesToBeRemoved = /* @__PURE__ */ new Set([...cssFilesInfos.keys()]); - const files = fg.sync(patterns, { suppressErrors: true, stats: true }); - for (const file of files) { - let mtime = ""; - let canBeSkipped = cssFilesInfos.has(file.path); - if (canBeSkipped) { - filesToBeRemoved.delete(file.path); - const stats = fs2.statSync(file.path); - mtime = `${stats.mtime || ""}`; - canBeSkipped = cssFilesInfos.get(file.path).mtime === mtime; - } - if (canBeSkipped) { - continue; - } - const data = fs2.readFileSync(file.path, "utf-8"); - const root = postcss.parse(data); - let detectedClassnames = /* @__PURE__ */ new Set(); - root.walkRules((rule) => { - const matches = [...rule.selector.matchAll(lastClassFromSelectorRegexp)]; - const classnames = matches.map((arr) => arr[1]); - detectedClassnames = /* @__PURE__ */ new Set([...detectedClassnames, ...classnames]); - }); - cssFilesInfos.set(file.path, { - mtime, - classNames: [...detectedClassnames] - }); - } - const deletedFiles = [...filesToBeRemoved]; - for (let i = 0; i < deletedFiles.length; i++) { - cssFilesInfos.delete(deletedFiles[i]); - } - classnamesFromFiles = []; - cssFilesInfos.forEach((css) => { - classnamesFromFiles = [...classnamesFromFiles, ...css.classNames]; - }); - return removeDuplicatesFromArray3(classnamesFromFiles); - }; - cssFiles_default = generateClassnamesListSync; - } -}); - -// src/util/generated.ts -function generate(className, context) { - const gen = generateRulesFallback(/* @__PURE__ */ new Set([className]), context); - return gen; -} -var generateRulesFallback, generated_default; -var init_generated = __esm({ - "src/util/generated.ts"() { - "use strict"; - generateRulesFallback = __require("tailwindcss/lib/lib/generateRules").generateRules; - generated_default = generate; - } -}); - -// src/rules/no-custom-classname.ts -var createContextFallback2, escapeRegex2, CUSTOM_CLASSNAME_DETECTED_MSG, getGroupNameRegex, contextFallbackCache2, no_custom_classname_default; -var init_no_custom_classname = __esm({ - "src/rules/no-custom-classname.ts"() { - "use strict"; - init_groups(); - init_ast(); - init_cssFiles(); - init_customConfig(); - init_docsUrl(); - init_generated(); - init_groupMethods(); - init_parser(); - init_settings(); - createContextFallback2 = __require("tailwindcss/lib/lib/setupContextUtils").createContext; - escapeRegex2 = (init_regex(), __toCommonJS(regex_exports)).escapeRegex; - CUSTOM_CLASSNAME_DETECTED_MSG = `Classname '{{classname}}' is not a Tailwind CSS class!`; - getGroupNameRegex = (prefix = "") => new RegExp(`^${escapeRegex2(prefix)}(group|peer)/[\\w\\$\\#\\@\\%\\^\\&\\*\\_\\-]+$`, "i"); - contextFallbackCache2 = /* @__PURE__ */ new WeakMap(); - no_custom_classname_default = { - meta: { - docs: { - description: "Detect classnames which do not belong to Tailwind CSS", - category: "Best Practices", - recommended: false, - url: docsUrl_default("no-custom-classname") - }, - messages: { - customClassnameDetected: CUSTOM_CLASSNAME_DETECTED_MSG - }, - fixable: null, - schema: [ - { - type: "object", - properties: { - callees: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - ignoredKeys: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - config: { - // returned from `loadConfig()` utility - type: ["string", "object"] - }, - cssFiles: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - cssFilesRefreshRate: { - type: "number" - // default: 5_000, - }, - tags: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - whitelist: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - } - } - } - ] - }, - create: function(context) { - const callees = settings_default(context, "callees"); - const ignoredKeys = settings_default(context, "ignoredKeys"); - const skipClassAttribute = settings_default(context, "skipClassAttribute"); - const tags = settings_default(context, "tags"); - const twConfig = settings_default(context, "config"); - const cssFiles = settings_default(context, "cssFiles"); - const cssFilesRefreshRate = settings_default(context, "cssFilesRefreshRate"); - const whitelist = settings_default(context, "whitelist"); - const classRegex = settings_default(context, "classRegex"); - const mergedConfig2 = customConfig_default.resolve(twConfig); - const contextFallback = ( - // Set the created contextFallback in the cache if it does not exist yet. - (contextFallbackCache2.has(mergedConfig2) ? contextFallbackCache2 : contextFallbackCache2.set(mergedConfig2, createContextFallback2(mergedConfig2))).get(mergedConfig2) - ); - const groups2 = groupMethods_default.getGroups(groups, mergedConfig2); - const classnamesFromFiles2 = cssFiles_default(cssFiles, cssFilesRefreshRate); - const groupNameRegex = getGroupNameRegex(mergedConfig2.prefix); - const parseForCustomClassNames = (classNames, node) => { - classNames.forEach((className) => { - const gen = generated_default(className, contextFallback); - if (gen.length) { - return; - } - const idx = groupMethods_default.getGroupIndex(className, groups2, mergedConfig2.separator); - if (idx >= 0) { - return; - } - const whitelistIdx = groupMethods_default.getGroupIndex(className, whitelist, mergedConfig2.separator); - if (whitelistIdx >= 0) { - return; - } - const fromFilesIdx = groupMethods_default.getGroupIndex(className, classnamesFromFiles2, mergedConfig2.separator); - if (fromFilesIdx >= 0) { - return; - } - if (groupNameRegex.test(className)) { - return; - } - context.report({ - node, - messageId: "customClassnameDetected", - data: { - classname: className - } - }); - }); - }; - const attributeVisitor = function(node) { - if (!ast_default.isClassAttribute(node, classRegex) || skipClassAttribute) { - return; - } - if (ast_default.isLiteralAttributeValue(node)) { - ast_default.parseNodeRecursive(node, null, parseForCustomClassNames, false, false, ignoredKeys); - } else if (node.value && node.value.type === "JSXExpressionContainer") { - ast_default.parseNodeRecursive(node, node.value.expression, parseForCustomClassNames, false, false, ignoredKeys); - } - }; - const callExpressionVisitor = function(node) { - const calleeStr = ast_default.calleeToString(node.callee); - if (callees.findIndex((name2) => calleeStr === name2) === -1) { - return; - } - node.arguments.forEach((arg) => { - ast_default.parseNodeRecursive(node, arg, parseForCustomClassNames, false, false, ignoredKeys); - }); - }; - const scriptVisitor = { - JSXAttribute: attributeVisitor, - TextAttribute: attributeVisitor, - CallExpression: callExpressionVisitor, - TaggedTemplateExpression: function(node) { - if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) { - return; - } - ast_default.parseNodeRecursive(node, node.quasi, parseForCustomClassNames, false, false, ignoredKeys); - } - }; - const templateVisitor = { - CallExpression: callExpressionVisitor, - /* - Tagged templates inside data bindings - https://github.com/vuejs/vue/issues/9721 - */ - VAttribute: function(node) { - switch (true) { - case !ast_default.isValidVueAttribute(node, classRegex): - return; - case ast_default.isVLiteralValue(node): - ast_default.parseNodeRecursive(node, null, parseForCustomClassNames, false, false, ignoredKeys); - break; - case ast_default.isArrayExpression(node): - node.value.expression.elements.forEach((arg) => { - ast_default.parseNodeRecursive(node, arg, parseForCustomClassNames, false, false, ignoredKeys); - }); - break; - case ast_default.isObjectExpression(node): - node.value.expression.properties.forEach((prop) => { - ast_default.parseNodeRecursive(node, prop, parseForCustomClassNames, false, false, ignoredKeys); - }); - break; - } - } - }; - return parser_default.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); - } - }; - } -}); - -// src/rules/no-unnecessary-arbitrary-value.ts -var validZeroRegEx2, UNNECESSARY_ARBITRARY_VALUE_DETECTED_MSG, no_unnecessary_arbitrary_value_default; -var init_no_unnecessary_arbitrary_value = __esm({ - "src/rules/no-unnecessary-arbitrary-value.ts"() { - "use strict"; - init_groups(); - init_ast(); - init_customConfig(); - init_docsUrl(); - init_groupMethods(); - init_parser(); - init_settings(); - init_length(); - validZeroRegEx2 = length_default.validZeroRegEx; - UNNECESSARY_ARBITRARY_VALUE_DETECTED_MSG = `The arbitrary class '{{classname}}' could be replaced by '{{presets}}'`; - no_unnecessary_arbitrary_value_default = { - meta: { - docs: { - description: "Forbid using arbitrary values in classnames when an equivalent preset exists", - category: "Best Practices", - recommended: true, - url: docsUrl_default("no-unnecessary-arbitrary-value") - }, - messages: { - unnecessaryArbitraryValueDetected: UNNECESSARY_ARBITRARY_VALUE_DETECTED_MSG - }, - fixable: "code", - schema: [ - { - type: "object", - properties: { - callees: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - ignoredKeys: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - }, - config: { - // returned from `loadConfig()` utility - type: ["string", "object"] - }, - tags: { - type: "array", - items: { type: "string", minLength: 0 }, - uniqueItems: true - } - } - } - ] - }, - create: function(context) { - const callees = settings_default(context, "callees"); - const skipClassAttribute = settings_default(context, "skipClassAttribute"); - const tags = settings_default(context, "tags"); - const twConfig = settings_default(context, "config"); - const classRegex = settings_default(context, "classRegex"); - const mergedConfig2 = customConfig_default.resolve(twConfig); - const groups2 = groupMethods_default.getGroups(groups, mergedConfig2); - const configKeys = groupMethods_default.getGroupConfigKeys(groups); - let parentTemplateLiteral = null; - const parseForArbitraryValues = (node, arg = null) => { - let start = null; - let end = null; - let originalClassNamesValue = null; - if (arg === null) { - originalClassNamesValue = ast_default.extractValueFromNode(node); - const range = ast_default.extractRangeFromNode(node); - if (node.type === "TextAttribute") { - start = range[0]; - end = range[1]; - } else { - start = range[0] + 1; - end = range[1] - 1; - } - } else { - switch (arg.type) { - case "Identifier": - return; - case "TemplateLiteral": - parentTemplateLiteral = arg; - arg.expressions.forEach((exp) => { - parseForArbitraryValues(node, exp); - }); - arg.quasis.forEach((quasis) => { - parseForArbitraryValues(node, quasis); - }); - parentTemplateLiteral = null; - return; - case "ConditionalExpression": - parseForArbitraryValues(node, arg.consequent); - parseForArbitraryValues(node, arg.alternate); - return; - case "LogicalExpression": - parseForArbitraryValues(node, arg.right); - return; - case "ArrayExpression": - arg.elements.forEach((el) => { - parseForArbitraryValues(node, el); - }); - return; - case "ObjectExpression": - const isUsedByClassNamesPlugin = node.callee && node.callee.name === "classnames"; - const isVue = node.key && node.key.type === "VDirectiveKey"; - arg.properties.forEach((prop) => { - const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value; - parseForArbitraryValues(node, propVal); - }); - return; - case "Property": - parseForArbitraryValues(node, arg.key); - start = arg.range[0] + 1; - end = arg.range[1] - 1; - return; - case "Literal": - originalClassNamesValue = arg.value; - start = arg.range[0] + 1; - end = arg.range[1] - 1; - break; - case "TemplateElement": - originalClassNamesValue = arg.value.raw; - if (originalClassNamesValue === "") { - return; - } - start = arg.range[0]; - end = arg.range[1]; - if (parentTemplateLiteral) { - if (parentTemplateLiteral.range[0] === start) { - start += 1; - } else { - start += 1; - } - if (parentTemplateLiteral.range[1] === end) { - end -= 1; - } else { - end -= 2; - } - } - break; - } - } - const arbitraryRegEx = /^(?.*)\[(?.*)\]$/i; - const { classNames } = ast_default.extractClassnamesFromValue(originalClassNamesValue); - const arbitraryClassnames = classNames.filter((c) => arbitraryRegEx.test(c)); - if (arbitraryClassnames.length === 0) { - return; - } - const unnecessaryArbitraryClasses = []; - const existingSubstitutes = []; - arbitraryClassnames.forEach((arbitraryClass, idx) => { - const parsed = groupMethods_default.parseClassname(arbitraryClass, [], mergedConfig2, idx); - const res = arbitraryRegEx.exec(parsed.name); - if (res && res.groups && res.groups.backBone && res.groups.arbitraryValue) { - const backBone = res.groups.backBone; - const arbitraryValue = res.groups.arbitraryValue; - const groupIdx = groupMethods_default.getGroupIndex(arbitraryClass, groups2, mergedConfig2.separator); - if ([groups2[groupIdx], parsed.body, arbitraryValue].includes(void 0)) { - return false; - } - const canBeNegative = groups2[groupIdx].indexOf("?") !== -1; - const isNegativeClass = parsed.body.indexOf("-") === 0; - const isNegativeValue = arbitraryValue.indexOf("-") === 0; - const configurationKey = configKeys[groupIdx]; - const configuration = mergedConfig2.theme[configurationKey]; - if ([void 0, null].includes(configuration)) { - return false; - } - const configurationKeys = Object.keys(configuration); - const zeroValueWithOrWithoutUnitsPattern = new RegExp(validZeroRegEx2, "i"); - const isZeroArbitraryValue = zeroValueWithOrWithoutUnitsPattern.test(arbitraryValue); - const negativeSubstitutes = []; - const matchingConfigurationKeys = configurationKeys.filter((key) => { - const configValue = configuration[key]; - if (isZeroArbitraryValue && zeroValueWithOrWithoutUnitsPattern.test(configValue)) { - negativeSubstitutes.push(false); - return true; - } - if (canBeNegative) { - const absoluteValue = isNegativeValue ? arbitraryValue.substring(1) : arbitraryValue; - const computedAsNegative = isNegativeClass !== isNegativeValue; - if (`${configValue}` === `${absoluteValue}`) { - negativeSubstitutes.push(computedAsNegative); - return true; - } - return false; - } - if (`${configValue}` === `${arbitraryValue}`) { - negativeSubstitutes.push(false); - return true; - } - return false; - }); - if (matchingConfigurationKeys.length) { - unnecessaryArbitraryClasses.push(parsed.name); - existingSubstitutes.push( - matchingConfigurationKeys.map((key, idx2) => { - let patchedBody = backBone.substring(parsed.variants.length); - patchedBody = patchedBody.charAt(0) === "-" ? patchedBody.substring(1) : patchedBody; - const noneOrMinus = negativeSubstitutes[idx2] ? "-" : ""; - if (key === "DEFAULT") { - return parsed.variants + noneOrMinus + patchedBody.substring(0, patchedBody.length - 1); - } - return parsed.variants + noneOrMinus + patchedBody + key; - }) - ); - } - } - }); - const fixables = {}; - unnecessaryArbitraryClasses.forEach((forbiddenClass, idx) => { - if (existingSubstitutes[idx].length === 1) { - const rangeKey = `s${start}e${end}`; - if (!fixables[rangeKey]) { - fixables[rangeKey] = []; - } - const fixer = { - unjustified: forbiddenClass, - substitute: existingSubstitutes[idx][0] - }; - fixables[rangeKey].push(fixer); - } else { - context.report({ - node, - messageId: "unnecessaryArbitraryValueDetected", - data: { - classname: forbiddenClass, - presets: existingSubstitutes[idx].join("' or '") - } - }); - } - }); - Object.keys(fixables).forEach((rangeKey) => { - const batchFixes = fixables[rangeKey]; - let patched = originalClassNamesValue; - const forbiddenClasses = []; - const substitutes = []; - for (let idx = 0; idx < batchFixes.length; idx++) { - const unjustified = batchFixes[idx].unjustified; - forbiddenClasses.push(unjustified); - const substitute = batchFixes[idx].substitute; - substitutes.push(substitute); - patched = patched.replace(unjustified, substitute); - } - context.report({ - node, - messageId: "unnecessaryArbitraryValueDetected", - data: { - classname: forbiddenClasses.join(", "), - presets: substitutes.join(", ") - }, - fix: function(fixer) { - return fixer.replaceTextRange([start, end], patched); - } - }); - }); - }; - const attributeVisitor = function(node) { - if (!ast_default.isClassAttribute(node, classRegex) || skipClassAttribute) { - return; - } - if (ast_default.isLiteralAttributeValue(node)) { - parseForArbitraryValues(node); - } else if (node.value && node.value.type === "JSXExpressionContainer") { - parseForArbitraryValues(node, node.value.expression); - } - }; - const callExpressionVisitor = function(node) { - const calleeStr = ast_default.calleeToString(node.callee); - if (callees.findIndex((name2) => calleeStr === name2) === -1) { - return; - } - node.arguments.forEach((arg) => { - parseForArbitraryValues(node, arg); - }); - }; - const scriptVisitor = { - JSXAttribute: attributeVisitor, - TextAttribute: attributeVisitor, - CallExpression: callExpressionVisitor, - TaggedTemplateExpression: function(node) { - if (!tags.includes(node.tag.name)) { - return; - } - parseForArbitraryValues(node, node.quasi); - } - }; - const templateVisitor = { - CallExpression: callExpressionVisitor, - /* - Tagged templates inside data bindings - https://github.com/vuejs/vue/issues/9721 - */ - VAttribute: function(node) { - switch (true) { - case !ast_default.isValidVueAttribute(node, classRegex): - return; - case ast_default.isVLiteralValue(node): - parseForArbitraryValues(node, null); - break; - case ast_default.isArrayExpression(node): - node.value.expression.elements.forEach((arg) => { - parseForArbitraryValues(node, arg); - }); - break; - case ast_default.isObjectExpression(node): - node.value.expression.properties.forEach((prop) => { - parseForArbitraryValues(node, prop); - }); - break; - } - } - }; - return parser_default.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor); - } - }; - } -}); - -// src/rules/index.ts -var rules; -var init_rules2 = __esm({ - "src/rules/index.ts"() { - "use strict"; - init_classnames_order(); - init_enforces_negative_arbitrary_values(); - init_enforces_shorthand(); - init_migration_from_tailwind_2(); - init_no_arbitrary_value(); - init_no_contradicting_classname(); - init_no_custom_classname(); - init_no_unnecessary_arbitrary_value(); - rules = { - "classnames-order": classnames_order_default, - "enforces-negative-arbitrary-values": enforces_negative_arbitrary_values_default, - "enforces-shorthand": enforces_shorthand_default, - "migration-from-tailwind-2": migration_from_tailwind_2_default, - "no-arbitrary-value": no_arbitrary_value_default, - "no-contradicting-classname": no_contradicting_classname_default, - "no-custom-classname": no_custom_classname_default, - "no-unnecessary-arbitrary-value": no_unnecessary_arbitrary_value_default - }; - } -}); - -// package.json -var require_package = __commonJS({ - "package.json"(exports, module) { - module.exports = { - name: "eslint-plugin-tailwindcss", - version: "3.18.0", - description: "Rules enforcing best practices while using Tailwind CSS", - type: "module", - keywords: [ - "eslint", - "eslintplugin", - "eslint-plugin", - "tailwind", - "tailwindcss" - ], - author: "Fran\xE7ois Massart", - repository: { - type: "git", - url: "https://github.com/francoismassart/eslint-plugin-tailwindcss" - }, - homepage: "https://github.com/francoismassart/eslint-plugin-tailwindcss", - bugs: "https://github.com/francoismassart/eslint-plugin-tailwindcss/issues", - main: "lib/index.js", - scripts: { - test: "npm run test:base && npm run test:integration", - "test:base": 'mocha "tests/lib/**/*.js"', - "test:integration": 'mocha "tests/integrations/*.js" --timeout 60000', - build: "tsc --build", - "build:diagnostics": "tsc --build --diagnostics", - watch: "tsc --watch", - tsup: "tsup ./src/index.ts --outDir lib/", - "tsup:watch": "tsup ./src/index.ts --watch --outDir lib/", - "docs:init": "eslint-doc-generator --init-rule-docs", - "docs:update": "eslint-doc-generator" - }, - files: [ - "lib" - ], - peerDependencies: { - tailwindcss: "^4.0.0" - }, - dependencies: { - "@typescript-eslint/utils": "^7.13.0", - eslint: "^8.56.0", - "fast-glob": "^3.2.5", - postcss: "^8.4.4" - }, - devDependencies: { - "@angular-eslint/template-parser": "^15.2.0", - "@tailwindcss/aspect-ratio": "^0.4.2", - "@tailwindcss/forms": "^0.5.3", - "@tailwindcss/line-clamp": "^0.4.2", - "@tailwindcss/typography": "^0.5.8", - "@types/eslint": "^8.56.10", - "@types/jest": "^29.5.12", - "@types/node": "^18.12.0", - "@typescript-eslint/parser": "^7.13.0", - "@typescript-eslint/rule-tester": "^7.13.0", - autoprefixer: "^10.4.0", - daisyui: "^2.6.4", - eslint: "^8.57.0", - "eslint-doc-generator": "^1.7.1", - mocha: "^10.2.0", - semver: "^7.6.0", - tailwindcss: "^4.0.0", - tsup: "^8.1.0", - typescript: "^5.4.5", - "vue-eslint-parser": "^9.4.2" - }, - packageManager: "npm@10.2.5+sha256.8002e3e7305d2abd4016e1368af48d49b066c269079eeb10a56e7d6598acfdaa", - engines: { - node: ">=18.12.0" - }, - license: "MIT" - }; - } -}); - -// src/index.ts -var index_exports = {}; -__export(index_exports, { - default: () => index_default -}); -var name, version, plugin2, index_default; -var init_index = __esm({ - async "src/index.ts"() { - await init_configs(); - init_rules2(); - ({ name, version } = await Promise.resolve().then(() => __toESM(require_package(), 1))); - plugin2 = { - meta: { - name, - version - }, - rules, - configs - }; - index_default = plugin2; - } -}); -await init_index(); -export { - index_default as default -}; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/index.js.map b/lib/index.js.map deleted file mode 100644 index dfc907ff..00000000 --- a/lib/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/configs/rules.ts","../src/configs/flat-recommended.ts","../src/configs/recommended.ts","../src/configs/index.ts","../src/util/regex.ts","../src/util/removeDuplicatesFromArray.ts","../src/util/ast.ts","../src/util/customConfig.ts","../src/util/docsUrl.ts","../src/util/parser.ts","../src/util/prettier/order.ts","../src/util/removeDuplicatesFromClassnamesAndWhitespaces.ts","../src/util/settings.ts","../src/rules/classnames-order.ts","../src/util/types/angle.ts","../src/util/types/color.ts","../src/util/types/length.ts","../src/util/groupMethods.ts","../src/rules/enforces-negative-arbitrary-values.ts","../src/configs/groups.ts","../src/rules/enforces-shorthand.ts","../src/rules/migration-from-tailwind-2.ts","../src/rules/no-arbitrary-value.ts","../src/rules/no-contradicting-classname.ts","../src/util/cssFiles.ts","../src/util/generated.ts","../src/rules/no-custom-classname.ts","../src/rules/no-unnecessary-arbitrary-value.ts","../src/rules/index.ts","../package.json","../src/index.ts"],"sourcesContent":["/**\n * @fileoverview Default rules configuration\n * @author François Massart\n */\n\nexport default {\n 'tailwindcss/classnames-order': 'warn',\n 'tailwindcss/enforces-negative-arbitrary-values': 'warn',\n 'tailwindcss/enforces-shorthand': 'warn',\n 'tailwindcss/migration-from-tailwind-2': 'warn',\n 'tailwindcss/no-arbitrary-value': 'off',\n 'tailwindcss/no-custom-classname': 'warn',\n 'tailwindcss/no-contradicting-classname': 'error',\n 'tailwindcss/no-unnecessary-arbitrary-value': 'warn',\n};\n","/**\n * @fileoverview Recommended coniguration for flat style\n * @see https://eslint.org/docs/latest/use/configure/configuration-files-new\n * @author François Massart\n */\n'use strict';\n\nimport rules from './rules';\n\nconst plugin = await import('../index');\n\nexport default [\n {\n name: 'tailwindcss:base',\n plugins: {\n get tailwindcss() {\n return plugin;\n },\n },\n languageOptions: {\n parserOptions: {\n ecmaFeatures: {\n jsx: true,\n },\n },\n },\n },\n {\n name: 'tailwindcss:rules',\n rules,\n },\n];\n","/**\n * @fileoverview Recommended coniguration for legacy style\n * @see https://eslint.org/docs/latest/use/configure/configuration-files\n * @author François Massart\n */\n'use strict';\n\nimport rules from './rules';\n\nexport default {\n plugins: ['tailwindcss'],\n parserOptions: {\n ecmaFeatures: {\n jsx: true,\n },\n },\n rules,\n};\n","import flatRecommended from './flat-recommended';\nimport recommended from './recommended';\n\nexport const configs = {\n recommended,\n 'flat/recommended': flatRecommended,\n};\n","/**\n * Escapes a string to be used in a regular expression\n * Copied from https://stackoverflow.com/a/3561711.\n * @param {string} input\n * @returns {string}\n */\nfunction escapeRegex(input: string): string {\n return input.replace(/[/\\-\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nconst separatorRegEx = /([\\t\\n\\f\\r ]+)/;\n\nexport { escapeRegex, separatorRegEx };\n","'use strict';\n\nfunction removeDuplicatesFromArray(arr: Iterable | null | undefined) {\n return [...new Set(arr)];\n}\n\nexport default removeDuplicatesFromArray;\n","/**\n * @fileoverview Utility functions for AST\n */\n\n'use strict';\n\nimport { separatorRegEx } from './regex';\n// context.parserPath\n// /.../eslint-plugin-tailwindcss/node_modules/espree/espree.js\n// /.../eslint-plugin-tailwindcss/node_modules/@angular-eslint/template-parser/dist/index.js\n\nconst removeDuplicatesFromArray = require('./removeDuplicatesFromArray');\n\nfunction calleeToString(calleeNode) {\n if (calleeNode.type === 'Identifier') {\n return calleeNode.name;\n }\n if (calleeNode.type === 'MemberExpression') {\n return `${calleeNode.object.name}.${calleeNode.property.name}`;\n }\n}\n\n/**\n * Find out if node is `class` or `className`\n *\n * @param {ASTNode} node The AST node being checked\n * @param {String} classRegex Regex to test the attribute that is being checked against\n * @returns {Boolean}\n */\nfunction isClassAttribute(node, classRegex) {\n if (!node.name) {\n return false;\n }\n let name = '';\n switch (node.type) {\n case 'TextAttribute':\n name = node.name;\n break;\n case 'JSXAttribute':\n if (node.name.type === 'JSXNamespacedName') {\n const ns = node.name.namespace.name || '';\n name = (ns.length ? ns + ':' : '') + node.name.name.name;\n } else {\n name = node.name.name;\n }\n break;\n default:\n name = node.name.name;\n }\n return new RegExp(classRegex).test(name);\n}\n\n/**\n * Find out if node is `class`\n *\n * @param {ASTNode} node The AST node being checked\n * @param {String} classRegex Regex to test the attribute that is being checked against\n * @returns {Boolean}\n */\nfunction isVueClassAttribute(node, classRegex) {\n const re = new RegExp(classRegex);\n let name = '';\n switch (true) {\n case node.key && node.key.name && re.test(node.key.name):\n // class=\"vue-classes-as-litteral\"\n return true;\n case node.key &&\n node.key.name &&\n node.key.name.name &&\n node.key.argument &&\n node.key.argument.name &&\n /^bind$/.test(node.key.name.name) &&\n re.test(node.key.argument.name):\n // v-bind:class=\"vue-classes-as-bind\"\n // :class=\"vue-classes-as-bind\"\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Find out if node's value attribute is just simple text\n *\n * @param {ASTNode} node The AST node being checked\n * @returns {Boolean}\n */\nfunction isVLiteralValue(node) {\n return node.value && node.value.type === 'VLiteral';\n}\n\n/**\n * Find out if node's value attribute is an ArrayExpression\n *\n * @param {ASTNode} node The AST node being checked\n * @returns {Boolean}\n */\nfunction isArrayExpression(node) {\n return (\n node.value &&\n node.value.type === 'VExpressionContainer' &&\n node.value.expression &&\n node.value.expression.type === 'ArrayExpression'\n );\n}\n\n/**\n * Find out if node's value attribute is an ObjectExpression\n *\n * @param {ASTNode} node The AST node being checked\n * @returns {Boolean}\n */\nfunction isObjectExpression(node) {\n return (\n node.value &&\n node.value.type === 'VExpressionContainer' &&\n node.value.expression &&\n node.value.expression.type === 'ObjectExpression'\n );\n}\n\n/**\n * Find out if node's value attribute is just simple text\n *\n * @param {ASTNode} node The AST node being checked\n * @returns {Boolean}\n */\nfunction isVueValidAttributeValue(node) {\n switch (true) {\n case isVLiteralValue(node): // Simple string\n case isArrayExpression(node): // ['tw-unknown-class']\n case isObjectExpression(node): // {'tw-unknown-class': true}\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Find out if node's value attribute is just simple text\n *\n * @param {ASTNode} node The AST node being checked\n * @returns {Boolean}\n */\nfunction isLiteralAttributeValue(node) {\n if (node.type === 'TextAttribute' && node.name === 'class' && typeof node.value === 'string') {\n return true;\n }\n if (node.value) {\n switch (node.value.type) {\n case 'Literal':\n // No support for dynamic or conditional...\n return !/\\{|\\?|\\}/.test(node.value.value);\n case 'JSXExpressionContainer':\n // className={\"...\"}\n return node.value.expression.type === 'Literal';\n }\n }\n return false;\n}\n\n/**\n * Find out if the node is a valid candidate for our rules\n *\n * @param {ASTNode} node The AST node being checked\n * @param {String} classRegex Regex to test the attribute that is being checked against\n * @returns {Boolean}\n */\nfunction isValidJSXAttribute(node, classRegex) {\n if (!isClassAttribute(node, classRegex)) {\n // Only run for class[Name] attributes\n return false;\n }\n if (!isLiteralAttributeValue(node)) {\n // No support for dynamic or conditional classnames\n return false;\n }\n return true;\n}\n\n/**\n * Find out if the node is a valid candidate for our rules\n *\n * @param {ASTNode} node The AST node being checked\n * @param {String} classRegex Regex to test the attribute that is being checked against\n * @returns {Boolean}\n */\nfunction isValidVueAttribute(node, classRegex) {\n if (!isVueClassAttribute(node, classRegex)) {\n // Only run for class attributes\n return false;\n }\n if (!isVueValidAttributeValue(node)) {\n // No support for dynamic or conditional classnames\n return false;\n }\n return true;\n}\n\nfunction extractRangeFromNode(node) {\n if (node.type === 'TextAttribute' && node.name === 'class') {\n return [node.valueSpan.fullStart.offset, node.valueSpan.end.offset];\n }\n if (node.value === undefined) {\n return [0, 0];\n }\n switch (node.value.type) {\n case 'JSXExpressionContainer':\n return node.value.expression.range;\n default:\n return node.value.range;\n }\n}\n\nfunction extractValueFromNode(node) {\n if (node.type === 'TextAttribute' && node.name === 'class') {\n return node.value;\n }\n if (node.value === undefined) {\n return node.value;\n }\n\n switch (node.value.type) {\n case 'JSXExpressionContainer':\n return node.value.expression.value;\n case 'VExpressionContainer':\n switch (node.value.expression.type) {\n case 'ArrayExpression':\n return node.value.expression.elements;\n case 'ObjectExpression':\n return node.value.expression.properties;\n }\n return node.value.expression.value;\n default:\n return node.value.value;\n }\n}\n\nfunction extractClassnamesFromValue(classStr) {\n if (typeof classStr !== 'string') {\n return { classNames: [], whitespaces: [], headSpace: false, tailSpace: false };\n }\n let parts = classStr.split(separatorRegEx);\n if (parts[0] === '') {\n parts.shift();\n }\n if (parts[parts.length - 1] === '') {\n parts.pop();\n }\n let headSpace = separatorRegEx.test(parts[0]);\n let tailSpace = separatorRegEx.test(parts[parts.length - 1]);\n const isClass = (_, i) => (headSpace ? i % 2 !== 0 : i % 2 === 0);\n const isNotClass = (_, i) => (headSpace ? i % 2 === 0 : i % 2 !== 0);\n let classNames = parts.filter(isClass);\n let whitespaces = parts.filter(isNotClass);\n return { classNames: classNames, whitespaces: whitespaces, headSpace: headSpace, tailSpace: tailSpace };\n}\n\n/**\n * Inspect and parse an abstract syntax node and run a callback function\n *\n * @param {ASTNode} rootNode The current root node being parsed by eslint\n * @param {ASTNode} childNode The AST node child argument being checked\n * @param {Function} cb The callback function\n * @param {Boolean} skipConditional Optional, indicate distinct parsing for conditional nodes\n * @param {Boolean} isolate Optional, set internally to isolate parsing and validation on conditional children\n * @param {Array} ignoredKeys Optional, set object keys which should not be parsed e.g. for `cva`\n * @returns {void}\n */\nfunction parseNodeRecursive(rootNode, childNode, cb, skipConditional = false, isolate = false, ignoredKeys = []) {\n // TODO allow vue non litteral\n let originalClassNamesValue;\n let classNames;\n if (childNode === null) {\n originalClassNamesValue = extractValueFromNode(rootNode);\n ({ classNames } = extractClassnamesFromValue(originalClassNamesValue));\n classNames = removeDuplicatesFromArray(classNames);\n if (classNames.length === 0) {\n // Don't run for empty className\n return;\n }\n cb(classNames, rootNode);\n } else if (childNode === undefined) {\n // Ignore invalid child candidates (probably inside complex TemplateLiteral)\n return;\n } else {\n const forceIsolation = skipConditional ? true : isolate;\n let trim = false;\n switch (childNode.type) {\n case 'TemplateLiteral':\n childNode.expressions.forEach((exp) => {\n parseNodeRecursive(rootNode, exp, cb, skipConditional, forceIsolation, ignoredKeys);\n });\n childNode.quasis.forEach((quasis) => {\n parseNodeRecursive(rootNode, quasis, cb, skipConditional, isolate, ignoredKeys);\n });\n return;\n case 'ConditionalExpression':\n parseNodeRecursive(rootNode, childNode.consequent, cb, skipConditional, forceIsolation, ignoredKeys);\n parseNodeRecursive(rootNode, childNode.alternate, cb, skipConditional, forceIsolation, ignoredKeys);\n return;\n case 'LogicalExpression':\n parseNodeRecursive(rootNode, childNode.right, cb, skipConditional, forceIsolation, ignoredKeys);\n return;\n case 'ArrayExpression':\n childNode.elements.forEach((el) => {\n parseNodeRecursive(rootNode, el, cb, skipConditional, forceIsolation, ignoredKeys);\n });\n return;\n case 'ObjectExpression':\n childNode.properties.forEach((prop) => {\n const isUsedByClassNamesPlugin =\n (rootNode.callee && rootNode.callee.name === 'classnames') || rootNode.type === 'VAttribute';\n\n if (prop.type === 'SpreadElement') {\n // Ignore spread elements\n return;\n }\n\n if (prop.key.type === 'Identifier' && ignoredKeys.includes(prop.key.name)) {\n // Ignore specific keys defined in settings\n return;\n }\n\n parseNodeRecursive(\n rootNode,\n isUsedByClassNamesPlugin ? prop.key : prop.value,\n cb,\n skipConditional,\n forceIsolation,\n ignoredKeys\n );\n });\n return;\n case 'Property':\n parseNodeRecursive(rootNode, childNode.key, cb, skipConditional, forceIsolation, ignoredKeys);\n return;\n case 'Literal':\n trim = true;\n originalClassNamesValue = childNode.value;\n break;\n case 'TemplateElement':\n originalClassNamesValue = childNode.value.raw;\n break;\n }\n ({ classNames } = extractClassnamesFromValue(originalClassNamesValue));\n classNames = removeDuplicatesFromArray(classNames);\n if (classNames.length === 0) {\n // Don't run for empty className\n return;\n }\n const targetNode = isolate ? null : rootNode;\n cb(classNames, targetNode);\n }\n}\n\nfunction getTemplateElementPrefix(text, raw) {\n const idx = text.indexOf(raw);\n if (idx === 0) {\n return '';\n }\n return text.split(raw).shift();\n}\n\nfunction getTemplateElementSuffix(text, raw) {\n if (text.indexOf(raw) === -1) {\n return '';\n }\n return text.split(raw).pop();\n}\n\nfunction getTemplateElementBody(text, prefix, suffix) {\n let arr = text.split(prefix);\n arr.shift();\n let body = arr.join(prefix);\n arr = body.split(suffix);\n arr.pop();\n return arr.join(suffix);\n}\n\nexport default {\n calleeToString,\n extractRangeFromNode,\n extractValueFromNode,\n extractClassnamesFromValue,\n isClassAttribute,\n isLiteralAttributeValue,\n isArrayExpression,\n isObjectExpression,\n isValidJSXAttribute,\n isValidVueAttribute,\n isVLiteralValue,\n parseNodeRecursive,\n getTemplateElementPrefix,\n getTemplateElementSuffix,\n getTemplateElementBody,\n};\n","'use strict';\n\nimport fs from 'fs';\nimport path from 'path';\nimport resolveConfig from 'tailwindcss/resolveConfig';\nlet twLoadConfig: { loadConfig: (arg0: any) => any } | null;\n\ntry {\n twLoadConfig = require('tailwindcss/lib/lib/load-config');\n} catch (err) {\n twLoadConfig = null;\n}\n\nconst CHECK_REFRESH_RATE = 1_000;\nlet previousConfig: null = null;\nlet lastCheck: number | null = null;\nlet mergedConfig: null = null;\nlet lastModifiedDate: string | null = null;\n\n/**\n * @see https://stackoverflow.com/questions/9210542/node-js-require-cache-possible-to-invalidate\n * @param {string} module The path to the module\n * @returns the module's export\n */\nfunction requireUncached(module: string) {\n delete require.cache[require.resolve(module)];\n if (twLoadConfig === null) {\n // Using native loading\n return require(module);\n } else {\n // Using Tailwind CSS's loadConfig utility\n return twLoadConfig.loadConfig(module);\n }\n}\n\n/**\n * Load the config from a path string or parsed from an object\n * @param {string|Object} config\n * @returns `null` when unchanged, `{}` when not found\n */\nfunction loadConfig(config: string | null) {\n let loadedConfig = null;\n if (typeof config === 'string') {\n const resolvedPath = path.isAbsolute(config) ? config : path.join(path.resolve(), config);\n try {\n const stats = fs.statSync(resolvedPath);\n const mtime = `${stats.mtime || ''}`;\n if (stats === null) {\n // Default to no config\n loadedConfig = {};\n } else if (lastModifiedDate !== mtime) {\n // Load the config based on path\n lastModifiedDate = mtime;\n loadedConfig = requireUncached(resolvedPath);\n } else {\n // Unchanged config\n loadedConfig = null;\n }\n } catch (err) {\n // Default to no config\n loadedConfig = {};\n } finally {\n return loadedConfig;\n }\n } else {\n if (typeof config === 'object' && config !== null) {\n return config;\n }\n return {};\n }\n}\n\nfunction convertConfigToString(config: any) {\n switch (typeof config) {\n case 'string':\n return config;\n case 'object':\n return JSON.stringify(config);\n default:\n return config.toString();\n }\n}\n\nfunction resolve(twConfig: any) {\n const newConfig = convertConfigToString(twConfig) !== convertConfigToString(previousConfig);\n const now = Date.now();\n const expired = now - (lastCheck ?? 0) > CHECK_REFRESH_RATE;\n if (newConfig || expired) {\n previousConfig = twConfig;\n lastCheck = now;\n const userConfig = loadConfig(twConfig);\n // userConfig is null when config file was not modified\n if (userConfig !== null) {\n mergedConfig = resolveConfig(userConfig);\n }\n }\n return mergedConfig;\n}\n\nexport default {\n resolve,\n};\n","'use strict';\n\n// Copied from https://github.com/yannickcr/eslint-plugin-react/blob/master/lib/util/docsUrl.js\nfunction docsUrl(ruleName: string) {\n return `https://github.com/francoismassart/eslint-plugin-tailwindcss/tree/master/docs/rules/${ruleName}.md`;\n}\n\nexport default docsUrl;\n","/**\n * @see parserServices https://eslint.org/docs/developer-guide/working-with-rules#the-context-object\n * @param {Object} context\n * @param {Function} templateBodyVisitor\n * @param {Function} scriptVisitor\n * @returns\n */\nfunction defineTemplateBodyVisitor(context: object, templateBodyVisitor: Function, scriptVisitor: Function) {\n const parserServices = getParserServices(context);\n if (parserServices == null || parserServices.defineTemplateBodyVisitor == null) {\n // Default parser\n return scriptVisitor;\n }\n\n // Using \"vue-eslint-parser\" requires this setup\n // @see https://eslint.org/docs/developer-guide/working-with-rules#the-context-object\n return parserServices.defineTemplateBodyVisitor(templateBodyVisitor, scriptVisitor);\n}\n\n/**\n * This function is API compatible with eslint v8.x and eslint v9 or later.\n * @see https://eslint.org/blog/2023/09/preparing-custom-rules-eslint-v9/#from-context-to-sourcecode\n */\nfunction getParserServices(context: { sourceCode?: any; parserServices?: any }) {\n return context.sourceCode ? context.sourceCode.parserServices : context.parserServices;\n}\n\nexport default {\n defineTemplateBodyVisitor,\n};\n","import { separatorRegEx } from '../regex';\n\nfunction bigSign(bigIntValue: number) {\n return (bigIntValue > 0n) - (bigIntValue < 0n);\n}\n\nfunction prefixCandidate(context: { tailwindConfig: { prefix: any } }, selector: string) {\n let prefix = context.tailwindConfig.prefix;\n return typeof prefix === 'function' ? prefix(selector) : prefix + selector;\n}\n\n// Polyfill for older Tailwind CSS versions\nfunction getClassOrderPolyfill(classes: string[], { env }: { env: any }) {\n // A list of utilities that are used by certain Tailwind CSS utilities but\n // that don't exist on their own. This will result in them \"not existing\" and\n // sorting could be weird since you still require them in order to make the\n // host utitlies work properly. (Thanks Biology)\n let parasiteUtilities = new Set([prefixCandidate(env.context, 'group'), prefixCandidate(env.context, 'peer')]);\n\n let classNamesWithOrder = [];\n\n for (let className of classes) {\n let order = env.generateRules(new Set([className]), env.context).sort(([a], [z]) => bigSign(z - a))[0]?.[0] ?? null;\n\n if (order === null && parasiteUtilities.has(className)) {\n // This will make sure that it is at the very beginning of the\n // `components` layer which technically means 'before any\n // components'.\n order = env.context.layerOrder.components;\n }\n\n classNamesWithOrder.push([className, order]);\n }\n\n return classNamesWithOrder;\n}\n\nfunction sortClasses(classStr: string, { env, ignoreFirst = false, ignoreLast = false }: { env: { context: any } }) {\n if (typeof classStr !== 'string' || classStr === '') {\n return classStr;\n }\n\n // Ignore class attributes containing `{{`, to match Prettier behaviour:\n // https://github.com/prettier/prettier/blob/main/src/language-html/embed.js#L83-L88\n if (classStr.includes('{{')) {\n return classStr;\n }\n\n let result = '';\n let parts = classStr.split(separatorRegEx);\n let classes = parts.filter((_, i) => i % 2 === 0);\n let whitespace = parts.filter((_, i) => i % 2 !== 0);\n\n if (classes[classes.length - 1] === '') {\n classes.pop();\n }\n\n let prefix = '';\n if (ignoreFirst) {\n prefix = `${classes.shift() ?? ''}${whitespace.shift() ?? ''}`;\n }\n\n let suffix = '';\n if (ignoreLast) {\n suffix = `${whitespace.pop() ?? ''}${classes.pop() ?? ''}`;\n }\n\n let classNamesWithOrder = env.context.getClassOrder\n ? env.context.getClassOrder(classes)\n : getClassOrderPolyfill(classes, { env });\n\n classes = classNamesWithOrder\n .sort(([, a], [, z]) => {\n if (a === z) return 0;\n // if (a === null) return options.unknownClassPosition === 'start' ? -1 : 1\n // if (z === null) return options.unknownClassPosition === 'start' ? 1 : -1\n if (a === null) return -1;\n if (z === null) return 1;\n return bigSign(a - z);\n })\n .map(([className]) => className);\n\n for (let i = 0; i < classes.length; i++) {\n result += `${classes[i]}${whitespace[i] ?? ''}`;\n }\n\n return prefix + result + suffix;\n}\n\n/**\n *\n * @param {Array} unordered the unordered classnames\n * @param context\n * @returns {Array} the ordered classnames\n */\nfunction order(unordered: any[], context: any) {\n const sorted = sortClasses(unordered.join(' '), { env: { context: context } });\n return sorted;\n}\n\nexport default order;\n","'use strict';\n\nfunction removeDuplicatesFromClassnamesAndWhitespaces(\n orderedClassNames: string[],\n whitespaces: string[],\n headSpace: boolean,\n tailSpace: boolean\n) {\n let previous = orderedClassNames[0];\n const offset = (!headSpace && !tailSpace) || tailSpace ? -1 : 0;\n for (let i = 1; i < orderedClassNames.length; i++) {\n const cls = orderedClassNames[i];\n // This function assumes that the list of classNames is ordered, so just comparing to the previous className is enough\n if (cls === previous) {\n orderedClassNames.splice(i, 1);\n whitespaces.splice(i + offset, 1);\n i--;\n }\n previous = cls;\n }\n}\n\nexport default removeDuplicatesFromClassnamesAndWhitespaces;\n","'use strict';\nlet resolveDefaultConfigPathAlias: (() => any) | null;\n\ntry {\n const { resolveDefaultConfigPath } = require('tailwindcss/lib/util/resolveConfigPath');\n resolveDefaultConfigPathAlias = resolveDefaultConfigPath;\n} catch (err) {\n resolveDefaultConfigPathAlias = null;\n}\n\nfunction getOption(context, name: string) {\n // Options (defined at rule level)\n const options = context.options[0] || {};\n if (options[name] != undefined) {\n return options[name];\n }\n // Settings (defined at plugin level, shared accross rules)\n if (context.settings && context.settings.tailwindcss && context.settings.tailwindcss[name] != undefined) {\n return context.settings.tailwindcss[name];\n }\n // Fallback to defaults\n switch (name) {\n case 'callees':\n return ['classnames', 'clsx', 'ctl', 'cva', 'tv'];\n case 'ignoredKeys':\n return ['compoundVariants', 'defaultVariants'];\n case 'classRegex':\n return '^class(Name)?$';\n case 'config':\n if (resolveDefaultConfigPathAlias === null) {\n return 'tailwind.config.js';\n } else {\n return resolveDefaultConfigPathAlias();\n }\n case 'cssFiles':\n return ['**/*.css', '!**/node_modules', '!**/.*', '!**/dist', '!**/build'];\n case 'cssFilesRefreshRate':\n return 5_000;\n case 'removeDuplicates':\n return true;\n case 'skipClassAttribute':\n return false;\n case 'tags':\n return [];\n case 'whitelist':\n return [];\n }\n}\n\nexport default getOption;\n","/**\n * @fileoverview Use a consistent orders for the Tailwind CSS classnames, based on property then on variants\n * @author François Massart\n */\n'use strict';\n\nimport astUtil from '../util/ast';\nimport customConfig from '../util/customConfig';\nimport docsUrl from '../util/docsUrl';\nimport parserUtil from '../util/parser';\nimport order from '../util/prettier/order';\nimport removeDuplicatesFromClassnamesAndWhitespaces from '../util/removeDuplicatesFromClassnamesAndWhitespaces';\nimport getOption from '../util/settings';\nconst createContextFallback = require('tailwindcss/lib/lib/setupContextUtils').createContext;\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst INVALID_CLASSNAMES_ORDER_MSG = 'Invalid Tailwind CSS classnames order';\n\nconst contextFallbackCache = new WeakMap();\n\nexport default {\n meta: {\n docs: {\n description: 'Enforce a consistent and logical order of the Tailwind CSS classnames',\n category: 'Stylistic Issues',\n recommended: false,\n url: docsUrl('classnames-order'),\n },\n messages: {\n invalidOrder: INVALID_CLASSNAMES_ORDER_MSG,\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n removeDuplicates: {\n // default: true,\n type: 'boolean',\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n const removeDuplicates = getOption(context, 'removeDuplicates');\n\n const mergedConfig = customConfig.resolve(twConfig);\n const contextFallback = // Set the created contextFallback in the cache if it does not exist yet.\n (\n contextFallbackCache.has(mergedConfig)\n ? contextFallbackCache\n : contextFallbackCache.set(mergedConfig, createContextFallback(mergedConfig))\n ).get(mergedConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n /**\n * Recursive function crawling into child nodes\n * @param {ASTNode} node The root node of the current parsing\n * @param {ASTNode} arg The child node of node\n * @returns {void}\n */\n const sortNodeArgumentValue = (node, arg = null) => {\n let originalClassNamesValue = null;\n let start = null;\n let end = null;\n let prefix = '';\n let suffix = '';\n if (arg === null) {\n originalClassNamesValue = astUtil.extractValueFromNode(node);\n const range = astUtil.extractRangeFromNode(node);\n if (node.type === 'TextAttribute') {\n start = range[0];\n end = range[1];\n } else {\n start = range[0] + 1;\n end = range[1] - 1;\n }\n } else {\n switch (arg.type) {\n case 'Identifier':\n return;\n case 'TemplateLiteral':\n arg.expressions.forEach((exp) => {\n sortNodeArgumentValue(node, exp);\n });\n arg.quasis.forEach((quasis) => {\n sortNodeArgumentValue(node, quasis);\n });\n return;\n case 'ConditionalExpression':\n sortNodeArgumentValue(node, arg.consequent);\n sortNodeArgumentValue(node, arg.alternate);\n return;\n case 'LogicalExpression':\n sortNodeArgumentValue(node, arg.right);\n return;\n case 'ArrayExpression':\n arg.elements.forEach((el) => {\n sortNodeArgumentValue(node, el);\n });\n return;\n case 'ObjectExpression':\n const isUsedByClassNamesPlugin = node.callee && node.callee.name === 'classnames';\n const isVue = node.key && node.key.type === 'VDirectiveKey';\n arg.properties.forEach((prop) => {\n const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value;\n sortNodeArgumentValue(node, propVal);\n });\n return;\n case 'Property':\n sortNodeArgumentValue(node, arg.key);\n break;\n case 'Literal':\n originalClassNamesValue = arg.value;\n start = arg.range[0] + 1;\n end = arg.range[1] - 1;\n break;\n case 'TemplateElement':\n originalClassNamesValue = arg.value.raw;\n if (originalClassNamesValue === '') {\n return;\n }\n start = arg.range[0];\n end = arg.range[1];\n // https://github.com/eslint/eslint/issues/13360\n // The problem is that range computation includes the backticks (`test`)\n // but value.raw does not include them, so there is a mismatch.\n // start/end does not include the backticks, therefore it matches value.raw.\n const txt = context.getSourceCode().getText(arg);\n prefix = astUtil.getTemplateElementPrefix(txt, originalClassNamesValue);\n suffix = astUtil.getTemplateElementSuffix(txt, originalClassNamesValue);\n originalClassNamesValue = astUtil.getTemplateElementBody(txt, prefix, suffix);\n break;\n }\n }\n\n let { classNames, whitespaces, headSpace, tailSpace } =\n astUtil.extractClassnamesFromValue(originalClassNamesValue);\n\n if (classNames.length <= 1) {\n // Don't run sorting for a single or empty className\n return;\n }\n\n let orderedClassNames = order(classNames, contextFallback).split(' ');\n\n if (removeDuplicates) {\n removeDuplicatesFromClassnamesAndWhitespaces(orderedClassNames, whitespaces, headSpace, tailSpace);\n }\n\n // Generates the validated/sorted attribute value\n let validatedClassNamesValue = '';\n for (let i = 0; i < orderedClassNames.length; i++) {\n const w = whitespaces[i] ?? '';\n const cls = orderedClassNames[i];\n validatedClassNamesValue += headSpace ? `${w}${cls}` : `${cls}${w}`;\n if (headSpace && tailSpace && i === orderedClassNames.length - 1) {\n validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? '';\n }\n }\n\n if (originalClassNamesValue !== validatedClassNamesValue) {\n validatedClassNamesValue = prefix + validatedClassNamesValue + suffix;\n context.report({\n node: node,\n messageId: 'invalidOrder',\n fix: function (fixer) {\n return fixer.replaceTextRange([start, end], validatedClassNamesValue);\n },\n });\n }\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n sortNodeArgumentValue(node);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n sortNodeArgumentValue(node, node.value.expression);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n\n node.arguments.forEach((arg) => {\n sortNodeArgumentValue(node, arg);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n\n sortNodeArgumentValue(node, node.quasi);\n },\n };\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n sortNodeArgumentValue(node, null);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n sortNodeArgumentValue(node, arg);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n sortNodeArgumentValue(node, prop);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","const units = ['deg', 'grad', 'rad', 'turn'];\n\nconst mergedAngleValues = [\n `\\\\-?(\\\\d{1,}(\\\\.\\\\d{1,})?|\\\\.\\\\d{1,})(${units.join('|')})`,\n `calc\\\\(.{1,}\\\\)`,\n `var\\\\(\\\\-\\\\-[A-Za-z\\\\-]{1,}\\\\)`,\n];\n\nexport default {\n mergedAngleValues,\n};\n","const cssNamedColors = [\n 'indianred',\n 'lightcoral',\n 'salmon',\n 'darksalmon',\n 'lightsalmon',\n 'crimson',\n 'red',\n 'firebrick',\n 'darkred',\n 'pink',\n 'lightpink',\n 'hotpink',\n 'deeppink',\n 'mediumvioletred',\n 'palevioletred',\n 'coral',\n 'tomato',\n 'orangered',\n 'darkorange',\n 'orange',\n 'gold',\n 'yellow',\n 'lightyellow',\n 'lemonchiffon',\n 'lightgoldenrodyellow',\n 'papayawhip',\n 'moccasin',\n 'peachpuff',\n 'palegoldenrod',\n 'khaki',\n 'darkkhaki',\n 'lavender',\n 'thistle',\n 'plum',\n 'violet',\n 'orchid',\n 'fuchsia',\n 'magenta',\n 'mediumorchid',\n 'mediumpurple',\n 'blueviolet',\n 'darkviolet',\n 'darkorchid',\n 'darkmagenta',\n 'purple',\n 'rebeccapurple',\n 'indigo',\n 'mediumslateblue',\n 'slateblue',\n 'darkslateblue',\n 'greenyellow',\n 'chartreuse',\n 'lawngreen',\n 'lime',\n 'limegreen',\n 'palegreen',\n 'lightgreen',\n 'mediumspringgreen',\n 'springgreen',\n 'mediumseagreen',\n 'seagreen',\n 'forestgreen',\n 'green',\n 'darkgreen',\n 'yellowgreen',\n 'olivedrab',\n 'olive',\n 'darkolivegreen',\n 'mediumaquamarine',\n 'darkseagreen',\n 'lightseagreen',\n 'darkcyan',\n 'teal',\n 'aqua',\n 'cyan',\n 'lightcyan',\n 'paleturquoise',\n 'aquamarine',\n 'turquoise',\n 'mediumturquoise',\n 'darkturquoise',\n 'cadetblue',\n 'steelblue',\n 'lightsteelblue',\n 'powderblue',\n 'lightblue',\n 'skyblue',\n 'lightskyblue',\n 'deepskyblue',\n 'dodgerblue',\n 'cornflowerblue',\n 'royalblue',\n 'blue',\n 'mediumblue',\n 'darkblue',\n 'navy',\n 'midnightblue',\n 'cornsilk',\n 'blanchedalmond',\n 'bisque',\n 'navajowhite',\n 'wheat',\n 'burlywood',\n 'tan',\n 'rosybrown',\n 'sandybrown',\n 'goldenrod',\n 'darkgoldenrod',\n 'peru',\n 'chocolate',\n 'saddlebrown',\n 'sienna',\n 'brown',\n 'maroon',\n 'white',\n 'snow',\n 'honeydew',\n 'mintcream',\n 'azure',\n 'aliceblue',\n 'ghostwhite',\n 'whitesmoke',\n 'seashell',\n 'beige',\n 'oldlace',\n 'floralwhite',\n 'ivory',\n 'antiquewhite',\n 'linen',\n 'lavenderblush',\n 'mistyrose',\n 'gainsboro',\n 'lightgray',\n 'lightgrey',\n 'silver',\n 'darkgray',\n 'darkgrey',\n 'gray',\n 'grey',\n 'dimgray',\n 'dimgrey',\n 'lightslategray',\n 'lightslategrey',\n 'slategray',\n 'slategrey',\n 'darkslategray',\n 'darkslategrey',\n 'black',\n 'transparent',\n 'currentColor',\n];\n\n// RGB[A] hexa: #123456AA, #B4DA55, #000A, #123\nconst hexRGBA = '\\\\#(([0-9A-Fa-f]{8})|([0-9A-Fa-f]{6})|([0-9A-Fa-f]{4})|([0-9A-Fa-f]{3}))';\n\n// RGB 0-255: rgb(10,20,30)\nconst RGBIntegers = 'rgb\\\\(\\\\d{1,3}\\\\,\\\\d{1,3}\\\\,\\\\d{1,3}\\\\)';\n\n// RGB %: rgb(25%,50%,75%)\nconst RGBPercentages = 'rgb\\\\(\\\\d{1,3}%\\\\,\\\\d{1,3}%\\\\,\\\\d{1,3}%\\\\)';\n\n// RGBA: rgba(50,100,255,.5), rgba(50,100,255,50%)\nconst supportedRGBA = 'rgba\\\\(\\\\d{1,3}\\\\,\\\\d{1,3}\\\\,\\\\d{1,3}\\\\,\\\\d*(\\\\.\\\\d*)?%?\\\\)';\n\nconst RGBAPercentages = 'rgba\\\\(\\\\d{1,3}%\\\\,\\\\d{1,3}%\\\\,\\\\d{1,3}%\\\\,\\\\d*(\\\\.\\\\d*)?%?\\\\)';\n\nconst optionalColorPrefixedVar = '(color\\\\:)?var\\\\(\\\\-\\\\-[A-Za-z\\\\-]{1,}\\\\)';\n\nconst mandatoryColorPrefixed = 'color\\\\:(?!(hsla\\\\()).{1,}';\n\nconst notHSLAPlusWildcard = '(?!(hsla\\\\()).{1,}';\n\n// HSL\nconst supportedHSL = 'hsl\\\\(\\\\d{1,3}%?\\\\,\\\\d{1,3}%?\\\\,\\\\d{1,3}%?\\\\)';\n\n// 'hsla\\\\(\\\\d{1,3}%?\\\\,\\\\d{1,3}%?\\\\,\\\\d{1,3}%?\\\\,\\\\d*(\\\\.\\\\d*)?%?\\\\)',\n\nconst colorValues = [hexRGBA, RGBIntegers, RGBPercentages, supportedRGBA, supportedHSL];\n\nconst mergedColorValues = [...cssNamedColors, ...colorValues];\n\nexport default {\n cssNamedColors,\n colorValues,\n mergedColorValues,\n RGBAPercentages,\n optionalColorPrefixedVar,\n mandatoryColorPrefixed,\n notHSLAPlusWildcard,\n};\n","import removeDuplicatesFromArray from '../removeDuplicatesFromArray';\n\n// Units\nconst fontUnits = ['cap', 'ch', 'em', 'ex', 'ic', 'lh', 'rem', 'rlh'];\nconst viewportUnits = ['vb', 'vh', 'vi', 'vw', 'vmin', 'vmax'];\nconst absoluteUnits = ['px', 'mm', 'cm', 'in', 'pt', 'pc'];\nconst perInchUnits = ['lin', 'pt', 'mm'];\nconst otherUnits = ['%'];\nconst mergedUnits = removeDuplicatesFromArray([\n ...fontUnits,\n ...viewportUnits,\n ...absoluteUnits,\n ...perInchUnits,\n ...otherUnits,\n]);\nconst selectedUnits = mergedUnits.filter((el) => {\n // All units minus this blacklist\n return !['cap', 'ic', 'vb', 'vi'].includes(el);\n});\n\nconst absoluteValues = ['0', 'xx\\\\-small', 'x\\\\-small', 'small', 'medium', 'large', 'x\\\\-large', 'xx\\\\-large'];\nconst relativeValues = ['larger', 'smaller'];\nconst globalValues = ['inherit', 'initial', 'unset'];\nconst mergedValues = [...absoluteValues, ...relativeValues, ...globalValues];\n\nconst mergedLengthValues = [`\\\\-?\\\\d*\\\\.?\\\\d*(${mergedUnits.join('|')})`, ...mergedValues];\nmergedLengthValues.push('length\\\\:var\\\\(\\\\-\\\\-[a-z\\\\-]{1,}\\\\)');\n\nconst mergedUnitsRegEx = `\\\\[(\\\\d{1,}(\\\\.\\\\d{1,})?|(\\\\.\\\\d{1,})?)(${mergedUnits.join('|')})\\\\]`;\n\nconst selectedUnitsRegEx = `\\\\[(\\\\d{1,}(\\\\.\\\\d{1,})?|(\\\\.\\\\d{1,})?)(${selectedUnits.join('|')})\\\\]`;\n\nconst anyCalcRegEx = `\\\\[calc\\\\(.{1,}\\\\)\\\\]`;\n\nconst validZeroRegEx = `^(0(\\\\.0{1,})?|\\\\.0{1,})(${mergedUnits.join('|')})?$`;\n\nexport default {\n anyCalcRegEx,\n mergedLengthValues,\n mergedUnits,\n mergedUnitsRegEx,\n mergedValues,\n selectedUnits,\n selectedUnitsRegEx,\n validZeroRegEx,\n};\n","/**\n * @fileoverview Utilities used for grouping classnames\n */\n\n'use strict';\n\n// Ambiguous values\n// ================\n// Supported hints: length, color, angle, list\n// -------------------------------------------\n//\n// border-[color/width]\n// text-[color/size]\n// ring-[color/width]\n// ring-offset-[color/width]\n// stroke-[current/width]\n// bg-[color/(position/size)]\n//\n// font-[family/weight]\n\nimport angle from './types/angle';\nimport color from './types/color';\nimport length from './types/length';\n\n/**\n * Escape special chars for regular expressions\n *\n * @param {String} str Regular expression to be escaped\n * @returns {String} Escaped version\n */\nfunction escapeSpecialChars(str: string) {\n return str.replace(/\\W/g, '\\\\$&');\n}\n\n/**\n * Generates the opacity suffix based on config\n *\n * @param {Object} config Tailwind CSS Config\n * @returns {String} The suffix or an empty string\n */\nfunction generateOptionalOpacitySuffix(config: { theme: { [x: string]: {} } }) {\n const opacityKeys = !config.theme['opacity'] ? [] : Object.keys(config.theme['opacity']);\n opacityKeys.push('\\\\[(\\\\d*\\\\.?\\\\d*)%?\\\\]');\n return `(\\\\/(${opacityKeys.join('|')}))?`;\n}\n\n/**\n * Generate the possible options for the RegEx\n *\n * @param {String} propName The name of the prop e.g. textColor\n * @param {Array} keys Keys to be injected in the options\n * @param {Object} config Tailwind CSS Config\n * @param {Boolean} isNegative If the value is negative\n * @returns {String} Generated part of regex exposing the possible values\n */\nfunction generateOptions(\n propName: string | number,\n keys: any[],\n config: { darkMode: string | any[]; theme: { [x: string]: { [x: string]: any }; colors: { [x: string]: any } } },\n isNegative = false\n) {\n const opacitySuffixes = generateOptionalOpacitySuffix(config);\n const genericArbitraryOption = '\\\\[(.*)\\\\]';\n const defaultKeyIndex = keys.findIndex((v: string) => v === 'DEFAULT');\n if (defaultKeyIndex > -1) {\n keys.splice(defaultKeyIndex, 1);\n }\n const escapedKeys = keys.map((k: string) => escapeSpecialChars(k));\n switch (propName) {\n case 'dark':\n // Optional `dark` class\n if (config.darkMode === 'class') {\n return 'dark';\n } else if (Array.isArray(config.darkMode) && config.darkMode.length === 2 && config.darkMode[0] === 'class') {\n // https://tailwindcss.com/docs/dark-mode#customizing-the-class-name\n // For the sake of simplicity we only support a single class name\n let value = '';\n const res = /^\\.(?[A-Z0-9\\:\\-\\_\\[\\d\\]]*)$/gi.exec(config.darkMode[1]);\n if (res && res.groups) {\n if (res.groups.classnameValue) {\n value = res.groups.classnameValue;\n }\n }\n return value;\n } else {\n return '';\n }\n case 'arbitraryProperties':\n escapedKeys.push(genericArbitraryOption);\n return '(' + escapedKeys.join('|') + ')';\n case 'colors':\n case 'accentColor':\n case 'borderColor':\n case 'boxShadowColor':\n case 'divideColor':\n case 'fill':\n case 'outlineColor':\n case 'textColor':\n case 'stroke':\n case 'gradientColorStopPositions':\n // Colors can use segments like 'indigo' and 'indigo-light'\n // https://tailwindcss.com/docs/customizing-colors#color-object-syntax\n const options = [];\n keys.forEach((k: string) => {\n const color = config.theme[propName][k] || config.theme.colors[k];\n if (typeof color === 'string') {\n options.push(escapeSpecialChars(k) + opacitySuffixes);\n } else {\n const variants = Object.keys(color).map((colorKey) => escapeSpecialChars(colorKey));\n const defaultIndex = variants.findIndex((v) => v === 'DEFAULT');\n const hasDefault = defaultIndex > -1;\n if (hasDefault) {\n variants.splice(defaultIndex, 1);\n }\n options.push(k + '(\\\\-(' + variants.join('|') + '))' + (hasDefault ? '?' : '') + opacitySuffixes);\n }\n });\n const arbitraryColors = [...color.mergedColorValues];\n switch (propName) {\n case 'fill':\n // Forbidden prefixes\n arbitraryColors.push(`(?!(angle|length|list)\\:).{1,}`);\n break;\n case 'gradientColorStopPositions':\n arbitraryColors.push(color.RGBAPercentages); // RGBA % 0.5[%]\n arbitraryColors.push(color.optionalColorPrefixedVar);\n arbitraryColors.push(color.notHSLAPlusWildcard);\n break;\n case 'textColor':\n arbitraryColors.push(color.RGBAPercentages); // RGBA % 0.5[%]\n arbitraryColors.push(color.mandatoryColorPrefixed);\n break;\n default:\n arbitraryColors.push(color.mandatoryColorPrefixed);\n }\n options.push(`\\\\[(${arbitraryColors.join('|')})\\\\]`);\n return '(' + options.join('|') + ')';\n case 'borderSpacing':\n case 'borderWidth':\n case 'divideWidth':\n case 'fontSize':\n case 'outlineWidth':\n case 'outlineOffset':\n case 'ringWidth':\n case 'ringOffsetWidth':\n case 'textUnderlineOffset':\n escapedKeys.push(length.selectedUnitsRegEx);\n escapedKeys.push(length.anyCalcRegEx);\n // Mandatory `length:` prefix + wildcard\n escapedKeys.push(`\\\\[length\\\\:.{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'strokeWidth':\n escapedKeys.push(length.selectedUnitsRegEx);\n escapedKeys.push(length.anyCalcRegEx);\n // Mandatory `length:` prefix + calc + wildcard\n escapedKeys.push(`\\\\[length\\\\:calc\\\\(.{1,}\\\\)\\\\]`);\n // Mandatory `length:` prefix + wildcard + optional units\n escapedKeys.push(`\\\\[length\\\\:(.{1,})(${length.selectedUnits.join('|')})?\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'gap':\n case 'height':\n case 'lineHeight':\n case 'maxHeight':\n case 'size':\n case 'maxWidth':\n case 'minHeight':\n case 'minWidth':\n case 'padding':\n case 'width':\n case 'blur':\n case 'brightness':\n case 'contrast':\n case 'grayscale':\n case 'invert':\n case 'saturate':\n case 'sepia':\n case 'backdropBlur':\n case 'backdropBrightness':\n case 'backdropContrast':\n case 'backdropGrayscale':\n case 'backdropInvert':\n case 'backdropOpacity':\n case 'backdropSaturate':\n case 'backdropSepia':\n case 'transitionDuration':\n case 'transitionTimingFunction':\n case 'transitionDelay':\n case 'animation':\n case 'transformOrigin':\n case 'scale':\n case 'cursor':\n // All units\n escapedKeys.push(length.mergedUnitsRegEx);\n // Forbidden prefixes\n escapedKeys.push(`\\\\[(?!(angle|color|length|list)\\:).{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'backdropHueRotate':\n case 'hueRotate':\n case 'inset':\n case 'letterSpacing':\n case 'margin':\n case 'scrollMargin':\n case 'skew':\n case 'space':\n case 'textIndent':\n case 'translate':\n // All units\n escapedKeys.push(length.mergedUnitsRegEx);\n // Forbidden prefixes\n escapedKeys.push(`\\\\[(?!(angle|color|length|list)\\:).{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'backgroundOpacity':\n case 'borderOpacity':\n case 'opacity':\n case 'ringOpacity':\n // 0 ... .5 ... 1\n escapedKeys.push(`\\\\[(0(\\\\.\\\\d{1,})?|\\\\.\\\\d{1,}|1)\\\\]`);\n escapedKeys.push(length.anyCalcRegEx);\n // Unprefixed var()\n escapedKeys.push(`\\\\[var\\\\(\\\\-\\\\-[A-Za-z\\\\-]{1,}\\\\)\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'rotate':\n escapedKeys.push(`\\\\[(${angle.mergedAngleValues.join('|')})\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'gridTemplateColumns':\n case 'gridColumn':\n case 'gridColumnStart':\n case 'gridColumnEnd':\n case 'gridTemplateRows':\n case 'gridRow':\n case 'gridRowStart':\n case 'gridRowEnd':\n case 'gridAutoColumns':\n case 'gridAutoRows':\n // Forbidden prefixes\n escapedKeys.push(`\\\\[(?!(angle|color|length)\\:).{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'listStyleType':\n // Forbidden prefixes\n escapedKeys.push(`\\\\[(?!(angle|color|length|list)\\:).{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'objectPosition':\n // Forbidden prefixes\n escapedKeys.push(`\\\\[(?!(angle|color|length)\\:).{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'backgroundPosition':\n case 'boxShadow':\n case 'dropShadow':\n case 'transitionProperty':\n // Forbidden prefixes\n escapedKeys.push(`\\\\[(?!((angle|color|length|list)\\:)|#|var\\\\().{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'backgroundSize':\n // Forbidden prefixes\n escapedKeys.push(`\\\\[length\\:.{1,}\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'backgroundImageUrl':\n // Forbidden prefixes\n escapedKeys.push(`.{1,}`);\n return '(' + escapedKeys.join('|') + ')';\n case 'backgroundImage':\n // Forbidden prefixes\n escapedKeys.push(`\\\\[url\\\\(.{1,}\\\\)\\\\]`);\n return '(' + escapedKeys.join('|') + ')';\n case 'order':\n case 'zIndex':\n escapedKeys.push(genericArbitraryOption);\n return '(' + escapedKeys.join('|') + ')';\n case 'fontWeight':\n case 'typography':\n case 'lineClamp':\n // Cannot be arbitrary?\n return '(' + escapedKeys.join('|') + ')';\n case 'aspectRatio':\n case 'flexGrow':\n case 'flexShrink':\n case 'fontFamily':\n case 'flex':\n case 'borderRadius':\n default:\n escapedKeys.push(genericArbitraryOption);\n return '(' + escapedKeys.join('|') + ')';\n }\n}\n\nconst cachedRegexes = new WeakMap();\n\n/**\n * Customize the regex based on config\n *\n * @param {String} re Regular expression\n * @param {Object} config The merged Tailwind CSS config\n * @returns {String} Patched version with config values and additional parameters\n */\nfunction patchRegex(re: string, config): string {\n if (!cachedRegexes.has(config)) {\n cachedRegexes.set(config, {});\n }\n const cache = cachedRegexes.get(config);\n if (re in cache) {\n return cache[re];\n }\n let patched = '\\\\!?';\n // Prefix\n if (config.prefix.length) {\n patched += escapeSpecialChars(config.prefix);\n }\n // Props\n let replaced = re;\n const propsRe = /\\$\\{(\\-?[a-z]*)\\}/gi;\n const res = replaced.matchAll(propsRe);\n const resArray = [...res];\n const props = resArray.map((arr) => arr[1]);\n if (props.length === 0) {\n return (cache[re] = `${patched}(${replaced})`);\n }\n // e.g. backgroundColor, letterSpacing, -margin...\n props.forEach((prop) => {\n const token = new RegExp('\\\\$\\\\{' + prop + '\\\\}');\n const isNegative = prop.substr(0, 1) === '-';\n const absoluteProp = isNegative ? prop.substr(1) : prop;\n if (prop === 'dark') {\n // Special case, not a default property from the theme\n replaced = replaced.replace(token, generateOptions(absoluteProp, [], config, isNegative));\n return `${patched}(${replaced})`;\n } else if (prop === 'arbitraryProperties') {\n // Special case\n replaced = replaced.replace(\n new RegExp('\\\\$\\\\{' + absoluteProp + '\\\\}'),\n generateOptions(absoluteProp, [], config, isNegative)\n );\n return `${patched}(${replaced})`;\n } else if (prop === 'backgroundImageUrl') {\n // Special case\n replaced = replaced.replace(new RegExp('\\\\$\\\\{' + prop + '\\\\}'), generateOptions(prop, [], config, false));\n return `${patched}(${replaced})`;\n } else if (!config.theme || !config.theme[absoluteProp]) {\n // prop not found in config\n return;\n }\n // Normal scenario\n const keys = Object.keys(config.theme[absoluteProp])\n .filter((key) => {\n if (isNegative) {\n // Negative prop cannot support NaN values and inherits positive values\n const val = config.theme[absoluteProp][key];\n const isCalc = typeof val === 'string' && val.indexOf('calc') === 0;\n const num = parseFloat(val);\n if (isCalc) {\n return true;\n }\n if (isNaN(num)) {\n return false;\n }\n } else if (key[0] === '-') {\n // Positive prop cannot use key starting with '-'\n return false;\n }\n return true;\n })\n .map((key) => {\n if (isNegative && key[0] === '-') {\n return key.substring(1);\n }\n return key;\n });\n if (keys.length === 0 || replaced.match(token) === null) {\n // empty array\n return;\n }\n const opts = generateOptions(absoluteProp, keys, config, isNegative);\n replaced = replaced.replace(token, opts);\n });\n return (cache[re] = `${patched}(${replaced})`);\n}\n\n/**\n * Generates a flatten array from the groups config\n *\n * @param {Array} groupsConfig The array of objects containing the regex\n * @param {Object} twConfig The merged config of Tailwind CSS\n * @returns {Array} Flatten array\n */\nfunction getGroups(groupsConfig: any[], twConfig = null) {\n const groups: any[] = [];\n groupsConfig.forEach((group: { members: any[] }) => {\n // e.g. SIZING or SPACING\n group.members.forEach((prop: { members: any[] }) => {\n // e.g. Width or Padding\n if (typeof prop.members === 'string') {\n // Unique property, like `width` limited to one value\n groups.push(prop.members);\n } else {\n // Multiple properties, like `padding`, `padding-top`...\n prop.members.forEach((subprop: { members: any }) => {\n groups.push(subprop.members);\n });\n }\n });\n });\n if (twConfig === null) {\n return groups;\n }\n return groups.map((re) => patchRegex(re, twConfig));\n}\n\n/**\n * Generates an array of empty arrays prior to grouping\n *\n * @param {Array} groups The array of objects containing the regex\n * @returns {Array} Array of empty arrays\n */\nfunction initGroupSlots(groups: any[]) {\n const slots: never[][] = [];\n groups.forEach((g: any) => slots.push([]));\n return slots;\n}\n\n/**\n * Searches for a match between classname and Tailwind CSS group\n *\n * @param {Array} name The target classname\n * @param {Array} arr The flatten array containing the regex\n * @param {String} separator The delimiter to be used between variants\n * @returns {Array} Array of empty arrays\n */\nfunction getGroupIndex(name: any, arr: any[], separator = ':') {\n const classSuffix = getSuffix(name, separator);\n let idx = arr.findIndex((pattern: any) => {\n const classRe = new RegExp(`^(${pattern})$`);\n return classRe.test(classSuffix);\n }, classSuffix);\n return idx;\n}\n\n/**\n * Generates a flatten array from the groups configKeys\n *\n * @param {Array} groupsConfig The array of objects containing the regex\n * @param {Object} twConfig The merged config of Tailwind CSS\n * @returns {Array} Flatten array\n */\nfunction getGroupConfigKeys(groupsConfig: any[]) {\n const groups: any[] = [];\n groupsConfig.forEach((group: { members: any[] }) => {\n // e.g. SIZING or SPACING\n group.members.forEach((prop: { members: any[]; configKey: any }) => {\n // e.g. Width or Padding\n if (typeof prop.members === 'string') {\n // Unique property, like `width` limited to one value\n groups.push(prop.configKey ? prop.configKey : null);\n } else {\n // Multiple properties, like `padding`, `padding-top`...\n prop.members.forEach((subprop: { configKey: any }) => {\n groups.push(subprop.configKey ? subprop.configKey : null);\n });\n }\n });\n });\n return groups;\n}\n\n/**\n * Returns the prefix (variants) of a className including the separator or an empty string if none\n *\n * @param {String} name Classname to be parsed\n * @param {String} separator The separator character as in config\n * @returns {String} The prefix\n */\nfunction getPrefix(name: string, separator: string | any[]) {\n const rootSeparator = String.raw`(? \"mask-type\"\n *\n * @see https://tailwindcss.com/docs/adding-custom-styles#arbitrary-properties\n * @param {String} name Classname suffix (without it variants) to be parsed\n * @param {String} separator The separator character as in config\n * @returns {String} The arbitrary property\n */\nfunction getArbitraryProperty(name: string, separator: any) {\n const arbitraryPropPattern = String.raw`^\\[([a-z\\-]*)${separator}\\.*`;\n const arbitraryPropRegExp = new RegExp(arbitraryPropPattern);\n const results = arbitraryPropRegExp.exec(name);\n return results === null ? '' : results[1];\n}\n\n/**\n * Get the last part of the full classname\n * e.g. \"lg:w-[100px]\" => \"w-[100px]\"\n *\n * @param {String} className The target classname\n * @param {String} separator The delimiter to be used between variants\n * @returns {String} The classname without its variants\n */\nfunction getSuffix(className: string, separator = ':') {\n const prefix = getPrefix(className, separator);\n return className.substring(prefix.length);\n}\n\n/**\n * Find the group of a classname\n *\n * @param {String} name Classname to be find using patterns (without modifiers)\n * @param {Array} group The group being tested\n * @param {Object} config Tailwind CSS config\n * @param {String} parentType The name of the parent group\n * @returns {Object} The infos\n */\nfunction findInGroup(name: string, group: { members: any[]; type: null | undefined }, config: any, parentType = null) {\n if (typeof group.members === 'string') {\n const pattern = patchRegex(group.members, config);\n const classRe = new RegExp(`^(${pattern})$`);\n if (classRe.test(name)) {\n const res = classRe.exec(name);\n let value = '';\n if (res && res.groups) {\n if (res.groups.value) {\n value = res.groups.value;\n }\n if (res.groups.negativeValue) {\n value = '-' + res.groups.negativeValue;\n }\n }\n return {\n group: parentType,\n ...group,\n value: value,\n };\n } else {\n return null;\n }\n } else {\n const innerGroup = group.members.find((v: any) => findInGroup(name, v, config, group.type));\n if (!innerGroup) {\n return null;\n } else {\n return findInGroup(name, innerGroup, config, group.type);\n }\n }\n}\n\n/**\n * Returns an object with parsed properties\n *\n * @param {String} name Classname to be parsed\n * @param {Array} arr The flatten array containing the regex\n * @param {Object} config The Tailwind CSS config\n * @param {Number} index The index\n * @returns {Object} Parsed infos\n */\nfunction parseClassname(name: string, arr: any[], config: { separator: string | undefined }, index = null) {\n const leadingRe = new RegExp('^(?\\\\s*)');\n const trailingRe = new RegExp('(?\\\\s*)$');\n let leading = '';\n let core = '';\n let trailing = '';\n const leadingRes = leadingRe.exec(name);\n if (leadingRes && leadingRes.groups) {\n leading = leadingRes.groups.leading || '';\n }\n const trailingRes = trailingRe.exec(name);\n if (trailingRes && trailingRes.groups) {\n trailing = trailingRes.groups.trailing || '';\n }\n core = name.substring(leading.length, name.length - trailing.length);\n const variants = getPrefix(core, config.separator);\n const classSuffix = getSuffix(core, config.separator);\n let slot = null;\n arr.forEach((group: any) => {\n if (slot === null) {\n const found = findInGroup(classSuffix, group, config);\n if (found) {\n slot = found;\n }\n }\n });\n const value = slot ? slot.value : '';\n const isNegative = value[0] === '-';\n const off = isNegative ? 1 : 0;\n const body = core.substr(0, core.length - value.length + off).substr(variants.length + off);\n return {\n index: index,\n name: core,\n variants: variants,\n parentType: slot ? slot.group : '',\n body: body,\n value: value,\n shorthand: slot && slot.shorthand ? slot.shorthand : '',\n leading: leading,\n trailing: trailing,\n important: body.substr(0, 1) === '!',\n };\n}\n\nexport default {\n initGroupSlots,\n getArbitraryProperty,\n getGroups,\n getGroupIndex,\n getGroupConfigKeys,\n getPrefix,\n getSuffix,\n parseClassname,\n};\n","/**\n * @fileoverview Warns about `-` prefixed classnames using arbitrary values\n * @author François Massart\n */\n'use strict';\n\nimport astUtil from '../util/ast';\nimport customConfig from '../util/customConfig';\nimport docsUrl from '../util/docsUrl';\nimport groupUtil from '../util/groupMethods';\nimport parserUtil from '../util/parser';\nimport getOption from '../util/settings';\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst NEGATIVE_ARBITRARY_VALUE = `Arbitrary value classname '{{classname}}' should not start with a dash (-)`;\n\nexport default {\n meta: {\n docs: {\n description: 'Warns about dash prefixed classnames using arbitrary values',\n category: 'Best Practices',\n recommended: true,\n url: docsUrl('enforces-negative-arbitrary-values'),\n },\n messages: {\n negativeArbitraryValue: NEGATIVE_ARBITRARY_VALUE,\n },\n fixable: null,\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n /**\n * Recursive function crawling into child nodes\n * @param {ASTNode} node The root node of the current parsing\n * @param {ASTNode} arg The child node of node\n * @returns {void}\n */\n const parseForNegativeArbitraryClassNames = (node, arg = null) => {\n let originalClassNamesValue = null;\n if (arg === null) {\n originalClassNamesValue = astUtil.extractValueFromNode(node);\n } else {\n switch (arg.type) {\n case 'Identifier':\n return;\n case 'TemplateLiteral':\n arg.expressions.forEach((exp) => {\n parseForNegativeArbitraryClassNames(node, exp);\n });\n arg.quasis.forEach((quasis) => {\n parseForNegativeArbitraryClassNames(node, quasis);\n });\n return;\n case 'ConditionalExpression':\n parseForNegativeArbitraryClassNames(node, arg.consequent);\n parseForNegativeArbitraryClassNames(node, arg.alternate);\n return;\n case 'LogicalExpression':\n parseForNegativeArbitraryClassNames(node, arg.right);\n return;\n case 'ArrayExpression':\n arg.elements.forEach((el) => {\n parseForNegativeArbitraryClassNames(node, el);\n });\n return;\n case 'ObjectExpression':\n const isUsedByClassNamesPlugin = node.callee && node.callee.name === 'classnames';\n const isVue = node.key && node.key.type === 'VDirectiveKey';\n arg.properties.forEach((prop) => {\n const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value;\n parseForNegativeArbitraryClassNames(node, propVal);\n });\n return;\n case 'Property':\n parseForNegativeArbitraryClassNames(node, arg.key);\n return;\n case 'Literal':\n originalClassNamesValue = arg.value;\n break;\n case 'TemplateElement':\n originalClassNamesValue = arg.value.raw;\n if (originalClassNamesValue === '') {\n return;\n }\n break;\n }\n }\n\n let { classNames } = astUtil.extractClassnamesFromValue(originalClassNamesValue);\n\n const detected = classNames.filter((cls) => {\n const suffix = groupUtil.getSuffix(cls, mergedConfig.separator);\n const negArbitraryValRegEx =\n /^\\-((inset|scale)(\\-(y|x))?|top|right|bottom|left|top|z|order|(scroll\\-)?m(y|x|t|r|l|b)?|(skew|space|translate)\\-(y|x)|rotate|tracking|indent|(backdrop\\-)?hue\\-rotate)\\-\\[.*\\]$/i;\n return negArbitraryValRegEx.test(suffix);\n });\n\n detected.forEach((className) => {\n context.report({\n node,\n messageId: 'negativeArbitraryValue',\n data: {\n classname: className,\n },\n });\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n parseForNegativeArbitraryClassNames(node);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n parseForNegativeArbitraryClassNames(node, node.value.expression);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n node.arguments.forEach((arg) => {\n parseForNegativeArbitraryClassNames(node, arg);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n parseForNegativeArbitraryClassNames(node, node.quasi);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n parseForNegativeArbitraryClassNames(node);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n parseForNegativeArbitraryClassNames(node, arg);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n parseForNegativeArbitraryClassNames(node, prop);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","/**\n * @fileoverview Default groups for Tailwind CSS classnames\n * @description The hierarchy of `members` can be useful to detect redundant and/or contradicting classnames\n * @version v3.1.3\n * @see https://tailwindcss.com/docs\n * @author François Massart\n */\nexport const groups = [\n {\n type: 'Core Concepts',\n members: [\n {\n type: 'Hover, Focus, & Other States',\n members: [\n {\n type: 'group',\n members: 'group',\n },\n {\n type: 'peer',\n members: 'peer',\n },\n ],\n },\n {\n type: 'Dark Mode',\n members: '${dark}',\n },\n {\n type: 'Arbitrary properties',\n members: '${arbitraryProperties}',\n },\n ],\n },\n {\n type: 'Layout',\n members: [\n {\n type: 'Aspect Ratio',\n members: 'aspect\\\\-(?${aspectRatio})',\n configKey: 'aspectRatio',\n },\n {\n type: 'Container',\n members: 'container',\n },\n {\n type: 'Columns',\n members: 'columns\\\\-(?${columns})',\n configKey: 'columns',\n },\n {\n type: 'Break After',\n members: 'break\\\\-after\\\\-(?auto|avoid|all|avoid\\\\-page|page|left|right|column)',\n },\n {\n type: 'Break Before',\n members: 'break\\\\-before\\\\-(?auto|avoid|all|avoid\\\\-page|page|left|right|column)',\n },\n {\n type: 'Break Inside',\n members: 'break\\\\-inside\\\\-(?auto|avoid|avoid\\\\-page|avoid\\\\-column)',\n },\n {\n type: 'Box Decoration Break',\n members: 'box\\\\-decoration\\\\-(?clone|slice)',\n },\n {\n type: 'Deprecated Box Decoration Break',\n members: 'decoration\\\\-(?clone|slice)',\n deprecated: true,\n },\n {\n type: 'Box Sizing',\n members: 'box\\\\-(?border|content)',\n },\n {\n type: 'Display',\n members:\n 'block|flex|grid|flow\\\\-root|contents|hidden|inline(\\\\-(block|flex|table|grid))?|table\\\\-(column|footer|header|row)\\\\-group|table(\\\\-(caption|row|cell|column))?|list\\\\-item',\n },\n {\n type: 'Floats',\n members: 'float\\\\-(?right|left|none)',\n },\n {\n type: 'Clear',\n members: 'clear\\\\-(?left|right|both|none)',\n },\n {\n type: 'Isolation',\n members: '(isolate|isolation\\\\-auto)',\n },\n {\n type: 'Object Fit',\n members: 'object\\\\-(?contain|cover|fill|none|scale\\\\-down)',\n },\n {\n type: 'Object Position',\n members: 'object\\\\-(?${objectPosition})',\n configKey: 'objectPosition',\n },\n {\n type: 'Overflow',\n members: [\n {\n type: 'overflow',\n members: 'overflow\\\\-(?auto|hidden|clip|visible|scroll)',\n shorthand: 'all',\n body: 'overflow',\n },\n {\n type: 'overflow-x',\n members: 'overflow\\\\-x\\\\-(?auto|hidden|clip|visible|scroll)',\n shorthand: 'x',\n body: 'overflow-x',\n },\n {\n type: 'overflow-y',\n members: 'overflow\\\\-y\\\\-(?auto|hidden|clip|visible|scroll)',\n shorthand: 'y',\n body: 'overflow-y',\n },\n ],\n },\n {\n type: 'Overscroll Behavior',\n members: [\n {\n type: 'overscroll',\n members: 'overscroll\\\\-(?auto|contain|none)',\n shorthand: 'all',\n body: 'overscroll',\n },\n {\n type: 'overscroll-x',\n members: 'overscroll\\\\-x\\\\-(?auto|contain|none)',\n shorthand: 'x',\n body: 'overscroll-x',\n },\n {\n type: 'overscroll-y',\n members: 'overscroll\\\\-y\\\\-(?auto|contain|none)',\n shorthand: 'y',\n body: 'overscroll-y',\n },\n ],\n },\n {\n type: 'Position',\n members: 'static|fixed|absolute|relative|sticky',\n },\n {\n type: 'Top / Right / Bottom / Left',\n members: [\n {\n type: 'inset',\n members: '(inset\\\\-(?${inset})|\\\\-inset\\\\-(?${-inset}))',\n shorthand: 'all',\n body: 'inset',\n configKey: 'inset',\n },\n {\n type: 'inset-y',\n members: '(inset\\\\-y\\\\-(?${inset})|\\\\-inset\\\\-y\\\\-(?${-inset}))',\n shorthand: 'y',\n body: 'inset-y',\n configKey: 'inset',\n },\n {\n type: 'inset-x',\n members: '(inset\\\\-x\\\\-(?${inset})|\\\\-inset\\\\-x\\\\-(?${-inset}))',\n shorthand: 'x',\n body: 'inset-x',\n configKey: 'inset',\n },\n {\n type: 'top',\n members: '(top\\\\-(?${inset})|\\\\-top\\\\-(?${-inset}))',\n shorthand: 't',\n body: 'top',\n configKey: 'inset',\n },\n {\n type: 'right',\n members: '(right\\\\-(?${inset})|\\\\-right\\\\-(?${-inset}))',\n shorthand: 'r',\n body: 'right',\n configKey: 'inset',\n },\n {\n type: 'bottom',\n members: '(bottom\\\\-(?${inset})|\\\\-bottom\\\\-(?${-inset}))',\n shorthand: 'b',\n body: 'bottom',\n configKey: 'inset',\n },\n {\n type: 'left',\n members: '(left\\\\-(?${inset})|\\\\-left\\\\-(?${-inset}))',\n shorthand: 'l',\n body: 'left',\n configKey: 'inset',\n },\n ],\n },\n {\n type: 'Visibility',\n members: '(in)?visible|collapse',\n },\n {\n type: 'Z-Index',\n members: '(z\\\\-(?${zIndex})|\\\\-z\\\\-(?${-zIndex}))',\n configKey: 'zIndex',\n },\n ],\n },\n {\n type: 'Flexbox & Grid',\n members: [\n {\n type: 'Flex Basis',\n members: 'basis\\\\-(?${flexBasis})',\n configKey: 'flexBasis',\n },\n {\n type: 'Flex Direction',\n members: 'flex\\\\-(row|col)(\\\\-reverse)?',\n },\n {\n type: 'Flex Wrap',\n members: 'flex\\\\-(wrap(\\\\-reverse)?|nowrap)',\n },\n {\n type: 'Flex',\n members: 'flex\\\\-(?${flex})',\n configKey: 'flex',\n },\n {\n type: 'Flex Grow',\n members: 'grow(\\\\-(?${flexGrow}))?',\n configKey: 'flexGrow',\n },\n {\n type: 'Deprecated Flex Grow',\n members: 'flex\\\\-grow(\\\\-(?${flexGrow}))?',\n deprecated: true,\n configKey: 'flexGrow',\n },\n {\n type: 'Flex Shrink',\n members: 'shrink(\\\\-(?${flexShrink}))?',\n configKey: 'flexShrink',\n },\n {\n type: 'Deprecated Flex Shrink',\n members: 'flex\\\\-shrink(\\\\-(?${flexShrink}))?',\n deprecated: true,\n configKey: 'flexShrink',\n },\n {\n type: 'Order',\n members: '(order\\\\-(?${order})|\\\\-order\\\\-(?${-order}))',\n configKey: 'order',\n },\n {\n type: 'Grid Template Columns',\n members: 'grid\\\\-cols\\\\-(?${gridTemplateColumns})',\n configKey: 'gridTemplateColumns',\n },\n {\n type: 'Grid Column Start / End',\n members: [\n {\n type: 'grid-column',\n members: 'col\\\\-(?${gridColumn})',\n configKey: 'gridColumn',\n },\n {\n type: 'grid-column-start',\n members: 'col\\\\-start\\\\-(?${gridColumnStart})',\n configKey: 'gridColumnStart',\n },\n {\n type: 'grid-column-end',\n members: 'col\\\\-end\\\\-(?${gridColumnEnd})',\n configKey: 'gridColumnEnd',\n },\n ],\n },\n {\n type: 'Grid Template Rows',\n members: 'grid\\\\-rows\\\\-(?${gridTemplateRows})',\n configKey: 'gridTemplateRows',\n },\n {\n type: 'Grid Row Start / End',\n members: [\n {\n type: 'grid-row',\n members: 'row\\\\-(?${gridRow})',\n configKey: 'gridRow',\n },\n {\n type: 'grid-row-start',\n members: 'row\\\\-start\\\\-(?${gridRowStart})',\n configKey: 'gridRowStart',\n },\n {\n type: 'grid-row-end',\n members: 'row\\\\-end\\\\-(?${gridRowEnd})',\n configKey: 'gridRowEnd',\n },\n ],\n },\n {\n type: 'Grid Auto Flow',\n members: 'grid\\\\-flow\\\\-(dense|(row|col)(\\\\-dense)?)',\n },\n {\n type: 'Grid Auto Columns',\n members: 'auto\\\\-cols\\\\-(?${gridAutoColumns})',\n configKey: 'gridAutoColumns',\n },\n {\n type: 'Grid Auto Rows',\n members: 'auto\\\\-rows\\\\-(?${gridAutoRows})',\n configKey: 'gridAutoRows',\n },\n {\n type: 'Gap',\n members: [\n {\n type: 'gap',\n members: 'gap\\\\-(?${gap})',\n shorthand: 'all',\n body: 'gap',\n configKey: 'gap',\n },\n {\n type: 'column-gap',\n members: 'gap\\\\-x\\\\-(?${gap})',\n shorthand: 'x',\n body: 'gap-x',\n configKey: 'gap',\n },\n {\n type: 'row-gap',\n members: 'gap\\\\-y\\\\-(?${gap})',\n shorthand: 'y',\n body: 'gap-y',\n configKey: 'gap',\n },\n ],\n },\n {\n type: 'Justify Content',\n members: 'justify\\\\-(start|end|center|between|around|evenly)',\n },\n {\n type: 'Justify Items',\n members: 'justify\\\\-items\\\\-(start|end|center|stretch)',\n },\n {\n type: 'Justify Self',\n members: 'justify\\\\-self\\\\-(auto|start|end|center|stretch)',\n },\n {\n type: 'Align Content',\n members: 'content\\\\-(center|start|end|between|around|evenly|baseline)',\n },\n {\n type: 'Align Items',\n members: 'items\\\\-(start|end|center|baseline|stretch)',\n },\n {\n type: 'Align Self',\n members: 'self\\\\-(auto|start|end|center|stretch|baseline)',\n },\n {\n type: 'Place Content',\n members: 'place\\\\-content\\\\-(center|start|end|between|around|evenly|stretch|baseline)',\n },\n {\n type: 'Place Items',\n members: 'place\\\\-items\\\\-(start|end|center|stretch|baseline)',\n },\n {\n type: 'Place Self',\n members: 'place\\\\-self\\\\-(auto|start|end|center|stretch)',\n },\n ],\n },\n {\n type: 'Spacing',\n members: [\n {\n type: 'Padding',\n members: [\n {\n type: 'p',\n members: 'p\\\\-(?${padding})',\n shorthand: 'all',\n body: 'p',\n configKey: 'padding',\n },\n {\n type: 'py',\n members: 'py\\\\-(?${padding})',\n shorthand: 'y',\n body: 'py',\n configKey: 'padding',\n },\n {\n type: 'px',\n members: 'px\\\\-(?${padding})',\n shorthand: 'x',\n body: 'px',\n configKey: 'padding',\n },\n {\n type: 'pt',\n members: 'pt\\\\-(?${padding})',\n shorthand: 't',\n body: 'pt',\n configKey: 'padding',\n },\n {\n type: 'pr',\n members: 'pr\\\\-(?${padding})',\n shorthand: 'r',\n body: 'pr',\n configKey: 'padding',\n },\n {\n type: 'pb',\n members: 'pb\\\\-(?${padding})',\n shorthand: 'b',\n body: 'pb',\n configKey: 'padding',\n },\n {\n type: 'pl',\n members: 'pl\\\\-(?${padding})',\n shorthand: 'l',\n body: 'pl',\n configKey: 'padding',\n },\n ],\n },\n {\n type: 'Margin',\n members: [\n {\n type: 'm',\n members: '(m\\\\-(?${margin})|\\\\-m\\\\-(?${-margin}))',\n shorthand: 'all',\n body: 'm',\n configKey: 'margin',\n },\n {\n type: 'my',\n members: '(my\\\\-(?${margin})|\\\\-my\\\\-(?${-margin}))',\n shorthand: 'y',\n body: 'my',\n configKey: 'margin',\n },\n {\n type: 'mx',\n members: '(mx\\\\-(?${margin})|\\\\-mx\\\\-(?${-margin}))',\n shorthand: 'x',\n body: 'mx',\n configKey: 'margin',\n },\n {\n type: 'mt',\n members: '(mt\\\\-(?${margin})|\\\\-mt\\\\-(?${-margin}))',\n shorthand: 't',\n body: 'mt',\n configKey: 'margin',\n },\n {\n type: 'mr',\n members: '(mr\\\\-(?${margin})|\\\\-mr\\\\-(?${-margin}))',\n shorthand: 'r',\n body: 'mr',\n configKey: 'margin',\n },\n {\n type: 'mb',\n members: '(mb\\\\-(?${margin})|\\\\-mb\\\\-(?${-margin}))',\n shorthand: 'b',\n body: 'mb',\n configKey: 'margin',\n },\n {\n type: 'ml',\n members: '(ml\\\\-(?${margin})|\\\\-ml\\\\-(?${-margin}))',\n shorthand: 'l',\n body: 'ml',\n configKey: 'margin',\n },\n ],\n },\n {\n type: 'Space Between',\n members: [\n {\n type: 'space-y',\n members: '(space\\\\-y\\\\-(?${space})|\\\\-space\\\\-y\\\\-(?${-space}))',\n configKey: 'space',\n },\n {\n type: 'space-x',\n members: '(space\\\\-x\\\\-(?${space})|\\\\-space\\\\-x\\\\-(?${-space}))',\n configKey: 'space',\n },\n {\n type: 'space-y-reverse',\n members: 'space\\\\-y\\\\-reverse',\n },\n {\n type: 'space-x-reverse',\n members: 'space\\\\-x\\\\-reverse',\n },\n ],\n },\n ],\n },\n {\n type: 'Sizing',\n members: [\n {\n type: 'Width',\n members: 'w\\\\-(?${width})',\n configKey: 'width',\n },\n {\n type: 'Min-Width',\n members: 'min\\\\-w\\\\-(?${minWidth})',\n configKey: 'minWidth',\n },\n {\n type: 'Max-Width',\n members: 'max\\\\-w\\\\-(?${maxWidth})',\n configKey: 'maxWidth',\n },\n {\n type: 'Height',\n members: 'h\\\\-(?${height})',\n configKey: 'height',\n },\n {\n type: 'Min-Height',\n members: 'min\\\\-h\\\\-(?${minHeight})',\n configKey: 'minHeight',\n },\n {\n type: 'Max-Height',\n members: 'max\\\\-h\\\\-(?${maxHeight})',\n configKey: 'maxHeight',\n },\n {\n type: 'Size',\n members: 'size\\\\-(?${size})',\n configKey: 'size',\n },\n ],\n },\n {\n type: 'Typography',\n members: [\n {\n type: 'Font Family',\n members: 'font\\\\-(?${fontFamily})',\n configKey: 'fontFamily',\n },\n {\n type: 'Font Size',\n members: 'text\\\\-(?${fontSize})',\n configKey: 'fontSize',\n },\n {\n type: 'Font Smoothing',\n members: '(subpixel\\\\-)?antialiased',\n },\n {\n type: 'Font Style',\n members: '(not\\\\-)?italic',\n },\n {\n type: 'Font Weight',\n members: 'font\\\\-(?${fontWeight})',\n configKey: 'fontWeight',\n },\n {\n type: 'Font Variant Numeric',\n members: [\n {\n type: 'Normal Nums',\n members: 'normal\\\\-nums',\n },\n {\n type: 'Ordinal',\n members: 'ordinal',\n },\n {\n type: 'Slashed Zero',\n members: 'slashed-zero',\n },\n {\n type: 'Style Nums',\n members: '(lining|oldstyle)\\\\-nums',\n },\n {\n type: 'Proportinal or Tabular',\n members: '(proportional|tabular)\\\\-nums',\n },\n {\n type: 'Fractions',\n members: '(diagonal|stacked)\\\\-fractions',\n },\n ],\n },\n {\n type: 'Letter Spacing',\n members: '(tracking\\\\-(?${letterSpacing})|\\\\-tracking\\\\-(?${-letterSpacing}))',\n configKey: 'letterSpacing',\n },\n // {\n // type: 'Line Clamp',\n // members: 'line\\\\-clamp\\\\-(?${lineClamp})',\n // configKey: 'lineClamp',\n // },\n {\n type: 'Line Height',\n members: 'leading\\\\-(?${lineHeight})',\n configKey: 'lineHeight',\n },\n // {\n // type: 'List Style Image',\n // members: 'list\\\\-image\\\\-(?${listStyleImage})',\n // configKey: 'listStyleImage',\n // },\n {\n type: 'List Style Type',\n members: 'list\\\\-(?${listStyleType})',\n configKey: 'listStyleType',\n },\n {\n type: 'List Style Position',\n members: 'list\\\\-(in|out)side',\n },\n {\n type: 'Text Alignment',\n members: 'text\\\\-(left|center|right|justify|start|end)',\n },\n {\n type: 'Text Color',\n members: 'text\\\\-(?${textColor})',\n configKey: 'colors',\n },\n {\n type: 'Text Decoration',\n members: '(no\\\\-)?underline|overline|line\\\\-through',\n },\n {\n type: 'Text Decoration Color',\n members: 'decoration\\\\-(?${colors})',\n configKey: 'colors',\n },\n {\n type: 'Text Decoration Style',\n members: 'decoration\\\\-(solid|double|dotted|dashed|wavy)',\n },\n {\n type: 'Text Decoration Thickness',\n members: 'decoration\\\\-(?${textDecorationThickness})',\n configKey: 'textDecorationThickness',\n },\n {\n type: 'Text Underline Offset',\n members: 'underline\\\\-offset\\\\-(?${textUnderlineOffset})',\n configKey: 'textUnderlineOffset',\n },\n {\n type: 'Text Transform',\n members: '(upper|lower|normal\\\\-)case|capitalize',\n },\n {\n type: 'Text Overflow',\n members: 'truncate|text\\\\-(ellipsis|clip)',\n },\n {\n type: 'Deprecated Text Overflow',\n members: 'overflow\\\\-(ellipsis|clip)',\n deprecated: true,\n },\n {\n type: 'Text Wrap',\n members: 'text\\\\-(wrap|nowrap|balance|pretty)',\n },\n {\n type: 'Text Indent',\n members: '(indent\\\\-(?${textIndent})|\\\\-indent\\\\-(?${-textIndent}))',\n configKey: 'textIndent',\n },\n {\n type: 'Vertical Alignment',\n members: 'align\\\\-(baseline|top|middle|bottom|text\\\\-(top|bottom)|sub|super)',\n },\n {\n type: 'Whitespace',\n members: 'whitespace\\\\-(normal|nowrap|pre(\\\\-(line|wrap))?)',\n },\n {\n type: 'Word Break',\n members: 'break\\\\-(normal|words|all|keep)',\n },\n {\n type: 'Content',\n members: 'content\\\\-(?${content})',\n configKey: 'content',\n },\n ],\n },\n {\n type: 'Backgrounds',\n members: [\n {\n type: 'Background Image URL',\n members: 'bg\\\\-\\\\[(image\\\\:|url\\\\()(?${backgroundImageUrl})\\\\)\\\\]',\n },\n {\n type: 'Background Attachment',\n members: 'bg\\\\-(fixed|local|scroll)',\n },\n {\n type: 'Background Clip',\n members: 'bg\\\\-clip\\\\-(border|padding|content|text)',\n },\n {\n type: 'Background Color',\n members: 'bg\\\\-(?${colors})',\n configKey: 'colors',\n },\n {\n type: 'Deprecated Background Opacity',\n members: 'bg\\\\-opacity\\\\-(?${backgroundOpacity})',\n deprecated: true,\n },\n {\n type: 'Background Origin',\n members: 'bg\\\\-origin\\\\-(border|padding|content)',\n },\n {\n type: 'Background Position',\n members: 'bg\\\\-(?${backgroundPosition})',\n configKey: 'backgroundPosition',\n },\n {\n type: 'Background Repeat',\n members: 'bg\\\\-(no\\\\-repeat|repeat(\\\\-(x|y|round|space))?)',\n },\n {\n type: 'Background Size',\n members: 'bg\\\\-(?${backgroundSize})',\n configKey: 'backgroundSize',\n },\n {\n type: 'Background Image',\n members: 'bg\\\\-(?${backgroundImage})',\n configKey: 'backgroundImage',\n },\n {\n type: 'Gradient Color Stops',\n members: [\n {\n type: 'from',\n members: 'from\\\\-(?${gradientColorStopPositions})',\n configKey: 'gradientColorStopPositions',\n },\n {\n type: 'via',\n members: 'via\\\\-(?${gradientColorStopPositions})',\n configKey: 'gradientColorStopPositions',\n },\n {\n type: 'to',\n members: 'to\\\\-(?${gradientColorStopPositions})',\n configKey: 'gradientColorStopPositions',\n },\n ],\n },\n ],\n },\n {\n type: 'Borders',\n members: [\n {\n type: 'Border Radius',\n members: [\n {\n type: 'border-radius',\n members: 'rounded(\\\\-(?${borderRadius}))?',\n shorthand: 'all',\n body: 'rounded',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-top',\n members: 'rounded\\\\-t(\\\\-(?${borderRadius}))?',\n shorthand: 't',\n body: 'rounded-t',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-right',\n members: 'rounded\\\\-r(\\\\-(?${borderRadius}))?',\n shorthand: 'r',\n body: 'rounded-r',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-bottom',\n members: 'rounded\\\\-b(\\\\-(?${borderRadius}))?',\n shorthand: 'b',\n body: 'rounded-b',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-left',\n members: 'rounded\\\\-l(\\\\-(?${borderRadius}))?',\n shorthand: 'l',\n body: 'rounded-l',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-top-left',\n members: 'rounded\\\\-tl(\\\\-(?${borderRadius}))?',\n shorthand: 'tl',\n body: 'rounded-tl',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-top-right',\n members: 'rounded\\\\-tr(\\\\-(?${borderRadius}))?',\n shorthand: 'tr',\n body: 'rounded-tr',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-bottom-right',\n members: 'rounded\\\\-br(\\\\-(?${borderRadius}))?',\n shorthand: 'br',\n body: 'rounded-br',\n configKey: 'borderRadius',\n },\n {\n type: 'border-radius-bottom-left',\n members: 'rounded\\\\-bl(\\\\-(?${borderRadius}))?',\n shorthand: 'bl',\n body: 'rounded-bl',\n configKey: 'borderRadius',\n },\n ],\n },\n {\n type: 'Border Width',\n members: [\n {\n type: 'border-width',\n members: 'border(\\\\-(?${borderWidth}))?',\n shorthand: 'all',\n body: 'border',\n configKey: 'borderWidth',\n },\n {\n type: 'border-y-width',\n members: 'border\\\\-y(\\\\-(?${borderWidth}))?',\n shorthand: 'y',\n body: 'border-y',\n configKey: 'borderWidth',\n },\n {\n type: 'border-x-width',\n members: 'border\\\\-x(\\\\-(?${borderWidth}))?',\n shorthand: 'x',\n body: 'border-x',\n configKey: 'borderWidth',\n },\n {\n type: 'border-top-width',\n members: 'border\\\\-t(\\\\-(?${borderWidth}))?',\n shorthand: 't',\n body: 'border-t',\n configKey: 'borderWidth',\n },\n {\n type: 'border-right-width',\n members: 'border\\\\-r(\\\\-(?${borderWidth}))?',\n shorthand: 'r',\n body: 'border-r',\n configKey: 'borderWidth',\n },\n {\n type: 'border-bottom-width',\n members: 'border\\\\-b(\\\\-(?${borderWidth}))?',\n shorthand: 'b',\n body: 'border-b',\n configKey: 'borderWidth',\n },\n {\n type: 'border-left-width',\n members: 'border\\\\-l(\\\\-(?${borderWidth}))?',\n shorthand: 'l',\n body: 'border-l',\n configKey: 'borderWidth',\n },\n ],\n },\n {\n type: 'Border Color',\n members: [\n {\n type: 'border-color',\n members: 'border\\\\-(?${borderColor})',\n shorthand: 'all',\n body: 'border',\n configKey: 'borderColor',\n },\n {\n type: 'border-y-color',\n members: 'border\\\\-y\\\\-(?${borderColor})',\n shorthand: 'y',\n body: 'border-y',\n configKey: 'borderColor',\n },\n {\n type: 'border-x-color',\n members: 'border\\\\-x\\\\-(?${borderColor})',\n shorthand: 'x',\n body: 'border-x',\n configKey: 'borderColor',\n },\n {\n type: 'border-top-color',\n members: 'border\\\\-t\\\\-(?${borderColor})',\n shorthand: 't',\n body: 'border-t',\n configKey: 'borderColor',\n },\n {\n type: 'border-right-color',\n members: 'border\\\\-r\\\\-(?${borderColor})',\n shorthand: 'r',\n body: 'border-r',\n configKey: 'borderColor',\n },\n {\n type: 'border-bottom-color',\n members: 'border\\\\-b\\\\-(?${borderColor})',\n shorthand: 'b',\n body: 'border-b',\n configKey: 'borderColor',\n },\n {\n type: 'border-left-color',\n members: 'border\\\\-l\\\\-(?${borderColor})',\n shorthand: 'l',\n body: 'border-l',\n configKey: 'borderColor',\n },\n ],\n },\n {\n type: 'Deprecated Border Opacity',\n members: 'border\\\\-opacity\\\\-(?${borderOpacity})',\n deprecated: true,\n configKey: 'borderOpacity',\n },\n {\n type: 'Border Style',\n members: 'border\\\\-(solid|dashed|dotted|double|hidden|none)',\n },\n {\n type: 'Divide Width',\n members: [\n {\n type: 'divide-y',\n members: 'divide\\\\-y(\\\\-(?${divideWidth}))?',\n configKey: 'divideWidth',\n },\n {\n type: 'divide-x',\n members: 'divide\\\\-x(\\\\-(?${divideWidth}))?',\n configKey: 'divideWidth',\n },\n {\n type: 'divide-y-reverse',\n members: 'divide\\\\-y\\\\-reverse',\n },\n {\n type: 'divide-x-reverse',\n members: 'divide\\\\-x\\\\-reverse',\n },\n ],\n },\n {\n type: 'Divide Color',\n members: 'divide\\\\-(?${divideColor})',\n configKey: 'divideColor',\n },\n {\n type: 'Divide Style',\n members: 'divide\\\\-(solid|dashed|dotted|double|none)',\n },\n {\n type: 'Outline Width',\n members: 'outline\\\\-(?${outlineWidth})',\n configKey: 'outlineWidth',\n },\n {\n type: 'Outline Color',\n members: 'outline\\\\-(?${outlineColor})',\n configKey: 'outlineColor',\n },\n {\n type: 'Outline Style',\n members: 'outline(\\\\-(none|dashed|dotted|double|hidden))?',\n },\n {\n type: 'Outline Offset',\n members:\n '(outline\\\\-offset\\\\-(?${outlineOffset})|\\\\-outline\\\\-offset\\\\-(?${-outlineOffset}))',\n configKey: 'outlineOffset',\n },\n {\n type: 'Ring Width',\n members: [\n {\n type: 'ring',\n members: 'ring(\\\\-(?${ringWidth}))?',\n configKey: 'ringWidth',\n },\n ],\n },\n {\n type: 'Ring Inset',\n members: [\n {\n type: 'ring-inset',\n members: 'ring\\\\-inset',\n },\n ],\n },\n {\n type: 'Ring Color',\n members: 'ring\\\\-(?${colors})',\n configKey: 'colors',\n },\n {\n type: 'Deprecated Ring Opacity',\n members: 'ring\\\\-opacity\\\\-(?${ringOpacity})',\n deprecated: true,\n configKey: 'ringOpacity',\n },\n {\n type: 'Ring Offset Width',\n members: 'ring\\\\-offset\\\\-(?${ringOffsetWidth})',\n configKey: 'ringOffsetWidth',\n },\n {\n type: 'Ring Offset Color',\n members: 'ring\\\\-offset\\\\-(?${colors})',\n configKey: 'colors',\n },\n ],\n },\n {\n type: 'Effects',\n members: [\n {\n type: 'Box Shadow',\n members: 'shadow(\\\\-(?${boxShadow}))?',\n configKey: 'boxShadow',\n },\n {\n type: 'Box Shadow Color',\n members: 'shadow(\\\\-(?${boxShadowColor}))?',\n configKey: 'boxShadowColor',\n },\n {\n type: 'Opacity',\n members: 'opacity\\\\-(?${opacity})',\n configKey: 'opacity',\n },\n {\n type: 'Mix Blend Mode',\n members:\n 'mix\\\\-blend\\\\-(normal|multiply|screen|overlay|darken|lighten|color\\\\-(burn|dodge)|(hard|soft)\\\\-light|difference|exclusion|hue|saturation|color|luminosity|plus\\\\-lighter)',\n },\n {\n type: 'Background Blend Mode',\n members:\n 'bg\\\\-blend\\\\-(normal|multiply|screen|overlay|darken|lighten|color\\\\-(dodge|burn)|(hard|soft)\\\\-light|difference|exclusion|hue|saturation|color|luminosity)',\n },\n ],\n },\n {\n type: 'Filters',\n members: [\n {\n type: 'Deprecated Filter',\n members: 'filter',\n deprecated: true,\n },\n {\n type: 'Blur',\n members: 'blur(\\\\-(?${blur}))?',\n configKey: 'blur',\n },\n {\n type: 'Brightness',\n members: 'brightness\\\\-(?${brightness})',\n configKey: 'brightness',\n },\n {\n type: 'Contrast',\n members: 'contrast\\\\-(?${contrast})',\n configKey: 'contrast',\n },\n {\n type: 'Drop Shadow',\n members: 'drop\\\\-shadow(\\\\-(?${dropShadow}))?',\n configKey: 'dropShadow',\n },\n {\n type: 'Grayscale',\n members: 'grayscale(\\\\-(?${grayscale}))?',\n configKey: 'grayscale',\n },\n {\n type: 'Hue Rotate',\n members: 'hue\\\\-rotate\\\\-(?${hueRotate})|\\\\-hue\\\\-rotate\\\\-(?${-hueRotate})',\n configKey: 'hueRotate',\n },\n {\n type: 'Invert',\n members: 'invert(\\\\-(?${invert}))?',\n configKey: 'invert',\n },\n {\n type: 'Saturate',\n members: 'saturate\\\\-(?${saturate})',\n configKey: 'saturate',\n },\n {\n type: 'Sepia',\n members: 'sepia(\\\\-(?${sepia}))?',\n configKey: 'sepia',\n },\n {\n type: 'Backdrop Blur',\n members: 'backdrop\\\\-blur(\\\\-(?${backdropBlur}))?',\n configKey: 'backdropBlur',\n },\n {\n type: 'Backdrop Brightness',\n members: 'backdrop\\\\-brightness\\\\-(?${backdropBrightness})',\n configKey: 'backdropBrightness',\n },\n {\n type: 'Backdrop Contrast',\n members: 'backdrop\\\\-contrast\\\\-(?${backdropContrast})',\n configKey: 'backdropContrast',\n },\n {\n type: 'Backdrop Grayscale',\n members: 'backdrop\\\\-grayscale(\\\\-(?${backdropGrayscale}))?',\n configKey: 'backdropGrayscale',\n },\n {\n type: 'Backdrop Hue Rotate',\n members:\n 'backdrop\\\\-hue\\\\-rotate\\\\-(?${backdropHueRotate})|\\\\-backdrop\\\\-hue\\\\-rotate\\\\-(?${-backdropHueRotate})',\n configKey: 'backdropHueRotate',\n },\n {\n type: 'Backdrop Invert',\n members: 'backdrop\\\\-invert(\\\\-(?${backdropInvert}))?',\n configKey: 'backdropInvert',\n },\n {\n type: 'Backdrop Opacity',\n members: 'backdrop\\\\-opacity\\\\-(?${backdropOpacity})',\n configKey: 'backdropOpacity',\n },\n {\n type: 'Backdrop Saturate',\n members: 'backdrop\\\\-saturate\\\\-(?${backdropSaturate})',\n configKey: 'backdropSaturate',\n },\n {\n type: 'Backdrop Sepia',\n members: 'backdrop\\\\-sepia(\\\\-(?${backdropSepia}))?',\n configKey: 'backdropSepia',\n },\n ],\n },\n {\n type: 'Tables',\n members: [\n {\n type: 'Border Collapse',\n members: 'border\\\\-(collapse|separate)',\n },\n {\n type: 'Border Spacing',\n members: [\n {\n type: 'border-spacing',\n members: 'border\\\\-spacing\\\\-(?${borderSpacing})',\n shorthand: 'all',\n body: 'border-spacing',\n configKey: 'borderSpacing',\n },\n {\n type: 'border-spacing-x',\n members: 'border\\\\-spacing\\\\-x\\\\-(?${borderSpacing})',\n shorthand: 'x',\n body: 'border-spacing-x',\n configKey: 'borderSpacing',\n },\n {\n type: 'border-spacing-y',\n members: 'border\\\\-spacing\\\\-y\\\\-(?${borderSpacing})',\n shorthand: 'y',\n body: 'border-spacing-y',\n configKey: 'borderSpacing',\n },\n ],\n },\n {\n type: 'Table Layout',\n members: 'table\\\\-(auto|fixed)',\n },\n ],\n },\n {\n type: 'Transitions & Animation',\n members: [\n {\n type: 'Transition Property',\n members: 'transition(\\\\-(?${transitionProperty}))?',\n configKey: 'transitionProperty',\n },\n {\n type: 'Transition Duration',\n members: 'duration(\\\\-(?${transitionDuration}))?',\n configKey: 'transitionDuration',\n },\n {\n type: 'Transition Timing Function',\n members: 'ease(\\\\-(?${transitionTimingFunction}))?',\n configKey: 'transitionTimingFunction',\n },\n {\n type: 'Transition Delay',\n members: 'delay\\\\-(?${transitionDelay})',\n configKey: 'transitionDelay',\n },\n {\n type: 'Animation',\n members: 'animate\\\\-(?${animation})',\n configKey: 'animation',\n },\n ],\n },\n {\n type: 'Transforms',\n members: [\n {\n type: 'Transform GPU',\n members: [\n {\n type: 'transform-gpu',\n members: 'transform\\\\-gpu',\n },\n ],\n },\n {\n type: 'Transform None',\n members: [\n {\n type: 'transform-none',\n members: 'transform\\\\-none',\n },\n ],\n },\n {\n type: 'Deprecated Transform',\n members: [\n {\n type: 'transform',\n members: 'transform',\n deprecated: true,\n },\n ],\n },\n {\n type: 'Scale',\n members: [\n {\n type: 'scale',\n members: 'scale\\\\-(?${scale})|\\\\-scale\\\\-(?${-scale})',\n shorthand: 'all',\n body: 'scale',\n configKey: 'scale',\n },\n {\n type: 'scale-y',\n members: 'scale\\\\-y\\\\-(?${scale})|\\\\-scale\\\\-y\\\\-(?${-scale})',\n shorthand: 'y',\n body: 'scale-y',\n configKey: 'scale',\n },\n {\n type: 'scale-x',\n members: 'scale\\\\-x\\\\-(?${scale})|\\\\-scale\\\\-x\\\\-(?${-scale})',\n shorthand: 'x',\n body: 'scale-x',\n configKey: 'scale',\n },\n ],\n },\n {\n type: 'Rotate',\n members: '(rotate\\\\-(?${rotate})|\\\\-rotate\\\\-(?${-rotate}))',\n configKey: 'rotate',\n },\n {\n type: 'Translate',\n members: [\n {\n type: 'translate-x',\n members: '(translate\\\\-x\\\\-(?${translate})|\\\\-translate\\\\-x\\\\-(?${-translate}))',\n configKey: 'translate',\n },\n {\n type: 'translate-y',\n members: '(translate\\\\-y\\\\-(?${translate})|\\\\-translate\\\\-y\\\\-(?${-translate}))',\n configKey: 'translate',\n },\n ],\n },\n {\n type: 'Skew',\n members: [\n {\n type: 'skew-x',\n members: '(skew\\\\-x\\\\-(?${skew})|\\\\-skew\\\\-x\\\\-(?${-skew}))',\n configKey: 'skew',\n },\n {\n type: 'skew-y',\n members: '(skew\\\\-y\\\\-(?${skew})|\\\\-skew\\\\-y\\\\-(?${-skew}))',\n configKey: 'skew',\n },\n ],\n },\n {\n type: 'Transform Origin',\n members: 'origin\\\\-(?${transformOrigin})',\n configKey: 'transformOrigin',\n },\n ],\n },\n {\n type: 'Interactivity',\n members: [\n {\n type: 'Accent Color',\n members: 'accent\\\\-(?${accentColor})',\n configKey: 'accentColor',\n },\n {\n type: 'Appearance',\n members: 'appearance\\\\-none',\n },\n {\n type: 'Cursor',\n members: 'cursor\\\\-(?${cursor})',\n configKey: 'cursor',\n },\n {\n type: 'Caret Color',\n members: 'caret\\\\-(?${colors})',\n configKey: 'colors',\n },\n {\n type: 'Pointer Events',\n members: 'pointer\\\\-events\\\\-(none|auto)',\n },\n {\n type: 'Resize',\n members: 'resize(\\\\-(none|x|y))?',\n },\n {\n type: 'Scroll Behavior',\n members: 'scroll\\\\-(auto|smooth)',\n },\n {\n type: 'Scroll Margin',\n members: 'scroll\\\\-(?${scrollMargin})',\n configKey: 'scrollMargin',\n members: [\n {\n type: 'scroll-m',\n members: 'scroll-m\\\\-(?${scrollMargin})|\\\\-scroll-m\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n {\n type: 'scroll-my',\n members: 'scroll-my\\\\-(?${scrollMargin})|\\\\-scroll-my\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n {\n type: 'scroll-mx',\n members: 'scroll-mx\\\\-(?${scrollMargin})|\\\\-scroll-mx\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n {\n type: 'scroll-mt',\n members: 'scroll-mt\\\\-(?${scrollMargin})|\\\\-scroll-mt\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n {\n type: 'scroll-mr',\n members: 'scroll-mr\\\\-(?${scrollMargin})|\\\\-scroll-mr\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n {\n type: 'scroll-mb',\n members: 'scroll-mb\\\\-(?${scrollMargin})|\\\\-scroll-mb\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n {\n type: 'scroll-ml',\n members: 'scroll-ml\\\\-(?${scrollMargin})|\\\\-scroll-ml\\\\-(?${-scrollMargin})',\n configKey: 'scrollMargin',\n },\n ],\n },\n {\n type: 'Scroll Padding',\n members: 'scroll\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n members: [\n {\n type: 'scroll-p',\n members: 'scroll-p\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n {\n type: 'scroll-py',\n members: 'scroll-py\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n {\n type: 'scroll-px',\n members: 'scroll-px\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n {\n type: 'scroll-pt',\n members: 'scroll-pt\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n {\n type: 'scroll-pr',\n members: 'scroll-pr\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n {\n type: 'scroll-pb',\n members: 'scroll-pb\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n {\n type: 'scroll-pl',\n members: 'scroll-pl\\\\-(?${scrollPadding})',\n configKey: 'scrollPadding',\n },\n ],\n },\n {\n type: 'Scroll Snap Align',\n members: 'snap\\\\-(start|end|center|align-none)',\n },\n {\n type: 'Scroll Snap Stop',\n members: 'snap\\\\-(normal|always)',\n },\n {\n type: 'Scroll Snap Type',\n members: 'snap\\\\-(none|x|y|both)',\n },\n {\n type: 'Scroll Snap Type Strictness',\n members: 'snap\\\\-(mandatory|proximity)',\n },\n {\n type: 'Touch Action',\n members: [\n {\n type: 'Touch Action Mode',\n members: 'touch\\\\-(auto|none|manipulation)',\n },\n {\n type: 'Touch Action X',\n members: 'touch\\\\-(pan\\\\-(x|left|right))',\n },\n {\n type: 'Touch Action Y',\n members: 'touch\\\\-(pan\\\\-(y|up|down))',\n },\n {\n type: 'Touch Action Pinch Zoom',\n members: 'touch\\\\-pinch\\\\-zoom',\n },\n ],\n },\n {\n type: 'User Select',\n members: 'select\\\\-(none|text|all|auto)',\n },\n {\n type: 'Will Change',\n members: 'will\\\\-change\\\\-(?${willChange})',\n configKey: 'willChange',\n },\n ],\n },\n {\n type: 'SVG',\n members: [\n {\n type: 'Fill',\n members: 'fill\\\\-(?${fill})',\n configKey: 'fill',\n },\n {\n type: 'Stroke',\n members: 'stroke\\\\-(?${stroke})',\n configKey: 'stroke',\n },\n {\n type: 'Stroke Width',\n members: 'stroke\\\\-(?${strokeWidth})',\n configKey: 'strokeWidth',\n },\n ],\n },\n {\n type: 'Accessibility',\n members: [\n {\n type: 'Screen Readers',\n members: '(not\\\\-)?sr\\\\-only',\n },\n {\n type: 'Forced Color Adjust',\n members: 'forced\\\\-color\\\\-adjust\\\\-(auto|none)',\n },\n ],\n },\n {\n type: 'Official Plugins',\n members: [\n {\n // TODO:\n // Support for custom prose classname like on\n // https://tailwindcss.com/docs/typography-plugin#changing-the-default-class-name\n // Adding custom color themes\n // https://tailwindcss.com/docs/typography-plugin#adding-custom-color-themes\n type: 'Typography',\n members: [\n {\n type: 'prose',\n members: '(not\\\\-)?prose',\n },\n {\n type: 'Prose Gray Scale',\n members: 'prose\\\\-(gray|slate|zinc|neutral|stone)',\n },\n {\n type: 'Prose Type Scale',\n members: 'prose\\\\-(sm|base|lg|2?xl)',\n },\n {\n type: 'Prose Dark Mode',\n members: 'prose\\\\-invert',\n },\n // These are modifiers and not the last part of the classname\n // {\n // type: 'Prose Element modifiers',\n // members:\n // 'prose\\\\-(headings|lead|h1|h2|h3|h4|p|a|blockquote|figure|figcaption|strong|em|code|pre|ol|ul|li|table|thead|tr|th|td|img|video|hr)',\n // },\n ],\n },\n // ('Forms' plugin has no related classnames, only selectors like `input[type='password']`)\n {\n type: 'Aspect Ratio',\n members: [\n {\n type: 'aspect-w',\n members: 'aspect\\\\-(none|w\\\\-(?${aspectRatio}))',\n },\n {\n type: 'aspect-h',\n members: 'aspect\\\\-h\\\\-(?${aspectRatio})',\n },\n ],\n },\n {\n type: 'Line Clamp',\n members: 'line\\\\-clamp\\\\-(none|(?${lineClamp}))',\n },\n ],\n },\n];\n","/**\n * @fileoverview Avoid using multiple Tailwind CSS classnames when not required (e.g. \"mx-3 my-3\" could be replaced by \"m-3\")\n * @author François Massart\n */\n'use strict';\n\nimport { groups as defaultGroups } from '../configs/groups';\nimport astUtil from '../util/ast';\nimport customConfig from '../util/customConfig';\nimport docsUrl from '../util/docsUrl';\nimport groupUtil from '../util/groupMethods';\nimport parserUtil from '../util/parser';\nimport getOption from '../util/settings';\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst SHORTHAND_CANDIDATE_CLASSNAMES_DETECTED_MSG = `Classnames '{{classnames}}' could be replaced by the '{{shorthand}}' shorthand!`;\n\nexport default {\n meta: {\n docs: {\n description: 'Enforces the usage of shorthand Tailwind CSS classnames',\n category: 'Best Practices',\n recommended: true,\n url: docsUrl('enforces-shorthand'),\n },\n messages: {\n shorthandCandidateDetected: SHORTHAND_CANDIDATE_CLASSNAMES_DETECTED_MSG,\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n const placeContentOptions = ['center', 'start', 'end', 'between', 'around', 'evenly', 'baseline', 'stretch'];\n const placeItemsOptions = ['start', 'end', 'center', 'stretch'];\n const placeSelfOptions = ['auto', 'start', 'end', 'center', 'stretch'];\n // These are shorthand candidates that do not share the same parent type\n const complexEquivalences = [\n {\n needles: ['overflow-hidden', 'text-ellipsis', 'whitespace-nowrap'],\n shorthand: 'truncate',\n mode: 'exact',\n },\n {\n needles: ['w-', 'h-'],\n shorthand: 'size-',\n mode: 'value',\n },\n ...placeContentOptions.map((opt) => {\n return {\n needles: [`content-${opt}`, `justify-${opt}`],\n shorthand: `place-content-${opt}`,\n mode: 'exact',\n };\n }),\n ...placeItemsOptions.map((opt) => {\n return {\n needles: [`items-${opt}`, `justify-items-${opt}`],\n shorthand: `place-items-${opt}`,\n mode: 'exact',\n };\n }),\n ...placeSelfOptions.map((opt) => {\n return {\n needles: [`self-${opt}`, `justify-self-${opt}`],\n shorthand: `place-self-${opt}`,\n mode: 'exact',\n };\n }),\n ];\n\n // Init assets\n const targetProperties = {\n Layout: ['Overflow', 'Overscroll Behavior', 'Top / Right / Bottom / Left'],\n 'Flexbox & Grid': ['Gap'],\n Spacing: ['Padding', 'Margin'],\n Sizing: ['Width', 'Height'],\n Borders: ['Border Radius', 'Border Width', 'Border Color'],\n Tables: ['Border Spacing'],\n Transforms: ['Scale'],\n Typography: ['Text Overflow', 'Whitespace'],\n };\n\n // We don't want to affect other rules by object reference\n const cloned = JSON.parse(JSON.stringify(defaultGroups));\n const targetGroups = cloned.filter((g) => Object.keys(targetProperties).includes(g.type));\n targetGroups.forEach((g) => {\n // Without using the clone, other rules would be affected by this `filter()`\n g.members = g.members.filter((sub) => targetProperties[g.type].includes(sub.type));\n });\n\n /**\n * Retrieve the main part of a classname base on its shorthand scope\n * @param {Object} targetGroups A specific subset of the groups\n * @param {String} parentType The name of the parent e.g. 'Border Radius'\n * @param {String} shorthand The searched shorthand e.g. 'all', 'y', 't', 'tr'\n * @returns\n */\n const getBodyByShorthand = (targetGroups, parentType, shorthand) => {\n const findByMemberType = (obj) => obj.members.find((m) => m.type === parentType);\n const mainGroup = targetGroups.find(findByMemberType);\n if (!mainGroup) {\n return '';\n }\n const typeGroup = mainGroup.members.find((m) => m.type === parentType);\n // const typeGroup = mainGroup.find(findByMemberType);\n if (!typeGroup) {\n return '';\n }\n const type = typeGroup.members.find((m) => m.shorthand === shorthand);\n return !type ? '' : type.body;\n };\n\n /**\n * Parse the classnames and report found shorthand candidates\n * @param {ASTNode} node The root node of the current parsing\n * @param {ASTNode} arg The child node of node\n * @returns {void}\n */\n const parseForShorthandCandidates = (node, arg = null) => {\n let originalClassNamesValue = null;\n let start = null;\n let end = null;\n let prefix = '';\n let suffix = '';\n const troubles = [];\n if (arg === null) {\n originalClassNamesValue = astUtil.extractValueFromNode(node);\n const range = astUtil.extractRangeFromNode(node);\n if (node.type === 'TextAttribute') {\n start = range[0];\n end = range[1];\n } else {\n start = range[0] + 1;\n end = range[1] - 1;\n }\n } else {\n switch (arg.type) {\n case 'Identifier':\n return;\n case 'TemplateLiteral':\n arg.expressions.forEach((exp) => {\n parseForShorthandCandidates(node, exp);\n });\n arg.quasis.forEach((quasis) => {\n parseForShorthandCandidates(node, quasis);\n });\n return;\n case 'ConditionalExpression':\n parseForShorthandCandidates(node, arg.consequent);\n parseForShorthandCandidates(node, arg.alternate);\n return;\n case 'LogicalExpression':\n parseForShorthandCandidates(node, arg.right);\n return;\n case 'ArrayExpression':\n arg.elements.forEach((el) => {\n parseForShorthandCandidates(node, el);\n });\n return;\n case 'ObjectExpression':\n const isUsedByClassNamesPlugin = node.callee && node.callee.name === 'classnames';\n const isVue = node.key && node.key.type === 'VDirectiveKey';\n arg.properties.forEach((prop) => {\n const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value;\n parseForShorthandCandidates(node, propVal);\n });\n return;\n case 'Property':\n parseForShorthandCandidates(node, arg.key);\n return;\n\n case 'Literal':\n originalClassNamesValue = arg.value;\n start = arg.range[0] + 1;\n end = arg.range[1] - 1;\n break;\n case 'TemplateElement':\n originalClassNamesValue = arg.value.raw;\n if (originalClassNamesValue === '') {\n return;\n }\n start = arg.range[0];\n end = arg.range[1];\n // https://github.com/eslint/eslint/issues/13360\n // The problem is that range computation includes the backticks (`test`)\n // but value.raw does not include them, so there is a mismatch.\n // start/end does not include the backticks, therefore it matches value.raw.\n const txt = context.getSourceCode().getText(arg);\n prefix = astUtil.getTemplateElementPrefix(txt, originalClassNamesValue);\n suffix = astUtil.getTemplateElementSuffix(txt, originalClassNamesValue);\n originalClassNamesValue = astUtil.getTemplateElementBody(txt, prefix, suffix);\n break;\n }\n }\n\n let { classNames, whitespaces, headSpace, tailSpace } =\n astUtil.extractClassnamesFromValue(originalClassNamesValue);\n\n if (classNames.length <= 1) {\n // Don't run sorting for a single or empty className\n return;\n }\n\n const parsed = [];\n\n classNames.forEach((className, index) => {\n parsed.push(groupUtil.parseClassname(className, targetGroups, mergedConfig, index));\n });\n\n const validated = [];\n\n // Handle sets of classnames with different parent types\n let remaining = parsed;\n for (const { needles: inputSet, shorthand: outputClassname, mode } of complexEquivalences) {\n if (remaining.length < inputSet.length) {\n continue;\n }\n\n // Matching classes\n const parsedElementsInInputSet = remaining.filter((remainingClass) => {\n if (mode === 'exact') {\n // Test if the name contains the target class, eg. 'text-ellipsis' inside 'md:text-ellipsis'...\n return inputSet.some((inputClass) => remainingClass.name.includes(inputClass));\n }\n // Test if the body of the class matches, eg. 'h-' inside 'h-10'\n if (mode === 'value') {\n const bodyMatch = inputSet.some(\n (inputClassPattern) => `${mergedConfig.prefix}${inputClassPattern}` === remainingClass.body\n );\n if ([undefined, null].includes(mergedConfig.theme.size)) {\n return false;\n }\n // w-screen + h-screen ≠ size-screen (Issue #307)\n const sizeKeys = Object.keys(mergedConfig.theme.size);\n const isSize = ['w-', 'h-'].includes(remainingClass.body);\n const isValidSize = sizeKeys.includes(remainingClass.value);\n const wValue = mergedConfig.theme.width[remainingClass.value];\n const hValue = mergedConfig.theme.height[remainingClass.value];\n const sizeValue = mergedConfig.theme.size[remainingClass.value];\n const fullMatch = wValue === hValue && wValue === sizeValue;\n return bodyMatch && !(isSize && !isValidSize && !fullMatch);\n }\n });\n\n const variantGroups = new Map();\n parsedElementsInInputSet.forEach((o) => {\n const val = mode === 'value' ? o.value : '';\n const v = `${o.variants}${o.important ? '!' : ''}${val}`;\n if (!variantGroups.has(v)) {\n variantGroups.set(\n v,\n parsedElementsInInputSet.filter(\n (c) => c.variants === o.variants && c.important === o.important && (val === '' || c.value === val)\n )\n );\n }\n });\n const validKeys = new Set();\n variantGroups.forEach((classes, key) => {\n let skip = false;\n // Make sure all required classes for the shorthand are present\n if (classes.length < inputSet.length) {\n skip = true;\n }\n // Make sure the classes share all the single/shared/same value\n if (mode === 'value' && new Set(classes.map((p) => p.value)).size !== 1) {\n skip = true;\n }\n if (!skip) {\n validKeys.add(key);\n }\n });\n validKeys.forEach((k) => {\n const candidates = variantGroups.get(k);\n const index = candidates[0].index;\n const variants = candidates[0].variants;\n const important = candidates[0].important ? '!' : '';\n const classValue = mode === 'value' ? candidates[0].value : '';\n\n const patchedClassname = `${variants}${important}${mergedConfig.prefix}${outputClassname}${classValue}`;\n troubles.push([candidates.map((c) => `${c.name}`), patchedClassname]);\n\n const validatedClassname = groupUtil.parseClassname(patchedClassname, targetGroups, mergedConfig, index);\n validated.push(validatedClassname);\n\n remaining = remaining.filter((p) => !candidates.includes(p));\n });\n }\n\n // Handle sets of classnames with the same parent type\n // Each group parentType\n const checkedGroups = [];\n remaining.forEach((classname, idx, arr) => {\n // Valid candidate\n if (classname.parentType === '') {\n validated.push(classname);\n } else if (!checkedGroups.includes(classname.parentType)) {\n checkedGroups.push(classname.parentType);\n const sameType = remaining.filter((cls) => cls.parentType === classname.parentType);\n // Comparing same parentType classnames\n const checkedVariantsValue = [];\n sameType.forEach((cls) => {\n const key = cls.variants + (cls.important ? '!' : '') + cls.value;\n if (!checkedVariantsValue.includes(key)) {\n checkedVariantsValue.push(key);\n const sameVariantAndValue = sameType.filter((v) => {\n return !(v.variants !== cls.variants || v.value !== cls.value || v.important !== cls.important);\n });\n if (sameVariantAndValue.length === 1) {\n validated.push(cls);\n } else if (sameVariantAndValue.length) {\n const supportCorners = ['Border Radius'].includes(classname.parentType);\n const hasTL =\n supportCorners && sameVariantAndValue.some((c) => ['tl', 't', 'all'].includes(c.shorthand));\n const hasTR =\n supportCorners && sameVariantAndValue.some((c) => ['tr', 't', 'all'].includes(c.shorthand));\n const hasBR =\n supportCorners && sameVariantAndValue.some((c) => ['br', 'b', 'all'].includes(c.shorthand));\n const hasBL =\n supportCorners && sameVariantAndValue.some((c) => ['bl', 'b', 'all'].includes(c.shorthand));\n const hasT = sameVariantAndValue.some((c) => c.shorthand === 't') || (hasTL && hasTR);\n const hasR = sameVariantAndValue.some((c) => c.shorthand === 'r') || (hasTR && hasBR);\n const hasB = sameVariantAndValue.some((c) => c.shorthand === 'b') || (hasBL && hasBR);\n const hasL = sameVariantAndValue.some((c) => c.shorthand === 'l') || (hasTL && hasBL);\n const hasX = sameVariantAndValue.some((c) => c.shorthand === 'x') || (hasL && hasR);\n const hasY = sameVariantAndValue.some((c) => c.shorthand === 'y') || (hasT && hasB);\n const hasAllProp = sameVariantAndValue.some((c) => c.shorthand === 'all');\n const hasAllPropNoCorner = hasY && hasX;\n const hasAllPropWithCorners = (hasL && hasR) || (hasT && hasB);\n const hasAllEquivalent = !supportCorners ? hasAllPropNoCorner : hasAllPropWithCorners;\n const hasAll = hasAllProp || hasAllEquivalent;\n const important = cls.important ? '!' : '';\n const isNegative = ('' + cls.value).substring(0, 1) === '-';\n const minus = isNegative ? '-' : '';\n const absoluteVal = isNegative ? ('' + cls.value).substring(1) : cls.value;\n\n if (hasAll) {\n const all = getBodyByShorthand(targetGroups, classname.parentType, 'all');\n const val = absoluteVal.length ? '-' + absoluteVal : '';\n const patchedName = `${cls.variants}${important}${minus}${mergedConfig.prefix}${all}${val}`;\n troubles.push([sameVariantAndValue.map((c) => c.name), patchedName]);\n cls.name = patchedName;\n cls.shorthand = 'all';\n validated.push(cls);\n } else if (hasY || hasX) {\n const xOrY = hasX ? 'x' : 'y';\n const xOrYType = getBodyByShorthand(targetGroups, classname.parentType, xOrY);\n const patchedName = `${cls.variants}${important}${minus}${mergedConfig.prefix}${xOrYType}${\n absoluteVal.length ? '-' + absoluteVal : ''\n }`;\n const toBeReplaced = sameVariantAndValue\n .filter((c) => {\n const candidates = hasX ? ['l', 'r'] : ['t', 'b'];\n return candidates.includes(c.shorthand);\n })\n .map((c) => c.name);\n const toBeKept = sameVariantAndValue.filter((c) => {\n const candidates = hasY ? ['l', 'r'] : ['t', 'b'];\n return candidates.includes(c.shorthand);\n });\n\n troubles.push([toBeReplaced, patchedName]);\n let replaced = false;\n sameVariantAndValue.forEach((ref, i) => {\n if (toBeKept.find((k) => k.name === ref.name)) {\n validated.push(ref);\n } else if (!replaced) {\n replaced = true;\n const cloned = JSON.parse(JSON.stringify(ref));\n cloned.name = patchedName;\n cloned.shorthand = xOrY;\n validated.push(cloned);\n }\n });\n } else if (supportCorners && (hasT || hasR || hasB || hasL)) {\n const side = hasT ? 't' : hasR ? 'r' : hasB ? 'b' : 'l';\n const sideBody = getBodyByShorthand(targetGroups, classname.parentType, side);\n const val = absoluteVal.length ? '-' + absoluteVal : '';\n const patchedName = `${cls.variants}${important}${minus}${mergedConfig.prefix}${sideBody}${val}`;\n const toBeReplaced = sameVariantAndValue\n .filter((c) => {\n const candidates = hasT ? ['tl', 'tr'] : hasR ? ['tr', 'br'] : hasB ? ['bl', 'br'] : ['tl', 'bl'];\n return candidates.includes(c.shorthand);\n })\n .map((c) => c.name);\n const toBeKept = sameVariantAndValue.filter((c) => {\n const candidates = hasT ? ['bl', 'br'] : hasR ? ['tl', 'bl'] : hasB ? ['tl', 'tr'] : ['tr', 'br'];\n return candidates.includes(c.shorthand);\n });\n\n troubles.push([toBeReplaced, patchedName]);\n let replaced = false;\n sameVariantAndValue.forEach((ref, i) => {\n if (toBeKept.find((k) => k.name === ref.name)) {\n validated.push(ref);\n } else if (!replaced) {\n replaced = true;\n const cloned = JSON.parse(JSON.stringify(ref));\n cloned.name = patchedName;\n cloned.shorthand = side;\n validated.push(cloned);\n }\n });\n } else {\n validated.push(...sameVariantAndValue);\n }\n }\n }\n });\n }\n });\n\n // Try to keep the original order\n validated.sort((a, b) => (a.index < b.index ? -1 : +1));\n\n // Generates the validated attribute value\n const union = validated.map((val) => val.leading + val.name + val.trailing);\n\n let validatedClassNamesValue = '';\n\n // Generates the validated attribute value\n if (union.length === 1) {\n validatedClassNamesValue += headSpace ? whitespaces[0] : '';\n validatedClassNamesValue += union[0];\n validatedClassNamesValue += tailSpace ? whitespaces[whitespaces.length - 1] : '';\n } else {\n for (let i = 0; i < union.length; i++) {\n const isLast = i === union.length - 1;\n const w = whitespaces[i] ?? '';\n const cls = union[i];\n validatedClassNamesValue += headSpace ? `${w}${cls}` : isLast ? `${cls}` : `${cls}${w}`;\n if (tailSpace && isLast) {\n validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? '';\n }\n }\n }\n\n troubles.forEach((issue) => {\n if (originalClassNamesValue !== validatedClassNamesValue) {\n validatedClassNamesValue = prefix + validatedClassNamesValue + suffix;\n context.report({\n node: node,\n messageId: 'shorthandCandidateDetected',\n data: {\n classnames: issue[0].join(', '),\n shorthand: issue[1],\n },\n fix: function (fixer) {\n return fixer.replaceTextRange([start, end], validatedClassNamesValue);\n },\n });\n }\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n parseForShorthandCandidates(node);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n parseForShorthandCandidates(node, node.value.expression);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n\n node.arguments.forEach((arg) => {\n parseForShorthandCandidates(node, arg);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n\n parseForShorthandCandidates(node, node.quasi);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n parseForShorthandCandidates(node);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n parseForShorthandCandidates(node, arg);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n parseForShorthandCandidates(node, prop);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","/**\n * @fileoverview Detect obsolete classnames when upgrading to Tailwind CSS v3\n * @author François Massart\n */\n'use strict';\n\nconst docsUrl = require('../util/docsUrl');\nconst customConfig = require('../util/customConfig');\nconst astUtil = require('../util/ast');\nconst groupUtil = require('../util/groupMethods');\nconst getOption = require('../util/settings');\nconst parserUtil = require('../util/parser');\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst CLASSNAME_NOT_NEEDED_MSG = `Classname '{{classnames}}' is not needed in Tailwind CSS v3!`;\nconst CLASSNAMES_NOT_NEEDED_MSG = `Classnames '{{classnames}}' are not needed in Tailwind CSS v3!`;\nconst CLASSNAME_CHANGED_MSG = `Classname '{{deprecated}}' should be updated to '{{updated}}' in Tailwind CSS v3!`;\nconst OPACITY_CLASS_DEPRECATED_MSG = `Classname '{{classname}}' should be replaced by an opacity suffix (eg. '/{{value}}')`;\n\nexport default {\n meta: {\n docs: {\n description: 'Detect obsolete classnames when upgrading to Tailwind CSS v3',\n category: 'Possible Errors',\n recommended: true,\n url: docsUrl('migration-from-tailwind-2'),\n },\n messages: {\n classnameNotNeeded: CLASSNAME_NOT_NEEDED_MSG,\n classnamesNotNeeded: CLASSNAMES_NOT_NEEDED_MSG,\n classnameChanged: CLASSNAME_CHANGED_MSG,\n classnameOpacityDeprecated: OPACITY_CLASS_DEPRECATED_MSG,\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n /**\n * Recursive function crawling into child nodes\n * @param {ASTNode} node The root node of the current parsing\n * @param {ASTNode} arg The child node of node\n * @returns {void}\n */\n const parseForObsoleteClassNames = (node, arg = null) => {\n let originalClassNamesValue = null;\n let start = null;\n let end = null;\n let prefix = '';\n let suffix = '';\n if (arg === null) {\n originalClassNamesValue = astUtil.extractValueFromNode(node);\n const range = astUtil.extractRangeFromNode(node);\n if (node.type === 'TextAttribute') {\n start = range[0];\n end = range[1];\n } else {\n start = range[0] + 1;\n end = range[1] - 1;\n }\n } else {\n switch (arg.type) {\n case 'Identifier':\n return;\n case 'TemplateLiteral':\n arg.expressions.forEach((exp) => {\n parseForObsoleteClassNames(node, exp);\n });\n arg.quasis.forEach((quasis) => {\n parseForObsoleteClassNames(node, quasis);\n });\n return;\n case 'ConditionalExpression':\n parseForObsoleteClassNames(node, arg.consequent);\n parseForObsoleteClassNames(node, arg.alternate);\n return;\n case 'LogicalExpression':\n parseForObsoleteClassNames(node, arg.right);\n return;\n case 'ArrayExpression':\n arg.elements.forEach((el) => {\n parseForObsoleteClassNames(node, el);\n });\n return;\n case 'ObjectExpression':\n arg.properties.forEach((prop) => {\n parseForObsoleteClassNames(node, prop.key);\n });\n return;\n case 'Property':\n parseForObsoleteClassNames(node, arg.key);\n return;\n case 'Literal':\n originalClassNamesValue = arg.value;\n start = arg.range[0] + 1;\n end = arg.range[1] - 1;\n break;\n case 'TemplateElement':\n originalClassNamesValue = arg.value.raw;\n if (originalClassNamesValue === '') {\n return;\n }\n start = arg.range[0];\n end = arg.range[1];\n // https://github.com/eslint/eslint/issues/13360\n // The problem is that range computation includes the backticks (`test`)\n // but value.raw does not include them, so there is a mismatch.\n // start/end does not include the backticks, therefore it matches value.raw.\n const txt = context.getSourceCode().getText(arg);\n prefix = astUtil.getTemplateElementPrefix(txt, originalClassNamesValue);\n suffix = astUtil.getTemplateElementSuffix(txt, originalClassNamesValue);\n originalClassNamesValue = astUtil.getTemplateElementBody(txt, prefix, suffix);\n break;\n }\n }\n\n let { classNames, whitespaces, headSpace, tailSpace } =\n astUtil.extractClassnamesFromValue(originalClassNamesValue);\n\n const notNeeded = [];\n const outdated = [];\n const deprecatedBgOpacity = [];\n const filtered = classNames.filter((cls) => {\n const suffix = groupUtil.getSuffix(cls, mergedConfig.separator);\n if (/^((backdrop\\-)?(filter|transform))$/i.test(suffix)) {\n notNeeded.push(cls);\n return false;\n }\n let overflowRes = /^overflow\\-(?clip|ellipsis)$/i.exec(suffix);\n if (overflowRes && overflowRes.groups && overflowRes.groups.value) {\n outdated.push([cls, cls.replace(/overflow\\-(clip|ellipsis)$/i, `text-${overflowRes.groups.value}`)]);\n }\n let growShrinkRes = /flex\\-(?grow|shrink)(\\-(?${flexVal}))?/i.exec(suffix);\n if (growShrinkRes && growShrinkRes.groups && growShrinkRes.groups.prop) {\n const prop = growShrinkRes.groups.prop;\n const flexVal = growShrinkRes.groups.flexVal;\n const optionalVal = flexVal ? `\\-${flexVal}` : '';\n const fixRegex = new RegExp(`flex\\-${prop}${optionalVal}`);\n outdated.push([cls, cls.replace(fixRegex, `${prop}${flexVal ? '-' + flexVal : ''}`)]);\n }\n let boxRes = /^decoration\\-(?clone|slice)$/i.exec(suffix);\n if (boxRes && boxRes.groups && boxRes.groups.value) {\n const boxVal = boxRes.groups.value;\n const fixRegex = new RegExp(`decoration\\-${boxVal}`);\n outdated.push([cls, cls.replace(fixRegex, `box-decoration\\-${boxVal}`)]);\n }\n let bgOpacityRes = /^(bg|border|ring)\\-opacity\\-(?\\d{1,})$/i.exec(suffix);\n if (bgOpacityRes && bgOpacityRes.groups && bgOpacityRes.groups.value) {\n const opacityVal = bgOpacityRes.groups.value;\n deprecatedBgOpacity.push([cls, opacityVal]);\n }\n let placeholderRes = /^placeholder\\-(?.{1,})$/i.exec(suffix);\n if (placeholderRes && placeholderRes.groups && placeholderRes.groups.value) {\n const placeholderVal = placeholderRes.groups.value;\n const fixPlaceholderRegex = new RegExp(`placeholder\\-${placeholderVal}$`);\n outdated.push([cls, cls.replace(fixPlaceholderRegex, `placeholder:text\\-${placeholderVal}`)]);\n }\n return true;\n });\n\n if (notNeeded.length) {\n let validatedClassNamesValue = '';\n for (let i = 0; i < filtered.length; i++) {\n const isLast = i === filtered.length - 1;\n const w = whitespaces[i] ?? '';\n const cls = filtered[i];\n validatedClassNamesValue += headSpace ? `${w}${cls}` : isLast ? `${cls}` : `${cls}${w}`;\n if (headSpace && tailSpace && isLast) {\n validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? '';\n }\n }\n validatedClassNamesValue = prefix + validatedClassNamesValue + suffix;\n context.report({\n node,\n messageId: notNeeded.length === 1 ? 'classnameNotNeeded' : 'classnamesNotNeeded',\n data: {\n classnames: notNeeded.join(', '),\n },\n fix: function (fixer) {\n return fixer.replaceTextRange([start, end], validatedClassNamesValue);\n },\n });\n }\n\n outdated.forEach((outdatedClass) => {\n let validatedClassNamesValue = '';\n for (let i = 0; i < filtered.length; i++) {\n const w = whitespaces[i] ?? '';\n const cls = filtered[i];\n validatedClassNamesValue += headSpace ? `${w}${cls}` : `${cls}${w}`;\n if (headSpace && tailSpace && i === filtered.length - 1) {\n validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? '';\n }\n }\n validatedClassNamesValue =\n prefix + validatedClassNamesValue.replace(outdatedClass[0], outdatedClass[1]) + suffix;\n context.report({\n node,\n messageId: 'classnameChanged',\n data: {\n deprecated: outdatedClass[0],\n updated: outdatedClass[1],\n },\n fix: function (fixer) {\n return fixer.replaceTextRange([start, end], validatedClassNamesValue);\n },\n });\n });\n deprecatedBgOpacity.forEach((bgClass) => {\n context.report({\n node,\n messageId: 'classnameOpacityDeprecated',\n data: {\n classname: bgClass[0],\n value: bgClass[1],\n },\n });\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n parseForObsoleteClassNames(node);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n parseForObsoleteClassNames(node, node.value.expression);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n node.arguments.forEach((arg) => {\n parseForObsoleteClassNames(node, arg);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n parseForObsoleteClassNames(node, node.quasi);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n parseForObsoleteClassNames(node);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n parseForObsoleteClassNames(node, arg);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n parseForObsoleteClassNames(node, prop);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","/**\n * @fileoverview Forbid using arbitrary values in classnames\n * @author François Massart\n */\n'use strict';\n\nconst docsUrl = require('../util/docsUrl');\nconst customConfig = require('../util/customConfig');\nconst astUtil = require('../util/ast');\nconst groupUtil = require('../util/groupMethods');\nconst getOption = require('../util/settings');\nconst parserUtil = require('../util/parser');\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst ARBITRARY_VALUE_DETECTED_MSG = `Arbitrary value detected in '{{classname}}'`;\n\nexport default {\n meta: {\n docs: {\n description: 'Forbid using arbitrary values in classnames',\n category: 'Best Practices',\n recommended: false,\n url: docsUrl('no-arbitrary-value'),\n },\n messages: {\n arbitraryValueDetected: ARBITRARY_VALUE_DETECTED_MSG,\n },\n fixable: null,\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n /**\n * Recursive function crawling into child nodes\n * @param {ASTNode} node The root node of the current parsing\n * @param {ASTNode} arg The child node of node\n * @returns {void}\n */\n const parseForArbitraryValues = (node, arg = null) => {\n let originalClassNamesValue = null;\n if (arg === null) {\n originalClassNamesValue = astUtil.extractValueFromNode(node);\n } else {\n switch (arg.type) {\n case 'Identifier':\n return;\n case 'TemplateLiteral':\n arg.expressions.forEach((exp) => {\n parseForArbitraryValues(node, exp);\n });\n arg.quasis.forEach((quasis) => {\n parseForArbitraryValues(node, quasis);\n });\n return;\n case 'ConditionalExpression':\n parseForArbitraryValues(node, arg.consequent);\n parseForArbitraryValues(node, arg.alternate);\n return;\n case 'LogicalExpression':\n parseForArbitraryValues(node, arg.right);\n return;\n case 'ArrayExpression':\n arg.elements.forEach((el) => {\n parseForArbitraryValues(node, el);\n });\n return;\n case 'ObjectExpression':\n const isUsedByClassNamesPlugin = node.callee && node.callee.name === 'classnames';\n const isVue = node.key && node.key.type === 'VDirectiveKey';\n arg.properties.forEach((prop) => {\n const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value;\n parseForArbitraryValues(node, propVal);\n });\n return;\n case 'Property':\n parseForArbitraryValues(node, arg.key);\n return;\n case 'Literal':\n originalClassNamesValue = arg.value;\n break;\n case 'TemplateElement':\n originalClassNamesValue = arg.value.raw;\n if (originalClassNamesValue === '') {\n return;\n }\n break;\n }\n }\n\n let { classNames } = astUtil.extractClassnamesFromValue(originalClassNamesValue);\n const forbidden = [];\n classNames.forEach((cls, idx) => {\n const parsed = groupUtil.parseClassname(cls, [], mergedConfig, idx);\n if (/\\[.*\\]/i.test(parsed.body)) {\n forbidden.push(parsed.name);\n }\n });\n\n forbidden.forEach((forbiddenClass) => {\n context.report({\n node,\n messageId: 'arbitraryValueDetected',\n data: {\n classname: forbiddenClass,\n },\n });\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n parseForArbitraryValues(node);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n parseForArbitraryValues(node, node.value.expression);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n node.arguments.forEach((arg) => {\n parseForArbitraryValues(node, arg);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n parseForArbitraryValues(node, node.quasi);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n parseForArbitraryValues(node, null);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n parseForArbitraryValues(node, arg);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n parseForArbitraryValues(node, prop);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","/**\n * @fileoverview Avoid contradicting Tailwind CSS classnames (e.g. \"w-3 w-5\")\n * @author François Massart\n */\n'use strict';\n\nimport { groups as defaultGroups } from '../configs/groups';\nimport astUtil from '../util/ast';\nimport customConfig from '../util/customConfig';\nimport docsUrl from '../util/docsUrl';\nimport groupUtil from '../util/groupMethods';\nimport parserUtil from '../util/parser';\nimport getOption from '../util/settings';\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst CONFLICTING_CLASSNAMES_DETECTED_MSG = `Classnames {{classnames}} are conflicting!`;\n\nexport default {\n meta: {\n docs: {\n description: 'Avoid contradicting Tailwind CSS classnames (e.g. \"w-3 w-5\")',\n category: 'Possible Errors',\n recommended: true,\n url: docsUrl('no-contradicting-classname'),\n },\n messages: {\n conflictingClassnames: CONFLICTING_CLASSNAMES_DETECTED_MSG,\n },\n fixable: null,\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const ignoredKeys = getOption(context, 'ignoredKeys');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n // Init assets before sorting\n const groups = groupUtil.getGroups(defaultGroups, mergedConfig);\n\n /**\n * Parse the classnames and report found conflicts\n * @param {Array} classNames\n * @param {ASTNode} node\n */\n const parseForContradictingClassNames = (classNames, node) => {\n // Init assets before sorting\n const sorted = groupUtil.initGroupSlots(groups);\n\n // Move each classname inside its dedicated group\n classNames.forEach((className) => {\n const idx = groupUtil.getGroupIndex(className, groups, mergedConfig.separator);\n if (idx > -1) {\n sorted[idx].push(className);\n }\n });\n\n // Only multiple classNames\n const sortedGroups = sorted.filter((slot) => slot.length > 1);\n const arbitraryPropsGroupIndex = sortedGroups.findIndex((slot) => {\n const suffix = groupUtil.getSuffix(slot[0], mergedConfig.separator);\n return groupUtil.getArbitraryProperty(suffix, mergedConfig.separator) !== '';\n });\n\n // Sorts each groups' classnames\n const ambiguousArbitraryValuesOrClasses = String.raw`(\\[(.*${mergedConfig.separator}))|(^((?!:).)*$)`;\n\n sortedGroups.forEach((group, groupIndex) => {\n const variants = [];\n group.forEach((cls) => {\n const prefix = groupUtil.getPrefix(cls, mergedConfig.separator);\n const name = cls.substr(prefix.length);\n if (groupIndex === arbitraryPropsGroupIndex) {\n // Arbitrary Props\n const arbitraryProp = groupUtil.getArbitraryProperty(name, mergedConfig.separator);\n const identifier = prefix + arbitraryProp;\n const idx = variants.findIndex((v) => identifier === v.prefix);\n if (idx === -1) {\n variants.push({\n prefix: identifier,\n name: [name],\n });\n } else {\n variants[idx].name.push(name);\n }\n } else {\n // \"Regular classNames\"\n const rePrefix = prefix === '' ? ambiguousArbitraryValuesOrClasses : '^' + prefix;\n const idx = variants.findIndex((v) => v.prefix === rePrefix);\n if (idx === -1) {\n variants.push({\n prefix: rePrefix,\n name: [name],\n });\n } else {\n variants[idx].name.push(name);\n }\n }\n });\n\n // Several classNames with the same prefix\n const potentialTroubles = variants.filter((v) => v.name.length > 1);\n if (potentialTroubles.length) {\n potentialTroubles.forEach((variantGroup) => {\n const re = new RegExp(variantGroup.prefix);\n const conflicting = group.filter((c) => re.test(c));\n context.report({\n node: node,\n messageId: 'conflictingClassnames',\n data: {\n classnames: conflicting.join(', '),\n },\n });\n });\n }\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n astUtil.parseNodeRecursive(node, null, parseForContradictingClassNames, true, false, ignoredKeys);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n astUtil.parseNodeRecursive(\n node,\n node.value.expression,\n parseForContradictingClassNames,\n true,\n false,\n ignoredKeys\n );\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n const allClassnamesForNode = [];\n const pushClasses = (classNames, targetNode) => {\n if (targetNode === null) {\n // Classnames should be parsed in isolation (e.g. conditional expressions)\n parseForContradictingClassNames(classNames, node);\n } else {\n // Gather the classes prior to validation\n allClassnamesForNode.push(...classNames);\n }\n };\n node.arguments.forEach((arg) => {\n astUtil.parseNodeRecursive(node, arg, pushClasses, true, false, ignoredKeys);\n });\n parseForContradictingClassNames(allClassnamesForNode, node);\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n\n const allClassnamesForNode = [];\n const pushClasses = (classNames, targetNode) => {\n if (targetNode === null) {\n // Classnames should be parsed in isolation (e.g. conditional expressions)\n parseForContradictingClassNames(classNames, node);\n } else {\n // Gather the classes prior to validation\n allClassnamesForNode.push(...classNames);\n }\n };\n astUtil.parseNodeRecursive(node, node.quasi, pushClasses, true, false, ignoredKeys);\n parseForContradictingClassNames(allClassnamesForNode, node);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n astUtil.parseNodeRecursive(node, null, parseForContradictingClassNames, true, false, ignoredKeys);\n break;\n case astUtil.isArrayExpression(node):\n const allClassnamesForNode = [];\n const pushClasses = (classNames, targetNode) => {\n if (targetNode === null) {\n // Classnames should be parsed in isolation (e.g. conditional expressions)\n parseForContradictingClassNames(classNames, node);\n } else {\n // Gather the classes prior to validation\n allClassnamesForNode.push(...classNames);\n }\n };\n node.value.expression.elements.forEach((el) => {\n astUtil.parseNodeRecursive(node, el, pushClasses, true, false, ignoredKeys);\n });\n parseForContradictingClassNames(allClassnamesForNode, node);\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n astUtil.parseNodeRecursive(node, prop, parseForContradictingClassNames, false, false, ignoredKeys);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","'use strict';\n\nconst fg = require('fast-glob');\nconst fs = require('fs');\nconst postcss = require('postcss');\nconst lastClassFromSelectorRegexp = /\\.([^\\.\\,\\s\\n\\:\\(\\)\\[\\]\\'~\\+\\>\\*\\\\]*)/gim;\nconst removeDuplicatesFromArray = require('./removeDuplicatesFromArray');\n\nconst cssFilesInfos = new Map();\nlet lastUpdate = null;\nlet classnamesFromFiles = [];\n\n/**\n * Read CSS files and extract classnames\n * @param {Array} patterns Glob patterns to locate files\n * @param {Number} refreshRate Interval\n * @returns {Array} List of classnames\n */\nconst generateClassnamesListSync = (patterns, refreshRate = 5_000) => {\n const now = Date.now();\n const isExpired = lastUpdate === null || now - lastUpdate > refreshRate;\n\n if (!isExpired) {\n // console.log(`generateClassnamesListSync from cache (${classnamesFromFiles.length} classes)`);\n return classnamesFromFiles;\n }\n\n // console.log('generateClassnamesListSync EXPIRED');\n // Update classnames from CSS files\n lastUpdate = now;\n const filesToBeRemoved = new Set([...cssFilesInfos.keys()]);\n const files = fg.sync(patterns, { suppressErrors: true, stats: true });\n for (const file of files) {\n let mtime = '';\n let canBeSkipped = cssFilesInfos.has(file.path);\n if (canBeSkipped) {\n // This file is still used\n filesToBeRemoved.delete(file.path);\n // Check modification date\n const stats = fs.statSync(file.path);\n mtime = `${stats.mtime || ''}`;\n canBeSkipped = cssFilesInfos.get(file.path).mtime === mtime;\n }\n if (canBeSkipped) {\n // File did not change since last run\n continue;\n }\n // Parse CSS file\n const data = fs.readFileSync(file.path, 'utf-8');\n const root = postcss.parse(data);\n let detectedClassnames = new Set();\n root.walkRules((rule) => {\n const matches = [...rule.selector.matchAll(lastClassFromSelectorRegexp)];\n const classnames = matches.map((arr) => arr[1]);\n detectedClassnames = new Set([...detectedClassnames, ...classnames]);\n });\n // Save the detected classnames\n cssFilesInfos.set(file.path, {\n mtime: mtime,\n classNames: [...detectedClassnames],\n });\n }\n // Remove erased CSS from the Map\n const deletedFiles = [...filesToBeRemoved];\n for (let i = 0; i < deletedFiles.length; i++) {\n cssFilesInfos.delete(deletedFiles[i]);\n }\n // Build the final list\n classnamesFromFiles = [];\n cssFilesInfos.forEach((css) => {\n classnamesFromFiles = [...classnamesFromFiles, ...css.classNames];\n });\n // Unique classnames\n return removeDuplicatesFromArray(classnamesFromFiles);\n};\n\nexport default generateClassnamesListSync;\n","var generateRulesFallback = require('tailwindcss/lib/lib/generateRules').generateRules;\n\nfunction generate(className, context) {\n // const order = generateRulesFallback(new Set([className]), context).sort(([a], [z]) => bigSign(z - a))[0]?.[0] ?? null;\n const gen = generateRulesFallback(new Set([className]), context);\n // console.debug(gen);\n return gen;\n}\n\nexport default generate;\n","/**\n * @fileoverview Detect classnames which do not belong to Tailwind CSS\n * @author no-custom-classname\n */\n'use strict';\n\nimport { groups as defaultGroups } from '../configs/groups';\nimport astUtil from '../util/ast';\nimport getClassnamesFromCSS from '../util/cssFiles';\nimport customConfig from '../util/customConfig';\nimport docsUrl from '../util/docsUrl';\nimport generated from '../util/generated';\nimport groupUtil from '../util/groupMethods';\nimport parserUtil from '../util/parser';\nimport getOption from '../util/settings';\nconst createContextFallback = require('tailwindcss/lib/lib/setupContextUtils').createContext;\nconst escapeRegex = require('../util/regex').escapeRegex;\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst CUSTOM_CLASSNAME_DETECTED_MSG = `Classname '{{classname}}' is not a Tailwind CSS class!`;\n\n// Group/peer names can be arbitrarily named and are not\n// generated by generateRules. Using a custom regexp to\n// validate these avoids false reports.\nconst getGroupNameRegex = (prefix = '') =>\n new RegExp(`^${escapeRegex(prefix)}(group|peer)\\/[\\\\w\\\\$\\\\#\\\\@\\\\%\\\\^\\\\&\\\\*\\\\_\\\\-]+$`, 'i');\n\nconst contextFallbackCache = new WeakMap();\n\nexport default {\n meta: {\n docs: {\n description: 'Detect classnames which do not belong to Tailwind CSS',\n category: 'Best Practices',\n recommended: false,\n url: docsUrl('no-custom-classname'),\n },\n messages: {\n customClassnameDetected: CUSTOM_CLASSNAME_DETECTED_MSG,\n },\n fixable: null,\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n cssFiles: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n cssFilesRefreshRate: {\n type: 'number',\n // default: 5_000,\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n whitelist: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const ignoredKeys = getOption(context, 'ignoredKeys');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const cssFiles = getOption(context, 'cssFiles');\n const cssFilesRefreshRate = getOption(context, 'cssFilesRefreshRate');\n const whitelist = getOption(context, 'whitelist');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n const contextFallback = // Set the created contextFallback in the cache if it does not exist yet.\n (\n contextFallbackCache.has(mergedConfig)\n ? contextFallbackCache\n : contextFallbackCache.set(mergedConfig, createContextFallback(mergedConfig))\n ).get(mergedConfig);\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n // Init assets before sorting\n const groups = groupUtil.getGroups(defaultGroups, mergedConfig);\n const classnamesFromFiles = getClassnamesFromCSS(cssFiles, cssFilesRefreshRate);\n const groupNameRegex = getGroupNameRegex(mergedConfig.prefix);\n\n /**\n * Parse the classnames and report found conflicts\n * @param {Array} classNames\n * @param {ASTNode} node\n */\n const parseForCustomClassNames = (classNames, node) => {\n classNames.forEach((className) => {\n const gen = generated(className, contextFallback);\n if (gen.length) {\n return; // Lazier is faster... processing next className!\n }\n const idx = groupUtil.getGroupIndex(className, groups, mergedConfig.separator);\n if (idx >= 0) {\n return; // Lazier is faster... processing next className!\n }\n const whitelistIdx = groupUtil.getGroupIndex(className, whitelist, mergedConfig.separator);\n if (whitelistIdx >= 0) {\n return; // Lazier is faster... processing next className!\n }\n const fromFilesIdx = groupUtil.getGroupIndex(className, classnamesFromFiles, mergedConfig.separator);\n if (fromFilesIdx >= 0) {\n return; // Lazier is faster... processing next className!\n }\n if (groupNameRegex.test(className)) {\n return; // Lazier is faster... processing next className!\n }\n\n // No match found\n context.report({\n node,\n messageId: 'customClassnameDetected',\n data: {\n classname: className,\n },\n });\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n astUtil.parseNodeRecursive(node, null, parseForCustomClassNames, false, false, ignoredKeys);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n astUtil.parseNodeRecursive(node, node.value.expression, parseForCustomClassNames, false, false, ignoredKeys);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n node.arguments.forEach((arg) => {\n astUtil.parseNodeRecursive(node, arg, parseForCustomClassNames, false, false, ignoredKeys);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name ?? node.tag.object?.name ?? node.tag.callee?.name)) {\n return;\n }\n astUtil.parseNodeRecursive(node, node.quasi, parseForCustomClassNames, false, false, ignoredKeys);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n astUtil.parseNodeRecursive(node, null, parseForCustomClassNames, false, false, ignoredKeys);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n astUtil.parseNodeRecursive(node, arg, parseForCustomClassNames, false, false, ignoredKeys);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n astUtil.parseNodeRecursive(node, prop, parseForCustomClassNames, false, false, ignoredKeys);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","/**\n * @fileoverview Detect arbitrary classnames which have an existing equivalent preset in the configuration\n * @author François Massart\n */\n'use strict';\n\nimport { groups as defaultGroups } from '../configs/groups';\nimport astUtil from '../util/ast';\nimport customConfig from '../util/customConfig';\nimport docsUrl from '../util/docsUrl';\nimport groupUtil from '../util/groupMethods';\nimport parserUtil from '../util/parser';\nimport getOption from '../util/settings';\nimport length from '../util/types/length';\n\nconst validZeroRegEx = length.validZeroRegEx;\n\n// TODO get the correct value of start and end\n// TODO make rule fixable when only 1 match\n// TODO propose several fixes when multiple matches + priority to exact match\n\n//------------------------------------------------------------------------------\n// Rule Definition\n//------------------------------------------------------------------------------\n\n// Predefine message for use in context.report conditional.\n// messageId will still be usable in tests.\nconst UNNECESSARY_ARBITRARY_VALUE_DETECTED_MSG = `The arbitrary class '{{classname}}' could be replaced by '{{presets}}'`;\n\nexport default {\n meta: {\n docs: {\n description: 'Forbid using arbitrary values in classnames when an equivalent preset exists',\n category: 'Best Practices',\n recommended: true,\n url: docsUrl('no-unnecessary-arbitrary-value'),\n },\n messages: {\n unnecessaryArbitraryValueDetected: UNNECESSARY_ARBITRARY_VALUE_DETECTED_MSG,\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n properties: {\n callees: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n ignoredKeys: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n config: {\n // returned from `loadConfig()` utility\n type: ['string', 'object'],\n },\n tags: {\n type: 'array',\n items: { type: 'string', minLength: 0 },\n uniqueItems: true,\n },\n },\n },\n ],\n },\n\n create: function (context) {\n const callees = getOption(context, 'callees');\n const skipClassAttribute = getOption(context, 'skipClassAttribute');\n const tags = getOption(context, 'tags');\n const twConfig = getOption(context, 'config');\n const classRegex = getOption(context, 'classRegex');\n\n const mergedConfig = customConfig.resolve(twConfig);\n const groups = groupUtil.getGroups(defaultGroups, mergedConfig);\n const configKeys = groupUtil.getGroupConfigKeys(defaultGroups);\n let parentTemplateLiteral = null;\n\n //----------------------------------------------------------------------\n // Helpers\n //----------------------------------------------------------------------\n\n /**\n * Recursive function crawling into child nodes\n * @param {ASTNode} node The root node of the current parsing\n * @param {ASTNode} arg The child node of node\n * @returns {void}\n */\n const parseForArbitraryValues = (node, arg = null) => {\n let start = null;\n let end = null;\n let originalClassNamesValue = null;\n if (arg === null) {\n originalClassNamesValue = astUtil.extractValueFromNode(node);\n const range = astUtil.extractRangeFromNode(node);\n if (node.type === 'TextAttribute') {\n start = range[0];\n end = range[1];\n } else {\n start = range[0] + 1;\n end = range[1] - 1;\n }\n } else {\n switch (arg.type) {\n case 'Identifier':\n return;\n case 'TemplateLiteral':\n parentTemplateLiteral = arg;\n arg.expressions.forEach((exp) => {\n parseForArbitraryValues(node, exp);\n });\n arg.quasis.forEach((quasis) => {\n parseForArbitraryValues(node, quasis);\n });\n parentTemplateLiteral = null;\n return;\n case 'ConditionalExpression':\n parseForArbitraryValues(node, arg.consequent);\n parseForArbitraryValues(node, arg.alternate);\n return;\n case 'LogicalExpression':\n parseForArbitraryValues(node, arg.right);\n return;\n case 'ArrayExpression':\n arg.elements.forEach((el) => {\n parseForArbitraryValues(node, el);\n });\n return;\n case 'ObjectExpression':\n const isUsedByClassNamesPlugin = node.callee && node.callee.name === 'classnames';\n const isVue = node.key && node.key.type === 'VDirectiveKey';\n arg.properties.forEach((prop) => {\n const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value;\n parseForArbitraryValues(node, propVal);\n });\n return;\n case 'Property':\n parseForArbitraryValues(node, arg.key);\n start = arg.range[0] + 1;\n end = arg.range[1] - 1;\n return;\n case 'Literal':\n originalClassNamesValue = arg.value;\n start = arg.range[0] + 1;\n end = arg.range[1] - 1;\n break;\n case 'TemplateElement':\n originalClassNamesValue = arg.value.raw;\n if (originalClassNamesValue === '') {\n return;\n }\n start = arg.range[0];\n end = arg.range[1];\n if (parentTemplateLiteral) {\n if (parentTemplateLiteral.range[0] === start) {\n start += 1; // Skip opening backtick\n } else {\n start += 1; // Skip closing }\n }\n if (parentTemplateLiteral.range[1] === end) {\n end -= 1; // Skip closing backtick\n } else {\n end -= 2; // Skip opening ${\n }\n }\n break;\n }\n }\n\n const arbitraryRegEx = /^(?.*)\\[(?.*)\\]$/i;\n const { classNames } = astUtil.extractClassnamesFromValue(originalClassNamesValue);\n const arbitraryClassnames = classNames.filter((c) => arbitraryRegEx.test(c));\n\n if (arbitraryClassnames.length === 0) {\n return;\n }\n\n const unnecessaryArbitraryClasses = [];\n const existingSubstitutes = [];\n\n arbitraryClassnames.forEach((arbitraryClass, idx) => {\n const parsed = groupUtil.parseClassname(arbitraryClass, [], mergedConfig, idx);\n const res = arbitraryRegEx.exec(parsed.name);\n if (res && res.groups && res.groups.backBone && res.groups.arbitraryValue) {\n const backBone = res.groups.backBone;\n const arbitraryValue = res.groups.arbitraryValue;\n const groupIdx = groupUtil.getGroupIndex(arbitraryClass, groups, mergedConfig.separator);\n if ([groups[groupIdx], parsed.body, arbitraryValue].includes(undefined)) {\n return false;\n }\n const canBeNegative = groups[groupIdx].indexOf('?') !== -1;\n const isNegativeClass = parsed.body.indexOf('-') === 0;\n const isNegativeValue = arbitraryValue.indexOf('-') === 0;\n const configurationKey = configKeys[groupIdx];\n const configuration = mergedConfig.theme[configurationKey];\n if ([undefined, null].includes(configuration)) {\n return false;\n }\n const configurationKeys = Object.keys(configuration);\n const zeroValueWithOrWithoutUnitsPattern = new RegExp(validZeroRegEx, 'i');\n const isZeroArbitraryValue = zeroValueWithOrWithoutUnitsPattern.test(arbitraryValue);\n const negativeSubstitutes = [];\n const matchingConfigurationKeys = configurationKeys.filter((key) => {\n const configValue = configuration[key];\n if (isZeroArbitraryValue && zeroValueWithOrWithoutUnitsPattern.test(configValue)) {\n // Both config and tested values are 0 based (with or without units)\n negativeSubstitutes.push(false);\n return true;\n }\n // Negative possibilities\n if (canBeNegative) {\n const absoluteValue = isNegativeValue ? arbitraryValue.substring(1) : arbitraryValue;\n const computedAsNegative = isNegativeClass !== isNegativeValue;\n if (`${configValue}` === `${absoluteValue}`) {\n negativeSubstitutes.push(computedAsNegative);\n return true;\n }\n return false;\n }\n // Default\n if (`${configValue}` === `${arbitraryValue}`) {\n negativeSubstitutes.push(false);\n return true;\n }\n return false;\n });\n if (matchingConfigurationKeys.length) {\n unnecessaryArbitraryClasses.push(parsed.name);\n existingSubstitutes.push(\n matchingConfigurationKeys.map((key, idx) => {\n let patchedBody = backBone.substring(parsed.variants.length);\n patchedBody = patchedBody.charAt(0) === '-' ? patchedBody.substring(1) : patchedBody;\n const noneOrMinus = negativeSubstitutes[idx] ? '-' : '';\n if (key === 'DEFAULT') {\n return parsed.variants + noneOrMinus + patchedBody.substring(0, patchedBody.length - 1);\n }\n return parsed.variants + noneOrMinus + patchedBody + key;\n })\n );\n }\n }\n });\n\n // TODO Group by range and bundle the fix\n const fixables = {};\n unnecessaryArbitraryClasses.forEach((forbiddenClass, idx) => {\n if (existingSubstitutes[idx].length === 1) {\n const rangeKey = `s${start}e${end}`;\n if (!fixables[rangeKey]) {\n fixables[rangeKey] = [];\n }\n const fixer = {\n unjustified: forbiddenClass,\n substitute: existingSubstitutes[idx][0],\n };\n fixables[rangeKey].push(fixer);\n } else {\n context.report({\n node,\n messageId: 'unnecessaryArbitraryValueDetected',\n data: {\n classname: forbiddenClass,\n presets: existingSubstitutes[idx].join(\"' or '\"),\n },\n });\n }\n });\n Object.keys(fixables).forEach((rangeKey) => {\n const batchFixes = fixables[rangeKey];\n let patched = originalClassNamesValue;\n const forbiddenClasses = [];\n const substitutes = [];\n for (let idx = 0; idx < batchFixes.length; idx++) {\n // BUG replace could affect same class with distinct variants... eg. h-0 might affect min-h-0\n const unjustified = batchFixes[idx].unjustified;\n forbiddenClasses.push(unjustified);\n const substitute = batchFixes[idx].substitute;\n substitutes.push(substitute);\n patched = patched.replace(unjustified, substitute);\n }\n context.report({\n node,\n messageId: 'unnecessaryArbitraryValueDetected',\n data: {\n classname: forbiddenClasses.join(', '),\n presets: substitutes.join(', '),\n },\n fix: function (fixer) {\n return fixer.replaceTextRange([start, end], patched);\n },\n });\n });\n };\n\n //----------------------------------------------------------------------\n // Public\n //----------------------------------------------------------------------\n\n const attributeVisitor = function (node) {\n if (!astUtil.isClassAttribute(node, classRegex) || skipClassAttribute) {\n return;\n }\n if (astUtil.isLiteralAttributeValue(node)) {\n parseForArbitraryValues(node);\n } else if (node.value && node.value.type === 'JSXExpressionContainer') {\n parseForArbitraryValues(node, node.value.expression);\n }\n };\n\n const callExpressionVisitor = function (node) {\n const calleeStr = astUtil.calleeToString(node.callee);\n if (callees.findIndex((name) => calleeStr === name) === -1) {\n return;\n }\n node.arguments.forEach((arg) => {\n parseForArbitraryValues(node, arg);\n });\n };\n\n const scriptVisitor = {\n JSXAttribute: attributeVisitor,\n TextAttribute: attributeVisitor,\n CallExpression: callExpressionVisitor,\n TaggedTemplateExpression: function (node) {\n if (!tags.includes(node.tag.name)) {\n return;\n }\n parseForArbitraryValues(node, node.quasi);\n },\n };\n\n const templateVisitor = {\n CallExpression: callExpressionVisitor,\n /*\n Tagged templates inside data bindings\n https://github.com/vuejs/vue/issues/9721\n */\n VAttribute: function (node) {\n switch (true) {\n case !astUtil.isValidVueAttribute(node, classRegex):\n return;\n case astUtil.isVLiteralValue(node):\n parseForArbitraryValues(node, null);\n break;\n case astUtil.isArrayExpression(node):\n node.value.expression.elements.forEach((arg) => {\n parseForArbitraryValues(node, arg);\n });\n break;\n case astUtil.isObjectExpression(node):\n node.value.expression.properties.forEach((prop) => {\n parseForArbitraryValues(node, prop);\n });\n break;\n }\n },\n };\n\n return parserUtil.defineTemplateBodyVisitor(context, templateVisitor, scriptVisitor);\n },\n};\n","import classnamesOrder from './classnames-order';\nimport enforcesNegativeArbitraryValues from './enforces-negative-arbitrary-values';\nimport enforcesShorthand from './enforces-shorthand';\nimport migrationFromTailwind2 from './migration-from-tailwind-2';\nimport noArbitraryValue from './no-arbitrary-value';\nimport noContradictingClassname from './no-contradicting-classname';\nimport noCustomClassname from './no-custom-classname';\nimport noUnnecessaryArbitraryValue from './no-unnecessary-arbitrary-value';\n\nexport const rules = {\n 'classnames-order': classnamesOrder,\n 'enforces-negative-arbitrary-values': enforcesNegativeArbitraryValues,\n 'enforces-shorthand': enforcesShorthand,\n 'migration-from-tailwind-2': migrationFromTailwind2,\n 'no-arbitrary-value': noArbitraryValue,\n 'no-contradicting-classname': noContradictingClassname,\n 'no-custom-classname': noCustomClassname,\n 'no-unnecessary-arbitrary-value': noUnnecessaryArbitraryValue,\n};\n","{\n \"name\": \"eslint-plugin-tailwindcss\",\n \"version\": \"3.18.0\",\n \"description\": \"Rules enforcing best practices while using Tailwind CSS\",\n \"type\": \"module\",\n \"keywords\": [\n \"eslint\",\n \"eslintplugin\",\n \"eslint-plugin\",\n \"tailwind\",\n \"tailwindcss\"\n ],\n \"author\": \"François Massart\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/francoismassart/eslint-plugin-tailwindcss\"\n },\n \"homepage\": \"https://github.com/francoismassart/eslint-plugin-tailwindcss\",\n \"bugs\": \"https://github.com/francoismassart/eslint-plugin-tailwindcss/issues\",\n \"main\": \"lib/index.js\",\n \"scripts\": {\n \"test\": \"npm run test:base && npm run test:integration\",\n \"test:base\": \"mocha \\\"tests/lib/**/*.js\\\"\",\n \"test:integration\": \"mocha \\\"tests/integrations/*.js\\\" --timeout 60000\",\n \"build\": \"tsc --build\",\n \"build:diagnostics\": \"tsc --build --diagnostics\",\n \"watch\": \"tsc --watch\",\n \"tsup\": \"tsup ./src/index.ts --outDir lib/\",\n \"tsup:watch\": \"tsup ./src/index.ts --watch --outDir lib/\",\n \"docs:init\": \"eslint-doc-generator --init-rule-docs\",\n \"docs:update\": \"eslint-doc-generator\"\n },\n \"files\": [\n \"lib\"\n ],\n \"peerDependencies\": {\n \"tailwindcss\": \"^4.0.0\"\n },\n \"dependencies\": {\n \"@typescript-eslint/utils\": \"^7.13.0\",\n \"eslint\": \"^8.56.0\",\n \"fast-glob\": \"^3.2.5\",\n \"postcss\": \"^8.4.4\"\n },\n \"devDependencies\": {\n \"@angular-eslint/template-parser\": \"^15.2.0\",\n \"@tailwindcss/aspect-ratio\": \"^0.4.2\",\n \"@tailwindcss/forms\": \"^0.5.3\",\n \"@tailwindcss/line-clamp\": \"^0.4.2\",\n \"@tailwindcss/typography\": \"^0.5.8\",\n \"@types/eslint\": \"^8.56.10\",\n \"@types/jest\": \"^29.5.12\",\n \"@types/node\": \"^18.12.0\",\n \"@typescript-eslint/parser\": \"^7.13.0\",\n \"@typescript-eslint/rule-tester\": \"^7.13.0\",\n \"autoprefixer\": \"^10.4.0\",\n \"daisyui\": \"^2.6.4\",\n \"eslint\": \"^8.57.0\",\n \"eslint-doc-generator\": \"^1.7.1\",\n \"mocha\": \"^10.2.0\",\n \"semver\": \"^7.6.0\",\n \"tailwindcss\": \"^4.0.0\",\n \"tsup\": \"^8.1.0\",\n \"typescript\": \"^5.4.5\",\n \"vue-eslint-parser\": \"^9.4.2\"\n },\n \"packageManager\": \"npm@10.2.5+sha256.8002e3e7305d2abd4016e1368af48d49b066c269079eeb10a56e7d6598acfdaa\",\n \"engines\": {\n \"node\": \">=18.12.0\"\n },\n \"license\": \"MIT\"\n}\n","/**\n * @fileoverview Rules enforcing best practices while using Tailwind CSS\n * @author François Massart\n */\n'use strict';\n\nimport { RuleModule } from '@typescript-eslint/utils/ts-eslint';\nimport { type ESLint } from 'eslint';\nimport { configs } from './configs';\nimport { rules } from './rules';\n\n//------------------------------------------------------------------------------\n// Plugin Definition\n//------------------------------------------------------------------------------\n\ntype RuleKey = keyof typeof rules;\n\ninterface Plugin extends Omit {\n rules: Record>;\n}\n\nconst { name, version } = await import('../package.json');\n\n// import all rules in lib/rules\nconst plugin: Plugin = {\n meta: {\n name,\n version,\n },\n rules,\n configs,\n};\nexport default plugin;\n"],"mappings":"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AA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AA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","names":["name","removeDuplicatesFromArray","order","name","mergedConfig","name","groups","name","mergedConfig","name","mergedConfig","targetGroups","cloned","name","docsUrl","getOption","mergedConfig","suffix","name","docsUrl","customConfig","astUtil","groupUtil","getOption","parserUtil","mergedConfig","name","mergedConfig","groups","name","fs","removeDuplicatesFromArray","createContextFallback","escapeRegex","contextFallbackCache","mergedConfig","groups","classnamesFromFiles","name","validZeroRegEx","mergedConfig","groups","idx","name","init_rules","plugin","init_rules"]} \ No newline at end of file From c5fd61b92acb2a16001e25833dd4a1c9626e4267 Mon Sep 17 00:00:00 2001 From: Imamuzzaki Abu Salam Date: Fri, 24 Jan 2025 21:44:39 +0700 Subject: [PATCH 3/4] chore: add 'lib' to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 22d59e5e..46111d41 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules .DS_Store .idea +lib From 89afb48202493a1b14c66971edf54d968ca9f477 Mon Sep 17 00:00:00 2001 From: Imamuzzaki Abu Salam Date: Fri, 24 Jan 2025 21:52:34 +0700 Subject: [PATCH 4/4] refactor: migrate to ES module syntax for imports across utility and rule files --- src/rules/classnames-order.ts | 2 +- src/rules/migration-from-tailwind-2.ts | 12 ++++++------ src/rules/no-arbitrary-value.ts | 12 ++++++------ src/rules/no-custom-classname.ts | 4 ++-- src/util/ast.ts | 2 +- src/util/cssFiles.ts | 8 ++++---- src/util/customConfig.ts | 4 ++-- src/util/generated.ts | 2 +- src/util/settings.ts | 2 +- 9 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/rules/classnames-order.ts b/src/rules/classnames-order.ts index d3ffd426..fd3fb3c4 100644 --- a/src/rules/classnames-order.ts +++ b/src/rules/classnames-order.ts @@ -4,6 +4,7 @@ */ 'use strict'; +import { createContext as createContextFallback } from 'tailwindcss/lib/lib/setupContextUtils'; import astUtil from '../util/ast'; import customConfig from '../util/customConfig'; import docsUrl from '../util/docsUrl'; @@ -11,7 +12,6 @@ import parserUtil from '../util/parser'; import order from '../util/prettier/order'; import removeDuplicatesFromClassnamesAndWhitespaces from '../util/removeDuplicatesFromClassnamesAndWhitespaces'; import getOption from '../util/settings'; -const createContextFallback = require('tailwindcss/lib/lib/setupContextUtils').createContext; //------------------------------------------------------------------------------ // Rule Definition diff --git a/src/rules/migration-from-tailwind-2.ts b/src/rules/migration-from-tailwind-2.ts index 4261efd1..dd1bdf89 100644 --- a/src/rules/migration-from-tailwind-2.ts +++ b/src/rules/migration-from-tailwind-2.ts @@ -4,12 +4,12 @@ */ 'use strict'; -const docsUrl = require('../util/docsUrl'); -const customConfig = require('../util/customConfig'); -const astUtil = require('../util/ast'); -const groupUtil = require('../util/groupMethods'); -const getOption = require('../util/settings'); -const parserUtil = require('../util/parser'); +import astUtil from '../util/ast'; +import customConfig from '../util/customConfig'; +import docsUrl from '../util/docsUrl'; +import groupUtil from '../util/groupMethods'; +import parserUtil from '../util/parser'; +import getOption from '../util/settings'; //------------------------------------------------------------------------------ // Rule Definition diff --git a/src/rules/no-arbitrary-value.ts b/src/rules/no-arbitrary-value.ts index 7a0ef71a..39478d60 100644 --- a/src/rules/no-arbitrary-value.ts +++ b/src/rules/no-arbitrary-value.ts @@ -4,12 +4,12 @@ */ 'use strict'; -const docsUrl = require('../util/docsUrl'); -const customConfig = require('../util/customConfig'); -const astUtil = require('../util/ast'); -const groupUtil = require('../util/groupMethods'); -const getOption = require('../util/settings'); -const parserUtil = require('../util/parser'); +import astUtil from '../util/ast'; +import customConfig from '../util/customConfig'; +import docsUrl from '../util/docsUrl'; +import groupUtil from '../util/groupMethods'; +import parserUtil from '../util/parser'; +import getOption from '../util/settings'; //------------------------------------------------------------------------------ // Rule Definition diff --git a/src/rules/no-custom-classname.ts b/src/rules/no-custom-classname.ts index df5180eb..ac801319 100644 --- a/src/rules/no-custom-classname.ts +++ b/src/rules/no-custom-classname.ts @@ -4,6 +4,7 @@ */ 'use strict'; +import { createContext as createContextFallback } from 'tailwindcss/lib/lib/setupContextUtils'; import { groups as defaultGroups } from '../configs/groups'; import astUtil from '../util/ast'; import getClassnamesFromCSS from '../util/cssFiles'; @@ -12,9 +13,8 @@ import docsUrl from '../util/docsUrl'; import generated from '../util/generated'; import groupUtil from '../util/groupMethods'; import parserUtil from '../util/parser'; +import { escapeRegex } from '../util/regex'; import getOption from '../util/settings'; -const createContextFallback = require('tailwindcss/lib/lib/setupContextUtils').createContext; -const escapeRegex = require('../util/regex').escapeRegex; //------------------------------------------------------------------------------ // Rule Definition diff --git a/src/util/ast.ts b/src/util/ast.ts index 962ce9c4..7ab31a2e 100644 --- a/src/util/ast.ts +++ b/src/util/ast.ts @@ -9,7 +9,7 @@ import { separatorRegEx } from './regex'; // /.../eslint-plugin-tailwindcss/node_modules/espree/espree.js // /.../eslint-plugin-tailwindcss/node_modules/@angular-eslint/template-parser/dist/index.js -const removeDuplicatesFromArray = require('./removeDuplicatesFromArray'); +import removeDuplicatesFromArray from './removeDuplicatesFromArray'; function calleeToString(calleeNode) { if (calleeNode.type === 'Identifier') { diff --git a/src/util/cssFiles.ts b/src/util/cssFiles.ts index 7b84a3f8..e834dbb5 100644 --- a/src/util/cssFiles.ts +++ b/src/util/cssFiles.ts @@ -1,10 +1,10 @@ 'use strict'; -const fg = require('fast-glob'); -const fs = require('fs'); -const postcss = require('postcss'); +import fg from 'fast-glob'; +import fs from 'fs'; +import postcss from 'postcss'; +import removeDuplicatesFromArray from './removeDuplicatesFromArray'; const lastClassFromSelectorRegexp = /\.([^\.\,\s\n\:\(\)\[\]\'~\+\>\*\\]*)/gim; -const removeDuplicatesFromArray = require('./removeDuplicatesFromArray'); const cssFilesInfos = new Map(); let lastUpdate = null; diff --git a/src/util/customConfig.ts b/src/util/customConfig.ts index f06f84c4..f7c2dad1 100644 --- a/src/util/customConfig.ts +++ b/src/util/customConfig.ts @@ -6,7 +6,7 @@ import resolveConfig from 'tailwindcss/resolveConfig'; let twLoadConfig: { loadConfig: (arg0: any) => any } | null; try { - twLoadConfig = require('tailwindcss/lib/lib/load-config'); + twLoadConfig = await import('tailwindcss/lib/lib/load-config'); } catch (err) { twLoadConfig = null; } @@ -14,7 +14,7 @@ try { const CHECK_REFRESH_RATE = 1_000; let previousConfig: null = null; let lastCheck: number | null = null; -let mergedConfig: null = null; +let mergedConfig: null | ReturnType = null; let lastModifiedDate: string | null = null; /** diff --git a/src/util/generated.ts b/src/util/generated.ts index aef79d85..f4a7bbbb 100644 --- a/src/util/generated.ts +++ b/src/util/generated.ts @@ -1,4 +1,4 @@ -var generateRulesFallback = require('tailwindcss/lib/lib/generateRules').generateRules; +import { generateRules as generateRulesFallback } from 'tailwindcss/lib/lib/generateRules'; function generate(className, context) { // const order = generateRulesFallback(new Set([className]), context).sort(([a], [z]) => bigSign(z - a))[0]?.[0] ?? null; diff --git a/src/util/settings.ts b/src/util/settings.ts index 633b6dac..d6df15fd 100644 --- a/src/util/settings.ts +++ b/src/util/settings.ts @@ -2,7 +2,7 @@ let resolveDefaultConfigPathAlias: (() => any) | null; try { - const { resolveDefaultConfigPath } = require('tailwindcss/lib/util/resolveConfigPath'); + const { resolveDefaultConfigPath } = await import('tailwindcss/lib/util/resolveConfigPath'); resolveDefaultConfigPathAlias = resolveDefaultConfigPath; } catch (err) { resolveDefaultConfigPathAlias = null;