Skip to content

Commit

Permalink
Only watch directories up to workspace root (#709)
Browse files Browse the repository at this point in the history
* Don't watch beyond workspace root

* Catch errors when adding paths to chokidar watcher

* Normalize paths

* wip
  • Loading branch information
bradlc committed Jan 27, 2023
1 parent 7fdf6c4 commit 8c152bd
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 11 deletions.
32 changes: 21 additions & 11 deletions packages/tailwindcss-language-server/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -346,16 +346,22 @@ 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]
if (dir === root) {
return patterns
}
while (true) {
dir = path.dirname((tmp = dir))
if (tmp === dir) {
break
} else {
patterns.push(dir)
if (dir === root) {
break
}
}
}
return patterns
Expand Down Expand Up @@ -440,8 +446,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)),
])
}

Expand All @@ -459,7 +465,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
Expand Down Expand Up @@ -564,7 +570,7 @@ async function createProjectService(
throw new SilentError('No config file found.')
}

watchPatterns(getWatchPatternsForFile(configPath))
watchPatterns(getWatchPatternsForFile(configPath, projectConfig.folder))

const pnpPath = findUp.sync(
(dir) => {
Expand All @@ -576,7 +582,7 @@ async function createProjectService(
if (findUp.sync.exists(pnpFile)) {
return pnpFile
}
if (dir === folder) {
if (dir === path.normalize(folder)) {
return findUp.stop
}
},
Expand Down Expand Up @@ -1062,7 +1068,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)

Expand Down Expand Up @@ -1515,7 +1525,7 @@ async function getConfigFileFromCssFile(cssFile: string): Promise<string | null>
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) {
Expand All @@ -1526,7 +1536,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
}
},
Expand Down Expand Up @@ -1606,7 +1616,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<string, string> = new Map()
let configTailwindVersionMap: Map<string, string> = new Map()

Expand Down Expand Up @@ -1640,7 +1650,7 @@ 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: normalizePath(path.resolve(userDefinedConfigBase, selector)),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 8c152bd

Please sign in to comment.