From 29392021f4af38dd5b1a7e4e64c315c8ce3ea185 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Tue, 8 Apr 2025 23:11:03 -0400 Subject: [PATCH 1/5] Refactor --- packages/tailwindcss-language-server/src/project-locator.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/tailwindcss-language-server/src/project-locator.ts b/packages/tailwindcss-language-server/src/project-locator.ts index de562b63..5421f9a3 100644 --- a/packages/tailwindcss-language-server/src/project-locator.ts +++ b/packages/tailwindcss-language-server/src/project-locator.ts @@ -274,11 +274,13 @@ export class ProjectLocator { } private async findConfigs(): Promise { + let ignore = this.settings.tailwindCSS.files.exclude + // Look for config files and CSS files let files = await glob({ patterns: [`**/${CONFIG_GLOB}`, `**/${CSS_GLOB}`], cwd: this.base, - ignore: this.settings.tailwindCSS.files.exclude, + ignore, onlyFiles: true, absolute: true, followSymbolicLinks: true, From 17ac609cf8f70eaf56503cc16dd51166ed2c81ce Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Tue, 8 Apr 2025 23:24:50 -0400 Subject: [PATCH 2/5] Fix type error --- .../tailwindcss-language-server/src/project-locator.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tailwindcss-language-server/src/project-locator.test.ts b/packages/tailwindcss-language-server/src/project-locator.test.ts index f43479ae..51338569 100644 --- a/packages/tailwindcss-language-server/src/project-locator.test.ts +++ b/packages/tailwindcss-language-server/src/project-locator.test.ts @@ -502,7 +502,7 @@ function testLocator({ }) } -async function prepare({ root }: TestUtils) { +async function prepare({ root }: TestUtils) { let defaultSettings = { tailwindCSS: { files: { From 0ab7a1007c44585ce5a77bc3efa727ab6c6cb6c8 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Tue, 8 Apr 2025 23:24:51 -0400 Subject: [PATCH 3/5] Add test for file exclusions starting with `/` --- .../src/project-locator.test.ts | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/packages/tailwindcss-language-server/src/project-locator.test.ts b/packages/tailwindcss-language-server/src/project-locator.test.ts index 51338569..3d5cddbb 100644 --- a/packages/tailwindcss-language-server/src/project-locator.test.ts +++ b/packages/tailwindcss-language-server/src/project-locator.test.ts @@ -462,6 +462,43 @@ testLocator({ ], }) +testLocator({ + name: 'File exclusions starting with `/` do not cause traversal to loop forever', + fs: { + 'index.css': css` + @import 'tailwindcss'; + `, + 'vendor/a.css': css` + @import 'tailwindcss'; + `, + 'vendor/nested/b.css': css` + @import 'tailwindcss'; + `, + 'src/vendor/c.css': css` + @import 'tailwindcss'; + `, + }, + settings: { + tailwindCSS: { + files: { + exclude: ['/vendor'], + }, + } as Settings['tailwindCSS'], + }, + expected: [ + { + version: '4.1.1 (bundled)', + config: '/index.css', + content: [], + }, + { + version: '4.1.1 (bundled)', + config: '/src/vendor/c.css', + content: [], + }, + ], +}) + // --- function testLocator({ From cd73a0440006f7c68b1e360b568edd321ba27341 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Tue, 8 Apr 2025 23:24:59 -0400 Subject: [PATCH 4/5] Workaround `fdir` bug --- .../tailwindcss-language-server/src/project-locator.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/tailwindcss-language-server/src/project-locator.ts b/packages/tailwindcss-language-server/src/project-locator.ts index 5421f9a3..4e3c0453 100644 --- a/packages/tailwindcss-language-server/src/project-locator.ts +++ b/packages/tailwindcss-language-server/src/project-locator.ts @@ -276,6 +276,15 @@ export class ProjectLocator { private async findConfigs(): Promise { let ignore = this.settings.tailwindCSS.files.exclude + // NOTE: This is a temporary workaround for a bug in the `fdir` package used + // by `tinyglobby`. It infinite loops when the ignore pattern starts with + // a `/`. This should be removed once the bug is fixed. + ignore = ignore.map((pattern) => { + if (!pattern.startsWith('/')) return pattern + + return pattern.slice(1) + }) + // Look for config files and CSS files let files = await glob({ patterns: [`**/${CONFIG_GLOB}`, `**/${CSS_GLOB}`], From 11dbbc6be8c6995b5310f7877f2fc257bbf31a9e Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Tue, 8 Apr 2025 23:31:49 -0400 Subject: [PATCH 5/5] Update changelog --- packages/vscode-tailwindcss/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vscode-tailwindcss/CHANGELOG.md b/packages/vscode-tailwindcss/CHANGELOG.md index fa0302ae..e9a9bbde 100644 --- a/packages/vscode-tailwindcss/CHANGELOG.md +++ b/packages/vscode-tailwindcss/CHANGELOG.md @@ -2,7 +2,7 @@ ## Prerelease -- Nothing yet! +- Prevent infinite loop when any file exclusion starts with `/` ([#1307](https://github.com/tailwindlabs/tailwindcss-intellisense/pull/1307)) # 0.14.14