From a5becfbf73a80b86fcbac4029cebbad35b8f03e2 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 13 Feb 2026 14:55:25 +0800 Subject: [PATCH 1/9] refactor: rename `registerDiagnosticCollection` to `useDiagnostics` composable --- src/index.ts | 4 ++-- src/providers/diagnostics/index.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 048a7d3..eea00e6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,7 +14,7 @@ import { PnpmWorkspaceYamlExtractor } from './extractors/pnpm-workspace-yaml' import { commands, displayName, version } from './generated-meta' import { UpgradeProvider } from './providers/code-actions/upgrade' import { VersionCompletionItemProvider } from './providers/completion-item/version' -import { registerDiagnosticCollection } from './providers/diagnostics' +import { useDiagnostics } from './providers/diagnostics' import { NpmxHoverProvider } from './providers/hover/npmx' import { config, logger } from './state' @@ -76,7 +76,7 @@ export const { activate, deactivate } = defineExtension(() => { onCleanup(() => disposable.dispose()) }) - registerDiagnosticCollection({ + useDiagnostics({ [PACKAGE_JSON_BASENAME]: packageJsonExtractor, [PNPM_WORKSPACE_BASENAME]: pnpmWorkspaceYamlExtractor, }) diff --git a/src/providers/diagnostics/index.ts b/src/providers/diagnostics/index.ts index 629d6b4..474d75e 100644 --- a/src/providers/diagnostics/index.ts +++ b/src/providers/diagnostics/index.ts @@ -5,7 +5,7 @@ import type { Diagnostic, TextDocument } from 'vscode' import { config, logger } from '#state' import { getPackageInfo } from '#utils/api/package' import { debounce } from 'perfect-debounce' -import { computed, useActiveTextEditor, useDocumentText, watch } from 'reactive-vscode' +import { computed, useActiveTextEditor, useDisposable, useDocumentText, watch } from 'reactive-vscode' import { languages } from 'vscode' import { Utils } from 'vscode-uri' import { displayName } from '../../generated-meta' @@ -32,8 +32,8 @@ const enabledRules = computed(() => { return rules }) -export function registerDiagnosticCollection(mapping: Record) { - const diagnosticCollection = languages.createDiagnosticCollection(displayName) +export function useDiagnostics(mapping: Record) { + const diagnosticCollection = useDisposable(languages.createDiagnosticCollection(displayName)) const activeEditor = useActiveTextEditor() const activeDocumentText = useDocumentText(() => activeEditor.value?.document) From a253cea206457042343cd624397676fc3519ca90 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 13 Feb 2026 15:09:07 +0800 Subject: [PATCH 2/9] refactor: extract `useActiveExtractor` --- src/composables/active-extractor.ts | 22 ++++++++++++ src/index.ts | 7 +--- src/providers/diagnostics/index.ts | 55 +++++++++++++---------------- tsconfig.json | 3 +- 4 files changed, 50 insertions(+), 37 deletions(-) create mode 100644 src/composables/active-extractor.ts diff --git a/src/composables/active-extractor.ts b/src/composables/active-extractor.ts new file mode 100644 index 0000000..08c319f --- /dev/null +++ b/src/composables/active-extractor.ts @@ -0,0 +1,22 @@ +import type { Extractor } from '#types/extractor' +import { PACKAGE_JSON_BASENAME, PNPM_WORKSPACE_BASENAME } from '#constants' +import { computed, useActiveTextEditor } from 'reactive-vscode' +import { Utils } from 'vscode-uri' +import { PackageJsonExtractor } from '../extractors/package-json' +import { PnpmWorkspaceYamlExtractor } from '../extractors/pnpm-workspace-yaml' + +const extractorMapping: Record = { + [PACKAGE_JSON_BASENAME]: new PackageJsonExtractor(), + [PNPM_WORKSPACE_BASENAME]: new PnpmWorkspaceYamlExtractor(), +} + +export function useActiveExtractor() { + const activeEditor = useActiveTextEditor() + + return computed(() => { + const editor = activeEditor.value + if (!editor) + return + return extractorMapping[Utils.basename(editor.document.uri)] + }) +} diff --git a/src/index.ts b/src/index.ts index eea00e6..36d5e27 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,5 @@ import { - PACKAGE_JSON_BASENAME, PACKAGE_JSON_PATTERN, - PNPM_WORKSPACE_BASENAME, PNPM_WORKSPACE_PATTERN, VERSION_TRIGGER_CHARACTERS, } from '#constants' @@ -76,10 +74,7 @@ export const { activate, deactivate } = defineExtension(() => { onCleanup(() => disposable.dispose()) }) - useDiagnostics({ - [PACKAGE_JSON_BASENAME]: packageJsonExtractor, - [PNPM_WORKSPACE_BASENAME]: pnpmWorkspaceYamlExtractor, - }) + useDiagnostics() useCommands({ [commands.openInBrowser]: openInBrowser, diff --git a/src/providers/diagnostics/index.ts b/src/providers/diagnostics/index.ts index 474d75e..3a79e1c 100644 --- a/src/providers/diagnostics/index.ts +++ b/src/providers/diagnostics/index.ts @@ -1,13 +1,13 @@ -import type { DependencyInfo, Extractor, ValidNode } from '#types/extractor' +import type { DependencyInfo, ValidNode } from '#types/extractor' import type { PackageInfo } from '#utils/api/package' import type { Awaitable } from 'reactive-vscode' -import type { Diagnostic, TextDocument } from 'vscode' +import type { Diagnostic } from 'vscode' +import { useActiveExtractor } from '#composables/active-extractor' import { config, logger } from '#state' import { getPackageInfo } from '#utils/api/package' import { debounce } from 'perfect-debounce' import { computed, useActiveTextEditor, useDisposable, useDocumentText, watch } from 'reactive-vscode' import { languages } from 'vscode' -import { Utils } from 'vscode-uri' import { displayName } from '../../generated-meta' import { checkDeprecation } from './rules/deprecation' import { checkReplacement } from './rules/replacement' @@ -19,26 +19,32 @@ export interface NodeDiagnosticInfo extends Omit } export type DiagnosticRule = (dep: DependencyInfo, pkg: PackageInfo) => Awaitable -const enabledRules = computed(() => { - const rules: DiagnosticRule[] = [] - if (config.diagnostics.upgrade) - rules.push(checkUpgrade) - if (config.diagnostics.deprecation) - rules.push(checkDeprecation) - if (config.diagnostics.replacement) - rules.push(checkReplacement) - if (config.diagnostics.vulnerability) - rules.push(checkVulnerability) - return rules -}) - -export function useDiagnostics(mapping: Record) { +export function useDiagnostics() { const diagnosticCollection = useDisposable(languages.createDiagnosticCollection(displayName)) const activeEditor = useActiveTextEditor() const activeDocumentText = useDocumentText(() => activeEditor.value?.document) + const activeExtractor = useActiveExtractor() + + const enabledRules = computed(() => { + const rules: DiagnosticRule[] = [] + if (config.diagnostics.upgrade) + rules.push(checkUpgrade) + if (config.diagnostics.deprecation) + rules.push(checkDeprecation) + if (config.diagnostics.replacement) + rules.push(checkReplacement) + if (config.diagnostics.vulnerability) + rules.push(checkVulnerability) + return rules + }) + + async function collectDiagnostics() { + const extractor = activeExtractor.value + const document = activeEditor.value?.document + if (!extractor || !document) + return - async function collectDiagnostics(document: TextDocument, extractor: Extractor) { diagnosticCollection.delete(document.uri) const root = extractor.parse(document) @@ -77,16 +83,5 @@ export function useDiagnostics(mapping: Record) { }) } - watch(activeDocumentText, async () => { - const editor = activeEditor.value - if (!editor) - return - - const document = editor.document - const filename = Utils.basename(document.uri) - const extractor = mapping[filename] - - if (extractor) - await collectDiagnostics(document, extractor) - }, { immediate: true }) + watch(activeDocumentText, collectDiagnostics, { immediate: true }) } diff --git a/tsconfig.json b/tsconfig.json index cb7dbef..b40ea2d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,7 +8,8 @@ "#constants": ["./src/constants.ts"], "#state": ["./src/state.ts"], "#types/*": ["./src/types/*"], - "#utils/*": ["./src/utils/*"] + "#utils/*": ["./src/utils/*"], + "#composables/*": ["./src/composables/*"] }, "resolveJsonModule": true, "strict": true, From 7b8a25a7ede9f3806e9c168939488bcd2e24e6bb Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 13 Feb 2026 16:05:10 +0800 Subject: [PATCH 3/9] wip: ensure extractor singleton --- .vscode/settings.json | 5 +++++ src/composables/active-extractor.ts | 2 +- src/index.ts | 9 +++++---- 3 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1e493df --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "cSpell.words": [ + "npmx" + ] +} diff --git a/src/composables/active-extractor.ts b/src/composables/active-extractor.ts index 08c319f..77c714f 100644 --- a/src/composables/active-extractor.ts +++ b/src/composables/active-extractor.ts @@ -5,7 +5,7 @@ import { Utils } from 'vscode-uri' import { PackageJsonExtractor } from '../extractors/package-json' import { PnpmWorkspaceYamlExtractor } from '../extractors/pnpm-workspace-yaml' -const extractorMapping: Record = { +export const extractorMapping: Record = { [PACKAGE_JSON_BASENAME]: new PackageJsonExtractor(), [PNPM_WORKSPACE_BASENAME]: new PnpmWorkspaceYamlExtractor(), } diff --git a/src/index.ts b/src/index.ts index 36d5e27..010179d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,8 @@ +import { extractorMapping } from '#composables/active-extractor' import { + PACKAGE_JSON_BASENAME, PACKAGE_JSON_PATTERN, + PNPM_WORKSPACE_BASENAME, PNPM_WORKSPACE_PATTERN, VERSION_TRIGGER_CHARACTERS, } from '#constants' @@ -7,8 +10,6 @@ import { defineExtension, useCommands, watchEffect } from 'reactive-vscode' import { CodeActionKind, Disposable, languages } from 'vscode' import { openFileInNpmx } from './commands/open-file-in-npmx' import { openInBrowser } from './commands/open-in-browser' -import { PackageJsonExtractor } from './extractors/package-json' -import { PnpmWorkspaceYamlExtractor } from './extractors/pnpm-workspace-yaml' import { commands, displayName, version } from './generated-meta' import { UpgradeProvider } from './providers/code-actions/upgrade' import { VersionCompletionItemProvider } from './providers/completion-item/version' @@ -19,8 +20,8 @@ import { config, logger } from './state' export const { activate, deactivate } = defineExtension(() => { logger.info(`${displayName} Activated, v${version}`) - const packageJsonExtractor = new PackageJsonExtractor() - const pnpmWorkspaceYamlExtractor = new PnpmWorkspaceYamlExtractor() + const packageJsonExtractor = extractorMapping[PACKAGE_JSON_BASENAME] + const pnpmWorkspaceYamlExtractor = extractorMapping[PNPM_WORKSPACE_BASENAME] watchEffect((onCleanup) => { if (!config.hover.enabled) From 45b417721ccb29cbd4948789c7afebbce54eaeed Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 13 Feb 2026 16:15:29 +0800 Subject: [PATCH 4/9] refactor: simplify register providers --- src/composables/active-extractor.ts | 5 +++- src/constants.ts | 3 -- src/index.ts | 46 ++++++++--------------------- 3 files changed, 16 insertions(+), 38 deletions(-) diff --git a/src/composables/active-extractor.ts b/src/composables/active-extractor.ts index 77c714f..54d7bf3 100644 --- a/src/composables/active-extractor.ts +++ b/src/composables/active-extractor.ts @@ -5,11 +5,14 @@ import { Utils } from 'vscode-uri' import { PackageJsonExtractor } from '../extractors/package-json' import { PnpmWorkspaceYamlExtractor } from '../extractors/pnpm-workspace-yaml' -export const extractorMapping: Record = { +const extractorMapping: Record = { [PACKAGE_JSON_BASENAME]: new PackageJsonExtractor(), [PNPM_WORKSPACE_BASENAME]: new PnpmWorkspaceYamlExtractor(), } +export const extractorEntries = Object.entries(extractorMapping) + .map(([basename, extractor]) => ({ basename, pattern: `**/${basename}`, extractor })) + export function useActiveExtractor() { const activeEditor = useActiveTextEditor() diff --git a/src/constants.ts b/src/constants.ts index 345a2be..663c4ad 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,9 +1,6 @@ export const PACKAGE_JSON_BASENAME = 'package.json' export const PNPM_WORKSPACE_BASENAME = 'pnpm-workspace.yaml' -export const PACKAGE_JSON_PATTERN = `**/${PACKAGE_JSON_BASENAME}` -export const PNPM_WORKSPACE_PATTERN = `**/${PNPM_WORKSPACE_BASENAME}` - export const VERSION_TRIGGER_CHARACTERS = [':', '^', '~', '.', ...Array.from({ length: 10 }).map((_, i) => `${i}`)] export const PRERELEASE_PATTERN = /-.+/ diff --git a/src/index.ts b/src/index.ts index 010179d..d785549 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,5 @@ -import { extractorMapping } from '#composables/active-extractor' -import { - PACKAGE_JSON_BASENAME, - PACKAGE_JSON_PATTERN, - PNPM_WORKSPACE_BASENAME, - PNPM_WORKSPACE_PATTERN, - VERSION_TRIGGER_CHARACTERS, -} from '#constants' +import { extractorEntries } from '#composables/active-extractor' +import { VERSION_TRIGGER_CHARACTERS } from '#constants' import { defineExtension, useCommands, watchEffect } from 'reactive-vscode' import { CodeActionKind, Disposable, languages } from 'vscode' import { openFileInNpmx } from './commands/open-file-in-npmx' @@ -20,23 +14,13 @@ import { config, logger } from './state' export const { activate, deactivate } = defineExtension(() => { logger.info(`${displayName} Activated, v${version}`) - const packageJsonExtractor = extractorMapping[PACKAGE_JSON_BASENAME] - const pnpmWorkspaceYamlExtractor = extractorMapping[PNPM_WORKSPACE_BASENAME] - watchEffect((onCleanup) => { if (!config.hover.enabled) return - const disposables = [ - languages.registerHoverProvider( - { pattern: PACKAGE_JSON_PATTERN }, - new NpmxHoverProvider(packageJsonExtractor), - ), - languages.registerHoverProvider( - { pattern: PNPM_WORKSPACE_PATTERN }, - new NpmxHoverProvider(pnpmWorkspaceYamlExtractor), - ), - ] + const disposables = extractorEntries.map(({ pattern, extractor }) => + languages.registerHoverProvider({ pattern }, new NpmxHoverProvider(extractor)), + ) onCleanup(() => Disposable.from(...disposables).dispose()) }) @@ -45,18 +29,13 @@ export const { activate, deactivate } = defineExtension(() => { if (config.completion.version === 'off') return - const disposables = [ + const disposables = extractorEntries.map(({ pattern, extractor }) => languages.registerCompletionItemProvider( - { pattern: PACKAGE_JSON_PATTERN }, - new VersionCompletionItemProvider(packageJsonExtractor), + { pattern }, + new VersionCompletionItemProvider(extractor), ...VERSION_TRIGGER_CHARACTERS, ), - languages.registerCompletionItemProvider( - { pattern: PNPM_WORKSPACE_PATTERN }, - new VersionCompletionItemProvider(pnpmWorkspaceYamlExtractor), - ...VERSION_TRIGGER_CHARACTERS, - ), - ] + ) onCleanup(() => Disposable.from(...disposables).dispose()) }) @@ -67,12 +46,11 @@ export const { activate, deactivate } = defineExtension(() => { const provider = new UpgradeProvider() const options = { providedCodeActionKinds: [CodeActionKind.QuickFix] } - const disposable = Disposable.from( - languages.registerCodeActionsProvider({ pattern: PACKAGE_JSON_PATTERN }, provider, options), - languages.registerCodeActionsProvider({ pattern: PNPM_WORKSPACE_PATTERN }, provider, options), + const disposables = extractorEntries.map(({ pattern }) => + languages.registerCodeActionsProvider({ pattern }, provider, options), ) - onCleanup(() => disposable.dispose()) + onCleanup(() => Disposable.from(...disposables).dispose()) }) useDiagnostics() From 57ebe91a4f41ae6de9fa74d81cba500f07c176f6 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 13 Feb 2026 16:40:10 +0800 Subject: [PATCH 5/9] refactor: use `languages.match` instead of mapping --- src/composables/active-extractor.ts | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/composables/active-extractor.ts b/src/composables/active-extractor.ts index 54d7bf3..a1b6598 100644 --- a/src/composables/active-extractor.ts +++ b/src/composables/active-extractor.ts @@ -1,25 +1,22 @@ import type { Extractor } from '#types/extractor' import { PACKAGE_JSON_BASENAME, PNPM_WORKSPACE_BASENAME } from '#constants' import { computed, useActiveTextEditor } from 'reactive-vscode' -import { Utils } from 'vscode-uri' +import { languages } from 'vscode' import { PackageJsonExtractor } from '../extractors/package-json' import { PnpmWorkspaceYamlExtractor } from '../extractors/pnpm-workspace-yaml' -const extractorMapping: Record = { - [PACKAGE_JSON_BASENAME]: new PackageJsonExtractor(), - [PNPM_WORKSPACE_BASENAME]: new PnpmWorkspaceYamlExtractor(), -} - -export const extractorEntries = Object.entries(extractorMapping) - .map(([basename, extractor]) => ({ basename, pattern: `**/${basename}`, extractor })) +export const extractorEntries = [ + { pattern: `**/${PACKAGE_JSON_BASENAME}`, extractor: new PackageJsonExtractor() }, + { pattern: `**/${PNPM_WORKSPACE_BASENAME}`, extractor: new PnpmWorkspaceYamlExtractor() }, +] export function useActiveExtractor() { const activeEditor = useActiveTextEditor() - return computed(() => { - const editor = activeEditor.value - if (!editor) + return computed(() => { + const document = activeEditor.value?.document + if (!document) return - return extractorMapping[Utils.basename(editor.document.uri)] + return extractorEntries.find(({ pattern }) => languages.match({ pattern }, document))?.extractor }) } From 7ecf242d7681dffed8d18abbe4944c77ab9e295f Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 13 Feb 2026 17:08:46 +0800 Subject: [PATCH 6/9] perf(diagnostics): check rules are enabled --- src/providers/diagnostics/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/providers/diagnostics/index.ts b/src/providers/diagnostics/index.ts index 3a79e1c..0be71b3 100644 --- a/src/providers/diagnostics/index.ts +++ b/src/providers/diagnostics/index.ts @@ -40,6 +40,9 @@ export function useDiagnostics() { }) async function collectDiagnostics() { + if (enabledRules.value.length === 0) + return + const extractor = activeExtractor.value const document = activeEditor.value?.document if (!extractor || !document) From d724eefff98a40b862aff7c5c2d71695e05efb62 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 13 Feb 2026 17:14:19 +0800 Subject: [PATCH 7/9] update --- src/providers/diagnostics/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/providers/diagnostics/index.ts b/src/providers/diagnostics/index.ts index 0be71b3..92a075d 100644 --- a/src/providers/diagnostics/index.ts +++ b/src/providers/diagnostics/index.ts @@ -40,9 +40,6 @@ export function useDiagnostics() { }) async function collectDiagnostics() { - if (enabledRules.value.length === 0) - return - const extractor = activeExtractor.value const document = activeEditor.value?.document if (!extractor || !document) @@ -50,6 +47,9 @@ export function useDiagnostics() { diagnosticCollection.delete(document.uri) + if (enabledRules.value.length === 0) + return + const root = extractor.parse(document) if (!root) return From 61e59298b0cb9baf6ecdca185fb5ed961694be77 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 13 Feb 2026 17:18:36 +0800 Subject: [PATCH 8/9] update --- src/providers/diagnostics/index.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/providers/diagnostics/index.ts b/src/providers/diagnostics/index.ts index 92a075d..fc58a98 100644 --- a/src/providers/diagnostics/index.ts +++ b/src/providers/diagnostics/index.ts @@ -1,7 +1,7 @@ import type { DependencyInfo, ValidNode } from '#types/extractor' import type { PackageInfo } from '#utils/api/package' import type { Awaitable } from 'reactive-vscode' -import type { Diagnostic } from 'vscode' +import type { Diagnostic, Uri } from 'vscode' import { useActiveExtractor } from '#composables/active-extractor' import { config, logger } from '#state' import { getPackageInfo } from '#utils/api/package' @@ -39,6 +39,10 @@ export function useDiagnostics() { return rules }) + const flush = debounce((uri: Uri, diagnostics: Diagnostic[]) => { + diagnosticCollection.set(uri, [...diagnostics]) + }, 100) + async function collectDiagnostics() { const extractor = activeExtractor.value const document = activeEditor.value?.document @@ -57,10 +61,6 @@ export function useDiagnostics() { const dependencies = extractor.getDependenciesInfo(root) const diagnostics: Diagnostic[] = [] - const flush = debounce(() => { - diagnosticCollection.set(document.uri, [...diagnostics]) - }, 100) - dependencies.forEach(async (dep) => { try { const pkg = await getPackageInfo(dep.name) @@ -77,7 +77,7 @@ export function useDiagnostics() { ...diagnostic, }) - flush() + flush(document.uri, diagnostics) } }) } catch (err) { @@ -86,5 +86,5 @@ export function useDiagnostics() { }) } - watch(activeDocumentText, collectDiagnostics, { immediate: true }) + watch([activeDocumentText, enabledRules], collectDiagnostics, { immediate: true }) } From b4063d3705a0b4c9fc486f1a8c9d01c2840c99b3 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 13 Feb 2026 17:42:39 +0800 Subject: [PATCH 9/9] fix: check document version before flush --- src/providers/diagnostics/index.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/providers/diagnostics/index.ts b/src/providers/diagnostics/index.ts index fc58a98..ad1183c 100644 --- a/src/providers/diagnostics/index.ts +++ b/src/providers/diagnostics/index.ts @@ -1,7 +1,7 @@ import type { DependencyInfo, ValidNode } from '#types/extractor' import type { PackageInfo } from '#utils/api/package' import type { Awaitable } from 'reactive-vscode' -import type { Diagnostic, Uri } from 'vscode' +import type { Diagnostic, TextDocument } from 'vscode' import { useActiveExtractor } from '#composables/active-extractor' import { config, logger } from '#state' import { getPackageInfo } from '#utils/api/package' @@ -23,7 +23,8 @@ export function useDiagnostics() { const diagnosticCollection = useDisposable(languages.createDiagnosticCollection(displayName)) const activeEditor = useActiveTextEditor() - const activeDocumentText = useDocumentText(() => activeEditor.value?.document) + const activeDocument = computed(() => activeEditor.value?.document) + const activeDocumentText = useDocumentText(activeDocument) const activeExtractor = useActiveExtractor() const enabledRules = computed(() => { @@ -39,8 +40,11 @@ export function useDiagnostics() { return rules }) - const flush = debounce((uri: Uri, diagnostics: Diagnostic[]) => { - diagnosticCollection.set(uri, [...diagnostics]) + const flush = debounce((doc: TextDocument, diagnostics: Diagnostic[]) => { + if (doc.version !== activeDocument.value?.version) + return + + diagnosticCollection.set(doc.uri, [...diagnostics]) }, 100) async function collectDiagnostics() { @@ -77,7 +81,7 @@ export function useDiagnostics() { ...diagnostic, }) - flush(document.uri, diagnostics) + flush(document, diagnostics) } }) } catch (err) {