@santi020k/eslint-config-basic 3.4.0 → 3.5.1

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;
@@ -19,7 +41,7 @@ const resolveLocalCssImport = (filePath, specifier) => {
19
41
  const candidates = extname(candidate) ? [candidate] : [candidate, `${candidate}.css`, join(candidate, "index.css")];
20
42
  return candidates.find((path) => existsSync(path));
21
43
  };
22
- const getImportedCssFiles = (filePath, content) => [...content.matchAll(CSS_IMPORT_PATTERN)].flatMap((match) => {
44
+ const getImportedCssFiles = (filePath, content) => [...content.replaceAll(CSS_COMMENT_PATTERN, "").matchAll(CSS_IMPORT_PATTERN)].flatMap((match) => {
23
45
  const importedFile = match[1] ? resolveLocalCssImport(filePath, match[1]) : void 0;
24
46
  return importedFile ? [importedFile] : [];
25
47
  });
@@ -42,21 +64,67 @@ 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 astroPath = join(directory, entry.name);
100
+ const content = readTextFile(astroPath);
101
+ if (content === void 0) continue;
102
+ for (const style of content.matchAll(ASTRO_STYLE_PATTERN)) {
103
+ const stylesheet = style[1];
104
+ if (!stylesheet) continue;
105
+ for (const className of getCssSelectorClasses(stylesheet)) classes.add(className);
106
+ for (const className of getCssUtilityClasses(stylesheet)) classes.add(className);
107
+ for (const importedFile of getImportedCssFiles(astroPath, stylesheet)) {
108
+ collectCssComponentClasses(importedFile, /* @__PURE__ */ new Set(), classes, /* @__PURE__ */ new Set());
109
+ }
110
+ }
111
+ }
112
+ };
113
+ visit(cwd);
114
+ };
115
+ const getConfiguredTailwindPlugins = (cwd) => {
116
+ const plugins = /* @__PURE__ */ new Set();
117
+ for (const entry of readDirectory(cwd)) {
118
+ if (!entry.isFile() || !TAILWIND_CONFIG_PATTERN.test(entry.name)) continue;
119
+ const content = readTextFile(join(cwd, entry.name));
120
+ if (content === void 0) continue;
121
+ const uncommentedContent = content.replaceAll(/\/\*[\s\S]*?\*\//g, "").replaceAll(/^\s*\/\/.*$/gm, "");
122
+ for (const plugin of Object.keys(PLUGIN_CLASS_PATTERNS)) {
123
+ if (uncommentedContent.includes(plugin)) plugins.add(plugin);
124
+ }
125
+ }
126
+ return [...plugins];
127
+ };
60
128
  const escapeRegex = (value) => value.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&");
61
129
  const createExactClassPatterns = (classes) => {
62
130
  const patterns = [];
@@ -78,9 +146,16 @@ const createExactClassPatterns = (classes) => {
78
146
  const findCssComponentClasses = (cwd, entryPoint) => {
79
147
  const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint);
80
148
  const classes = /* @__PURE__ */ new Set();
81
- collectCssComponentClasses(entryPath, /* @__PURE__ */ new Set(), classes);
149
+ collectCssComponentClasses(entryPath, /* @__PURE__ */ new Set(), classes, /* @__PURE__ */ new Set());
150
+ collectAstroComponentClasses(cwd, classes);
82
151
  return [...classes].toSorted();
83
152
  };
153
+ const findTailwindPluginClassPatterns = (cwd, entryPoint) => {
154
+ const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint);
155
+ const plugins = new Set(getConfiguredTailwindPlugins(cwd));
156
+ collectCssComponentClasses(entryPath, /* @__PURE__ */ new Set(), /* @__PURE__ */ new Set(), plugins);
157
+ return [...plugins].flatMap((plugin) => PLUGIN_CLASS_PATTERNS[plugin] ?? []).filter((pattern, index, patterns) => patterns.indexOf(pattern) === index).toSorted();
158
+ };
84
159
  const findCssComponentClassPatterns = (cwd, entryPoint) => createExactClassPatterns(findCssComponentClasses(cwd, entryPoint));
85
160
  const getIgnoredClasses = (tailwindOptions) => {
86
161
  const configuredClasses = tailwindOptions.ignore ?? [];
@@ -91,7 +166,11 @@ const getIgnoredClasses = (tailwindOptions) => {
91
166
  tailwindOptions.cwd ?? process.cwd(),
92
167
  tailwindOptions.entryPoint
93
168
  );
94
- return [.../* @__PURE__ */ new Set([...configuredClasses, ...detectedClasses])];
169
+ const pluginClasses = findTailwindPluginClassPatterns(
170
+ tailwindOptions.cwd ?? process.cwd(),
171
+ tailwindOptions.entryPoint
172
+ );
173
+ return [.../* @__PURE__ */ new Set([...configuredClasses, ...detectedClasses, ...pluginClasses])];
95
174
  };
96
175
  const getUnknownClassRule = (tailwindOptions, ignoredClasses) => {
97
176
  const options = {
@@ -122,6 +201,7 @@ const buildTailwindSettingsConfig = (tailwindOptions) => {
122
201
  export {
123
202
  buildTailwindSettingsConfig,
124
203
  findCssComponentClassPatterns,
125
- findCssComponentClasses
204
+ findCssComponentClasses,
205
+ findTailwindPluginClassPatterns
126
206
  };
127
207
  //# 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":"AAAA,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,SAAS,YAAY,MAAM,eAAe;AAK5D,MAAM,qBAAqB,OAAO;AAElC,MAAM,oBAAoB,IAAI;AAAA,EAC5B,OAAO,YAAY,kBAAkB,iBAAiB,kBAAkB;AAAA,EACxE;AACF;AAEA,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AAC3B,MAAM,+BAA+B;AAErC,MAAM,sBAAsB,CAAC,UAA0B,MACpD,WAAW,2BAA2B,CAAC,GAAG,cAAsB,OAAO,cAAc,OAAO,SAAS,WAAW,EAAE,CAAC,CAAC,EACpH,WAAW,kBAAkB,IAAI;AAEpC,MAAM,wBAAwB,CAAC,UAAkB,cAA0C;AACzF,MAAI,CAAC,UAAU,WAAW,GAAG,KAAK,CAAC,WAAW,SAAS,EAAG,QAAO;AAEjE,QAAM,iBAAiB,UAAU,MAAM,QAAQ,CAAC,EAAE,CAAC;AAEnD,MAAI,CAAC,eAAgB,QAAO;AAE5B,QAAM,YAAY,WAAW,cAAc,IAAI,iBAAiB,QAAQ,QAAQ,QAAQ,GAAG,cAAc;AACzG,QAAM,aAAa,QAAQ,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,GAAG,SAAS,QAAQ,KAAK,WAAW,WAAW,CAAC;AAElH,SAAO,WAAW,KAAK,UAAQ,WAAW,IAAI,CAAC;AACjD;AAEA,MAAM,sBAAsB,CAAC,UAAkB,YAC7C,CAAC,GAAG,QAAQ,SAAS,kBAAkB,CAAC,EAAE,QAAQ,WAAS;AACzD,QAAM,eAAe,MAAM,CAAC,IAAI,sBAAsB,UAAU,MAAM,CAAC,CAAC,IAAI;AAE5E,SAAO,eAAe,CAAC,YAAY,IAAI,CAAC;AAC1C,CAAC;AAGH,MAAM,wBAAwB,CAAC,YAA8B;AAC3D,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,SAAS,QAAQ,WAAW,qBAAqB,EAAE;AAEzD,aAAW,cAAc,OAAO,SAAS,KAAK,GAAG;AAC/C,UAAM,QAAQ,WAAW;AAEzB,UAAM,WAAW,KAAK;AAAA,MACpB,OAAO,YAAY,KAAK,QAAQ,CAAC;AAAA,MACjC,OAAO,YAAY,KAAK,QAAQ,CAAC;AAAA,MACjC,OAAO,YAAY,KAAK,QAAQ,CAAC;AAAA,IACnC;AAEA,UAAM,WAAW,OAAO,MAAM,WAAW,GAAG,KAAK,EAAE,KAAK;AAExD,QAAI,CAAC,YAAY,SAAS,WAAW,GAAG,EAAG;AAE3C,eAAW,SAAS,SAAS,WAAW,oBAAoB,EAAE,EAAE,SAAS,iBAAiB,GAAG;AAC3F,UAAI,MAAM,CAAC,EAAG,SAAQ,IAAI,oBAAoB,MAAM,CAAC,CAAC,CAAC;AAAA,IACzD;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,OAAO;AACpB;AAEA,MAAM,uBAAuB,CAAC,YAC5B,CAAC,GAAG,QAAQ,WAAW,qBAAqB,EAAE,EAAE,SAAS,mBAAmB,CAAC,EAC1E,QAAQ,WAAS,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAGhD,MAAM,6BAA6B,CACjC,UACA,SACA,YACS;AACT,MAAI,QAAQ,IAAI,QAAQ,EAAG;AAE3B,UAAQ,IAAI,QAAQ;AAEpB,MAAI;AAEJ,MAAI;AACF,cAAU,aAAa,UAAU,MAAM;AAAA,EACzC,QAAQ;AACN;AAAA,EACF;AAEA,aAAW,aAAa,sBAAsB,OAAO,EAAG,SAAQ,IAAI,SAAS;AAE7E,aAAW,aAAa,qBAAqB,OAAO,EAAG,SAAQ,IAAI,SAAS;AAE5E,aAAW,gBAAgB,oBAAoB,UAAU,OAAO,GAAG;AACjE,+BAA2B,cAAc,SAAS,OAAO;AAAA,EAC3D;AACF;AAEA,MAAM,cAAc,CAAC,UAA0B,MAAM,WAAW,uBAAuB,MAAM;AAE7F,MAAM,2BAA2B,CAAC,YAAgC;AAChE,QAAM,WAAqB,CAAC;AAC5B,MAAI,eAAyB,CAAC;AAE9B,QAAM,QAAQ,MAAY;AACxB,QAAI,aAAa,WAAW,EAAG;AAE/B,aAAS,KAAK,OAAO,aAAa,KAAK,GAAG,CAAC,IAAI;AAE/C,mBAAe,CAAC;AAAA,EAClB;AAEA,aAAW,aAAa,QAAQ,SAAS,GAAG;AAC1C,UAAM,eAAe,YAAY,SAAS;AAC1C,UAAM,aAAa,aAAa,KAAK,GAAG,EAAE,SAAS,aAAa,SAAS;AAEzE,QAAI,aAAa,6BAA8B,OAAM;AAErD,iBAAa,KAAK,YAAY;AAAA,EAChC;AAEA,QAAM;AAEN,SAAO;AACT;AAEO,MAAM,0BAA0B,CACrC,KACA,eACa;AACb,QAAM,YAAY,WAAW,UAAU,IAAI,aAAa,KAAK,KAAK,UAAU;AAC5E,QAAM,UAAU,oBAAI,IAAY;AAEhC,6BAA2B,WAAW,oBAAI,IAAI,GAAG,OAAO;AAExD,SAAO,CAAC,GAAG,OAAO,EAAE,SAAS;AAC/B;AAEO,MAAM,gCAAgC,CAC3C,KACA,eACa,yBAAyB,wBAAwB,KAAK,UAAU,CAAC;AAEhF,MAAM,oBAAoB,CAAC,oBAA+C;AACxE,QAAM,oBAAoB,gBAAgB,UAAU,CAAC;AAErD,MAAI,CAAC,gBAAgB,cAAc,gBAAgB,2BAA2B,OAAO;AACnF,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB;AAAA,IACtB,gBAAgB,OAAO,QAAQ,IAAI;AAAA,IACnC,gBAAgB;AAAA,EAClB;AAEA,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,mBAAmB,GAAG,eAAe,CAAC,CAAC;AAChE;AAEA,MAAM,sBAAsB,CAC1B,iBACA,mBAC8C;AAC9C,QAAM,UAAU;AAAA,IACd,GAAI,gBAAgB,aAAa,EAAE,YAAY,gBAAgB,WAAW,IAAI,CAAC;AAAA,IAC/E,GAAI,eAAe,SAAS,EAAE,QAAQ,eAAe,IAAI,CAAC;AAAA,EAC5D;AAEA,QAAM,aAAa,OAAO,KAAK,OAAO,EAAE,SAAS;AACjD,QAAM,WAAW,gBAAgB,oBAAoB;AAErD,MAAI,CAAC,cAAc,gBAAgB,qBAAqB,OAAW,QAAO;AAE1E,MAAI,aAAa,MAAO,QAAO;AAE/B,SAAO,aAAa,CAAC,UAAU,OAAO,IAAI;AAC5C;AAEO,MAAM,8BAA8B,CACzC,oBAC+B;AAC/B,QAAM,iBAAiB,kBAAkB,eAAe;AACxD,QAAM,uBAAuB,oBAAoB,iBAAiB,cAAc;AAEhF,QAAM,kBAAkB;AAAA,IACtB,GAAI,gBAAgB,MAAM,EAAE,KAAK,gBAAgB,IAAI,IAAI,CAAC;AAAA,IAC1D,GAAI,gBAAgB,2BAA2B,SAC7C,CAAC,IACD,EAAE,wBAAwB,gBAAgB,uBAAuB;AAAA,IACnE,GAAI,gBAAgB,aAAa,EAAE,YAAY,gBAAgB,WAAW,IAAI,CAAC;AAAA,IAC/E,GAAI,gBAAgB,QAAQ,SAAS,EAAE,QAAQ,gBAAgB,OAAO,IAAI,CAAC;AAAA,EAC7E;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAI,yBAAyB,SAC3B,CAAC,IACD,EAAE,OAAO,EAAE,yCAAyC,qBAAqB,EAAE;AAAA,IAC7E,UAAU,EAAE,sBAAsB,gBAAgB;AAAA,EACpD;AACF;","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.replaceAll(CSS_COMMENT_PATTERN, '').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 astroPath = join(directory, entry.name)\n const content = readTextFile(astroPath)\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 for (const importedFile of getImportedCssFiles(astroPath, stylesheet)) {\n collectCssComponentClasses(importedFile, new Set(), classes, new Set())\n }\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.1",
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",
42
+ "@santi020k/eslint-config-typescript": "^3.1.3",
43
43
  "@santi020k/eslint-config-core": "^3.1.1"
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",
@@ -59,14 +59,14 @@
59
59
  "@santi020k/eslint-config-next": "^3.1.0",
60
60
  "@santi020k/eslint-config-nuxt": "^3.1.0",
61
61
  "@santi020k/eslint-config-preact": "^3.1.0",
62
- "@santi020k/eslint-config-qwik": "^3.1.0",
63
62
  "@santi020k/eslint-config-react": "^3.1.0",
64
63
  "@santi020k/eslint-config-react-router": "^3.1.0",
64
+ "@santi020k/eslint-config-qwik": "^3.1.0",
65
65
  "@santi020k/eslint-config-slidev": "^3.1.0",
66
66
  "@santi020k/eslint-config-solid": "^3.1.0",
67
67
  "@santi020k/eslint-config-svelte": "^3.1.0",
68
- "@santi020k/eslint-config-tanstack-start": "^3.1.0",
69
68
  "@santi020k/eslint-config-testing": "^3.1.1",
69
+ "@santi020k/eslint-config-tanstack-start": "^3.1.0",
70
70
  "@santi020k/eslint-config-tools": "^3.1.1",
71
71
  "@santi020k/eslint-config-vite": "^3.1.0",
72
72
  "@santi020k/eslint-config-vue": "^3.1.0"
@@ -74,29 +74,29 @@
74
74
  "peerDependencies": {
75
75
  "eslint": "^10.0.0",
76
76
  "typescript": ">=5.0.0 <7.0.0",
77
- "@santi020k/eslint-config-angular": "^3.1.0",
78
- "@santi020k/eslint-config-astro": "^3.1.1",
79
- "@santi020k/eslint-config-expo": "^3.1.0",
80
77
  "@santi020k/eslint-config-extensions": "^3.1.1",
81
78
  "@santi020k/eslint-config-formats": "^3.1.1",
82
79
  "@santi020k/eslint-config-hono": "^3.1.0",
83
- "@santi020k/eslint-config-lit": "^3.1.0",
84
80
  "@santi020k/eslint-config-libraries": "^3.1.1",
85
81
  "@santi020k/eslint-config-nest": "^3.1.0",
86
- "@santi020k/eslint-config-nuxt": "^3.1.0",
87
82
  "@santi020k/eslint-config-next": "^3.1.0",
83
+ "@santi020k/eslint-config-lit": "^3.1.0",
88
84
  "@santi020k/eslint-config-preact": "^3.1.0",
85
+ "@santi020k/eslint-config-qwik": "^3.1.0",
89
86
  "@santi020k/eslint-config-react": "^3.1.0",
90
87
  "@santi020k/eslint-config-react-router": "^3.1.0",
91
- "@santi020k/eslint-config-qwik": "^3.1.0",
92
88
  "@santi020k/eslint-config-slidev": "^3.1.0",
89
+ "@santi020k/eslint-config-nuxt": "^3.1.0",
93
90
  "@santi020k/eslint-config-svelte": "^3.1.0",
94
91
  "@santi020k/eslint-config-tanstack-start": "^3.1.0",
92
+ "@santi020k/eslint-config-angular": "^3.1.0",
95
93
  "@santi020k/eslint-config-testing": "^3.1.1",
96
- "@santi020k/eslint-config-solid": "^3.1.0",
97
- "@santi020k/eslint-config-vite": "^3.1.0",
98
94
  "@santi020k/eslint-config-tools": "^3.1.1",
99
- "@santi020k/eslint-config-vue": "^3.1.0"
95
+ "@santi020k/eslint-config-vue": "^3.1.0",
96
+ "@santi020k/eslint-config-expo": "^3.1.0",
97
+ "@santi020k/eslint-config-astro": "^3.1.2",
98
+ "@santi020k/eslint-config-vite": "^3.1.0",
99
+ "@santi020k/eslint-config-solid": "^3.1.0"
100
100
  },
101
101
  "peerDependenciesMeta": {
102
102
  "@santi020k/eslint-config-angular": {