From a2c3ba8df03363f968b10b2536b9842f348998b3 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 27 Aug 2026 23:49:06 +0800 Subject: [PATCH 1/6] refactor(workspace): encapsulate engine lookup --- packages/language-server/src/workspace.ts | 13 +++++++++++++ .../diagnostics/rules/__tests__/utils.ts | 19 +++++++++++++++++-- .../diagnostics/rules/engine-mismatch.test.ts | 19 ++++++++++++++++++- .../diagnostics/rules/engine-mismatch.ts | 10 ++-------- .../installed-package-definition.test.ts | 3 +++ packages/language-service/src/types.ts | 2 ++ 6 files changed, 55 insertions(+), 11 deletions(-) diff --git a/packages/language-server/src/workspace.ts b/packages/language-server/src/workspace.ts index e573dab6..f511a10e 100644 --- a/packages/language-server/src/workspace.ts +++ b/packages/language-server/src/workspace.ts @@ -1,4 +1,5 @@ import type { Connection, LanguageServer } from '@volar/language-server' +import type { Engines } from 'npmx-language-core/types' import type { DependencyInfo, PackageManager, WorkspaceAdapter } from 'npmx-language-core/workspace' import type { ClientFeatures, IWorkspaceState } from 'npmx-language-service/types' import { access, realpath as fsRealpath, readFile } from 'node:fs/promises' @@ -171,6 +172,18 @@ export class WorkspaceState implements IWorkspaceState { return await this.#getWorkspaceContextByFolder(folderUri) } + async getPackageEngines(uriString: string): Promise { + const ctx = await this.getWorkspaceContext(uriString) + if (!ctx) + return + + const uri = URI.parse(uriString) + if (uri.scheme !== 'file' || !isPackageManifest(uri.path)) + return + + return (await ctx.loadPackageManifestInfo(uri.path))?.engines + } + async getResolvedDependencies(uriString: string): Promise { const ctx = await this.getWorkspaceContext(uriString) if (!ctx) diff --git a/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts b/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts index 5bbbe4ee..42626072 100644 --- a/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts +++ b/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts @@ -16,7 +16,7 @@ interface CreateContextOptions { } export function createContext(options: CreateContextOptions): DiagnosticContext { - const { name, version, distTags = {}, versionsMeta = {}, category = 'dependencies' } = options + const { name, version, distTags = {}, versionsMeta = {}, engines, category = 'dependencies' } = options const { protocol, resolvedName, resolvedSpec, resolvedProtocol } = resolveDependencySpec(name, version) const pkg = { distTags, versionsMeta } as PackageInfo @@ -33,5 +33,20 @@ export function createContext(options: CreateContextOptions): DiagnosticContext resolvedVersion: async () => resolveExactVersion(pkg, resolvedSpec), packageInfo: async () => (pkg), } - return { uri: 'file:///package.json', dep, pkg } as DiagnosticContext + const workspace: DiagnosticContext['workspace'] = { + getClientFeatures: () => ({ catalogInlayHints: true, iconStyle: 'emoji' }), + async getPackageEngines() { + return engines + }, + async getWorkspaceContext() { + return undefined + }, + async getResolvedDependencies() { + return undefined + }, + async getResolvedDependenciesForContainingPackage() { + return undefined + }, + } + return { uri: 'file:///package.json', dep, pkg, workspace } } diff --git a/packages/language-service/src/plugins/diagnostics/rules/engine-mismatch.test.ts b/packages/language-service/src/plugins/diagnostics/rules/engine-mismatch.test.ts index 1e39e35b..e8607795 100644 --- a/packages/language-service/src/plugins/diagnostics/rules/engine-mismatch.test.ts +++ b/packages/language-service/src/plugins/diagnostics/rules/engine-mismatch.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from 'vitest' -import { resolveEngineMismatches } from './engine-mismatch' +import { createContext } from './__tests__/utils' +import { checkEngineMismatch, resolveEngineMismatches } from './engine-mismatch' describe('resolveEngineMismatches', () => { it('should flag when engine ranges do not overlap', () => { @@ -62,3 +63,19 @@ describe('resolveEngineMismatches', () => { )).toEqual([]) }) }) + +describe('checkEngineMismatch', () => { + it('reads package engines through the workspace interface', async () => { + await expect(checkEngineMismatch( + createContext({ + name: 'foo', + version: '1.0.0', + engines: { node: '>=20' }, + versionsMeta: { + '1.0.0': { engines: { node: '>=22' } }, + }, + }), + [], + )).resolves.toMatchObject({ code: 'engine-mismatch' }) + }) +}) diff --git a/packages/language-service/src/plugins/diagnostics/rules/engine-mismatch.ts b/packages/language-service/src/plugins/diagnostics/rules/engine-mismatch.ts index f3bdc7bf..aa704008 100644 --- a/packages/language-service/src/plugins/diagnostics/rules/engine-mismatch.ts +++ b/packages/language-service/src/plugins/diagnostics/rules/engine-mismatch.ts @@ -2,9 +2,8 @@ import type { DiagnosticSeverity } from '@volar/language-service' import type { Engines } from 'npmx-language-core/types' import type { DiagnosticRule } from '../types' import { npmxPackageUrl } from 'npmx-language-core/links' -import { formatPackageId, isPackageManifest } from 'npmx-language-core/utils' +import { formatPackageId } from 'npmx-language-core/utils' import { isRangeSubset, parseRange, rangesIntersect } from 'verkit' -import { URI } from 'vscode-uri' interface EngineMismatch { engine: string @@ -46,10 +45,6 @@ export function resolveEngineMismatches( } export const checkEngineMismatch: DiagnosticRule = async ({ uri, dep, pkg, workspace }) => { - const path = URI.parse(uri).path - - if (!isPackageManifest(path)) - return if (dep.category !== 'dependencies') return @@ -57,8 +52,7 @@ export const checkEngineMismatch: DiagnosticRule = async ({ uri, dep, pkg, works if (!resolvedVersion) return - const wsCtx = await workspace.getWorkspaceContext(uri) - const engines = (await wsCtx?.loadPackageManifestInfo(path))?.engines + const engines = await workspace.getPackageEngines(uri) if (!engines) return diff --git a/packages/language-service/src/plugins/installed-package-definition.test.ts b/packages/language-service/src/plugins/installed-package-definition.test.ts index e8e33b5c..54e7cdaa 100644 --- a/packages/language-service/src/plugins/installed-package-definition.test.ts +++ b/packages/language-service/src/plugins/installed-package-definition.test.ts @@ -27,6 +27,9 @@ async function createWorkspaceState( return { getClientFeatures: () => DEFAULT_CLIENT_FEATURES, + async getPackageEngines() { + return undefined + }, async getWorkspaceContext() { return workspaceContext }, diff --git a/packages/language-service/src/types.ts b/packages/language-service/src/types.ts index f1e2d1a4..7a950498 100644 --- a/packages/language-service/src/types.ts +++ b/packages/language-service/src/types.ts @@ -1,3 +1,4 @@ +import type { Engines } from 'npmx-language-core/types' import type { DependencyInfo, WorkspaceContext } from 'npmx-language-core/workspace' export type IconStyle = 'codicon' | 'emoji' @@ -14,6 +15,7 @@ export const DEFAULT_CLIENT_FEATURES: ClientFeatures = { export interface IWorkspaceState { getClientFeatures: () => ClientFeatures + getPackageEngines: (uri: string) => Promise getWorkspaceContext: (uri: string) => Promise getResolvedDependencies: (uri: string) => Promise getResolvedDependenciesForContainingPackage: (uri: string) => Promise From 9c0b8b6bc786bda560f3b0493ae36e258cca9731 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 27 Aug 2026 23:56:20 +0800 Subject: [PATCH 2/6] refactor(workspace): encapsulate install lookup --- packages/language-server/src/workspace.ts | 12 ++++++++++++ .../src/plugins/diagnostics/rules/__tests__/utils.ts | 3 +++ .../src/plugins/installed-package-definition.test.ts | 4 ++++ .../src/plugins/installed-package-definition.ts | 8 ++------ packages/language-service/src/types.ts | 1 + 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/language-server/src/workspace.ts b/packages/language-server/src/workspace.ts index f511a10e..75a2a4e1 100644 --- a/packages/language-server/src/workspace.ts +++ b/packages/language-server/src/workspace.ts @@ -172,6 +172,18 @@ export class WorkspaceState implements IWorkspaceState { return await this.#getWorkspaceContextByFolder(folderUri) } + async findInstalledPackageManifestPath(uriString: string, packageName: string): Promise { + const ctx = await this.getWorkspaceContext(uriString) + if (!ctx) + return + + const uri = URI.parse(uriString) + if (uri.scheme !== 'file' || !isPackageManifest(uri.path)) + return + + return ctx.findInstalledPackageManifestPath(uri.path, packageName) + } + async getPackageEngines(uriString: string): Promise { const ctx = await this.getWorkspaceContext(uriString) if (!ctx) diff --git a/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts b/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts index 42626072..69db61b1 100644 --- a/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts +++ b/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts @@ -34,6 +34,9 @@ export function createContext(options: CreateContextOptions): DiagnosticContext packageInfo: async () => (pkg), } const workspace: DiagnosticContext['workspace'] = { + async findInstalledPackageManifestPath() { + return undefined + }, getClientFeatures: () => ({ catalogInlayHints: true, iconStyle: 'emoji' }), async getPackageEngines() { return engines diff --git a/packages/language-service/src/plugins/installed-package-definition.test.ts b/packages/language-service/src/plugins/installed-package-definition.test.ts index 54e7cdaa..1f4609bf 100644 --- a/packages/language-service/src/plugins/installed-package-definition.test.ts +++ b/packages/language-service/src/plugins/installed-package-definition.test.ts @@ -3,6 +3,7 @@ import type { IWorkspaceState } from '../types' import { WorkspaceContext } from 'npmx-language-core/workspace' import { describe, expect, it } from 'vitest' import { TextDocument } from 'vscode-languageserver-textdocument' +import { URI } from 'vscode-uri' import { createDependencyInfo } from '../test-utils/dependency' import { DEFAULT_CLIENT_FEATURES } from '../types' import { provideInstalledPackageDefinition } from './installed-package-definition' @@ -26,6 +27,9 @@ async function createWorkspaceState( const workspaceContext = await WorkspaceContext.create('/repo', adapter) return { + async findInstalledPackageManifestPath(uri, packageName) { + return workspaceContext.findInstalledPackageManifestPath(URI.parse(uri).path, packageName) + }, getClientFeatures: () => DEFAULT_CLIENT_FEATURES, async getPackageEngines() { return undefined diff --git a/packages/language-service/src/plugins/installed-package-definition.ts b/packages/language-service/src/plugins/installed-package-definition.ts index 64b81a9a..3c2ebe73 100644 --- a/packages/language-service/src/plugins/installed-package-definition.ts +++ b/packages/language-service/src/plugins/installed-package-definition.ts @@ -25,12 +25,8 @@ export async function provideInstalledPackageDefinition( if (!dependency) return - const workspaceContext = await workspaceState.getWorkspaceContext(document.uri) - if (!workspaceContext) - return - - const targetPath = await workspaceContext.findInstalledPackageManifestPath( - packageManifestUri.path, + const targetPath = await workspaceState.findInstalledPackageManifestPath( + document.uri, dependency.rawName, ) if (!targetPath) diff --git a/packages/language-service/src/types.ts b/packages/language-service/src/types.ts index 7a950498..30fda8bb 100644 --- a/packages/language-service/src/types.ts +++ b/packages/language-service/src/types.ts @@ -14,6 +14,7 @@ export const DEFAULT_CLIENT_FEATURES: ClientFeatures = { } export interface IWorkspaceState { + findInstalledPackageManifestPath: (uri: string, packageName: string) => Promise getClientFeatures: () => ClientFeatures getPackageEngines: (uri: string) => Promise getWorkspaceContext: (uri: string) => Promise From d5319cafb3affc845b639d1b14244a1cf1d0a20b Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 27 Aug 2026 23:57:51 +0800 Subject: [PATCH 3/6] refactor(workspace): encapsulate catalog lookup --- packages/language-server/src/workspace.ts | 6 +++++- packages/language-service/src/plugins/catalog.ts | 6 +----- .../src/plugins/diagnostics/rules/__tests__/utils.ts | 3 +++ .../src/plugins/installed-package-definition.test.ts | 3 +++ packages/language-service/src/types.ts | 3 ++- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/language-server/src/workspace.ts b/packages/language-server/src/workspace.ts index 75a2a4e1..58d8b69a 100644 --- a/packages/language-server/src/workspace.ts +++ b/packages/language-server/src/workspace.ts @@ -1,5 +1,5 @@ import type { Connection, LanguageServer } from '@volar/language-server' -import type { Engines } from 'npmx-language-core/types' +import type { CatalogsInfo, Engines } from 'npmx-language-core/types' import type { DependencyInfo, PackageManager, WorkspaceAdapter } from 'npmx-language-core/workspace' import type { ClientFeatures, IWorkspaceState } from 'npmx-language-service/types' import { access, realpath as fsRealpath, readFile } from 'node:fs/promises' @@ -184,6 +184,10 @@ export class WorkspaceState implements IWorkspaceState { return ctx.findInstalledPackageManifestPath(uri.path, packageName) } + async getCatalogs(uriString: string): Promise { + return (await this.getWorkspaceContext(uriString))?.getCatalogs() + } + async getPackageEngines(uriString: string): Promise { const ctx = await this.getWorkspaceContext(uriString) if (!ctx) diff --git a/packages/language-service/src/plugins/catalog.ts b/packages/language-service/src/plugins/catalog.ts index e0ec1289..a023d8c3 100644 --- a/packages/language-service/src/plugins/catalog.ts +++ b/packages/language-service/src/plugins/catalog.ts @@ -61,11 +61,7 @@ export function create(workspaceState: IWorkspaceState): LanguageServicePlugin { if (!dependency) return - const workspaceContext = await workspaceState.getWorkspaceContext(document.uri) - if (!workspaceContext) - return - - const catalogs = await workspaceContext.getCatalogs() + const catalogs = await workspaceState.getCatalogs(document.uri) if (!catalogs) return diff --git a/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts b/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts index 69db61b1..d2538a49 100644 --- a/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts +++ b/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts @@ -37,6 +37,9 @@ export function createContext(options: CreateContextOptions): DiagnosticContext async findInstalledPackageManifestPath() { return undefined }, + async getCatalogs() { + return undefined + }, getClientFeatures: () => ({ catalogInlayHints: true, iconStyle: 'emoji' }), async getPackageEngines() { return engines diff --git a/packages/language-service/src/plugins/installed-package-definition.test.ts b/packages/language-service/src/plugins/installed-package-definition.test.ts index 1f4609bf..d0022281 100644 --- a/packages/language-service/src/plugins/installed-package-definition.test.ts +++ b/packages/language-service/src/plugins/installed-package-definition.test.ts @@ -30,6 +30,9 @@ async function createWorkspaceState( async findInstalledPackageManifestPath(uri, packageName) { return workspaceContext.findInstalledPackageManifestPath(URI.parse(uri).path, packageName) }, + async getCatalogs() { + return undefined + }, getClientFeatures: () => DEFAULT_CLIENT_FEATURES, async getPackageEngines() { return undefined diff --git a/packages/language-service/src/types.ts b/packages/language-service/src/types.ts index 30fda8bb..00d89f52 100644 --- a/packages/language-service/src/types.ts +++ b/packages/language-service/src/types.ts @@ -1,4 +1,4 @@ -import type { Engines } from 'npmx-language-core/types' +import type { CatalogsInfo, Engines } from 'npmx-language-core/types' import type { DependencyInfo, WorkspaceContext } from 'npmx-language-core/workspace' export type IconStyle = 'codicon' | 'emoji' @@ -15,6 +15,7 @@ export const DEFAULT_CLIENT_FEATURES: ClientFeatures = { export interface IWorkspaceState { findInstalledPackageManifestPath: (uri: string, packageName: string) => Promise + getCatalogs: (uri: string) => Promise getClientFeatures: () => ClientFeatures getPackageEngines: (uri: string) => Promise getWorkspaceContext: (uri: string) => Promise From d69678d9fda941a4e9b3ce8da1974c6a326396ae Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 28 Aug 2026 00:02:13 +0800 Subject: [PATCH 4/6] refactor(workspace): resolve catalog definitions --- packages/language-server/src/workspace.ts | 20 +++++++++++++- .../language-service/src/plugins/catalog.ts | 27 ++++--------------- .../diagnostics/rules/__tests__/utils.ts | 3 +++ .../installed-package-definition.test.ts | 3 +++ packages/language-service/src/types.ts | 4 +++ 5 files changed, 34 insertions(+), 23 deletions(-) diff --git a/packages/language-server/src/workspace.ts b/packages/language-server/src/workspace.ts index 58d8b69a..61662906 100644 --- a/packages/language-server/src/workspace.ts +++ b/packages/language-server/src/workspace.ts @@ -4,7 +4,7 @@ import type { DependencyInfo, PackageManager, WorkspaceAdapter } from 'npmx-lang import type { ClientFeatures, IWorkspaceState } from 'npmx-language-service/types' import { access, realpath as fsRealpath, readFile } from 'node:fs/promises' import { CACHE_MAX_AGE_MAXIMUM, DEPENDENCY_FILE_GLOB, PACKAGE_JSON_BASENAME } from 'npmx-language-core/constants' -import { isDependencyFile, isPackageManifest } from 'npmx-language-core/utils' +import { isDependencyFile, isPackageManifest, normalizeCatalogName } from 'npmx-language-core/utils' import { WorkspaceContext } from 'npmx-language-core/workspace' import { DEFAULT_CLIENT_FEATURES } from 'npmx-language-service/types' import { defineCachedFunction } from 'ocache' @@ -172,6 +172,24 @@ export class WorkspaceState implements IWorkspaceState { return await this.#getWorkspaceContextByFolder(folderUri) } + async findCatalogDependency(uriString: string, dependency: DependencyInfo) { + const ctx = await this.getWorkspaceContext(uriString) + if (!ctx?.workspaceFilePath) + return + + const workspaceFileInfo = await ctx.loadWorkspaceFileInfo(ctx.workspaceFilePath) + const targetDependency = workspaceFileInfo?.dependencies.find((candidate) => + candidate.rawName === dependency.resolvedName + && candidate.categoryName != null + && dependency.categoryName != null + && normalizeCatalogName(candidate.categoryName) === normalizeCatalogName(dependency.categoryName), + ) + if (!targetDependency) + return + + return { dependency: targetDependency, path: ctx.workspaceFilePath } + } + async findInstalledPackageManifestPath(uriString: string, packageName: string): Promise { const ctx = await this.getWorkspaceContext(uriString) if (!ctx) diff --git a/packages/language-service/src/plugins/catalog.ts b/packages/language-service/src/plugins/catalog.ts index a023d8c3..2c1bf9e6 100644 --- a/packages/language-service/src/plugins/catalog.ts +++ b/packages/language-service/src/plugins/catalog.ts @@ -1,7 +1,7 @@ import type { CompletionItemKind, CompletionList, LanguageServicePlugin, LanguageServicePluginInstance, LocationLink } from '@volar/language-service' import type { DependencyInfo } from 'npmx-language-core/workspace' import type { IWorkspaceState } from '../types' -import { isPackageManifest, normalizeCatalogName } from 'npmx-language-core/utils' +import { isPackageManifest } from 'npmx-language-core/utils' import { URI } from 'vscode-uri' import { getDocumentByUri, getResolvedDependencySpecAtOffset } from '../utils/document' @@ -33,13 +33,6 @@ export function create(workspaceState: IWorkspaceState): LanguageServicePlugin { return getCatalogDependencyAtOffset(dependencies, offset) } - function matchesCatalogDependency(candidate: DependencyInfo, dependency: DependencyInfo): boolean { - return candidate.rawName === dependency.resolvedName - && candidate.categoryName != null - && dependency.categoryName != null - && normalizeCatalogName(candidate.categoryName) === normalizeCatalogName(dependency.categoryName) - } - return { name: 'npmx-catalog', capabilities: { @@ -92,26 +85,16 @@ export function create(workspaceState: IWorkspaceState): LanguageServicePlugin { if (!dependency) return - const workspaceContext = await workspaceState.getWorkspaceContext(document.uri) - if (!workspaceContext?.workspaceFilePath) - return - - const workspaceFileInfo = await workspaceContext.loadWorkspaceFileInfo(workspaceContext.workspaceFilePath) - if (!workspaceFileInfo) - return - - const targetDependency = workspaceFileInfo.dependencies.find((candidate) => - matchesCatalogDependency(candidate, dependency), - ) - if (!targetDependency) + const target = await workspaceState.findCatalogDependency(document.uri, dependency) + if (!target) return - const workspaceFileUri = dependencyFileUri.with({ path: workspaceContext.workspaceFilePath }) + const workspaceFileUri = dependencyFileUri.with({ path: target.path }) const workspaceDocument = await getDocumentByUri(context, workspaceFileUri) if (!workspaceDocument) return - const [targetStart, targetEnd] = targetDependency.specRange + const [targetStart, targetEnd] = target.dependency.specRange const originStart = document.positionAt(dependency.specRange[0]) const originEnd = document.positionAt(dependency.specRange[1]) diff --git a/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts b/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts index d2538a49..cd854cf7 100644 --- a/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts +++ b/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts @@ -34,6 +34,9 @@ export function createContext(options: CreateContextOptions): DiagnosticContext packageInfo: async () => (pkg), } const workspace: DiagnosticContext['workspace'] = { + async findCatalogDependency() { + return undefined + }, async findInstalledPackageManifestPath() { return undefined }, diff --git a/packages/language-service/src/plugins/installed-package-definition.test.ts b/packages/language-service/src/plugins/installed-package-definition.test.ts index d0022281..cb05bc05 100644 --- a/packages/language-service/src/plugins/installed-package-definition.test.ts +++ b/packages/language-service/src/plugins/installed-package-definition.test.ts @@ -27,6 +27,9 @@ async function createWorkspaceState( const workspaceContext = await WorkspaceContext.create('/repo', adapter) return { + async findCatalogDependency() { + return undefined + }, async findInstalledPackageManifestPath(uri, packageName) { return workspaceContext.findInstalledPackageManifestPath(URI.parse(uri).path, packageName) }, diff --git a/packages/language-service/src/types.ts b/packages/language-service/src/types.ts index 00d89f52..7284a8a1 100644 --- a/packages/language-service/src/types.ts +++ b/packages/language-service/src/types.ts @@ -14,6 +14,10 @@ export const DEFAULT_CLIENT_FEATURES: ClientFeatures = { } export interface IWorkspaceState { + findCatalogDependency: (uri: string, dependency: DependencyInfo) => Promise<{ + dependency: DependencyInfo + path: string + } | undefined> findInstalledPackageManifestPath: (uri: string, packageName: string) => Promise getCatalogs: (uri: string) => Promise getClientFeatures: () => ClientFeatures From e736d503153e113365148a57d6bf9a680e4e529d Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 28 Aug 2026 00:06:52 +0800 Subject: [PATCH 5/6] refactor(workspace): hide workspace context --- packages/language-server/src/workspace.ts | 14 +++++++------- .../plugins/diagnostics/rules/__tests__/utils.ts | 3 --- .../plugins/installed-package-definition.test.ts | 3 --- packages/language-service/src/types.ts | 3 +-- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/packages/language-server/src/workspace.ts b/packages/language-server/src/workspace.ts index 61662906..22e86583 100644 --- a/packages/language-server/src/workspace.ts +++ b/packages/language-server/src/workspace.ts @@ -164,7 +164,7 @@ export class WorkspaceState implements IWorkspaceState { return bestMatch } - async getWorkspaceContext(uriString: string): Promise { + async #getWorkspaceContext(uriString: string): Promise { const folderUri = this.#getWorkspaceFolderUri(uriString) if (!folderUri) return @@ -173,7 +173,7 @@ export class WorkspaceState implements IWorkspaceState { } async findCatalogDependency(uriString: string, dependency: DependencyInfo) { - const ctx = await this.getWorkspaceContext(uriString) + const ctx = await this.#getWorkspaceContext(uriString) if (!ctx?.workspaceFilePath) return @@ -191,7 +191,7 @@ export class WorkspaceState implements IWorkspaceState { } async findInstalledPackageManifestPath(uriString: string, packageName: string): Promise { - const ctx = await this.getWorkspaceContext(uriString) + const ctx = await this.#getWorkspaceContext(uriString) if (!ctx) return @@ -203,11 +203,11 @@ export class WorkspaceState implements IWorkspaceState { } async getCatalogs(uriString: string): Promise { - return (await this.getWorkspaceContext(uriString))?.getCatalogs() + return (await this.#getWorkspaceContext(uriString))?.getCatalogs() } async getPackageEngines(uriString: string): Promise { - const ctx = await this.getWorkspaceContext(uriString) + const ctx = await this.#getWorkspaceContext(uriString) if (!ctx) return @@ -219,7 +219,7 @@ export class WorkspaceState implements IWorkspaceState { } async getResolvedDependencies(uriString: string): Promise { - const ctx = await this.getWorkspaceContext(uriString) + const ctx = await this.#getWorkspaceContext(uriString) if (!ctx) return @@ -241,7 +241,7 @@ export class WorkspaceState implements IWorkspaceState { } async getResolvedDependenciesForContainingPackage(uriString: string): Promise { - const ctx = await this.getWorkspaceContext(uriString) + const ctx = await this.#getWorkspaceContext(uriString) if (!ctx) return diff --git a/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts b/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts index cd854cf7..507e6bf9 100644 --- a/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts +++ b/packages/language-service/src/plugins/diagnostics/rules/__tests__/utils.ts @@ -47,9 +47,6 @@ export function createContext(options: CreateContextOptions): DiagnosticContext async getPackageEngines() { return engines }, - async getWorkspaceContext() { - return undefined - }, async getResolvedDependencies() { return undefined }, diff --git a/packages/language-service/src/plugins/installed-package-definition.test.ts b/packages/language-service/src/plugins/installed-package-definition.test.ts index cb05bc05..fca81788 100644 --- a/packages/language-service/src/plugins/installed-package-definition.test.ts +++ b/packages/language-service/src/plugins/installed-package-definition.test.ts @@ -40,9 +40,6 @@ async function createWorkspaceState( async getPackageEngines() { return undefined }, - async getWorkspaceContext() { - return workspaceContext - }, async getResolvedDependencies() { return dependencies }, diff --git a/packages/language-service/src/types.ts b/packages/language-service/src/types.ts index 7284a8a1..c4d8cde7 100644 --- a/packages/language-service/src/types.ts +++ b/packages/language-service/src/types.ts @@ -1,5 +1,5 @@ import type { CatalogsInfo, Engines } from 'npmx-language-core/types' -import type { DependencyInfo, WorkspaceContext } from 'npmx-language-core/workspace' +import type { DependencyInfo } from 'npmx-language-core/workspace' export type IconStyle = 'codicon' | 'emoji' @@ -22,7 +22,6 @@ export interface IWorkspaceState { getCatalogs: (uri: string) => Promise getClientFeatures: () => ClientFeatures getPackageEngines: (uri: string) => Promise - getWorkspaceContext: (uri: string) => Promise getResolvedDependencies: (uri: string) => Promise getResolvedDependenciesForContainingPackage: (uri: string) => Promise } From f1e7cd58be8fe6cd287eeaa3b681aa7366ec0e70 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Sat, 29 Aug 2026 11:52:44 +0800 Subject: [PATCH 6/6] Update types.ts --- packages/language-service/src/types.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/language-service/src/types.ts b/packages/language-service/src/types.ts index c4d8cde7..afe6087a 100644 --- a/packages/language-service/src/types.ts +++ b/packages/language-service/src/types.ts @@ -14,14 +14,14 @@ export const DEFAULT_CLIENT_FEATURES: ClientFeatures = { } export interface IWorkspaceState { + getClientFeatures: () => ClientFeatures + getCatalogs: (uri: string) => Promise findCatalogDependency: (uri: string, dependency: DependencyInfo) => Promise<{ dependency: DependencyInfo path: string } | undefined> - findInstalledPackageManifestPath: (uri: string, packageName: string) => Promise - getCatalogs: (uri: string) => Promise - getClientFeatures: () => ClientFeatures getPackageEngines: (uri: string) => Promise getResolvedDependencies: (uri: string) => Promise getResolvedDependenciesForContainingPackage: (uri: string) => Promise + findInstalledPackageManifestPath: (uri: string, packageName: string) => Promise }