Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions extensions/vscode/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import { launch } from './client'
import { addToIgnore } from './commands/add-to-ignore'
import { openFileInNpmx } from './commands/open-file-in-npmx'
import { openInBrowser } from './commands/open-in-browser'
import { useCompletionItem } from './providers/completion-item'
import { useDecorators } from './providers/decorators'
import { useDocumentLink } from './providers/document-link'
import { logger } from './state'
Expand All @@ -22,7 +21,6 @@ export const { activate, deactivate } = defineExtension((ctx) => {

useWorkspaceContext()

useCompletionItem()
useDecorators()
useDocumentLink()

Expand Down
20 changes: 0 additions & 20 deletions extensions/vscode/src/providers/completion-item/index.ts

This file was deleted.

54 changes: 0 additions & 54 deletions extensions/vscode/src/providers/completion-item/version.ts

This file was deleted.

25 changes: 0 additions & 25 deletions extensions/vscode/src/utils/version.test.ts

This file was deleted.

47 changes: 0 additions & 47 deletions extensions/vscode/src/utils/version.ts

This file was deleted.

2 changes: 2 additions & 0 deletions packages/language-service/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import type { LanguageServicePlugin } from '@volar/language-service'
import type { IWorkspaceState } from './types'
import { create as createNpmxCatalogService } from './plugins/catalog'
import { create as createNpmxCompletionService } from './plugins/completion'
import { create as createNpmxDiagnosticsService } from './plugins/diagnostics'
import { create as createNpmxHoverService } from './plugins/hover'

export function createNpmxLanguageServicePlugins(workspace: IWorkspaceState): LanguageServicePlugin[] {
return [
createNpmxCatalogService(workspace),
createNpmxCompletionService(workspace),
createNpmxDiagnosticsService(workspace),
createNpmxHoverService(workspace),
]
Expand Down
75 changes: 75 additions & 0 deletions packages/language-service/src/plugins/completion.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import type { CompletionItemKind, CompletionList, LanguageServicePlugin, LanguageServicePluginInstance } from '@volar/language-service'
import type { IWorkspaceState } from '../types'
import { isDependencyFile } from 'npmx-language-core/utils'
import { URI } from 'vscode-uri'
import { getConfig } from '../config'
import { getResolvedDependencyAtOffset } from '../utils/range'
import { formatUpgradeVersion } from '../utils/version'

const PRERELEASE_PATTERN = /-.+/

export function create(workspaceState: IWorkspaceState): LanguageServicePlugin {
return {
name: 'npmx-completion',
capabilities: {
completionProvider: {
triggerCharacters: [':', '^', '~', '.'],
},
},
create(context): LanguageServicePluginInstance {
return {
async provideCompletionItems(document, position): Promise<CompletionList | undefined> {
const completionVersion = await getConfig(context, 'npmx.completion.version')
if (completionVersion === 'off')
return

const uri = URI.parse(document.uri)
if (uri.scheme !== 'file' || !isDependencyFile(uri.path))
return

const dependencies = await workspaceState.getResolvedDependencies(document.uri)
if (!dependencies)
return

const offset = document.offsetAt(position)
const dep = getResolvedDependencyAtOffset(dependencies, offset)
if (!dep || dep.resolvedProtocol !== 'npm')
return

const pkg = await dep.packageInfo()
if (!pkg)
return

const excludePrerelease = await getConfig(context, 'npmx.completion.excludePrerelease')
const items: CompletionList['items'] = []

for (const version in pkg.versionsMeta) {
const meta = pkg.versionsMeta[version]!

if (meta.deprecated != null)
continue

if (excludePrerelease && PRERELEASE_PATTERN.test(version))
continue

if (completionVersion === 'provenance-only' && !meta.provenance)
continue

const text = formatUpgradeVersion(dep, version)

const tag = pkg.versionToTag.get(version)

items.push({
label: text,
kind: 12 satisfies typeof CompletionItemKind.Value,
insertText: text,
detail: tag,
})
}

return { isIncomplete: false, items }
},
}
},
}
}
Loading