tailwind-lint 0.4.2 → 0.4.3
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.
- package/dist/cli.cjs +1 -2
- package/dist/linter-nHnZsaYY.cjs +1 -2
- package/package.json +1 -1
- package/dist/cli.cjs.map +0 -1
- package/dist/linter-nHnZsaYY.cjs.map +0 -1
package/dist/cli.cjs
CHANGED
package/dist/linter-nHnZsaYY.cjs
CHANGED
package/package.json
CHANGED
package/dist/cli.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.cjs","names":["SEVERITY","path","DEFAULT_FILE_PATTERN","Command","fs","DEFAULT_VERSION","lint","TERMINAL_PADDING","TERMINAL_WIDTH"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { Diagnostic } from \"vscode-languageserver\";\nimport {\n\tDEFAULT_FILE_PATTERN,\n\tDEFAULT_VERSION,\n\tSEVERITY,\n\tTERMINAL_PADDING,\n\tTERMINAL_WIDTH,\n} from \"./constants\";\nimport { lint } from \"./linter\";\nimport type { LintFileResult } from \"./types\";\n\nconst MAX_FILENAME_DISPLAY_LENGTH = 50;\n\nfunction countDiagnosticsBySeverity(diagnostics: Diagnostic[]): {\n\terrors: number;\n\twarnings: number;\n} {\n\tlet errors = 0;\n\tlet warnings = 0;\n\n\tfor (const diagnostic of diagnostics) {\n\t\tif (diagnostic.severity === SEVERITY.ERROR) errors++;\n\t\tif (diagnostic.severity === SEVERITY.WARNING) warnings++;\n\t}\n\n\treturn { errors, warnings };\n}\n\ninterface CliOptions {\n\tconfig?: string;\n\tauto?: boolean;\n\tfix?: boolean;\n\tverbose?: boolean;\n}\n\nfunction resolveOptions(files: string[], options: CliOptions) {\n\tconst hasConfigFlag = !!options.config;\n\tconst hasAutoFlag = !!options.auto;\n\tconst hasFiles = files.length > 0;\n\n\tlet cwd = process.cwd();\n\tlet configPath = options.config;\n\tlet patterns = files;\n\n\tif (hasConfigFlag && options.config && !hasFiles) {\n\t\tconst absoluteConfigPath = path.isAbsolute(options.config)\n\t\t\t? options.config\n\t\t\t: path.resolve(process.cwd(), options.config);\n\t\tcwd = path.dirname(absoluteConfigPath);\n\t\tconfigPath = path.basename(absoluteConfigPath);\n\t\tpatterns = [DEFAULT_FILE_PATTERN];\n\t}\n\n\tconst autoDiscover = hasAutoFlag;\n\n\treturn {\n\t\tcwd,\n\t\tconfigPath,\n\t\tpatterns: autoDiscover ? [] : patterns,\n\t\tautoDiscover,\n\t\tfix: options.fix || false,\n\t\tverbose: options.verbose || false,\n\t};\n}\n\nfunction truncateFilename(filename: string) {\n\treturn filename.length > MAX_FILENAME_DISPLAY_LENGTH\n\t\t? `...${filename.slice(-MAX_FILENAME_DISPLAY_LENGTH)}`\n\t\t: filename;\n}\n\nasync function displayResults(files: LintFileResult[], fixMode: boolean) {\n\tlet totalErrors = 0;\n\tlet totalWarnings = 0;\n\tlet totalFixed = 0;\n\tlet filesWithIssues = 0;\n\tlet isFirstFile = true;\n\n\tfor (const file of files) {\n\t\tif (file.diagnostics.length > 0 || (fixMode && file.fixed)) {\n\t\t\tif (isFirstFile) {\n\t\t\t\tconsole.log();\n\t\t\t\tisFirstFile = false;\n\t\t\t} else {\n\t\t\t\tconsole.log();\n\t\t\t}\n\t\t\tconsole.log(chalk.underline.bold(file.path));\n\n\t\t\tif (fixMode && file.fixed) {\n\t\t\t\tconst issueText = `${file.fixedCount || 0} issue${file.fixedCount !== 1 ? \"s\" : \"\"}`;\n\t\t\t\tconsole.log(chalk.green(` ✔ Fixed ${issueText}`));\n\t\t\t\ttotalFixed += file.fixedCount || 0;\n\t\t\t}\n\n\t\t\tconst { errors, warnings } = countDiagnosticsBySeverity(file.diagnostics);\n\t\t\ttotalErrors += errors;\n\t\t\ttotalWarnings += warnings;\n\n\t\t\tif (file.diagnostics.length > 0) {\n\t\t\t\tfilesWithIssues++;\n\t\t\t}\n\n\t\t\tfor (const diagnostic of file.diagnostics) {\n\t\t\t\tconst line = diagnostic.range.start.line + 1;\n\t\t\t\tconst char = diagnostic.range.start.character + 1;\n\t\t\t\tconst severity =\n\t\t\t\t\tdiagnostic.severity === SEVERITY.ERROR ? \"error\" : \"warning\";\n\t\t\t\tconst severityColor =\n\t\t\t\t\tdiagnostic.severity === SEVERITY.ERROR\n\t\t\t\t\t\t? chalk.red(severity)\n\t\t\t\t\t\t: chalk.yellow(severity);\n\t\t\t\tconst code = diagnostic.code ? chalk.dim(` (${diagnostic.code})`) : \"\";\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t` ${chalk.dim(`${line}:${char}`)} ${severityColor} ${diagnostic.message}${code}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tconsole.log();\n\n\tif (totalErrors === 0 && totalWarnings === 0) {\n\t\tif (totalFixed > 0) {\n\t\t\tconst issueText = `${totalFixed} issue${totalFixed !== 1 ? \"s\" : \"\"}`;\n\t\t\tconsole.log(chalk.green.bold(`✔ Fixed ${issueText}`));\n\t\t} else {\n\t\t\tconsole.log(chalk.green.bold(\"✔ No issues found\"));\n\t\t}\n\t} else {\n\t\tconst parts = [];\n\t\tif (totalErrors > 0) {\n\t\t\tparts.push(`${totalErrors} error${totalErrors !== 1 ? \"s\" : \"\"}`);\n\t\t}\n\t\tif (totalWarnings > 0) {\n\t\t\tparts.push(`${totalWarnings} warning${totalWarnings !== 1 ? \"s\" : \"\"}`);\n\t\t}\n\n\t\tconst fileText = `${filesWithIssues} file${filesWithIssues !== 1 ? \"s\" : \"\"}`;\n\t\tconst summary = `Found ${parts.join(\" and \")} in ${fileText}`;\n\n\t\tif (totalFixed > 0) {\n\t\t\tconst issueText = `${totalFixed} issue${totalFixed !== 1 ? \"s\" : \"\"}`;\n\t\t\tconsole.log(chalk.green.bold(`✔ Fixed ${issueText}`));\n\t\t\tconsole.log(summary);\n\t\t} else {\n\t\t\tconsole.log(summary);\n\t\t}\n\t}\n}\n\nconst program = new Command();\n\nconst getVersion = (): string => {\n\tconst packageJsonPath = path.join(__dirname, \"../package.json\");\n\ttry {\n\t\tconst pkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n\t\treturn pkg.version || DEFAULT_VERSION;\n\t} catch {\n\t\treturn DEFAULT_VERSION;\n\t}\n};\n\nprogram.configureHelp({\n\tformatHelp: (cmd, helper) => {\n\t\tconst termWidth = helper.padWidth(cmd, helper);\n\t\tlet output = \"\";\n\n\t\toutput += `${chalk.bold.cyan(\"Usage:\")} ${helper.commandUsage(cmd)}\\n\\n`;\n\n\t\tif (cmd.description()) {\n\t\t\toutput += `${cmd.description()}\\n\\n`;\n\t\t}\n\n\t\tconst args = helper.visibleArguments(cmd);\n\t\tif (args.length > 0) {\n\t\t\toutput += `${chalk.bold.cyan(\"Arguments:\")}\\n`;\n\t\t\targs.forEach((arg) => {\n\t\t\t\tconst argName = arg.required ? `<${arg.name()}>` : `[${arg.name()}]`;\n\t\t\t\toutput += ` ${chalk.green(argName.padEnd(termWidth))} ${arg.description}\\n`;\n\t\t\t});\n\t\t\toutput += \"\\n\";\n\t\t}\n\n\t\tconst options = helper.visibleOptions(cmd);\n\t\tif (options.length > 0) {\n\t\t\toutput += `${chalk.bold.cyan(\"Options:\")}\\n`;\n\t\t\toptions.forEach((option) => {\n\t\t\t\tconst flags = helper.optionTerm(option);\n\t\t\t\tconst description = helper.optionDescription(option);\n\t\t\t\toutput += ` ${chalk.yellow(flags.padEnd(termWidth))} ${description}\\n`;\n\t\t\t});\n\t\t\toutput += \"\\n\";\n\t\t}\n\n\t\treturn output;\n\t},\n});\n\nprogram\n\t.name(\"tailwind-lint\")\n\t.description(\"A CLI tool for linting Tailwind CSS class usage\")\n\t.version(getVersion())\n\t.argument(\n\t\t\"[files...]\",\n\t\t'File patterns to lint (e.g., \"src/**/*.{js,jsx,ts,tsx}\")',\n\t)\n\t.option(\n\t\t\"-c, --config <path>\",\n\t\t\"Path to Tailwind config file (default: auto-discover)\",\n\t)\n\t.option(\n\t\t\"-a, --auto\",\n\t\t\"Auto-discover files from Tailwind config content patterns\",\n\t)\n\t.option(\"--fix\", \"Automatically fix problems that can be fixed\")\n\t.option(\"-v, --verbose\", \"Enable verbose logging for debugging\")\n\t.addHelpText(\n\t\t\"after\",\n\t\t`\n${chalk.bold.cyan(\"Examples:\")}\n ${chalk.dim(\"$\")} tailwind-lint\n ${chalk.dim(\"$\")} tailwind-lint ${chalk.green('\"src/**/*.{js,jsx,ts,tsx}\"')}\n ${chalk.dim(\"$\")} tailwind-lint ${chalk.yellow(\"--config\")} ${chalk.green(\"./tailwind.config.js\")}\n ${chalk.dim(\"$\")} tailwind-lint ${chalk.green('\"src/**/*.tsx\"')} ${chalk.yellow(\"--fix\")}\n ${chalk.dim(\"$\")} tailwind-lint ${chalk.green('\"**/*.vue\"')}\n\n${chalk.bold.cyan(\"Notes:\")}\n ${chalk.dim(\"•\")} Running without arguments auto-discovers config and files\n ${chalk.dim(\"•\")} For v3: uses content patterns from tailwind.config.js\n ${chalk.dim(\"•\")} For v4: uses @source patterns from CSS config, or default pattern\n ${chalk.dim(\"•\")} Default pattern: ${chalk.dim(\"./**/*.{js,jsx,ts,tsx,html}\")}\n ${chalk.dim(\"•\")} Use ${chalk.yellow(\"--fix\")} to automatically resolve fixable issues\n`,\n\t)\n\t.action(async (files: string[], options) => {\n\t\tconst hasConfigFlag = !!options.config;\n\t\tconst hasAutoFlag = !!options.auto;\n\t\tconst hasFiles = files.length > 0;\n\n\t\t// If no arguments provided, enable auto mode by default\n\t\tif (!hasFiles && !hasAutoFlag && !hasConfigFlag) {\n\t\t\toptions.auto = true;\n\t\t}\n\n\t\tconst resolved = resolveOptions(files, options);\n\n\t\ttry {\n\t\t\tif (resolved.verbose) {\n\t\t\t\tconsole.log(chalk.cyan.bold(\"→ Configuration\"));\n\t\t\t\tconsole.log(chalk.dim(` Working directory: ${resolved.cwd}`));\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.dim(` Config path: ${resolved.configPath || \"auto-discover\"}`),\n\t\t\t\t);\n\t\t\t\tconsole.log(chalk.dim(` Fix mode: ${resolved.fix}`));\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.dim(\n\t\t\t\t\t\t` Patterns: ${resolved.patterns.length > 0 ? resolved.patterns.join(\", \") : \"auto-discover\"}`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconsole.log();\n\t\t\t}\n\n\t\t\tconst results = await lint({\n\t\t\t\t...resolved,\n\t\t\t\tonProgress: (current, total, file) => {\n\t\t\t\t\tif (process.stdout.isTTY && !resolved.verbose) {\n\t\t\t\t\t\tconst displayFile = truncateFilename(file);\n\t\t\t\t\t\tprocess.stdout.write(\n\t\t\t\t\t\t\t`\\r${chalk.cyan(\"→\")} Linting files... ${chalk.dim(`(${current}/${total})`)} ${chalk.dim(displayFile)}${\" \".repeat(TERMINAL_PADDING)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (resolved.verbose) {\n\t\t\t\t\t\tconsole.log(chalk.dim(` [${current}/${total}] Linting ${file}`));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (process.stdout.isTTY && !resolved.verbose) {\n\t\t\t\tprocess.stdout.write(`\\r${\" \".repeat(TERMINAL_WIDTH)}\\r`);\n\t\t\t}\n\n\t\t\tif (results.totalFilesProcessed === 0) {\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(chalk.yellow(\"⚠ No files found to lint\"));\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tif (results.files.length === 0) {\n\t\t\t\tconsole.log(chalk.green.bold(\"✔ No issues found\"));\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tawait displayResults(results.files, resolved.fix);\n\n\t\t\tconst hasErrors = results.files.some((file) =>\n\t\t\t\tfile.diagnostics.some((d) => d.severity === SEVERITY.ERROR),\n\t\t\t);\n\t\t\tprocess.exit(hasErrors ? 1 : 0);\n\t\t} catch (error) {\n\t\t\tconst errorMessage =\n\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\tconsole.error(chalk.red(\"✖ Error:\"), errorMessage);\n\n\t\t\tif (resolved.verbose && error instanceof Error) {\n\t\t\t\tconsole.error(chalk.dim(\"\\nStack trace:\"));\n\t\t\t\tconsole.error(chalk.dim(error.stack || error.toString()));\n\t\t\t}\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n\nprogram.parse();\n"],"mappings":";;;;;;;;;;;AAiBA,MAAM,8BAA8B;AAEpC,SAAS,2BAA2B,aAGlC;CACD,IAAI,SAAS;CACb,IAAI,WAAW;AAEf,MAAK,MAAM,cAAc,aAAa;AACrC,MAAI,WAAW,aAAaA,wBAAS,MAAO;AAC5C,MAAI,WAAW,aAAaA,wBAAS,QAAS;;AAG/C,QAAO;EAAE;EAAQ;EAAU;;AAU5B,SAAS,eAAe,OAAiB,SAAqB;CAC7D,MAAM,gBAAgB,CAAC,CAAC,QAAQ;CAChC,MAAM,cAAc,CAAC,CAAC,QAAQ;CAC9B,MAAM,WAAW,MAAM,SAAS;CAEhC,IAAI,MAAM,QAAQ,KAAK;CACvB,IAAI,aAAa,QAAQ;CACzB,IAAI,WAAW;AAEf,KAAI,iBAAiB,QAAQ,UAAU,CAAC,UAAU;EACjD,MAAM,qBAAqBC,UAAK,WAAW,QAAQ,OAAO,GACvD,QAAQ,SACRA,UAAK,QAAQ,QAAQ,KAAK,EAAE,QAAQ,OAAO;AAC9C,QAAMA,UAAK,QAAQ,mBAAmB;AACtC,eAAaA,UAAK,SAAS,mBAAmB;AAC9C,aAAW,CAACC,oCAAqB;;CAGlC,MAAM,eAAe;AAErB,QAAO;EACN;EACA;EACA,UAAU,eAAe,EAAE,GAAG;EAC9B;EACA,KAAK,QAAQ,OAAO;EACpB,SAAS,QAAQ,WAAW;EAC5B;;AAGF,SAAS,iBAAiB,UAAkB;AAC3C,QAAO,SAAS,SAAS,8BACtB,MAAM,SAAS,MAAM,CAAC,4BAA4B,KAClD;;AAGJ,eAAe,eAAe,OAAyB,SAAkB;CACxE,IAAI,cAAc;CAClB,IAAI,gBAAgB;CACpB,IAAI,aAAa;CACjB,IAAI,kBAAkB;CACtB,IAAI,cAAc;AAElB,MAAK,MAAM,QAAQ,MAClB,KAAI,KAAK,YAAY,SAAS,KAAM,WAAW,KAAK,OAAQ;AAC3D,MAAI,aAAa;AAChB,WAAQ,KAAK;AACb,iBAAc;QAEd,SAAQ,KAAK;AAEd,UAAQ,IAAI,cAAM,UAAU,KAAK,KAAK,KAAK,CAAC;AAE5C,MAAI,WAAW,KAAK,OAAO;GAC1B,MAAM,YAAY,GAAG,KAAK,cAAc,EAAE,QAAQ,KAAK,eAAe,IAAI,MAAM;AAChF,WAAQ,IAAI,cAAM,MAAM,aAAa,YAAY,CAAC;AAClD,iBAAc,KAAK,cAAc;;EAGlC,MAAM,EAAE,QAAQ,aAAa,2BAA2B,KAAK,YAAY;AACzE,iBAAe;AACf,mBAAiB;AAEjB,MAAI,KAAK,YAAY,SAAS,EAC7B;AAGD,OAAK,MAAM,cAAc,KAAK,aAAa;GAC1C,MAAM,OAAO,WAAW,MAAM,MAAM,OAAO;GAC3C,MAAM,OAAO,WAAW,MAAM,MAAM,YAAY;GAChD,MAAM,WACL,WAAW,aAAaF,wBAAS,QAAQ,UAAU;GACpD,MAAM,gBACL,WAAW,aAAaA,wBAAS,QAC9B,cAAM,IAAI,SAAS,GACnB,cAAM,OAAO,SAAS;GAC1B,MAAM,OAAO,WAAW,OAAO,cAAM,IAAI,MAAM,WAAW,KAAK,GAAG,GAAG;AAErE,WAAQ,IACP,KAAK,cAAM,IAAI,GAAG,KAAK,GAAG,OAAO,CAAC,IAAI,cAAc,IAAI,WAAW,UAAU,OAC7E;;;AAKJ,SAAQ,KAAK;AAEb,KAAI,gBAAgB,KAAK,kBAAkB,EAC1C,KAAI,aAAa,GAAG;EACnB,MAAM,YAAY,GAAG,WAAW,QAAQ,eAAe,IAAI,MAAM;AACjE,UAAQ,IAAI,cAAM,MAAM,KAAK,WAAW,YAAY,CAAC;OAErD,SAAQ,IAAI,cAAM,MAAM,KAAK,oBAAoB,CAAC;MAE7C;EACN,MAAM,QAAQ,EAAE;AAChB,MAAI,cAAc,EACjB,OAAM,KAAK,GAAG,YAAY,QAAQ,gBAAgB,IAAI,MAAM,KAAK;AAElE,MAAI,gBAAgB,EACnB,OAAM,KAAK,GAAG,cAAc,UAAU,kBAAkB,IAAI,MAAM,KAAK;EAGxE,MAAM,WAAW,GAAG,gBAAgB,OAAO,oBAAoB,IAAI,MAAM;EACzE,MAAM,UAAU,SAAS,MAAM,KAAK,QAAQ,CAAC,MAAM;AAEnD,MAAI,aAAa,GAAG;GACnB,MAAM,YAAY,GAAG,WAAW,QAAQ,eAAe,IAAI,MAAM;AACjE,WAAQ,IAAI,cAAM,MAAM,KAAK,WAAW,YAAY,CAAC;AACrD,WAAQ,IAAI,QAAQ;QAEpB,SAAQ,IAAI,QAAQ;;;AAKvB,MAAM,UAAU,IAAIG,mBAAS;AAE7B,MAAM,mBAA2B;CAChC,MAAM,kBAAkBF,UAAK,KAAK,WAAW,kBAAkB;AAC/D,KAAI;AAEH,SADY,KAAK,MAAMG,QAAG,aAAa,iBAAiB,QAAQ,CAAC,CACtD,WAAWC;SACf;AACP,SAAOA;;;AAIT,QAAQ,cAAc,EACrB,aAAa,KAAK,WAAW;CAC5B,MAAM,YAAY,OAAO,SAAS,KAAK,OAAO;CAC9C,IAAI,SAAS;AAEb,WAAU,GAAG,cAAM,KAAK,KAAK,SAAS,CAAC,GAAG,OAAO,aAAa,IAAI,CAAC;AAEnE,KAAI,IAAI,aAAa,CACpB,WAAU,GAAG,IAAI,aAAa,CAAC;CAGhC,MAAM,OAAO,OAAO,iBAAiB,IAAI;AACzC,KAAI,KAAK,SAAS,GAAG;AACpB,YAAU,GAAG,cAAM,KAAK,KAAK,aAAa,CAAC;AAC3C,OAAK,SAAS,QAAQ;GACrB,MAAM,UAAU,IAAI,WAAW,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC;AAClE,aAAU,KAAK,cAAM,MAAM,QAAQ,OAAO,UAAU,CAAC,CAAC,GAAG,IAAI,YAAY;IACxE;AACF,YAAU;;CAGX,MAAM,UAAU,OAAO,eAAe,IAAI;AAC1C,KAAI,QAAQ,SAAS,GAAG;AACvB,YAAU,GAAG,cAAM,KAAK,KAAK,WAAW,CAAC;AACzC,UAAQ,SAAS,WAAW;GAC3B,MAAM,QAAQ,OAAO,WAAW,OAAO;GACvC,MAAM,cAAc,OAAO,kBAAkB,OAAO;AACpD,aAAU,KAAK,cAAM,OAAO,MAAM,OAAO,UAAU,CAAC,CAAC,GAAG,YAAY;IACnE;AACF,YAAU;;AAGX,QAAO;GAER,CAAC;AAEF,QACE,KAAK,gBAAgB,CACrB,YAAY,kDAAkD,CAC9D,QAAQ,YAAY,CAAC,CACrB,SACA,cACA,6DACA,CACA,OACA,uBACA,wDACA,CACA,OACA,cACA,4DACA,CACA,OAAO,SAAS,+CAA+C,CAC/D,OAAO,iBAAiB,uCAAuC,CAC/D,YACA,SACA;EACA,cAAM,KAAK,KAAK,YAAY,CAAC;IAC3B,cAAM,IAAI,IAAI,CAAC;IACf,cAAM,IAAI,IAAI,CAAC,iBAAiB,cAAM,MAAM,+BAA6B,CAAC;IAC1E,cAAM,IAAI,IAAI,CAAC,iBAAiB,cAAM,OAAO,WAAW,CAAC,GAAG,cAAM,MAAM,uBAAuB,CAAC;IAChG,cAAM,IAAI,IAAI,CAAC,iBAAiB,cAAM,MAAM,mBAAiB,CAAC,GAAG,cAAM,OAAO,QAAQ,CAAC;IACvF,cAAM,IAAI,IAAI,CAAC,iBAAiB,cAAM,MAAM,eAAa,CAAC;;EAE5D,cAAM,KAAK,KAAK,SAAS,CAAC;IACxB,cAAM,IAAI,IAAI,CAAC;IACf,cAAM,IAAI,IAAI,CAAC;IACf,cAAM,IAAI,IAAI,CAAC;IACf,cAAM,IAAI,IAAI,CAAC,oBAAoB,cAAM,IAAI,8BAA8B,CAAC;IAC5E,cAAM,IAAI,IAAI,CAAC,OAAO,cAAM,OAAO,QAAQ,CAAC;EAE9C,CACA,OAAO,OAAO,OAAiB,YAAY;CAC3C,MAAM,gBAAgB,CAAC,CAAC,QAAQ;CAChC,MAAM,cAAc,CAAC,CAAC,QAAQ;AAI9B,KAAI,EAHa,MAAM,SAAS,MAGf,CAAC,eAAe,CAAC,cACjC,SAAQ,OAAO;CAGhB,MAAM,WAAW,eAAe,OAAO,QAAQ;AAE/C,KAAI;AACH,MAAI,SAAS,SAAS;AACrB,WAAQ,IAAI,cAAM,KAAK,KAAK,kBAAkB,CAAC;AAC/C,WAAQ,IAAI,cAAM,IAAI,wBAAwB,SAAS,MAAM,CAAC;AAC9D,WAAQ,IACP,cAAM,IAAI,kBAAkB,SAAS,cAAc,kBAAkB,CACrE;AACD,WAAQ,IAAI,cAAM,IAAI,eAAe,SAAS,MAAM,CAAC;AACrD,WAAQ,IACP,cAAM,IACL,eAAe,SAAS,SAAS,SAAS,IAAI,SAAS,SAAS,KAAK,KAAK,GAAG,kBAC7E,CACD;AACD,WAAQ,KAAK;;EAGd,MAAM,UAAU,MAAMC,oBAAK;GAC1B,GAAG;GACH,aAAa,SAAS,OAAO,SAAS;AACrC,QAAI,QAAQ,OAAO,SAAS,CAAC,SAAS,SAAS;KAC9C,MAAM,cAAc,iBAAiB,KAAK;AAC1C,aAAQ,OAAO,MACd,KAAK,cAAM,KAAK,IAAI,CAAC,oBAAoB,cAAM,IAAI,IAAI,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,cAAM,IAAI,YAAY,GAAG,IAAI,OAAOC,gCAAiB,GACpI;eACS,SAAS,QACnB,SAAQ,IAAI,cAAM,IAAI,MAAM,QAAQ,GAAG,MAAM,YAAY,OAAO,CAAC;;GAGnE,CAAC;AAEF,MAAI,QAAQ,OAAO,SAAS,CAAC,SAAS,QACrC,SAAQ,OAAO,MAAM,KAAK,IAAI,OAAOC,8BAAe,CAAC,IAAI;AAG1D,MAAI,QAAQ,wBAAwB,GAAG;AACtC,WAAQ,KAAK;AACb,WAAQ,IAAI,cAAM,OAAO,2BAA2B,CAAC;AACrD,WAAQ,KAAK,EAAE;;AAGhB,MAAI,QAAQ,MAAM,WAAW,GAAG;AAC/B,WAAQ,IAAI,cAAM,MAAM,KAAK,oBAAoB,CAAC;AAClD,WAAQ,KAAK,EAAE;;AAGhB,QAAM,eAAe,QAAQ,OAAO,SAAS,IAAI;EAEjD,MAAM,YAAY,QAAQ,MAAM,MAAM,SACrC,KAAK,YAAY,MAAM,MAAM,EAAE,aAAaR,wBAAS,MAAM,CAC3D;AACD,UAAQ,KAAK,YAAY,IAAI,EAAE;UACvB,OAAO;EACf,MAAM,eACL,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACvD,UAAQ,MAAM,cAAM,IAAI,WAAW,EAAE,aAAa;AAElD,MAAI,SAAS,WAAW,iBAAiB,OAAO;AAC/C,WAAQ,MAAM,cAAM,IAAI,iBAAiB,CAAC;AAC1C,WAAQ,MAAM,cAAM,IAAI,MAAM,SAAS,MAAM,UAAU,CAAC,CAAC;;AAE1D,UAAQ,KAAK,EAAE;;EAEf;AAEH,QAAQ,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"linter-nHnZsaYY.cjs","names":["TextDocument","fs","path","require","path","fs","require","path","require","path","require","path","TextDocument","path"],"sources":["../src/constants.ts","../src/code-actions.ts","../src/adapters/editor-state-adapter.ts","../src/types.ts","../src/adapters/v3-adapter.ts","../src/utils/fs.ts","../src/adapters/v4-adapter.ts","../src/utils/config.ts","../src/state.ts","../src/linter.ts"],"sourcesContent":["export const DEFAULT_IGNORE_PATTERNS = [\n\t\"**/node_modules/**\",\n\t\"**/dist/**\",\n\t\"**/build/**\",\n\t\"**/.git/**\",\n\t\"**/.next/**\",\n\t\"**/.nuxt/**\",\n\t\"**/coverage/**\",\n\t\"**/.vscode/**\",\n\t\"**/.idea/**\",\n\t\"**/.cache/**\",\n\t\"**/.DS_Store/**\",\n];\n\nexport const DEFAULT_FILE_PATTERN = \"./**/*.{js,jsx,ts,tsx,html}\";\n\nexport const V3_CONFIG_PATHS = [\n\t\"tailwind.config.js\",\n\t\"tailwind.config.cjs\",\n\t\"tailwind.config.mjs\",\n\t\"tailwind.config.ts\",\n];\n\nexport const V4_CSS_NAMES = [\n\t\"app.css\",\n\t\"index.css\",\n\t\"tailwind.css\",\n\t\"globals.css\",\n];\n\nexport const V4_CSS_FOLDERS = [\"./\", \"./src/\", \"./app/\", \"./styles/\"];\n\nexport const LANGUAGE_MAP: Record<string, string> = {\n\t\".astro\": \"astro\",\n\t\".css\": \"css\",\n\t\".erb\": \"erb\",\n\t\".hbs\": \"handlebars\",\n\t\".htm\": \"html\",\n\t\".html\": \"html\",\n\t\".js\": \"javascript\",\n\t\".jsx\": \"javascriptreact\",\n\t\".less\": \"less\",\n\t\".md\": \"markdown\",\n\t\".mdx\": \"mdx\",\n\t\".php\": \"php\",\n\t\".sass\": \"sass\",\n\t\".scss\": \"scss\",\n\t\".svelte\": \"svelte\",\n\t\".ts\": \"typescript\",\n\t\".tsx\": \"typescriptreact\",\n\t\".twig\": \"twig\",\n\t\".vue\": \"vue\",\n};\n\nexport const DEFAULT_VERSION = \"0.0.1\";\n\nexport const DEFAULT_TAB_SIZE = 2;\n\nexport const DEFAULT_SEPARATOR = \":\";\n\nexport const DEFAULT_ROOT_FONT_SIZE = 16;\n\nexport const CONCURRENT_FILES = 10;\n\nexport const SEVERITY = {\n\tERROR: 1,\n\tWARNING: 2,\n} as const;\n\nexport const TERMINAL_WIDTH = 80;\nexport const TERMINAL_PADDING = 10;\n\nexport const MAX_FIX_ITERATIONS = 100;\nexport const QUICKFIX_ACTION_KIND = \"quickfix\";\n\nexport const TAILWIND_V4_IMPORT_PATTERNS = [\n\t'@import \"tailwindcss\"',\n\t\"@import 'tailwindcss'\",\n] as const;\n\nexport const CSS_CONFIG_EXTENSION = \".css\";\n\nexport function getLanguageId(filePath: string) {\n\tconst ext = filePath.substring(filePath.lastIndexOf(\".\")).toLowerCase();\n\treturn LANGUAGE_MAP[ext] || \"html\";\n}\n","import type { State } from \"@tailwindcss/language-service\";\nimport { doCodeActions, doValidate } from \"@tailwindcss/language-service\";\nimport type { CodeActionParams, Diagnostic } from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport {\n\tgetLanguageId,\n\tMAX_FIX_ITERATIONS,\n\tQUICKFIX_ACTION_KIND,\n} from \"./constants\";\nimport type { ApplyCodeActionsResult } from \"./types\";\n\nexport type { ApplyCodeActionsResult };\n\ninterface QuickfixAction {\n\tkind?: string;\n\tedit?: {\n\t\tchanges?: Record<string, unknown[]>;\n\t};\n}\n\nasync function getQuickfixes(\n\tstate: State,\n\tdocument: TextDocument,\n\turi: string,\n\tdiagnostics: Diagnostic[],\n) {\n\tconst lspDiagnostics: Diagnostic[] = diagnostics.map((diag) => ({\n\t\trange: diag.range,\n\t\tseverity: diag.severity,\n\t\tmessage: diag.message,\n\t\tcode: diag.code,\n\t\tsource: diag.source || \"tailwindcss\",\n\t}));\n\n\tconst params: CodeActionParams = {\n\t\ttextDocument: {\n\t\t\turi,\n\t\t},\n\t\trange: {\n\t\t\tstart: {\n\t\t\t\tline: 0,\n\t\t\t\tcharacter: 0,\n\t\t\t},\n\t\t\tend: {\n\t\t\t\tline: document.lineCount,\n\t\t\t\tcharacter: 0,\n\t\t\t},\n\t\t},\n\t\tcontext: {\n\t\t\tdiagnostics: lspDiagnostics,\n\t\t},\n\t};\n\n\tconst codeActions = await doCodeActions(state, params, document);\n\n\treturn codeActions.filter(\n\t\t(action) =>\n\t\t\taction.kind === QUICKFIX_ACTION_KIND ||\n\t\t\taction.kind?.startsWith(`${QUICKFIX_ACTION_KIND}.`),\n\t) as QuickfixAction[];\n}\n\nfunction applyFirstQuickfix(\n\taction: QuickfixAction,\n\turi: string,\n\tdocument: TextDocument,\n\tcontent: string,\n) {\n\tif (!action.edit?.changes?.[uri]) return null;\n\n\tconst edits = action.edit.changes[uri] as {\n\t\trange: {\n\t\t\tstart: {\n\t\t\t\tline: number;\n\t\t\t\tcharacter: number;\n\t\t\t};\n\t\t\tend: {\n\t\t\t\tline: number;\n\t\t\t\tcharacter: number;\n\t\t\t};\n\t\t};\n\t\tnewText: string;\n\t}[];\n\n\tconst sortedEdits = [...edits].sort((a, b) => {\n\t\tconst lineDiff = b.range.start.line - a.range.start.line;\n\t\tif (lineDiff !== 0) return lineDiff;\n\t\treturn b.range.start.character - a.range.start.character;\n\t});\n\n\tlet newContent = content;\n\tfor (const edit of sortedEdits) {\n\t\tconst startOffset = document.offsetAt(edit.range.start);\n\t\tconst endOffset = document.offsetAt(edit.range.end);\n\t\tnewContent =\n\t\t\tnewContent.substring(0, startOffset) +\n\t\t\tedit.newText +\n\t\t\tnewContent.substring(endOffset);\n\t}\n\n\treturn { content: newContent };\n}\n\nexport async function applyCodeActions(\n\tstate: State,\n\tfilePath: string,\n\tcontent: string,\n\tdiagnostics: Diagnostic[],\n): Promise<ApplyCodeActionsResult> {\n\tif (diagnostics.length === 0) {\n\t\treturn {\n\t\t\tcontent,\n\t\t\tchanged: false,\n\t\t\tfixedCount: 0,\n\t\t};\n\t}\n\n\ttry {\n\t\tconst languageId = getLanguageId(filePath);\n\t\tconst uri = `file://${filePath}`;\n\t\tlet currentDocument = TextDocument.create(uri, languageId, 1, content);\n\t\tlet currentContent = content;\n\t\tlet totalFixed = 0;\n\n\t\t// Keep fixing until no more fixable issues remain\n\t\t// Add iteration limit to prevent infinite loops\n\t\tfor (let iteration = 0; iteration < MAX_FIX_ITERATIONS; iteration++) {\n\t\t\tconst currentDiagnostics = await doValidate(state, currentDocument);\n\t\t\tif (currentDiagnostics.length === 0) break;\n\n\t\t\tconst quickfixes = await getQuickfixes(\n\t\t\t\tstate,\n\t\t\t\tcurrentDocument,\n\t\t\t\turi,\n\t\t\t\tcurrentDiagnostics,\n\t\t\t);\n\t\t\tif (quickfixes.length === 0) break;\n\n\t\t\tconst fixResult = applyFirstQuickfix(\n\t\t\t\tquickfixes[0],\n\t\t\t\turi,\n\t\t\t\tcurrentDocument,\n\t\t\t\tcurrentContent,\n\t\t\t);\n\t\t\tif (!fixResult) break;\n\n\t\t\tcurrentContent = fixResult.content;\n\t\t\tcurrentDocument = TextDocument.create(\n\t\t\t\turi,\n\t\t\t\tlanguageId,\n\t\t\t\tcurrentDocument.version + 1,\n\t\t\t\tcurrentContent,\n\t\t\t);\n\t\t\ttotalFixed++;\n\n\t\t\t// Safety check: warn if approaching iteration limit\n\t\t\tif (iteration === MAX_FIX_ITERATIONS - 1) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Warning: Reached maximum fix iterations (${MAX_FIX_ITERATIONS}) for ${filePath}. Some issues may remain unfixed.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tcontent: currentContent,\n\t\t\tchanged: currentContent !== content,\n\t\t\tfixedCount: totalFixed,\n\t\t};\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\n\t\t// Handle language service crashes gracefully\n\t\tif (message.includes(\"Cannot read\") || message.includes(\"undefined\")) {\n\t\t\tconsole.warn(\n\t\t\t\t`Warning: Language service crashed while applying fixes to ${filePath}. Skipping auto-fix for this file.`,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tcontent,\n\t\t\t\tchanged: false,\n\t\t\t\tfixedCount: 0,\n\t\t\t};\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { EditorState, Settings } from \"@tailwindcss/language-service\";\nimport { DEFAULT_ROOT_FONT_SIZE, DEFAULT_TAB_SIZE } from \"../constants\";\n\nfunction isDirectory(filePath: string) {\n\ttry {\n\t\treturn fs.statSync(filePath).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function createEditorState(cwd: string) {\n\tconst settings: Settings = {\n\t\teditor: {\n\t\t\ttabSize: DEFAULT_TAB_SIZE,\n\t\t},\n\t\ttailwindCSS: {\n\t\t\tinspectPort: null,\n\t\t\temmetCompletions: false,\n\t\t\tincludeLanguages: {},\n\t\t\tclassAttributes: [\n\t\t\t\t\"class\",\n\t\t\t\t\"className\",\n\t\t\t\t\"ngClass\",\n\t\t\t\t\"[class]\",\n\t\t\t\t\":class\",\n\t\t\t\t\"v-bind:class\",\n\t\t\t\t\"x-bind:class\",\n\t\t\t\t\"class:list\",\n\t\t\t\t\"classList\",\n\t\t\t],\n\t\t\tclassFunctions: [],\n\t\t\tcodeActions: true,\n\t\t\thovers: true,\n\t\t\tcodeLens: false,\n\t\t\tsuggestions: true,\n\t\t\tvalidate: true,\n\t\t\tcolorDecorators: true,\n\t\t\trootFontSize: DEFAULT_ROOT_FONT_SIZE,\n\t\t\tshowPixelEquivalents: true,\n\t\t\tfiles: {\n\t\t\t\texclude: [\n\t\t\t\t\t\"**/.git/**\",\n\t\t\t\t\t\"**/node_modules/**\",\n\t\t\t\t\t\"**/.hg/**\",\n\t\t\t\t\t\"**/.svn/**\",\n\t\t\t\t],\n\t\t\t},\n\t\t\texperimental: {\n\t\t\t\tconfigFile: null,\n\t\t\t\tclassRegex: [],\n\t\t\t},\n\t\t\tlint: {\n\t\t\t\tcssConflict: \"warning\",\n\t\t\t\tinvalidApply: \"error\",\n\t\t\t\tinvalidScreen: \"error\",\n\t\t\t\tinvalidVariant: \"error\",\n\t\t\t\tinvalidConfigPath: \"error\",\n\t\t\t\tinvalidTailwindDirective: \"error\",\n\t\t\t\tinvalidSourceDirective: \"error\",\n\t\t\t\trecommendedVariantOrder: \"warning\",\n\t\t\t\tusedBlocklistedClass: \"warning\",\n\t\t\t\tsuggestCanonicalClasses: \"warning\",\n\t\t\t},\n\t\t},\n\t};\n\n\treturn {\n\t\tconnection: null as unknown as EditorState[\"connection\"],\n\t\tfolder: cwd,\n\t\tuserLanguages: {},\n\t\tcapabilities: {\n\t\t\tconfiguration: true,\n\t\t\tdiagnosticRelatedInformation: true,\n\t\t\titemDefaults: [],\n\t\t},\n\t\tgetConfiguration: async () => settings,\n\t\tgetDocumentSymbols: async () => [],\n\t\treadDirectory: async (document, directory) => {\n\t\t\tconst docPath =\n\t\t\t\ttypeof document === \"string\"\n\t\t\t\t\t? document\n\t\t\t\t\t: document.uri.replace(\"file://\", \"\");\n\t\t\tconst dir = path.resolve(path.dirname(docPath), directory);\n\t\t\ttry {\n\t\t\t\tconst files = fs.readdirSync(dir);\n\t\t\t\treturn files.map((file) => [\n\t\t\t\t\tfile,\n\t\t\t\t\t{ isDirectory: isDirectory(path.join(dir, file)) },\n\t\t\t\t]);\n\t\t\t} catch {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\t};\n}\n","import type { Diagnostic } from \"vscode-languageserver\";\n\nexport interface TailwindConfig {\n\tcontent?: string[] | { files?: string[] };\n\tseparator?: string;\n\t[key: string]: unknown;\n}\n\nexport interface ResolvedTailwindConfig extends TailwindConfig {\n\tseparator: string;\n}\n\nexport interface DesignSystem {\n\tcandidatesToAst?: (candidates: string[]) => unknown[];\n\tcandidatesToCss?: (candidates: string[]) => string[];\n\t[key: string]: unknown;\n}\n\nexport interface ContextUtils {\n\t[key: string]: unknown;\n}\n\nexport interface GenerateRulesModule {\n\tgenerateRules?: (set: unknown, context: unknown) => unknown[];\n\t[key: string]: unknown;\n}\n\nexport interface ApplyCodeActionsResult {\n\tcontent: string;\n\tchanged: boolean;\n\tfixedCount: number;\n}\n\nexport interface LintFileResult {\n\tpath: string;\n\tdiagnostics: Diagnostic[];\n\tfixed?: boolean;\n\tfixedCount?: number;\n}\n\nexport interface LintOptions {\n\tcwd: string;\n\tpatterns: string[];\n\tconfigPath?: string;\n\tautoDiscover: boolean;\n\tfix?: boolean;\n\tverbose?: boolean;\n\tonProgress?: (current: number, total: number, file: string) => void;\n}\n\nexport interface LintResult {\n\tfiles: LintFileResult[];\n\ttotalFilesProcessed: number;\n}\n\n/**\n * Error thrown when adapter fails to load required modules\n */\nexport class AdapterLoadError extends Error {\n\tconstructor(\n\t\tpublic readonly version: string,\n\t\tcause: Error,\n\t) {\n\t\tsuper(`Failed to load ${version} adapter: ${cause.message}`);\n\t\tthis.name = \"AdapterLoadError\";\n\t}\n}\n","import { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport type { State } from \"@tailwindcss/language-service\";\nimport chalk from \"chalk\";\nimport type { ContextUtils, GenerateRulesModule } from \"../types\";\nimport { AdapterLoadError } from \"../types\";\n\nconst require = createRequire(import.meta.url || __filename);\n\nexport async function loadV3ClassMetadata(\n\tstate: State,\n\tcwd: string,\n\tverbose = false,\n): Promise<void> {\n\ttry {\n\t\tconst tailwindPath = require.resolve(\"tailwindcss\", { paths: [cwd] });\n\t\tconst tailwindcss = require(tailwindPath) as unknown;\n\n\t\ttry {\n\t\t\tconst tailwindDir = path.dirname(\n\t\t\t\trequire.resolve(\"tailwindcss/package.json\", { paths: [cwd] }),\n\t\t\t);\n\n\t\t\tconst contextUtils = require(\n\t\t\t\tpath.join(tailwindDir, \"lib\", \"lib\", \"setupContextUtils\"),\n\t\t\t) as ContextUtils;\n\t\t\tconst generateRulesModule = require(\n\t\t\t\tpath.join(tailwindDir, \"lib\", \"lib\", \"generateRules\"),\n\t\t\t) as GenerateRulesModule;\n\n\t\t\tstate.modules = {\n\t\t\t\ttailwindcss: {\n\t\t\t\t\tversion: state.version || \"unknown\",\n\t\t\t\t\tmodule: tailwindcss,\n\t\t\t\t},\n\t\t\t\tjit: {\n\t\t\t\t\tgenerateRules: {\n\t\t\t\t\t\tmodule:\n\t\t\t\t\t\t\tgenerateRulesModule.generateRules ||\n\t\t\t\t\t\t\t((_set: unknown, _context: unknown) => []),\n\t\t\t\t\t},\n\t\t\t\t\tcreateContext: {\n\t\t\t\t\t\tmodule: contextUtils.createContext,\n\t\t\t\t\t},\n\t\t\t\t\texpandApplyAtRules: {\n\t\t\t\t\t\tmodule: generateRulesModule.expandApplyAtRules,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tif (verbose) {\n\t\t\t\tconsole.log(chalk.dim(\" ✓ Loaded v3 JIT modules\"));\n\t\t\t}\n\t\t} catch (jitError) {\n\t\t\t// JIT modules are optional - some v3 configs may not have them\n\t\t\t// Fall back to basic module loading without JIT support\n\t\t\tif (verbose) {\n\t\t\t\tconst message =\n\t\t\t\t\tjitError instanceof Error ? jitError.message : String(jitError);\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.yellow(\n\t\t\t\t\t\t` ⚠ Warning: Could not load v3 JIT modules: ${message}`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tstate.modules = {\n\t\t\t\ttailwindcss: {\n\t\t\t\t\tversion: state.version || \"unknown\",\n\t\t\t\t\tmodule: tailwindcss,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\textractConfigMetadata(state);\n\t} catch (error) {\n\t\tif (error instanceof Error) {\n\t\t\tthrow new AdapterLoadError(\"v3\", error);\n\t\t}\n\t\tthrow new Error(`Failed to load v3 class metadata: ${String(error)}`);\n\t}\n}\n\nfunction extractConfigMetadata(state: State) {\n\tconst { config } = state;\n\tif (!config || typeof config !== \"object\") return;\n\n\tconst theme = (config as Record<string, unknown>).theme as\n\t\t| Record<string, unknown>\n\t\t| undefined;\n\tstate.screens = Object.keys(\n\t\t(theme?.screens as Record<string, unknown>) ?? {},\n\t);\n\tstate.blocklist = (config.blocklist as string[] | undefined) ?? [];\n\n\tif (config.variants && typeof config.variants === \"object\") {\n\t\tstate.variants = Object.keys(config.variants).map((name) => ({\n\t\t\tname,\n\t\t\tvalues: [],\n\t\t\tisArbitrary: false,\n\t\t\thasDash: true,\n\t\t\tselectors: () => [],\n\t\t}));\n\t}\n\n\tif (config.corePlugins) {\n\t\tstate.corePlugins = Array.isArray(config.corePlugins)\n\t\t\t? (config.corePlugins as string[])\n\t\t\t: Object.keys(config.corePlugins as Record<string, unknown>);\n\t}\n}\n","import * as fs from \"node:fs\";\n\nexport function fileExists(filePath: string) {\n\ttry {\n\t\treturn fs.existsSync(filePath);\n\t} catch {\n\t\t// Errors during existence check (e.g., permission issues) are treated as non-existent\n\t\treturn false;\n\t}\n}\n\nexport function readFileSync(filePath: string) {\n\tif (!filePath || typeof filePath !== \"string\") {\n\t\tthrow new TypeError(\"File path must be a non-empty string\");\n\t}\n\treturn fs.readFileSync(filePath, \"utf-8\");\n}\n\nexport function writeFileSync(filePath: string, content: string) {\n\tif (!filePath || typeof filePath !== \"string\") {\n\t\tthrow new TypeError(\"File path must be a non-empty string\");\n\t}\n\tif (typeof content !== \"string\") {\n\t\tthrow new TypeError(\"Content must be a string\");\n\t}\n\tfs.writeFileSync(filePath, content, \"utf-8\");\n}\n","import { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport type { State } from \"@tailwindcss/language-service\";\nimport chalk from \"chalk\";\nimport type { DesignSystem } from \"../types\";\nimport { AdapterLoadError } from \"../types\";\nimport { fileExists, readFileSync } from \"../utils/fs\";\n\nconst require = createRequire(import.meta.url || __filename);\n\nexport async function loadV4DesignSystem(\n\tstate: State,\n\tcwd: string,\n\tconfigPath: string,\n\tverbose = false,\n): Promise<void> {\n\ttry {\n\t\tconst tailwindPath = require.resolve(\"tailwindcss\", { paths: [cwd] });\n\t\tconst tailwindcss = require(tailwindPath) as unknown;\n\n\t\tif (\n\t\t\ttailwindcss !== null &&\n\t\t\ttailwindcss !== undefined &&\n\t\t\t(typeof tailwindcss === \"object\" || typeof tailwindcss === \"function\") &&\n\t\t\t\"__unstable__loadDesignSystem\" in tailwindcss &&\n\t\t\ttypeof tailwindcss.__unstable__loadDesignSystem === \"function\"\n\t\t) {\n\t\t\tlet cssContent: string;\n\t\t\tconst basePath = path.dirname(configPath);\n\n\t\t\tif (fileExists(configPath)) {\n\t\t\t\tcssContent = readFileSync(configPath);\n\t\t\t} else {\n\t\t\t\tcssContent = '@import \"tailwindcss\";';\n\t\t\t}\n\n\t\t\ttype LoadDesignSystemFn = (\n\t\t\t\tcss: string,\n\t\t\t\toptions: {\n\t\t\t\t\tbase: string;\n\t\t\t\t\tloadStylesheet: (\n\t\t\t\t\t\tid: string,\n\t\t\t\t\t\tbase: string,\n\t\t\t\t\t\tcontent?: string,\n\t\t\t\t\t) => Promise<{ base: string; content: string }>;\n\t\t\t\t},\n\t\t\t) => Promise<DesignSystem>;\n\n\t\t\tconst loadDesignSystem =\n\t\t\t\ttailwindcss.__unstable__loadDesignSystem as LoadDesignSystemFn;\n\n\t\t\tconst designSystem = await loadDesignSystem(cssContent, {\n\t\t\t\tbase: basePath,\n\t\t\t\tasync loadStylesheet(\n\t\t\t\t\t_id: string,\n\t\t\t\t\tbase: string,\n\t\t\t\t\tcontent?: string,\n\t\t\t\t): Promise<{ base: string; content: string }> {\n\t\t\t\t\tif (content) {\n\t\t\t\t\t\treturn { base, content };\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!_id.startsWith(\".\") && !_id.startsWith(\"/\")) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst pkgJsonPath = require.resolve(`${_id}/package.json`, {\n\t\t\t\t\t\t\t\tpaths: [base, cwd],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst pkgDir = path.dirname(pkgJsonPath);\n\t\t\t\t\t\t\tconst cssPath = path.join(pkgDir, \"index.css\");\n\t\t\t\t\t\t\tif (fileExists(cssPath)) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tbase: pkgDir,\n\t\t\t\t\t\t\t\t\tcontent: readFileSync(cssPath),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Package not found or doesn't have index.css - continue to file path resolution\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst filePath = path.resolve(base, _id);\n\t\t\t\t\tif (fileExists(filePath)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tbase: path.dirname(filePath),\n\t\t\t\t\t\t\tcontent: readFileSync(filePath),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn { base, content: \"\" };\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tObject.assign(designSystem, {\n\t\t\t\tdependencies: () => new Set<string>(),\n\n\t\t\t\tcompile(classes: string[]): unknown[][] {\n\t\t\t\t\tconst results = designSystem.candidatesToAst\n\t\t\t\t\t\t? designSystem.candidatesToAst(classes)\n\t\t\t\t\t\t: designSystem.candidatesToCss?.(classes) || [];\n\n\t\t\t\t\treturn results.map((result: unknown) => {\n\t\t\t\t\t\tif (Array.isArray(result)) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (result === null) {\n\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// @ts-expect-error - DesignSystem types are loaded dynamically at runtime\n\t\t\tstate.designSystem = designSystem;\n\n\t\t\tif (!state.classNames) {\n\t\t\t\tstate.classNames = {\n\t\t\t\t\tcontext: {},\n\t\t\t\t} as unknown as typeof state.classNames;\n\t\t\t}\n\n\t\t\tif (verbose) {\n\t\t\t\tconsole.log(chalk.dim(\" ✓ Loaded v4 design system\"));\n\t\t\t}\n\t\t} else {\n\t\t\tconst error = new Error(\n\t\t\t\t\"Tailwind v4 __unstable__loadDesignSystem is not available. Please ensure you have Tailwind CSS v4 installed.\",\n\t\t\t);\n\t\t\tthrow new AdapterLoadError(\"v4\", error);\n\t\t}\n\t} catch (error) {\n\t\tif (error instanceof AdapterLoadError) {\n\t\t\tthrow error;\n\t\t}\n\t\tif (error instanceof Error) {\n\t\t\tthrow new AdapterLoadError(\"v4\", error);\n\t\t}\n\t\tthrow new Error(`Failed to load v4 design system: ${String(error)}`);\n\t}\n}\n","import { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport { V3_CONFIG_PATHS, V4_CSS_FOLDERS, V4_CSS_NAMES } from \"../constants\";\nimport type { TailwindConfig } from \"../types\";\nimport { fileExists, readFileSync } from \"./fs\";\n\nconst require = createRequire(import.meta.url || __filename);\n\nexport const isCssConfigFile = (filePath: string) => filePath.endsWith(\".css\");\n\nexport async function loadTailwindConfig(\n\tconfigPath: string,\n): Promise<TailwindConfig> {\n\tif (isCssConfigFile(configPath)) {\n\t\treturn {};\n\t}\n\n\tif (!path.isAbsolute(configPath)) {\n\t\tthrow new Error(\n\t\t\t`Config path must be absolute for security reasons: ${configPath}`,\n\t\t);\n\t}\n\n\ttry {\n\t\tdelete require.cache[configPath];\n\n\t\tconst configModule = require(configPath) as\n\t\t\t| TailwindConfig\n\t\t\t| { default: TailwindConfig };\n\t\tconst config = (\n\t\t\t\"default\" in configModule ? configModule.default : configModule\n\t\t) as TailwindConfig;\n\n\t\tif (typeof config !== \"object\" || config === null) {\n\t\t\tthrow new Error(\"Config must be an object\");\n\t\t}\n\n\t\treturn config;\n\t} catch (error) {\n\t\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\n\t\tif (errorMessage.includes(\"Cannot find module\")) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to load config from ${configPath}.\\n` +\n\t\t\t\t\t\"The config file may have missing dependencies. Check that all imports are installed.\",\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\terrorMessage.includes(\"SyntaxError\") ||\n\t\t\terrorMessage.includes(\"Unexpected token\")\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to parse config from ${configPath}.\\n` +\n\t\t\t\t\t\"The config file has syntax errors. Check your JavaScript/TypeScript syntax.\",\n\t\t\t);\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t`Failed to load config from ${configPath}: ${errorMessage}`,\n\t\t);\n\t}\n}\n\nexport async function findTailwindConfigPath(\n\tcwd: string,\n\tconfigPath?: string,\n): Promise<string | null> {\n\tif (configPath) {\n\t\tconst resolved = path.isAbsolute(configPath)\n\t\t\t? configPath\n\t\t\t: path.resolve(cwd, configPath);\n\t\treturn fileExists(resolved) ? resolved : null;\n\t}\n\n\t// Search for v3 JavaScript config files\n\tfor (const p of V3_CONFIG_PATHS) {\n\t\tconst fullPath = path.join(cwd, p);\n\t\tif (fileExists(fullPath)) {\n\t\t\treturn fullPath;\n\t\t}\n\t}\n\n\t// Search for v4 CSS config files\n\tconst v4Paths = V4_CSS_FOLDERS.flatMap((folder) =>\n\t\tV4_CSS_NAMES.map((name) => path.join(folder, name)),\n\t);\n\n\tfor (const p of v4Paths) {\n\t\tconst fullPath = path.join(cwd, p);\n\t\tif (fileExists(fullPath)) {\n\t\t\ttry {\n\t\t\t\tconst content = readFileSync(fullPath);\n\t\t\t\t// Verify it's a valid Tailwind v4 CSS config\n\t\t\t\tif (\n\t\t\t\t\tcontent.includes('@import \"tailwindcss\"') ||\n\t\t\t\t\tcontent.includes(\"@import 'tailwindcss'\")\n\t\t\t\t) {\n\t\t\t\t\treturn fullPath;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// File exists but can't be read (permission denied, etc.) - skip it\n\t\t\t\t// This is expected behavior when scanning directories\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n","import { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport type { State } from \"@tailwindcss/language-service\";\nimport chalk from \"chalk\";\nimport { createEditorState } from \"./adapters/editor-state-adapter\";\nimport { loadV3ClassMetadata } from \"./adapters/v3-adapter\";\nimport { loadV4DesignSystem } from \"./adapters/v4-adapter\";\nimport { DEFAULT_SEPARATOR } from \"./constants\";\nimport type { ResolvedTailwindConfig, TailwindConfig } from \"./types\";\nimport {\n\tfindTailwindConfigPath,\n\tisCssConfigFile,\n\tloadTailwindConfig,\n} from \"./utils/config\";\n\nconst require = createRequire(import.meta.url || __filename);\n\nfunction getTailwindVersion(cwd: string) {\n\ttry {\n\t\tconst tailwindPackageJson = require.resolve(\"tailwindcss/package.json\", {\n\t\t\tpaths: [cwd],\n\t\t});\n\t\tconst { readFileSync } = require(\"node:fs\");\n\t\tconst pkg = JSON.parse(readFileSync(tailwindPackageJson, \"utf-8\")) as {\n\t\t\tversion?: string;\n\t\t};\n\t\treturn pkg.version;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction isV4Config(version: string | undefined) {\n\treturn version?.startsWith(\"4.\") ?? false;\n}\n\nfunction resolveTailwindPath(cwd: string, configDir?: string) {\n\tconst paths = configDir ? [configDir, cwd] : [cwd];\n\ttry {\n\t\treturn require.resolve(\"tailwindcss\", { paths });\n\t} catch {\n\t\tthrow new Error(\n\t\t\t`Could not find tailwindcss module in ${paths.join(\" or \")}.\\n` +\n\t\t\t\t\"Install it with: npm install -D tailwindcss\",\n\t\t);\n\t}\n}\n\nexport async function createState(\n\tcwd: string,\n\tconfigPath?: string,\n\tverbose = false,\n): Promise<State> {\n\tconst resolvedConfigPath = await findTailwindConfigPath(cwd, configPath);\n\n\tif (!resolvedConfigPath) {\n\t\tthrow new Error(\n\t\t\t\"Could not find Tailwind config file. Expected one of:\\n\" +\n\t\t\t\t\" • Tailwind v4 (CSS): app.css, index.css, tailwind.css in project root or src/\\n\" +\n\t\t\t\t\" • Tailwind v3 (JS): tailwind.config.js, tailwind.config.ts\\n\" +\n\t\t\t\t\"Run 'npx tailwindcss init' to create a config file.\",\n\t\t);\n\t}\n\n\tconst isCssConfig = isCssConfigFile(resolvedConfigPath);\n\tconst configDir = path.dirname(resolvedConfigPath);\n\tconst tailwindPath = resolveTailwindPath(cwd, configDir);\n\n\tconst tailwindcss = require(tailwindPath) as {\n\t\tresolveConfig?: (config: unknown) => unknown;\n\t};\n\n\tconst version = getTailwindVersion(cwd);\n\tconst isV4 = isV4Config(version);\n\n\tif (verbose) {\n\t\tconsole.log(chalk.cyan.bold(\"→ Tailwind Configuration\"));\n\t\tconsole.log(chalk.dim(` Version: ${version || \"unknown\"}`));\n\t\tconsole.log(\n\t\t\tchalk.dim(` Config type: ${isCssConfig ? \"CSS (v4)\" : \"JavaScript\"}`),\n\t\t);\n\t\tconsole.log(chalk.dim(` Config path: ${resolvedConfigPath}`));\n\t}\n\n\tlet config: TailwindConfig = {};\n\tlet resolvedConfig: ResolvedTailwindConfig = { separator: \":\" };\n\n\tif (!isCssConfig) {\n\t\tconfig = await loadTailwindConfig(resolvedConfigPath);\n\t\tresolvedConfig = {\n\t\t\t...config,\n\t\t\tseparator: config.separator ?? DEFAULT_SEPARATOR,\n\t\t};\n\t\tif (tailwindcss.resolveConfig) {\n\t\t\tresolvedConfig = tailwindcss.resolveConfig(\n\t\t\t\tconfig,\n\t\t\t) as ResolvedTailwindConfig;\n\t\t}\n\t}\n\n\tconst state: State = {\n\t\tenabled: true,\n\t\tconfigPath: resolvedConfigPath,\n\t\tconfig: resolvedConfig,\n\t\tversion,\n\t\tv4: isV4 || undefined,\n\t\tseparator: resolvedConfig.separator || DEFAULT_SEPARATOR,\n\t\tscreens: [],\n\t\tvariants: [],\n\t\tclassNames: undefined,\n\t\tclassList: undefined,\n\t\tmodules: undefined,\n\t\tblocklist: [],\n\t\teditor: createEditorState(cwd),\n\t\tfeatures: [\"diagnostics\"] as unknown as State[\"features\"],\n\t};\n\n\tif (isV4 || isCssConfig) {\n\t\tawait loadV4DesignSystem(state, cwd, resolvedConfigPath, verbose);\n\t} else {\n\t\tawait loadV3ClassMetadata(state, cwd, verbose);\n\t}\n\n\treturn state;\n}\n","import * as path from \"node:path\";\nimport type { State } from \"@tailwindcss/language-service\";\nimport { doValidate } from \"@tailwindcss/language-service\";\nimport chalk from \"chalk\";\nimport glob from \"fast-glob\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { applyCodeActions } from \"./code-actions\";\nimport {\n\tCONCURRENT_FILES,\n\tDEFAULT_FILE_PATTERN,\n\tDEFAULT_IGNORE_PATTERNS,\n\tgetLanguageId,\n} from \"./constants\";\nimport { createState } from \"./state\";\nimport type {\n\tLintFileResult,\n\tLintOptions,\n\tLintResult,\n\tTailwindConfig,\n} from \"./types\";\nimport {\n\tfindTailwindConfigPath,\n\tisCssConfigFile,\n\tloadTailwindConfig,\n} from \"./utils/config\";\nimport { fileExists, readFileSync, writeFileSync } from \"./utils/fs\";\n\nasync function validateDocument(\n\tstate: State,\n\tfilePath: string,\n\tcontent: string,\n) {\n\ttry {\n\t\tif (!state) {\n\t\t\tthrow new Error(\"State is not initialized\");\n\t\t}\n\n\t\tif (state.v4 && !state.designSystem) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Design system not initialized for Tailwind v4. This might indicate a configuration issue.\",\n\t\t\t);\n\t\t}\n\n\t\tif (!state.v4 && !state.modules?.tailwindcss) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Tailwind modules not initialized for Tailwind v3. This might indicate a configuration issue.\",\n\t\t\t);\n\t\t}\n\n\t\tconst languageId = getLanguageId(filePath);\n\t\tconst uri = `file://${filePath}`;\n\t\tconst document = TextDocument.create(uri, languageId, 1, content);\n\n\t\treturn await doValidate(state, document);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\n\t\tif (message.includes(\"Cannot read\") || message.includes(\"undefined\")) {\n\t\t\tconsole.warn(\n\t\t\t\t`Warning: Language service crashed while validating ${filePath}. Skipping this file.`,\n\t\t\t);\n\t\t\treturn [];\n\t\t}\n\n\t\tthrow new Error(`Failed to validate document ${filePath}: ${message}`);\n\t}\n}\n\nasync function discoverFiles(\n\tcwd: string,\n\tpatterns: string[],\n\tconfigPath: string | undefined,\n\tautoDiscover: boolean,\n) {\n\tif (autoDiscover) {\n\t\treturn discoverFilesFromConfig(cwd, configPath);\n\t}\n\treturn expandPatterns(cwd, patterns);\n}\n\nasync function expandPatterns(cwd: string, patterns: string[]) {\n\treturn glob(patterns, {\n\t\tcwd,\n\t\tabsolute: false,\n\t\tignore: DEFAULT_IGNORE_PATTERNS,\n\t});\n}\n\nasync function discoverFilesFromConfig(cwd: string, configPath?: string) {\n\tconst configFilePath = await findTailwindConfigPath(cwd, configPath);\n\n\tif (!configFilePath) {\n\t\tthrow new Error(\n\t\t\t\"Could not find Tailwind config for auto-discovery.\\n\" +\n\t\t\t\t\"Use --config to specify the path, or provide file patterns directly.\",\n\t\t);\n\t}\n\n\tif (!isCssConfigFile(configFilePath)) {\n\t\tconst config = await loadTailwindConfig(configFilePath);\n\n\t\tif (!config || !config.content) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Tailwind config is missing the 'content' property.\\n\" +\n\t\t\t\t\t\"Add a content array to specify which files to scan:\\n\" +\n\t\t\t\t\t\" content: ['./src/**/*.{js,jsx,ts,tsx}']\",\n\t\t\t);\n\t\t}\n\n\t\tconst patterns = extractContentPatterns(config);\n\n\t\tif (patterns.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t\"No content patterns found in Tailwind config.\\n\" +\n\t\t\t\t\t\"Ensure your config has a content array with file patterns.\",\n\t\t\t);\n\t\t}\n\n\t\treturn expandPatterns(cwd, patterns);\n\t}\n\n\tconst cssContent = readFileSync(configFilePath);\n\tconst sourcePatterns = extractSourcePatterns(cssContent);\n\n\tif (sourcePatterns.length > 0) {\n\t\treturn expandPatterns(cwd, sourcePatterns);\n\t}\n\n\treturn expandPatterns(cwd, [DEFAULT_FILE_PATTERN]);\n}\n\nfunction extractContentPatterns(config: TailwindConfig) {\n\tif (!config.content) return [];\n\n\tconst content = Array.isArray(config.content)\n\t\t? config.content\n\t\t: config.content.files || [];\n\n\treturn content.filter((p): p is string => typeof p === \"string\");\n}\n\nfunction extractSourcePatterns(cssContent: string) {\n\tconst patterns: string[] = [];\n\tconst sourceRegex = /@source\\s+[\"']([^\"']+)[\"']/g;\n\n\tfor (const match of cssContent.matchAll(sourceRegex)) {\n\t\tpatterns.push(match[1]);\n\t}\n\n\treturn patterns;\n}\n\nasync function processFiles(\n\tstate: State,\n\tcwd: string,\n\tfiles: string[],\n\tfix: boolean,\n\tonProgress?: (current: number, total: number, file: string) => void,\n) {\n\tconst results: LintFileResult[] = [];\n\n\tfor (let i = 0; i < files.length; i += CONCURRENT_FILES) {\n\t\tconst batch = files.slice(i, i + CONCURRENT_FILES);\n\n\t\tconst batchResults = await Promise.all(\n\t\t\tbatch.map(async (file, batchIndex) => {\n\t\t\t\tif (onProgress) {\n\t\t\t\t\tonProgress(i + batchIndex + 1, files.length, file);\n\t\t\t\t}\n\t\t\t\treturn processFile(state, cwd, file, fix);\n\t\t\t}),\n\t\t);\n\n\t\tresults.push(\n\t\t\t...(batchResults.filter((r) => r !== null) as LintFileResult[]),\n\t\t);\n\t}\n\n\treturn results;\n}\n\nasync function processFile(\n\tstate: State,\n\tcwd: string,\n\tfilePath: string,\n\tfix: boolean,\n) {\n\tconst absolutePath = path.isAbsolute(filePath)\n\t\t? filePath\n\t\t: path.resolve(cwd, filePath);\n\n\tif (!fileExists(absolutePath)) {\n\t\treturn null;\n\t}\n\n\tconst content = readFileSync(absolutePath);\n\tlet diagnostics = await validateDocument(state, absolutePath, content);\n\n\tlet fixedCount = 0;\n\n\tif (fix && diagnostics.length > 0) {\n\t\tconst fixResult = await applyCodeActions(\n\t\t\tstate,\n\t\t\tabsolutePath,\n\t\t\tcontent,\n\t\t\tdiagnostics,\n\t\t);\n\n\t\tif (fixResult.changed) {\n\t\t\twriteFileSync(absolutePath, fixResult.content);\n\t\t\tfixedCount = fixResult.fixedCount;\n\t\t\tdiagnostics = await validateDocument(\n\t\t\t\tstate,\n\t\t\t\tabsolutePath,\n\t\t\t\tfixResult.content,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn {\n\t\tpath: path.relative(cwd, absolutePath),\n\t\tdiagnostics,\n\t\tfixed: fixedCount > 0,\n\t\tfixedCount,\n\t};\n}\nasync function initializeState(\n\tcwd: string,\n\tconfigPath?: string,\n\tverbose = false,\n) {\n\ttry {\n\t\tconst state = await createState(cwd, configPath, verbose);\n\t\tif (verbose) {\n\t\t\tconsole.log();\n\t\t}\n\t\treturn state;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`Failed to initialize Tailwind state: ${message}`);\n\t}\n}\n\nexport type { LintFileResult, LintOptions, LintResult };\n\nexport async function lint({\n\tcwd,\n\tpatterns,\n\tconfigPath,\n\tautoDiscover,\n\tfix = false,\n\tverbose = false,\n\tonProgress,\n}: LintOptions): Promise<LintResult> {\n\tconst state = await initializeState(cwd, configPath, verbose);\n\tconst files = await discoverFiles(cwd, patterns, configPath, autoDiscover);\n\n\tif (verbose) {\n\t\tconsole.log(\n\t\t\tchalk.cyan.bold(\n\t\t\t\t`→ Discovered ${files.length} file${files.length !== 1 ? \"s\" : \"\"} to lint`,\n\t\t\t),\n\t\t);\n\t\tconsole.log();\n\t}\n\n\tif (files.length === 0) {\n\t\treturn { files: [], totalFilesProcessed: 0 };\n\t}\n\n\tconst results = await processFiles(state, cwd, files, fix, onProgress);\n\n\treturn {\n\t\tfiles: results.filter(\n\t\t\t(result) => result.diagnostics.length > 0 || result.fixed,\n\t\t),\n\t\ttotalFilesProcessed: files.length,\n\t};\n}\n"],"mappings":"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"}
|