tailwind-lint 0.1.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.
- package/LICENSE +21 -0
- package/README.md +205 -0
- package/dist/cli.cjs +200 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/constants-BFubEpZ9.cjs +102 -0
- package/dist/constants-BFubEpZ9.cjs.map +1 -0
- package/dist/constants-Bstz7FuV.cjs +5 -0
- package/dist/linter-QRh7wAZ7.cjs +686 -0
- package/dist/linter-QRh7wAZ7.cjs.map +1 -0
- package/dist/linter.cjs +3 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linter-QRh7wAZ7.cjs","names":["getLanguageId","path","TextDocument","MAX_FIX_ITERATIONS","fs","DEFAULT_TAB_SIZE","DEFAULT_ROOT_FONT_SIZE","path","require","path","require","fileExists","fs","readFileSync","path","require","fileExists","fs","readFileSync","isCssConfigFile","loadTailwindConfig","path","findTailwindConfigPath","V3_CONFIG_PATHS","V4_CSS_FOLDERS","V4_CSS_NAMES","DEFAULT_SEPARATOR","path","TextDocument","DEFAULT_IGNORE_PATTERNS"],"sources":["../src/code-actions.ts","../src/adapters/editor-state-adapter.ts","../src/types.ts","../src/adapters/v3-adapter.ts","../src/adapters/v4-adapter.ts","../src/state.ts","../src/linter.ts"],"sourcesContent":["import * as path from \"node:path\";\nimport 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 { MAX_FIX_ITERATIONS } from \"./constants\";\nimport type { ApplyCodeActionsResult, SerializedDiagnostic } from \"./types\";\n\nexport type { ApplyCodeActionsResult };\n\nfunction getLanguageId(filePath: string): string {\n\tconst LANGUAGE_MAP: Record<string, string> = {\n\t\t\".astro\": \"astro\",\n\t\t\".css\": \"css\",\n\t\t\".erb\": \"erb\",\n\t\t\".hbs\": \"handlebars\",\n\t\t\".htm\": \"html\",\n\t\t\".html\": \"html\",\n\t\t\".js\": \"javascript\",\n\t\t\".jsx\": \"javascriptreact\",\n\t\t\".less\": \"less\",\n\t\t\".md\": \"markdown\",\n\t\t\".mdx\": \"mdx\",\n\t\t\".php\": \"php\",\n\t\t\".sass\": \"sass\",\n\t\t\".scss\": \"scss\",\n\t\t\".svelte\": \"svelte\",\n\t\t\".ts\": \"typescript\",\n\t\t\".tsx\": \"typescriptreact\",\n\t\t\".twig\": \"twig\",\n\t\t\".vue\": \"vue\",\n\t};\n\tconst ext = path.extname(filePath).toLowerCase();\n\treturn LANGUAGE_MAP[ext] || \"html\";\n}\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): Promise<QuickfixAction[]> {\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?.startsWith(\"quickfix.\"),\n\t) as QuickfixAction[];\n}\n\nfunction applyFirstQuickfix(\n\taction: QuickfixAction,\n\turi: string,\n\tdocument: TextDocument,\n\tcontent: string,\n): {\n\tcontent: string;\n} | null {\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: SerializedDiagnostic[],\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\tconst languageId = getLanguageId(filePath);\n\tconst uri = `file://${filePath}`;\n\tlet currentDocument = TextDocument.create(uri, languageId, 1, content);\n\tlet currentContent = content;\n\tlet totalFixed = 0;\n\n\tlet iteration = 0;\n\tfor (; iteration < MAX_FIX_ITERATIONS; iteration++) {\n\t\tconst currentDiagnostics = await doValidate(state, currentDocument);\n\t\tif (currentDiagnostics.length === 0) break;\n\n\t\tconst quickfixes = await getQuickfixes(\n\t\t\tstate,\n\t\t\tcurrentDocument,\n\t\t\turi,\n\t\t\tcurrentDiagnostics,\n\t\t);\n\t\tif (quickfixes.length === 0) break;\n\n\t\tconst fixResult = applyFirstQuickfix(\n\t\t\tquickfixes[0],\n\t\t\turi,\n\t\t\tcurrentDocument,\n\t\t\tcurrentContent,\n\t\t);\n\t\tif (!fixResult) break;\n\n\t\tcurrentContent = fixResult.content;\n\t\tcurrentDocument = TextDocument.create(\n\t\t\turi,\n\t\t\tlanguageId,\n\t\t\tcurrentDocument.version + 1,\n\t\t\tcurrentContent,\n\t\t);\n\t\ttotalFixed++;\n\t}\n\n\tif (iteration === MAX_FIX_ITERATIONS) {\n\t\tconst remainingDiagnostics = await doValidate(state, currentDocument);\n\t\tif (remainingDiagnostics.length > 0) {\n\t\t\tconsole.warn(\n\t\t\t\t`Warning: Reached maximum fix iterations (${MAX_FIX_ITERATIONS}) for ${filePath}. Some issues may remain.`,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn {\n\t\tcontent: currentContent,\n\t\tchanged: currentContent !== content,\n\t\tfixedCount: totalFixed,\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): boolean {\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): EditorState {\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","export 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 SerializedDiagnostic {\n\trange: {\n\t\tstart: { line: number; character: number };\n\t\tend: { line: number; character: number };\n\t};\n\tseverity: number;\n\tmessage: string;\n\tcode?: string;\n\tsource?: string;\n}\n\nexport interface ApplyCodeActionsResult {\n\tcontent: string;\n\tchanged: boolean;\n\tfixedCount: number;\n}\n\nexport interface LintFileResult {\n\tpath: string;\n\tdiagnostics: SerializedDiagnostic[];\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 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(\" ✓ Loaded v3 JIT modules\");\n\t\t\t}\n\t\t} catch (jitError) {\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(` ⚠ Warning: Could not load v3 JIT modules: ${message}`);\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): void {\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\";\nimport { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport type { State } from \"@tailwindcss/language-service\";\nimport type { DesignSystem } from \"../types\";\nimport { AdapterLoadError } from \"../types\";\n\nconst require = createRequire(import.meta.url || __filename);\n\nfunction fileExists(filePath: string): boolean {\n\ttry {\n\t\treturn fs.existsSync(filePath);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction readFileSync(filePath: string): 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 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, true);\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, true),\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}\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, true),\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(\" ✓ 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 * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport type { State } from \"@tailwindcss/language-service\";\nimport { createEditorState } from \"./adapters/editor-state-adapter\";\nimport { loadV3ClassMetadata } from \"./adapters/v3-adapter\";\nimport { loadV4DesignSystem } from \"./adapters/v4-adapter\";\nimport {\n\tDEFAULT_SEPARATOR,\n\tV3_CONFIG_PATHS,\n\tV4_CSS_FOLDERS,\n\tV4_CSS_NAMES,\n} from \"./constants\";\nimport type { ResolvedTailwindConfig, TailwindConfig } from \"./types\";\n\nconst require = createRequire(import.meta.url || __filename);\n\nfunction fileExists(filePath: string): boolean {\n\ttry {\n\t\treturn fs.existsSync(filePath);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction readFileSync(filePath: string): 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\nfunction getTailwindVersion(cwd: string): string | undefined {\n\ttry {\n\t\tconst tailwindPackageJson = require.resolve(\"tailwindcss/package.json\", {\n\t\t\tpaths: [cwd],\n\t\t});\n\t\tconst pkg = JSON.parse(fs.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): boolean {\n\treturn version?.startsWith(\"4.\") ?? false;\n}\n\nfunction isCssConfigFile(filePath: string): boolean {\n\treturn filePath.endsWith(\".css\");\n}\n\nasync function loadTailwindConfig(configPath: string): 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\t\tthrow new Error(\n\t\t\t`Failed to load config from ${configPath}: ${errorMessage}`,\n\t\t);\n\t}\n}\n\nasync 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\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\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\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}\n\t}\n\n\treturn null;\n}\n\nfunction resolveTailwindPath(cwd: string, configDir?: string): 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 resolve tailwindcss module from ${paths.join(\" or \")}`,\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(\"Could not find tailwind config file (JS/TS or CSS)\");\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(` Tailwind version: ${version || \"unknown\"}`);\n\t\tconsole.log(` Config type: ${isCssConfig ? \"CSS (v4)\" : \"JavaScript\"}`);\n\t\tconsole.log(` 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 glob from \"fast-glob\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { applyCodeActions } from \"./code-actions\";\nimport { DEFAULT_IGNORE_PATTERNS } from \"./constants\";\nimport { createState } from \"./state\";\nimport type {\n\tLintFileResult,\n\tLintOptions,\n\tLintResult,\n\tSerializedDiagnostic,\n\tTailwindConfig,\n} from \"./types\";\n\nfunction fileExists(filePath: string): boolean {\n\ttry {\n\t\treturn require(\"node:fs\").existsSync(filePath);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction readFileSync(filePath: string): string {\n\tif (!filePath || typeof filePath !== \"string\") {\n\t\tthrow new TypeError(\"File path must be a non-empty string\");\n\t}\n\treturn require(\"node:fs\").readFileSync(filePath, \"utf-8\");\n}\n\nfunction writeFileSync(filePath: string, content: string): void {\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\trequire(\"node:fs\").writeFileSync(filePath, content, \"utf-8\");\n}\n\nfunction serializeDiagnostics(\n\tdiagnostics: import(\"vscode-languageserver\").Diagnostic[],\n): SerializedDiagnostic[] {\n\treturn diagnostics.map((diagnostic) => ({\n\t\trange: {\n\t\t\tstart: {\n\t\t\t\tline: diagnostic.range.start.line,\n\t\t\t\tcharacter: diagnostic.range.start.character,\n\t\t\t},\n\t\t\tend: {\n\t\t\t\tline: diagnostic.range.end.line,\n\t\t\t\tcharacter: diagnostic.range.end.character,\n\t\t\t},\n\t\t},\n\t\tseverity: diagnostic.severity || 2,\n\t\tmessage: diagnostic.message,\n\t\tcode: diagnostic.code?.toString(),\n\t\tsource: diagnostic.source,\n\t}));\n}\n\nfunction getLanguageId(filePath: string): string {\n\tconst LANGUAGE_MAP: Record<string, string> = {\n\t\t\".astro\": \"astro\",\n\t\t\".css\": \"css\",\n\t\t\".erb\": \"erb\",\n\t\t\".hbs\": \"handlebars\",\n\t\t\".htm\": \"html\",\n\t\t\".html\": \"html\",\n\t\t\".js\": \"javascript\",\n\t\t\".jsx\": \"javascriptreact\",\n\t\t\".less\": \"less\",\n\t\t\".md\": \"markdown\",\n\t\t\".mdx\": \"mdx\",\n\t\t\".php\": \"php\",\n\t\t\".sass\": \"sass\",\n\t\t\".scss\": \"scss\",\n\t\t\".svelte\": \"svelte\",\n\t\t\".ts\": \"typescript\",\n\t\t\".tsx\": \"typescriptreact\",\n\t\t\".twig\": \"twig\",\n\t\t\".vue\": \"vue\",\n\t};\n\tconst ext = path.extname(filePath).toLowerCase();\n\treturn LANGUAGE_MAP[ext] || \"html\";\n}\n\nasync function validateDocument(\n\tstate: State,\n\tfilePath: string,\n\tcontent: string,\n): Promise<SerializedDiagnostic[]> {\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\tconst diagnostics = await doValidate(state, document);\n\n\t\treturn serializeDiagnostics(diagnostics);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`Failed to validate document ${filePath}: ${message}`);\n\t}\n}\n\nasync function findTailwindConfigPath(\n\tcwd: string,\n\tconfigPath?: string,\n): Promise<string | null> {\n\tconst { V3_CONFIG_PATHS, V4_CSS_FOLDERS, V4_CSS_NAMES } = await import(\n\t\t\"./constants\"\n\t);\n\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\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\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\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}\n\t}\n\n\treturn null;\n}\n\nfunction isCssConfigFile(filePath: string): boolean {\n\treturn filePath.endsWith(\".css\");\n}\n\nasync function loadTailwindConfig(configPath: string): 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\tconst { createRequire } = await import(\"node:module\");\n\t\tconst require = createRequire(import.meta.url || __filename);\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\t\tthrow new Error(\n\t\t\t`Failed to load config from ${configPath}: ${errorMessage}`,\n\t\t);\n\t}\n}\n\nasync function discoverFiles(\n\tcwd: string,\n\tpatterns: string[],\n\tconfigPath: string | undefined,\n\tautoDiscover: boolean,\n): Promise<string[]> {\n\tif (autoDiscover) {\n\t\treturn discoverFilesFromConfig(cwd, configPath);\n\t}\n\treturn expandPatterns(cwd, patterns);\n}\n\nasync function expandPatterns(\n\tcwd: string,\n\tpatterns: string[],\n): Promise<string[]> {\n\tconst explicitFiles: string[] = [];\n\tconst globPatterns: string[] = [];\n\n\tfor (const pattern of patterns) {\n\t\tif (\n\t\t\tpattern.includes(\"*\") ||\n\t\t\tpattern.includes(\"?\") ||\n\t\t\tpattern.includes(\"[\")\n\t\t) {\n\t\t\tglobPatterns.push(pattern);\n\t\t} else {\n\t\t\tconst fullPath = path.resolve(cwd, pattern);\n\t\t\tif (fileExists(fullPath)) {\n\t\t\t\texplicitFiles.push(pattern);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (globPatterns.length === 0) {\n\t\treturn explicitFiles;\n\t}\n\n\tconst globResults = await glob(globPatterns, {\n\t\tcwd,\n\t\tabsolute: false,\n\t\tignore: DEFAULT_IGNORE_PATTERNS,\n\t});\n\n\tif (explicitFiles.length === 0) {\n\t\treturn globResults;\n\t}\n\n\tconst fileSet = new Set(explicitFiles);\n\tfor (const file of globResults) {\n\t\tfileSet.add(file);\n\t}\n\treturn Array.from(fileSet);\n}\n\nasync function discoverFilesFromConfig(\n\tcwd: string,\n\tconfigPath?: string,\n): Promise<string[]> {\n\tconst configFilePath = await findTailwindConfigPath(cwd, configPath);\n\n\tif (!configFilePath) {\n\t\tthrow new Error(\"Could not find Tailwind config\");\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\"Could not find Tailwind config or config has no content property\",\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(\"No content patterns found in Tailwind config\");\n\t\t}\n\n\t\treturn expandPatterns(cwd, patterns);\n\t}\n\n\tthrow new Error(\n\t\t\"Auto-discovery is not supported for CSS-based configs (v4). Please specify file patterns.\",\n\t);\n}\n\nfunction extractContentPatterns(config: TailwindConfig): string[] {\n\tif (!config.content) return [];\n\n\tif (Array.isArray(config.content)) {\n\t\treturn config.content.filter((p): p is string => typeof p === \"string\");\n\t}\n\n\tif (config.content.files) {\n\t\treturn config.content.files.filter(\n\t\t\t(p): p is string => typeof p === \"string\",\n\t\t);\n\t}\n\n\treturn [];\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): Promise<LintFileResult[]> {\n\tconst results: LintFileResult[] = [];\n\n\tfor (let i = 0; i < files.length; i++) {\n\t\tif (onProgress) {\n\t\t\tonProgress(i + 1, files.length, files[i]);\n\t\t}\n\n\t\tconst result = await processFile(state, cwd, files[i], fix);\n\t\tif (result) {\n\t\t\tresults.push(result);\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): Promise<LintFileResult | null> {\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\tlet content = readFileSync(absolutePath);\n\tlet diagnostics = await validateDocument(state, absolutePath, content);\n\n\tlet fixedCount = 0;\n\tlet wasFixed = false;\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\tcontent = fixResult.content;\n\t\t\twasFixed = true;\n\t\t\tfixedCount = fixResult.fixedCount;\n\n\t\t\t// Re-validate to get remaining diagnostics\n\t\t\tdiagnostics = await validateDocument(state, absolutePath, content);\n\t\t}\n\t}\n\n\treturn {\n\t\tpath: path.relative(cwd, absolutePath),\n\t\tdiagnostics,\n\t\tfixed: wasFixed,\n\t\tfixedCount,\n\t};\n}\nasync function initializeState(\n\tcwd: string,\n\tconfigPath?: string,\n\tverbose = false,\n) {\n\ttry {\n\t\tif (verbose) {\n\t\t\tconsole.log(\"→ Initializing Tailwind CSS language service...\");\n\t\t}\n\t\tconst state = await createState(cwd, configPath, verbose);\n\t\tif (verbose) {\n\t\t\tconsole.log(\" ✓ State initialized successfully\\n\");\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 files = await discoverFiles(cwd, patterns, configPath, autoDiscover);\n\n\tif (verbose) {\n\t\tconsole.log(\n\t\t\t`→ Discovered ${files.length} file${files.length !== 1 ? \"s\" : \"\"} to lint`,\n\t\t);\n\t}\n\n\tif (files.length === 0) {\n\t\treturn { files: [], totalFilesProcessed: 0 };\n\t}\n\n\tconst state = await initializeState(cwd, configPath, verbose);\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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"}
|
package/dist/linter.cjs
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tailwind-lint",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A command-line tool that uses the Tailwind CSS IntelliSense plugin to show linting suggestions for your Tailwind CSS classes",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"tailwindcss",
|
|
7
|
+
"tailwind",
|
|
8
|
+
"linter",
|
|
9
|
+
"lint",
|
|
10
|
+
"cli",
|
|
11
|
+
"diagnostics",
|
|
12
|
+
"intellisense",
|
|
13
|
+
"css",
|
|
14
|
+
"utility-first",
|
|
15
|
+
"code-quality"
|
|
16
|
+
],
|
|
17
|
+
"homepage": "https://github.com/ph1p/tailwind-lint#readme",
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/ph1p/tailwind-lint/issues"
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/ph1p/tailwind-lint.git"
|
|
24
|
+
},
|
|
25
|
+
"funding": {
|
|
26
|
+
"type": "github",
|
|
27
|
+
"url": "https://github.com/sponsors/ph1p"
|
|
28
|
+
},
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"author": "Philip Stapelfeldt <me@ph1p.dev>",
|
|
31
|
+
"type": "module",
|
|
32
|
+
"bin": {
|
|
33
|
+
"tailwind-lint": "./dist/cli.cjs"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"README.md",
|
|
38
|
+
"LICENSE"
|
|
39
|
+
],
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@tailwindcss/language-service": "^0.14.29",
|
|
42
|
+
"chalk": "^5.6.2",
|
|
43
|
+
"commander": "^14.0.2",
|
|
44
|
+
"fast-glob": "^3.3.3",
|
|
45
|
+
"vscode-languageserver": "^9.0.1",
|
|
46
|
+
"vscode-languageserver-textdocument": "^1.0.12"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@biomejs/biome": "^2.3.12",
|
|
50
|
+
"@types/node": "^25.0.10",
|
|
51
|
+
"tsdown": "^0.20.1",
|
|
52
|
+
"vitest": "^4.0.18"
|
|
53
|
+
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=22.0.0",
|
|
56
|
+
"pnpm": ">=10.0.0"
|
|
57
|
+
},
|
|
58
|
+
"publishConfig": {
|
|
59
|
+
"access": "public",
|
|
60
|
+
"registry": "https://registry.npmjs.org/"
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "tsdown",
|
|
64
|
+
"dev": "tsdown --watch",
|
|
65
|
+
"format": "biome check --write",
|
|
66
|
+
"lint": "biome check",
|
|
67
|
+
"start": "node dist/cli.cjs",
|
|
68
|
+
"test": "vitest run",
|
|
69
|
+
"test:coverage": "vitest run --coverage",
|
|
70
|
+
"test:watch": "vitest"
|
|
71
|
+
}
|
|
72
|
+
}
|