File tree Expand file tree Collapse file tree
providers/completion-item Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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}
Original file line number Diff line number Diff line change 11catalog :
22 lodash : 2.4.2
3+ is-number : ^4.0.0
34catalogs :
45 prod :
56 ' @deno/doc ' : jsr:^0.189.1
7+ is-number : 5.0.0
68 dev :
79 is-number : ~7.0.0
Original file line number Diff line number Diff 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 )
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 1- import { SUPPORTED_DOCUMENT_PATTERN } from '#constants'
1+ import { PACKAGE_JSON_BASENAME , SUPPORTED_DOCUMENT_PATTERN } from '#constants'
22import { config } from '#state'
33import { watchEffect } from 'reactive-vscode'
44import { languages } from 'vscode'
5+ import { CatalogCompletionItemProvider } from './catalog'
56import { VersionCompletionItemProvider } from './version'
67
78export 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}
You can’t perform that action at this time.
0 commit comments