Skip to content

Commit efbbab7

Browse files
RYGRITautofix-ci[bot]9romise
authored
feat: add catalog name completion in package.json (#75)
* feat: support catalog completion * fix: remove incorrect range in catalog completion * [autofix.ci] apply automated fixes * fix: update completion item kind to text * update --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Vida Xie <vida_2020@163.com>
1 parent b5cacf5 commit efbbab7

5 files changed

Lines changed: 53 additions & 3 deletions

File tree

playground/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"ofetch": "^2.0.0-alpha.1",
1515
"array-includes": "latest",
1616
"axios": "",
17-
"is-number": "",
17+
"is-number": "catalog:",
1818
"lodash": "catalog:"
1919
}
2020
}

playground/pnpm-workspace.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
catalog:
22
lodash: 2.4.2
3+
is-number: ^4.0.0
34
catalogs:
45
prod:
56
'@deno/doc': jsr:^0.189.1
7+
is-number: 5.0.0
68
dev:
79
is-number: ~7.0.0

src/core/workspace.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ class WorkspaceContext {
6767
this.#invalidatedPaths.add(path)
6868
}
6969

70+
async getCatalogs(): Promise<CatalogsInfo | undefined> {
71+
return this.#catalogs?.promise
72+
}
73+
7074
#createResolvedDependencyInfo(dependency: DependencyInfo, catalogs?: CatalogsInfo): ResolvedDependencyInfo {
7175
const resolution = resolveDependencySpec(dependency.rawName, dependency.rawSpec, catalogs)
7276

@@ -110,7 +114,7 @@ class WorkspaceContext {
110114

111115
const [info, catalogs] = await Promise.all([
112116
getDocumentText(uri).then((text) => extractor.getPackageManifestInfo(text)),
113-
this.#catalogs!.promise,
117+
this.#catalogs?.promise,
114118
])
115119

116120
if (!info)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import type { CompletionItemProvider, Position, TextDocument } from 'vscode'
2+
import { getResolvedDependencyByOffset, getWorkspaceContext } from '#core/workspace'
3+
import { CompletionItem, CompletionItemKind } from 'vscode'
4+
5+
export class CatalogCompletionItemProvider implements CompletionItemProvider {
6+
static triggers = [':']
7+
8+
async provideCompletionItems(document: TextDocument, position: Position) {
9+
const offset = document.offsetAt(position)
10+
const info = await getResolvedDependencyByOffset(document.uri, offset)
11+
if (!info?.rawSpec.startsWith('catalog:'))
12+
return
13+
14+
const ctx = await getWorkspaceContext(document.uri)
15+
if (!ctx)
16+
return
17+
18+
const catalogs = await ctx.getCatalogs()
19+
20+
if (!catalogs)
21+
return
22+
23+
return Object.entries(catalogs).flatMap(([name, catalog]) => {
24+
const version = catalog[info.resolvedName]
25+
if (!version)
26+
return []
27+
28+
const item = new CompletionItem(name, CompletionItemKind.Value)
29+
item.detail = version
30+
return [item]
31+
})
32+
}
33+
}

src/providers/completion-item/index.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { SUPPORTED_DOCUMENT_PATTERN } from '#constants'
1+
import { PACKAGE_JSON_BASENAME, SUPPORTED_DOCUMENT_PATTERN } from '#constants'
22
import { config } from '#state'
33
import { watchEffect } from 'reactive-vscode'
44
import { languages } from 'vscode'
5+
import { CatalogCompletionItemProvider } from './catalog'
56
import { VersionCompletionItemProvider } from './version'
67

78
export function useCompletionItem() {
@@ -17,4 +18,14 @@ export function useCompletionItem() {
1718

1819
onCleanup(() => disposable.dispose())
1920
})
21+
22+
watchEffect((onCleanup) => {
23+
const disposable = languages.registerCompletionItemProvider(
24+
{ pattern: `**/${PACKAGE_JSON_BASENAME}` },
25+
new CatalogCompletionItemProvider(),
26+
...CatalogCompletionItemProvider.triggers,
27+
)
28+
29+
onCleanup(() => disposable.dispose())
30+
})
2031
}

0 commit comments

Comments
 (0)