diff --git a/packages/tailwindcss-language-server/src/server.ts b/packages/tailwindcss-language-server/src/server.ts index 463b3639274bdd51cad3d85e985a347296370a9e..809c79d62601bebcdd608f705dbb9bb52f58af18 100644 --- a/packages/tailwindcss-language-server/src/server.ts +++ b/packages/tailwindcss-language-server/src/server.ts @@ -23,8 +23,6 @@ BulkRegistration, CodeActionRequest, BulkUnregistration, HoverRequest, - DidChangeWatchedFilesNotification, - FileChangeType, } from 'vscode-languageserver/node' import { TextDocument } from 'vscode-languageserver-textdocument' import { URI } from 'vscode-uri' @@ -34,7 +32,7 @@ import normalizePath from 'normalize-path' import * as path from 'path' import * as os from 'os' import * as fs from 'fs' -import chokidar, { FSWatcher } from 'chokidar' +import chokidar from 'chokidar' import findUp from 'find-up' import minimatch from 'minimatch' import resolveFrom, { setPnpApi } from './util/resolveFrom' @@ -208,87 +206,47 @@ const documentSettingsCache: Map = new Map() let registrations: Promise - let watcher: FSWatcher - - function onFileEvents(changes: Array<{ file: string; type: FileChangeType }>): void { - let needsInit = false - let needsRebuild = false - - for (let change of changes) { - let file = normalizePath(change.file) - - if (change.type === FileChangeType.Created) { - needsInit = true - break - } else if (change.type === FileChangeType.Changed) { - if (!state.enabled || minimatch(file, '**/package.json')) { - needsInit = true - break - } else { - needsRebuild = true - } - } else if (change.type === FileChangeType.Deleted) { - if ( - !state.enabled || - minimatch(file, '**/package.json') || - minimatch(file, `**/${CONFIG_FILE_GLOB}`) - ) { - needsInit = true - break - } else { - needsRebuild = true - } - } + const watcher = chokidar.watch( + [normalizePath(`${folder}/**/${CONFIG_FILE_GLOB}`), normalizePath(`${folder}/**/package.json`)], + { + ignorePermissionErrors: true, + ignoreInitial: true, + ignored: ['**/node_modules/**'], + awaitWriteFinish: { + stabilityThreshold: 100, + pollInterval: 20, + }, } + ) - if (needsInit) { - tryInit() - } else if (needsRebuild) { - tryRebuild() - } - } + await new Promise((resolve) => { + watcher.on('ready', () => resolve()) + }) - if (params.capabilities.workspace?.didChangeWatchedFiles?.dynamicRegistration) { - connection.onDidChangeWatchedFiles(({ changes }) => { - onFileEvents( - changes.map(({ uri, type }) => ({ - file: URI.parse(uri).fsPath, - type, - })) - ) + watcher + .on('add', () => { + tryInit() }) - - connection.client.register(DidChangeWatchedFilesNotification.type, { - watchers: [{ globPattern: `**/${CONFIG_FILE_GLOB}` }, { globPattern: '**/package.json' }], + .on('unlink', (file) => { + if ( + !state.enabled || + minimatch(file, '**/package.json') || + minimatch(file, `**/${CONFIG_FILE_GLOB}`) + ) { + tryInit() + } else { + tryRebuild() + } }) - } else { - watcher = chokidar.watch( - [ - normalizePath(`${folder}/**/${CONFIG_FILE_GLOB}`), - normalizePath(`${folder}/**/package.json`), - ], - { - ignorePermissionErrors: true, - ignoreInitial: true, - ignored: ['**/node_modules/**'], - awaitWriteFinish: { - stabilityThreshold: 100, - pollInterval: 20, - }, + .on('change', (file) => { + if (!state.enabled || minimatch(file, '**/package.json')) { + tryInit() + } else { + tryRebuild() } - ) - - await new Promise((resolve) => { - watcher.on('ready', () => resolve()) }) - watcher - .on('add', (file) => onFileEvents([{ file, type: FileChangeType.Created }])) - .on('change', (file) => onFileEvents([{ file, type: FileChangeType.Changed }])) - .on('unlink', (file) => onFileEvents([{ file, type: FileChangeType.Deleted }])) - } - - function registerCapabilities(watchFiles?: string[]): void { + function registerCapabilities(): void { if (supportsDynamicRegistration(connection, params)) { if (registrations) { registrations.then((r) => r.dispose()) @@ -310,11 +268,6 @@ documentSelector: null, resolveProvider: true, triggerCharacters: [...TRIGGER_CHARACTERS, state.separator], }) - if (watchFiles) { - capabilities.add(DidChangeWatchedFilesNotification.type, { - watchers: watchFiles.map((file) => ({ globPattern: file })), - }) - } registrations = connection.client.register(capabilities) } @@ -813,10 +766,10 @@ hook.unhook() } if (state.dependencies) { - watcher?.unwatch(state.dependencies) + watcher.unwatch(state.dependencies) } state.dependencies = getModuleDependencies(state.configPath) - watcher?.add(state.dependencies) + watcher.add(state.dependencies) state.configId = getConfigId(state.configPath, state.dependencies) @@ -831,7 +784,7 @@ state.enabled = true updateAllDiagnostics(state) - registerCapabilities(state.dependencies) + registerCapabilities() } return { @@ -843,7 +796,7 @@ if (state.enabled) { updateAllDiagnostics(state) } if (settings.editor.colorDecorators) { - registerCapabilities(state.dependencies) + registerCapabilities() } else { connection.sendNotification('@/tailwindCSS/clearColors') }