From c9a55d23ae9e7d697c432c1fe589f89429ecb480 Mon Sep 17 00:00:00 2001 From: Brad Cornes Date: Thu, 26 Jan 2023 11:13:12 +0000 Subject: [PATCH 1/4] Don't watch beyond workspace root --- .../tailwindcss-language-server/src/server.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/tailwindcss-language-server/src/server.ts b/packages/tailwindcss-language-server/src/server.ts index 99bb9894..dd3b138c 100644 --- a/packages/tailwindcss-language-server/src/server.ts +++ b/packages/tailwindcss-language-server/src/server.ts @@ -346,7 +346,7 @@ function changeAffectsFile(change: string, files: string[]): boolean { // We need to add parent directories to the watcher: // https://github.com/microsoft/vscode/issues/60813 -function getWatchPatternsForFile(file: string): string[] { +function getWatchPatternsForFile(file: string, root: string): string[] { let tmp: string let dir = path.dirname(file) let patterns: string[] = [file, dir] @@ -356,6 +356,9 @@ function getWatchPatternsForFile(file: string): string[] { break } else { patterns.push(dir) + if (dir === root) { + break + } } } return patterns @@ -426,8 +429,8 @@ async function createProjectService( deps = getModuleDependencies(projectConfig.configPath) } catch {} watchPatterns([ - ...getWatchPatternsForFile(projectConfig.configPath), - ...deps.flatMap((dep) => getWatchPatternsForFile(dep)), + ...getWatchPatternsForFile(projectConfig.configPath, projectConfig.folder), + ...deps.flatMap((dep) => getWatchPatternsForFile(dep, projectConfig.folder)), ]) } @@ -550,7 +553,7 @@ async function createProjectService( throw new SilentError('No config file found.') } - watchPatterns(getWatchPatternsForFile(configPath)) + watchPatterns(getWatchPatternsForFile(configPath, projectConfig.folder)) const pnpPath = findUp.sync( (dir) => { @@ -1044,7 +1047,11 @@ async function createProjectService( // } state.dependencies = getModuleDependencies(state.configPath) // chokidarWatcher?.add(state.dependencies) - watchPatterns((state.dependencies ?? []).flatMap((dep) => getWatchPatternsForFile(dep))) + watchPatterns( + (state.dependencies ?? []).flatMap((dep) => + getWatchPatternsForFile(dep, projectConfig.folder) + ) + ) state.configId = getConfigId(state.configPath, state.dependencies) From 4f17845e036867959bbf6cd1ea9801a44ed17ed6 Mon Sep 17 00:00:00 2001 From: Brad Cornes Date: Thu, 26 Jan 2023 11:14:18 +0000 Subject: [PATCH 2/4] Catch errors when adding paths to chokidar watcher --- packages/tailwindcss-language-server/src/server.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/tailwindcss-language-server/src/server.ts b/packages/tailwindcss-language-server/src/server.ts index dd3b138c..54e12de7 100644 --- a/packages/tailwindcss-language-server/src/server.ts +++ b/packages/tailwindcss-language-server/src/server.ts @@ -1947,7 +1947,11 @@ class TW { let newPatterns = this.filterNewWatchPatterns(patterns) if (newPatterns.length) { console.log(`[Global] Adding watch patterns: ${newPatterns.join(', ')}`) - chokidarWatcher.add(newPatterns) + for (let newPattern of newPatterns) { + try { + chokidarWatcher.add(newPattern) + } catch {} + } } } } From 6b26e5ce25e58147917e3ca3e3c38e83c7d13125 Mon Sep 17 00:00:00 2001 From: Brad Cornes Date: Thu, 26 Jan 2023 18:34:40 +0000 Subject: [PATCH 3/4] Normalize paths --- .../tailwindcss-language-server/src/server.ts | 17 ++++++++++------- .../src/util/getModuleDependencies.ts | 2 ++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/tailwindcss-language-server/src/server.ts b/packages/tailwindcss-language-server/src/server.ts index 54e12de7..5fda30eb 100644 --- a/packages/tailwindcss-language-server/src/server.ts +++ b/packages/tailwindcss-language-server/src/server.ts @@ -350,6 +350,9 @@ function getWatchPatternsForFile(file: string, root: string): string[] { let tmp: string let dir = path.dirname(file) let patterns: string[] = [file, dir] + if (dir === root) { + return patterns + } while (true) { dir = path.dirname((tmp = dir)) if (tmp === dir) { @@ -448,7 +451,7 @@ async function createProjectService( let file = normalizePath(change.file) let isConfigFile = changeAffectsFile(file, [projectConfig.configPath]) - let isDependency = changeAffectsFile(change.file, state.dependencies ?? []) + let isDependency = changeAffectsFile(file, state.dependencies ?? []) let isPackageFile = minimatch(file, `**/${PACKAGE_LOCK_GLOB}`, { dot: true }) if (!isConfigFile && !isDependency && !isPackageFile) continue @@ -565,7 +568,7 @@ async function createProjectService( if (findUp.sync.exists(pnpFile)) { return pnpFile } - if (dir === folder) { + if (dir === path.normalize(folder)) { return findUp.stop } }, @@ -1512,7 +1515,7 @@ async function getConfigFileFromCssFile(cssFile: string): Promise if (!match) { return null } - return path.resolve(path.dirname(cssFile), match.groups.config.slice(1, -1)) + return normalizePath(path.resolve(path.dirname(cssFile), match.groups.config.slice(1, -1))) } function getPackageRoot(cwd: string, rootDir: string) { @@ -1523,7 +1526,7 @@ function getPackageRoot(cwd: string, rootDir: string) { if (findUp.sync.exists(pkgJson)) { return pkgJson } - if (dir === rootDir) { + if (dir === path.normalize(rootDir)) { return findUp.stop } }, @@ -1603,7 +1606,7 @@ class TW { let ignore = globalSettings.tailwindCSS.files.exclude let configFileOrFiles = globalSettings.tailwindCSS.experimental.configFile - let base = normalizeFileNameToFsPath(this.initializeParams.rootPath) + let base = normalizePath(normalizeFileNameToFsPath(this.initializeParams.rootPath)) let cssFileConfigMap: Map = new Map() let configTailwindVersionMap: Map = new Map() @@ -1637,10 +1640,10 @@ class TW { ([relativeConfigPath, relativeDocumentSelectorOrSelectors]) => { return { folder: base, - configPath: path.resolve(userDefinedConfigBase, relativeConfigPath), + configPath: normalizePath(path.resolve(userDefinedConfigBase, relativeConfigPath)), documentSelector: [].concat(relativeDocumentSelectorOrSelectors).map((selector) => ({ priority: DocumentSelectorPriority.USER_CONFIGURED, - pattern: path.resolve(userDefinedConfigBase, selector), + pattern: normalizePath(path.resolve(userDefinedConfigBase, selector)), })), isUserConfigured: true, } diff --git a/packages/tailwindcss-language-server/src/util/getModuleDependencies.ts b/packages/tailwindcss-language-server/src/util/getModuleDependencies.ts index feae51c6..84de7f88 100644 --- a/packages/tailwindcss-language-server/src/util/getModuleDependencies.ts +++ b/packages/tailwindcss-language-server/src/util/getModuleDependencies.ts @@ -2,11 +2,13 @@ import fs from 'fs' import path from 'path' import resolve from 'resolve' import detective from 'detective' +import normalizePath from 'normalize-path' export function getModuleDependencies(modulePath: string): string[] { return _getModuleDependencies(modulePath) .map(({ file }) => file) .filter((file) => file !== modulePath) + .map((file) => normalizePath(file)) } function createModule(file) { From a527578c9b1fa054a72d6360085b24d67c1b3de4 Mon Sep 17 00:00:00 2001 From: Brad Cornes Date: Fri, 27 Jan 2023 10:38:36 +0000 Subject: [PATCH 4/4] wip --- packages/tailwindcss-language-server/src/server.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/tailwindcss-language-server/src/server.ts b/packages/tailwindcss-language-server/src/server.ts index 5fda30eb..01bf6c31 100644 --- a/packages/tailwindcss-language-server/src/server.ts +++ b/packages/tailwindcss-language-server/src/server.ts @@ -1950,11 +1950,7 @@ class TW { let newPatterns = this.filterNewWatchPatterns(patterns) if (newPatterns.length) { console.log(`[Global] Adding watch patterns: ${newPatterns.join(', ')}`) - for (let newPattern of newPatterns) { - try { - chokidarWatcher.add(newPattern) - } catch {} - } + chokidarWatcher.add(newPatterns) } } }