Skip to content

Commit 09032ff

Browse files
feat: migrate document link to language-service (#94)
* feat: migrate document link to language-service * [autofix.ci] apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent e3a9a92 commit 09032ff

5 files changed

Lines changed: 67 additions & 60 deletions

File tree

extensions/vscode/src/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { addToIgnore } from './commands/add-to-ignore'
99
import { openFileInNpmx } from './commands/open-file-in-npmx'
1010
import { openInBrowser } from './commands/open-in-browser'
1111
import { useDecorators } from './providers/decorators'
12-
import { useDocumentLink } from './providers/document-link'
1312
import { logger } from './state'
1413

1514
export const { activate, deactivate } = defineExtension((ctx) => {
@@ -22,7 +21,6 @@ export const { activate, deactivate } = defineExtension((ctx) => {
2221
useWorkspaceContext()
2322

2423
useDecorators()
25-
useDocumentLink()
2624

2725
useCommand(ADD_TO_IGNORE_COMMAND, addToIgnore)
2826

extensions/vscode/src/providers/document-link/index.ts

Lines changed: 0 additions & 16 deletions
This file was deleted.

extensions/vscode/src/providers/document-link/npmx.ts

Lines changed: 0 additions & 42 deletions
This file was deleted.

packages/language-service/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ import type { LanguageServicePlugin } from '@volar/language-service'
22
import type { IWorkspaceState } from './types'
33
import { create as createNpmxCatalogService } from './plugins/catalog'
44
import { create as createNpmxDiagnosticsService } from './plugins/diagnostics'
5+
import { create as createNpmxDocumentLinkService } from './plugins/document-link'
56
import { create as createNpmxHoverService } from './plugins/hover'
67
import { create as createNpmxVersionCompletionService } from './plugins/version-completion'
78

89
export function createNpmxLanguageServicePlugins(workspace: IWorkspaceState): LanguageServicePlugin[] {
910
return [
1011
createNpmxCatalogService(workspace),
1112
createNpmxDiagnosticsService(workspace),
13+
createNpmxDocumentLinkService(workspace),
1214
createNpmxHoverService(workspace),
1315
createNpmxVersionCompletionService(workspace),
1416
]
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import type { DocumentLink, LanguageServicePlugin, LanguageServicePluginInstance } from '@volar/language-service'
2+
import type { IWorkspaceState } from '../types'
3+
import { npmxPackageUrl } from 'npmx-language-core/links'
4+
import { isDependencyFile } from 'npmx-language-core/utils'
5+
import { URI } from 'vscode-uri'
6+
import { getConfig } from '../config'
7+
8+
export function create(workspaceState: IWorkspaceState): LanguageServicePlugin {
9+
return {
10+
name: 'npmx-document-link',
11+
capabilities: {
12+
documentLinkProvider: {},
13+
},
14+
create(context): LanguageServicePluginInstance {
15+
return {
16+
async provideDocumentLinks(document): Promise<DocumentLink[] | undefined> {
17+
const linkMode = await getConfig(context, 'npmx.packageLinks')
18+
if (linkMode === 'off')
19+
return
20+
21+
const uri = URI.parse(document.uri)
22+
if (uri.scheme !== 'file' || !isDependencyFile(uri.path))
23+
return
24+
25+
const dependencies = await workspaceState.getResolvedDependencies(document.uri)
26+
if (!dependencies)
27+
return
28+
29+
const links: DocumentLink[] = []
30+
31+
for (const dep of dependencies) {
32+
if (dep.resolvedProtocol !== 'npm')
33+
continue
34+
35+
const { resolvedName, resolvedSpec, nameRange } = dep
36+
37+
let targetVersion: string | undefined
38+
39+
if (linkMode === 'declared') {
40+
targetVersion = resolvedSpec
41+
} else if (linkMode === 'resolved') {
42+
targetVersion = await dep.resolvedVersion() ?? resolvedSpec
43+
}
44+
45+
const url = targetVersion
46+
? npmxPackageUrl(resolvedName, targetVersion)
47+
: npmxPackageUrl(resolvedName)
48+
49+
const [start, end] = nameRange
50+
links.push({
51+
range: {
52+
start: document.positionAt(start),
53+
end: document.positionAt(end),
54+
},
55+
target: url,
56+
tooltip: `Open ${resolvedName}@${targetVersion ?? 'latest'} on npmx`,
57+
})
58+
}
59+
60+
return links
61+
},
62+
}
63+
},
64+
}
65+
}

0 commit comments

Comments
 (0)