@santi020k/eslint-config-basic 3.4.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,8 @@ import { TailwindOptions } from '@santi020k/eslint-config-core';
2
2
  import { TSESLint } from '@typescript-eslint/utils';
3
3
 
4
4
  declare const findCssComponentClasses: (cwd: string, entryPoint: string) => string[];
5
+ declare const findTailwindPluginClassPatterns: (cwd: string, entryPoint: string) => string[];
5
6
  declare const findCssComponentClassPatterns: (cwd: string, entryPoint: string) => string[];
6
7
  declare const buildTailwindSettingsConfig: (tailwindOptions: TailwindOptions) => TSESLint.FlatConfig.Config;
7
8
 
8
- export { buildTailwindSettingsConfig, findCssComponentClassPatterns, findCssComponentClasses };
9
+ export { buildTailwindSettingsConfig, findCssComponentClassPatterns, findCssComponentClasses, findTailwindPluginClassPatterns };
package/dist/tailwind.js CHANGED
@@ -1,4 +1,4 @@
1
- import { existsSync, readFileSync } from "node:fs";
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
2
  import { dirname, extname, isAbsolute, join, resolve } from "node:path";
3
3
  const CSS_ESCAPE_PATTERN = String.raw`\\(?:[\dA-Fa-f]{1,6}\s?|[^\f\n\r])`;
4
4
  const CSS_CLASS_PATTERN = new RegExp(
@@ -7,9 +7,31 @@ const CSS_CLASS_PATTERN = new RegExp(
7
7
  );
8
8
  const CSS_UTILITY_PATTERN = /@utility\s+([A-Za-z_][\w-]*)\s*\{/g;
9
9
  const CSS_IMPORT_PATTERN = /@import\s+(?:url\(\s*)?["']([^"']+)["']/g;
10
+ const CSS_PLUGIN_PATTERN = /@plugin\s+["']([^"']+)["']/g;
10
11
  const CSS_COMMENT_PATTERN = /\/\*[\s\S]*?\*\//g;
11
12
  const CSS_STRING_PATTERN = /("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')/g;
13
+ const ASTRO_STYLE_PATTERN = /<style(?:\s[^>]*)?>([\s\S]*?)<\/style\s*>/gi;
14
+ const TAILWIND_CONFIG_PATTERN = /^tailwind\.config\.(?:cjs|cts|js|mjs|mts|ts)$/;
12
15
  const MAX_COMPONENT_PATTERN_LENGTH = 3e3;
16
+ const IGNORED_COMPONENT_DIRECTORIES = /* @__PURE__ */ new Set([
17
+ ".astro",
18
+ ".git",
19
+ ".next",
20
+ ".nuxt",
21
+ ".output",
22
+ ".svelte-kit",
23
+ "build",
24
+ "coverage",
25
+ "dist",
26
+ "node_modules"
27
+ ]);
28
+ const PLUGIN_CLASS_PATTERNS = {
29
+ "@tailwindcss/aspect-ratio": ["^aspect-(?:h|w)-\\d+$"],
30
+ "@tailwindcss/forms": [
31
+ "^form-(?:checkbox|input|multiselect|radio|select|textarea)$"
32
+ ],
33
+ "@tailwindcss/typography": ["^not-prose$"]
34
+ };
13
35
  const decodeCssIdentifier = (value) => value.replaceAll(/\\([\dA-Fa-f]{1,6})\s?/g, (_, codePoint) => String.fromCodePoint(Number.parseInt(codePoint, 16))).replaceAll(/\\([^\f\n\r])/g, "$1");
14
36
  const resolveLocalCssImport = (filePath, specifier) => {
15
37
  if (!specifier.startsWith(".") && !isAbsolute(specifier)) return void 0;
@@ -42,21 +64,63 @@ const getCssSelectorClasses = (content) => {
42
64
  return [...classes];
43
65
  };
44
66
  const getCssUtilityClasses = (content) => [...content.replaceAll(CSS_COMMENT_PATTERN, "").matchAll(CSS_UTILITY_PATTERN)].flatMap((match) => match[1] ? [match[1]] : []);
45
- const collectCssComponentClasses = (filePath, visited, classes) => {
46
- if (visited.has(filePath)) return;
47
- visited.add(filePath);
48
- let content;
67
+ const getCssPlugins = (content) => [...content.replaceAll(CSS_COMMENT_PATTERN, "").matchAll(CSS_PLUGIN_PATTERN)].flatMap((match) => match[1] ? [match[1]] : []);
68
+ const readDirectory = (directory) => {
49
69
  try {
50
- content = readFileSync(filePath, "utf8");
70
+ return readdirSync(directory, { withFileTypes: true, encoding: "utf8" });
51
71
  } catch {
52
- return;
72
+ return [];
53
73
  }
74
+ };
75
+ const readTextFile = (path) => {
76
+ try {
77
+ return readFileSync(path, "utf8");
78
+ } catch {
79
+ return void 0;
80
+ }
81
+ };
82
+ const collectCssComponentClasses = (filePath, visited, classes, plugins) => {
83
+ if (visited.has(filePath)) return;
84
+ visited.add(filePath);
85
+ const content = readTextFile(filePath);
86
+ if (content === void 0) return;
54
87
  for (const className of getCssSelectorClasses(content)) classes.add(className);
55
88
  for (const className of getCssUtilityClasses(content)) classes.add(className);
89
+ for (const plugin of getCssPlugins(content)) plugins.add(plugin);
56
90
  for (const importedFile of getImportedCssFiles(filePath, content)) {
57
- collectCssComponentClasses(importedFile, visited, classes);
91
+ collectCssComponentClasses(importedFile, visited, classes, plugins);
58
92
  }
59
93
  };
94
+ const collectAstroComponentClasses = (cwd, classes) => {
95
+ const visit = (directory) => {
96
+ const entries = readDirectory(directory);
97
+ for (const entry of entries.filter((entry2) => entry2.isDirectory() && !IGNORED_COMPONENT_DIRECTORIES.has(entry2.name))) visit(join(directory, entry.name));
98
+ for (const entry of entries.filter((entry2) => entry2.isFile() && entry2.name.endsWith(".astro"))) {
99
+ const content = readTextFile(join(directory, entry.name));
100
+ if (content === void 0) continue;
101
+ for (const style of content.matchAll(ASTRO_STYLE_PATTERN)) {
102
+ const stylesheet = style[1];
103
+ if (!stylesheet) continue;
104
+ for (const className of getCssSelectorClasses(stylesheet)) classes.add(className);
105
+ for (const className of getCssUtilityClasses(stylesheet)) classes.add(className);
106
+ }
107
+ }
108
+ };
109
+ visit(cwd);
110
+ };
111
+ const getConfiguredTailwindPlugins = (cwd) => {
112
+ const plugins = /* @__PURE__ */ new Set();
113
+ for (const entry of readDirectory(cwd)) {
114
+ if (!entry.isFile() || !TAILWIND_CONFIG_PATTERN.test(entry.name)) continue;
115
+ const content = readTextFile(join(cwd, entry.name));
116
+ if (content === void 0) continue;
117
+ const uncommentedContent = content.replaceAll(/\/\*[\s\S]*?\*\//g, "").replaceAll(/^\s*\/\/.*$/gm, "");
118
+ for (const plugin of Object.keys(PLUGIN_CLASS_PATTERNS)) {
119
+ if (uncommentedContent.includes(plugin)) plugins.add(plugin);
120
+ }
121
+ }
122
+ return [...plugins];
123
+ };
60
124
  const escapeRegex = (value) => value.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&");
61
125
  const createExactClassPatterns = (classes) => {
62
126
  const patterns = [];
@@ -78,9 +142,16 @@ const createExactClassPatterns = (classes) => {
78
142
  const findCssComponentClasses = (cwd, entryPoint) => {
79
143
  const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint);
80
144
  const classes = /* @__PURE__ */ new Set();
81
- collectCssComponentClasses(entryPath, /* @__PURE__ */ new Set(), classes);
145
+ collectCssComponentClasses(entryPath, /* @__PURE__ */ new Set(), classes, /* @__PURE__ */ new Set());
146
+ collectAstroComponentClasses(cwd, classes);
82
147
  return [...classes].toSorted();
83
148
  };
149
+ const findTailwindPluginClassPatterns = (cwd, entryPoint) => {
150
+ const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint);
151
+ const plugins = new Set(getConfiguredTailwindPlugins(cwd));
152
+ collectCssComponentClasses(entryPath, /* @__PURE__ */ new Set(), /* @__PURE__ */ new Set(), plugins);
153
+ return [...plugins].flatMap((plugin) => PLUGIN_CLASS_PATTERNS[plugin] ?? []).filter((pattern, index, patterns) => patterns.indexOf(pattern) === index).toSorted();
154
+ };
84
155
  const findCssComponentClassPatterns = (cwd, entryPoint) => createExactClassPatterns(findCssComponentClasses(cwd, entryPoint));
85
156
  const getIgnoredClasses = (tailwindOptions) => {
86
157
  const configuredClasses = tailwindOptions.ignore ?? [];
@@ -91,7 +162,11 @@ const getIgnoredClasses = (tailwindOptions) => {
91
162
  tailwindOptions.cwd ?? process.cwd(),
92
163
  tailwindOptions.entryPoint
93
164
  );
94
- return [.../* @__PURE__ */ new Set([...configuredClasses, ...detectedClasses])];
165
+ const pluginClasses = findTailwindPluginClassPatterns(
166
+ tailwindOptions.cwd ?? process.cwd(),
167
+ tailwindOptions.entryPoint
168
+ );
169
+ return [.../* @__PURE__ */ new Set([...configuredClasses, ...detectedClasses, ...pluginClasses])];
95
170
  };
96
171
  const getUnknownClassRule = (tailwindOptions, ignoredClasses) => {
97
172
  const options = {
@@ -122,6 +197,7 @@ const buildTailwindSettingsConfig = (tailwindOptions) => {
122
197
  export {
123
198
  buildTailwindSettingsConfig,
124
199
  findCssComponentClassPatterns,
125
- findCssComponentClasses
200
+ findCssComponentClasses,
201
+ findTailwindPluginClassPatterns
126
202
  };
127
203
  //# sourceMappingURL=tailwind.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tailwind.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, extname, isAbsolute, join, resolve } from 'node:path'\n\nimport type { TailwindOptions } from '@santi020k/eslint-config-core'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nconst CSS_ESCAPE_PATTERN = String.raw`\\\\(?:[\\dA-Fa-f]{1,6}\\s?|[^\\f\\n\\r])`\n\nconst CSS_CLASS_PATTERN = new RegExp(\n String.raw`\\.((?:${CSS_ESCAPE_PATTERN}|[A-Za-z_])(?:${CSS_ESCAPE_PATTERN}|[\\w-])*)`,\n 'g'\n)\n\nconst CSS_UTILITY_PATTERN = /@utility\\s+([A-Za-z_][\\w-]*)\\s*\\{/g\nconst CSS_IMPORT_PATTERN = /@import\\s+(?:url\\(\\s*)?[\"']([^\"']+)[\"']/g\nconst CSS_COMMENT_PATTERN = /\\/\\*[\\s\\S]*?\\*\\//g\nconst CSS_STRING_PATTERN = /(\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*')/g\nconst MAX_COMPONENT_PATTERN_LENGTH = 3000\n\nconst decodeCssIdentifier = (value: string): string => value\n .replaceAll(/\\\\([\\dA-Fa-f]{1,6})\\s?/g, (_, codePoint: string) => String.fromCodePoint(Number.parseInt(codePoint, 16)))\n .replaceAll(/\\\\([^\\f\\n\\r])/g, '$1')\n\nconst resolveLocalCssImport = (filePath: string, specifier: string): string | undefined => {\n if (!specifier.startsWith('.') && !isAbsolute(specifier)) return undefined\n\n const cleanSpecifier = specifier.split(/[?#]/, 1)[0]\n\n if (!cleanSpecifier) return undefined\n\n const candidate = isAbsolute(cleanSpecifier) ? cleanSpecifier : resolve(dirname(filePath), cleanSpecifier)\n const candidates = extname(candidate) ? [candidate] : [candidate, `${candidate}.css`, join(candidate, 'index.css')]\n\n return candidates.find(path => existsSync(path))\n}\n\nconst getImportedCssFiles = (filePath: string, content: string): string[] => (\n [...content.matchAll(CSS_IMPORT_PATTERN)].flatMap(match => {\n const importedFile = match[1] ? resolveLocalCssImport(filePath, match[1]) : undefined\n\n return importedFile ? [importedFile] : []\n })\n)\n\nconst getCssSelectorClasses = (content: string): string[] => {\n const classes = new Set<string>()\n const source = content.replaceAll(CSS_COMMENT_PATTERN, '')\n\n for (const blockStart of source.matchAll(/\\{/g)) {\n const index = blockStart.index\n\n const boundary = Math.max(\n source.lastIndexOf(';', index - 1),\n source.lastIndexOf('{', index - 1),\n source.lastIndexOf('}', index - 1)\n )\n\n const selector = source.slice(boundary + 1, index).trim()\n\n if (!selector || selector.startsWith('@')) continue\n\n for (const match of selector.replaceAll(CSS_STRING_PATTERN, '').matchAll(CSS_CLASS_PATTERN)) {\n if (match[1]) classes.add(decodeCssIdentifier(match[1]))\n }\n }\n\n return [...classes]\n}\n\nconst getCssUtilityClasses = (content: string): string[] => (\n [...content.replaceAll(CSS_COMMENT_PATTERN, '').matchAll(CSS_UTILITY_PATTERN)]\n .flatMap(match => match[1] ? [match[1]] : [])\n)\n\nconst collectCssComponentClasses = (\n filePath: string,\n visited: Set<string>,\n classes: Set<string>\n): void => {\n if (visited.has(filePath)) return\n\n visited.add(filePath)\n\n let content: string\n\n try {\n content = readFileSync(filePath, 'utf8')\n } catch {\n return\n }\n\n for (const className of getCssSelectorClasses(content)) classes.add(className)\n\n for (const className of getCssUtilityClasses(content)) classes.add(className)\n\n for (const importedFile of getImportedCssFiles(filePath, content)) {\n collectCssComponentClasses(importedFile, visited, classes)\n }\n}\n\nconst escapeRegex = (value: string): string => value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\nconst createExactClassPatterns = (classes: string[]): string[] => {\n const patterns: string[] = []\n let alternatives: string[] = []\n\n const flush = (): void => {\n if (alternatives.length === 0) return\n\n patterns.push(`^(?:${alternatives.join('|')})$`)\n\n alternatives = []\n }\n\n for (const className of classes.toSorted()) {\n const escapedClass = escapeRegex(className)\n const nextLength = alternatives.join('|').length + escapedClass.length + 6\n\n if (nextLength > MAX_COMPONENT_PATTERN_LENGTH) flush()\n\n alternatives.push(escapedClass)\n }\n\n flush()\n\n return patterns\n}\n\nexport const findCssComponentClasses = (\n cwd: string,\n entryPoint: string\n): string[] => {\n const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint)\n const classes = new Set<string>()\n\n collectCssComponentClasses(entryPath, new Set(), classes)\n\n return [...classes].toSorted()\n}\n\nexport const findCssComponentClassPatterns = (\n cwd: string,\n entryPoint: string\n): string[] => createExactClassPatterns(findCssComponentClasses(cwd, entryPoint))\n\nconst getIgnoredClasses = (tailwindOptions: TailwindOptions): string[] => {\n const configuredClasses = tailwindOptions.ignore ?? []\n\n if (!tailwindOptions.entryPoint || tailwindOptions.detectComponentClasses === false) {\n return configuredClasses\n }\n\n const detectedClasses = findCssComponentClassPatterns(\n tailwindOptions.cwd ?? process.cwd(),\n tailwindOptions.entryPoint\n )\n\n return [...new Set([...configuredClasses, ...detectedClasses])]\n}\n\nconst getUnknownClassRule = (\n tailwindOptions: TailwindOptions,\n ignoredClasses: string[]\n): TSESLint.FlatConfig.RuleEntry | undefined => {\n const options = {\n ...(tailwindOptions.entryPoint ? { entryPoint: tailwindOptions.entryPoint } : {}),\n ...(ignoredClasses.length ? { ignore: ignoredClasses } : {})\n }\n\n const hasOptions = Object.keys(options).length > 0\n const severity = tailwindOptions.noUnknownClasses ?? 'error'\n\n if (!hasOptions && tailwindOptions.noUnknownClasses === undefined) return undefined\n\n if (severity === false) return 'off'\n\n return hasOptions ? [severity, options] : severity\n}\n\nexport const buildTailwindSettingsConfig = (\n tailwindOptions: TailwindOptions\n): TSESLint.FlatConfig.Config => {\n const ignoredClasses = getIgnoredClasses(tailwindOptions)\n const noUnknownClassesRule = getUnknownClassRule(tailwindOptions, ignoredClasses)\n\n const settingsOptions = {\n ...(tailwindOptions.cwd ? { cwd: tailwindOptions.cwd } : {}),\n ...(tailwindOptions.detectComponentClasses === undefined ?\n {} :\n { detectComponentClasses: tailwindOptions.detectComponentClasses }),\n ...(tailwindOptions.entryPoint ? { entryPoint: tailwindOptions.entryPoint } : {}),\n ...(tailwindOptions.ignore?.length ? { ignore: tailwindOptions.ignore } : {})\n }\n\n return {\n name: 'eslint-config-basic/tailwind-settings',\n ...(noUnknownClassesRule === undefined ?\n {} :\n { rules: { 'better-tailwindcss/no-unknown-classes': noUnknownClassesRule } }),\n settings: { 'better-tailwindcss': settingsOptions }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/tailwind.ts"],"sourcesContent":["import type { Dirent } from 'node:fs'\nimport { existsSync, readdirSync, readFileSync } from 'node:fs'\nimport { dirname, extname, isAbsolute, join, resolve } from 'node:path'\n\nimport type { TailwindOptions } from '@santi020k/eslint-config-core'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nconst CSS_ESCAPE_PATTERN = String.raw`\\\\(?:[\\dA-Fa-f]{1,6}\\s?|[^\\f\\n\\r])`\n\nconst CSS_CLASS_PATTERN = new RegExp(\n String.raw`\\.((?:${CSS_ESCAPE_PATTERN}|[A-Za-z_])(?:${CSS_ESCAPE_PATTERN}|[\\w-])*)`,\n 'g'\n)\n\nconst CSS_UTILITY_PATTERN = /@utility\\s+([A-Za-z_][\\w-]*)\\s*\\{/g\nconst CSS_IMPORT_PATTERN = /@import\\s+(?:url\\(\\s*)?[\"']([^\"']+)[\"']/g\nconst CSS_PLUGIN_PATTERN = /@plugin\\s+[\"']([^\"']+)[\"']/g\nconst CSS_COMMENT_PATTERN = /\\/\\*[\\s\\S]*?\\*\\//g\nconst CSS_STRING_PATTERN = /(\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*')/g\nconst ASTRO_STYLE_PATTERN = /<style(?:\\s[^>]*)?>([\\s\\S]*?)<\\/style\\s*>/gi\nconst TAILWIND_CONFIG_PATTERN = /^tailwind\\.config\\.(?:cjs|cts|js|mjs|mts|ts)$/\nconst MAX_COMPONENT_PATTERN_LENGTH = 3000\n\nconst IGNORED_COMPONENT_DIRECTORIES = new Set([\n '.astro',\n '.git',\n '.next',\n '.nuxt',\n '.output',\n '.svelte-kit',\n 'build',\n 'coverage',\n 'dist',\n 'node_modules'\n])\n\nconst PLUGIN_CLASS_PATTERNS: Readonly<Record<string, readonly string[]>> = {\n '@tailwindcss/aspect-ratio': ['^aspect-(?:h|w)-\\\\d+$'],\n '@tailwindcss/forms': [\n '^form-(?:checkbox|input|multiselect|radio|select|textarea)$'\n ],\n '@tailwindcss/typography': ['^not-prose$']\n}\n\nconst decodeCssIdentifier = (value: string): string => value\n .replaceAll(/\\\\([\\dA-Fa-f]{1,6})\\s?/g, (_, codePoint: string) => String.fromCodePoint(Number.parseInt(codePoint, 16)))\n .replaceAll(/\\\\([^\\f\\n\\r])/g, '$1')\n\nconst resolveLocalCssImport = (filePath: string, specifier: string): string | undefined => {\n if (!specifier.startsWith('.') && !isAbsolute(specifier)) return undefined\n\n const cleanSpecifier = specifier.split(/[?#]/, 1)[0]\n\n if (!cleanSpecifier) return undefined\n\n const candidate = isAbsolute(cleanSpecifier) ? cleanSpecifier : resolve(dirname(filePath), cleanSpecifier)\n const candidates = extname(candidate) ? [candidate] : [candidate, `${candidate}.css`, join(candidate, 'index.css')]\n\n return candidates.find(path => existsSync(path))\n}\n\nconst getImportedCssFiles = (filePath: string, content: string): string[] => (\n [...content.matchAll(CSS_IMPORT_PATTERN)].flatMap(match => {\n const importedFile = match[1] ? resolveLocalCssImport(filePath, match[1]) : undefined\n\n return importedFile ? [importedFile] : []\n })\n)\n\nconst getCssSelectorClasses = (content: string): string[] => {\n const classes = new Set<string>()\n const source = content.replaceAll(CSS_COMMENT_PATTERN, '')\n\n for (const blockStart of source.matchAll(/\\{/g)) {\n const index = blockStart.index\n\n const boundary = Math.max(\n source.lastIndexOf(';', index - 1),\n source.lastIndexOf('{', index - 1),\n source.lastIndexOf('}', index - 1)\n )\n\n const selector = source.slice(boundary + 1, index).trim()\n\n if (!selector || selector.startsWith('@')) continue\n\n for (const match of selector.replaceAll(CSS_STRING_PATTERN, '').matchAll(CSS_CLASS_PATTERN)) {\n if (match[1]) classes.add(decodeCssIdentifier(match[1]))\n }\n }\n\n return [...classes]\n}\n\nconst getCssUtilityClasses = (content: string): string[] => (\n [...content.replaceAll(CSS_COMMENT_PATTERN, '').matchAll(CSS_UTILITY_PATTERN)]\n .flatMap(match => match[1] ? [match[1]] : [])\n)\n\nconst getCssPlugins = (content: string): string[] => (\n [...content.replaceAll(CSS_COMMENT_PATTERN, '').matchAll(CSS_PLUGIN_PATTERN)]\n .flatMap(match => match[1] ? [match[1]] : [])\n)\n\nconst readDirectory = (directory: string): Dirent[] => {\n try {\n return readdirSync(directory, { withFileTypes: true, encoding: 'utf8' })\n } catch {\n return []\n }\n}\n\nconst readTextFile = (path: string): string | undefined => {\n try {\n return readFileSync(path, 'utf8')\n } catch {\n return undefined\n }\n}\n\nconst collectCssComponentClasses = (\n filePath: string,\n visited: Set<string>,\n classes: Set<string>,\n plugins: Set<string>\n): void => {\n if (visited.has(filePath)) return\n\n visited.add(filePath)\n\n const content = readTextFile(filePath)\n\n if (content === undefined) return\n\n for (const className of getCssSelectorClasses(content)) classes.add(className)\n\n for (const className of getCssUtilityClasses(content)) classes.add(className)\n\n for (const plugin of getCssPlugins(content)) plugins.add(plugin)\n\n for (const importedFile of getImportedCssFiles(filePath, content)) {\n collectCssComponentClasses(importedFile, visited, classes, plugins)\n }\n}\n\nconst collectAstroComponentClasses = (cwd: string, classes: Set<string>): void => {\n const visit = (directory: string): void => {\n const entries = readDirectory(directory)\n\n for (const entry of entries.filter(entry => (\n entry.isDirectory() && !IGNORED_COMPONENT_DIRECTORIES.has(entry.name)\n ))) visit(join(directory, entry.name))\n\n for (const entry of entries.filter(entry => entry.isFile() && entry.name.endsWith('.astro'))) {\n const content = readTextFile(join(directory, entry.name))\n\n if (content === undefined) continue\n\n for (const style of content.matchAll(ASTRO_STYLE_PATTERN)) {\n const stylesheet = style[1]\n\n if (!stylesheet) continue\n\n for (const className of getCssSelectorClasses(stylesheet)) classes.add(className)\n\n for (const className of getCssUtilityClasses(stylesheet)) classes.add(className)\n }\n }\n }\n\n visit(cwd)\n}\n\nconst getConfiguredTailwindPlugins = (cwd: string): string[] => {\n const plugins = new Set<string>()\n\n for (const entry of readDirectory(cwd)) {\n if (!entry.isFile() || !TAILWIND_CONFIG_PATTERN.test(entry.name)) continue\n\n const content = readTextFile(join(cwd, entry.name))\n\n if (content === undefined) continue\n\n const uncommentedContent = content\n .replaceAll(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .replaceAll(/^\\s*\\/\\/.*$/gm, '')\n\n for (const plugin of Object.keys(PLUGIN_CLASS_PATTERNS)) {\n if (uncommentedContent.includes(plugin)) plugins.add(plugin)\n }\n }\n\n return [...plugins]\n}\n\nconst escapeRegex = (value: string): string => value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\nconst createExactClassPatterns = (classes: string[]): string[] => {\n const patterns: string[] = []\n let alternatives: string[] = []\n\n const flush = (): void => {\n if (alternatives.length === 0) return\n\n patterns.push(`^(?:${alternatives.join('|')})$`)\n\n alternatives = []\n }\n\n for (const className of classes.toSorted()) {\n const escapedClass = escapeRegex(className)\n const nextLength = alternatives.join('|').length + escapedClass.length + 6\n\n if (nextLength > MAX_COMPONENT_PATTERN_LENGTH) flush()\n\n alternatives.push(escapedClass)\n }\n\n flush()\n\n return patterns\n}\n\nexport const findCssComponentClasses = (\n cwd: string,\n entryPoint: string\n): string[] => {\n const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint)\n const classes = new Set<string>()\n\n collectCssComponentClasses(entryPath, new Set(), classes, new Set())\n\n collectAstroComponentClasses(cwd, classes)\n\n return [...classes].toSorted()\n}\n\nexport const findTailwindPluginClassPatterns = (\n cwd: string,\n entryPoint: string\n): string[] => {\n const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint)\n const plugins = new Set(getConfiguredTailwindPlugins(cwd))\n\n collectCssComponentClasses(entryPath, new Set(), new Set(), plugins)\n\n return [...plugins]\n .flatMap(plugin => PLUGIN_CLASS_PATTERNS[plugin] ?? [])\n .filter((pattern, index, patterns) => patterns.indexOf(pattern) === index)\n .toSorted()\n}\n\nexport const findCssComponentClassPatterns = (\n cwd: string,\n entryPoint: string\n): string[] => createExactClassPatterns(findCssComponentClasses(cwd, entryPoint))\n\nconst getIgnoredClasses = (tailwindOptions: TailwindOptions): string[] => {\n const configuredClasses = tailwindOptions.ignore ?? []\n\n if (!tailwindOptions.entryPoint || tailwindOptions.detectComponentClasses === false) {\n return configuredClasses\n }\n\n const detectedClasses = findCssComponentClassPatterns(\n tailwindOptions.cwd ?? process.cwd(),\n tailwindOptions.entryPoint\n )\n\n const pluginClasses = findTailwindPluginClassPatterns(\n tailwindOptions.cwd ?? process.cwd(),\n tailwindOptions.entryPoint\n )\n\n return [...new Set([...configuredClasses, ...detectedClasses, ...pluginClasses])]\n}\n\nconst getUnknownClassRule = (\n tailwindOptions: TailwindOptions,\n ignoredClasses: string[]\n): TSESLint.FlatConfig.RuleEntry | undefined => {\n const options = {\n ...(tailwindOptions.entryPoint ? { entryPoint: tailwindOptions.entryPoint } : {}),\n ...(ignoredClasses.length ? { ignore: ignoredClasses } : {})\n }\n\n const hasOptions = Object.keys(options).length > 0\n const severity = tailwindOptions.noUnknownClasses ?? 'error'\n\n if (!hasOptions && tailwindOptions.noUnknownClasses === undefined) return undefined\n\n if (severity === false) return 'off'\n\n return hasOptions ? [severity, options] : severity\n}\n\nexport const buildTailwindSettingsConfig = (\n tailwindOptions: TailwindOptions\n): TSESLint.FlatConfig.Config => {\n const ignoredClasses = getIgnoredClasses(tailwindOptions)\n const noUnknownClassesRule = getUnknownClassRule(tailwindOptions, ignoredClasses)\n\n const settingsOptions = {\n ...(tailwindOptions.cwd ? { cwd: tailwindOptions.cwd } : {}),\n ...(tailwindOptions.detectComponentClasses === undefined ?\n {} :\n { detectComponentClasses: tailwindOptions.detectComponentClasses }),\n ...(tailwindOptions.entryPoint ? { entryPoint: tailwindOptions.entryPoint } : {}),\n ...(tailwindOptions.ignore?.length ? { ignore: tailwindOptions.ignore } : {})\n }\n\n return {\n name: 'eslint-config-basic/tailwind-settings',\n ...(noUnknownClassesRule === undefined ?\n {} :\n { rules: { 'better-tailwindcss/no-unknown-classes': noUnknownClassesRule } }),\n settings: { 'better-tailwindcss': settingsOptions }\n }\n}\n"],"mappings":"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","names":["entry"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@santi020k/eslint-config-basic",
3
- "version": "3.4.0",
3
+ "version": "3.5.0",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": true
@@ -39,16 +39,16 @@
39
39
  "dependencies": {
40
40
  "@typescript-eslint/utils": "^8.65.0",
41
41
  "semver": "^7.8.5",
42
- "@santi020k/eslint-config-typescript": "^3.1.2",
43
- "@santi020k/eslint-config-core": "^3.1.1"
42
+ "@santi020k/eslint-config-core": "^3.1.1",
43
+ "@santi020k/eslint-config-typescript": "^3.1.3"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/node": "^26.1.2",
47
47
  "publint": "^0.3.22",
48
48
  "tsup": "^8.5.1",
49
- "typescript": "^6.0.3",
49
+ "typescript": "npm:@typescript/typescript6@^6.0.2",
50
50
  "@santi020k/eslint-config-angular": "^3.1.0",
51
- "@santi020k/eslint-config-astro": "^3.1.1",
51
+ "@santi020k/eslint-config-astro": "^3.1.2",
52
52
  "@santi020k/eslint-config-expo": "^3.1.0",
53
53
  "@santi020k/eslint-config-extensions": "^3.1.1",
54
54
  "@santi020k/eslint-config-formats": "^3.1.1",
@@ -75,28 +75,28 @@
75
75
  "eslint": "^10.0.0",
76
76
  "typescript": ">=5.0.0 <7.0.0",
77
77
  "@santi020k/eslint-config-angular": "^3.1.0",
78
- "@santi020k/eslint-config-astro": "^3.1.1",
78
+ "@santi020k/eslint-config-astro": "^3.1.2",
79
79
  "@santi020k/eslint-config-expo": "^3.1.0",
80
80
  "@santi020k/eslint-config-extensions": "^3.1.1",
81
81
  "@santi020k/eslint-config-formats": "^3.1.1",
82
82
  "@santi020k/eslint-config-hono": "^3.1.0",
83
83
  "@santi020k/eslint-config-lit": "^3.1.0",
84
84
  "@santi020k/eslint-config-libraries": "^3.1.1",
85
+ "@santi020k/eslint-config-next": "^3.1.0",
85
86
  "@santi020k/eslint-config-nest": "^3.1.0",
86
87
  "@santi020k/eslint-config-nuxt": "^3.1.0",
87
- "@santi020k/eslint-config-next": "^3.1.0",
88
88
  "@santi020k/eslint-config-preact": "^3.1.0",
89
+ "@santi020k/eslint-config-qwik": "^3.1.0",
89
90
  "@santi020k/eslint-config-react": "^3.1.0",
90
91
  "@santi020k/eslint-config-react-router": "^3.1.0",
91
- "@santi020k/eslint-config-qwik": "^3.1.0",
92
92
  "@santi020k/eslint-config-slidev": "^3.1.0",
93
+ "@santi020k/eslint-config-solid": "^3.1.0",
93
94
  "@santi020k/eslint-config-svelte": "^3.1.0",
94
95
  "@santi020k/eslint-config-tanstack-start": "^3.1.0",
95
- "@santi020k/eslint-config-testing": "^3.1.1",
96
- "@santi020k/eslint-config-solid": "^3.1.0",
97
- "@santi020k/eslint-config-vite": "^3.1.0",
98
96
  "@santi020k/eslint-config-tools": "^3.1.1",
99
- "@santi020k/eslint-config-vue": "^3.1.0"
97
+ "@santi020k/eslint-config-vite": "^3.1.0",
98
+ "@santi020k/eslint-config-vue": "^3.1.0",
99
+ "@santi020k/eslint-config-testing": "^3.1.1"
100
100
  },
101
101
  "peerDependenciesMeta": {
102
102
  "@santi020k/eslint-config-angular": {