From 42b623a3b22ba9afbe126066fdcd9de224d77fd1 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Thu, 27 Mar 2025 15:19:36 -0400 Subject: [PATCH 1/4] fix --- packages/tailwindcss-language-server/src/project-locator.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tailwindcss-language-server/src/project-locator.ts b/packages/tailwindcss-language-server/src/project-locator.ts index c75ae1dee..e994e4608 100644 --- a/packages/tailwindcss-language-server/src/project-locator.ts +++ b/packages/tailwindcss-language-server/src/project-locator.ts @@ -639,6 +639,7 @@ async function* detectContentFiles( sources: sources.map((pattern) => ({ base: path.dirname(inputFile), pattern, + negated: false, })), }) From bc215c2092282c31a76fa463bf33e4d0e758f89d Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Thu, 27 Mar 2025 15:19:59 -0400 Subject: [PATCH 2/4] Refactor --- .../src/css/extract-source-directives.ts | 11 +++++++++-- .../src/project-locator.ts | 15 ++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/tailwindcss-language-server/src/css/extract-source-directives.ts b/packages/tailwindcss-language-server/src/css/extract-source-directives.ts index 9de33a9b3..42d1d3c89 100644 --- a/packages/tailwindcss-language-server/src/css/extract-source-directives.ts +++ b/packages/tailwindcss-language-server/src/css/extract-source-directives.ts @@ -1,12 +1,19 @@ import type { Plugin } from 'postcss' +import type { SourcePattern } from '../project-locator' -export function extractSourceDirectives(sources: string[]): Plugin { +export function extractSourceDirectives(sources: SourcePattern[]): Plugin { return { postcssPlugin: 'extract-at-rules', AtRule: { source: ({ params }) => { + let negated = false + if (params[0] !== '"' && params[0] !== "'") return - sources.push(params.slice(1, -1)) + + sources.push({ + pattern: params.slice(1, -1), + negated, + }) }, }, } diff --git a/packages/tailwindcss-language-server/src/project-locator.ts b/packages/tailwindcss-language-server/src/project-locator.ts index e994e4608..c04738bf8 100644 --- a/packages/tailwindcss-language-server/src/project-locator.ts +++ b/packages/tailwindcss-language-server/src/project-locator.ts @@ -623,7 +623,7 @@ async function* contentSelectorsFromCssConfig( async function* detectContentFiles( base: string, inputFile: string, - sources: string[], + sources: SourcePattern[], resolver: Resolver, ): AsyncIterable { try { @@ -636,10 +636,10 @@ async function* detectContentFiles( oxidePath, oxideVersion: oxidePackageJson.version, basePath: base, - sources: sources.map((pattern) => ({ + sources: sources.map((source) => ({ base: path.dirname(inputFile), - pattern, - negated: false, + pattern: source.pattern, + negated: source.negated, })), }) @@ -673,11 +673,16 @@ type ConfigEntry = { content: ContentItem[] } +export interface SourcePattern { + pattern: string + negated: boolean +} + class FileEntry { content: string | null deps: FileEntry[] = [] realpath: string | null - sources: string[] = [] + sources: SourcePattern[] = [] meta: TailwindStylesheet | null = null constructor( From 537b23d9106c53e5528ab16b93b765b2c88db5d2 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Thu, 27 Mar 2025 15:21:12 -0400 Subject: [PATCH 3/4] Handle `@source not` when processing `@source` directives --- .../src/css/extract-source-directives.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/tailwindcss-language-server/src/css/extract-source-directives.ts b/packages/tailwindcss-language-server/src/css/extract-source-directives.ts index 42d1d3c89..a97e35594 100644 --- a/packages/tailwindcss-language-server/src/css/extract-source-directives.ts +++ b/packages/tailwindcss-language-server/src/css/extract-source-directives.ts @@ -6,7 +6,9 @@ export function extractSourceDirectives(sources: SourcePattern[]): Plugin { postcssPlugin: 'extract-at-rules', AtRule: { source: ({ params }) => { - let negated = false + let negated = /^not\s+/.test(params) + + if (negated) params = params.slice(4).trimStart() if (params[0] !== '"' && params[0] !== "'") return From fb6f8b07a2ff1f51108720bc589fcef60e0b502a Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Thu, 27 Mar 2025 15:30:49 -0400 Subject: [PATCH 4/4] Add test for negative sources --- .../src/project-locator.test.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/packages/tailwindcss-language-server/src/project-locator.test.ts b/packages/tailwindcss-language-server/src/project-locator.test.ts index ae3598e5b..429f0b27b 100644 --- a/packages/tailwindcss-language-server/src/project-locator.test.ts +++ b/packages/tailwindcss-language-server/src/project-locator.test.ts @@ -265,6 +265,40 @@ testLocator({ ], }) +testLocator({ + // TODO: Enable once v4.1 is released + options: { skip: true }, + name: 'automatic content detection with negative custom sources', + fs: { + 'package.json': json` + { + "dependencies": { + "tailwindcss": "0.0.0-insiders.3e53e25", + "@tailwindcss/oxide": "0.0.0-insiders.3e53e25" + } + } + `, + 'src/app.css': css` + @import 'tailwindcss'; + @source './**/*.html'; + @source not './ignored.html'; + `, + 'src/index.html': html`
`, + 'src/ignored.html': html`
`, + }, + expected: [ + { + config: '/src/app.css', + content: [ + '/*', + '/package.json', + '/src/index.html', + '/src/{**/*.html,**/*.{aspx,astro,cjs,cts,eex,erb,gjs,gts,haml,handlebars,hbs,heex,html,jade,js,json,jsx,liquid,md,mdx,mjs,mts,mustache,njk,nunjucks,php,pug,py,razor,rb,rhtml,rs,slim,svelte,tpl,ts,tsx,twig,vue}}', + ], + }, + ], +}) + testFixture('v4/missing-files', [ // {