11import type { DependencyInfo , Extractor } from '#types/extractor'
22import type { TextDocument } from 'vscode'
3- import type { Node , Pair , Scalar , YAMLMap } from 'yaml'
3+ import type { Node } from 'yaml'
44import { isInRange } from '#utils/ast'
5+ import { traverseYamlCatalogs } from '#utils/catalog/yaml'
56import { parseYaml } from '#utils/parse'
67import { Range } from 'vscode'
7- import { isMap , isPair , isScalar } from 'yaml'
8-
9- const CATALOG_SECTION = 'catalog'
10- const CATALOGS_SECTION = 'catalogs'
11-
12- type CatalogEntry = Pair < Scalar < string > , Scalar < string > >
13-
14- type CatalogEntryVisitor = ( catalog : CatalogEntry ) => boolean | void
8+ import { isMap } from 'yaml'
159
1610export class PnpmWorkspaceYamlExtractor implements Extractor < Node > {
1711 parse = parseYaml
@@ -31,66 +25,34 @@ export class PnpmWorkspaceYamlExtractor implements Extractor<Node> {
3125
3226 const result : DependencyInfo < Node > [ ] = [ ]
3327
34- this . traverseCatalogs ( root , ( item ) => {
28+ traverseYamlCatalogs ( root , ( entry ) => {
3529 result . push ( {
36- nameNode : item . key ,
37- versionNode : item . value ! ,
38- name : String ( item . key . value ) ,
39- version : String ( item . value ! . value ) ,
30+ nameNode : entry . key ,
31+ versionNode : entry . value ! ,
32+ name : String ( entry . key . value ) ,
33+ version : String ( entry . value ! . value ) ,
4034 } )
4135 } )
4236
4337 return result
4438 }
4539
46- private traverseCatalogs ( root : YAMLMap , callback : CatalogEntryVisitor ) : boolean {
47- const catalog = root . items . find ( ( i ) => isScalar ( i . key ) && i . key . value === CATALOG_SECTION )
48- if ( this . traverseCatalog ( catalog , callback ) )
49- return true
50-
51- const catalogs = root . items . find ( ( i ) => isScalar ( i . key ) && i . key . value === CATALOGS_SECTION )
52- if ( isMap ( catalogs ?. value ) ) {
53- for ( const c of catalogs . value . items ) {
54- if ( this . traverseCatalog ( c , callback ) )
55- return true
56- }
57- }
58-
59- return false
60- }
61-
62- private traverseCatalog ( catalog : unknown , callback : CatalogEntryVisitor ) : boolean {
63- if ( ! isPair ( catalog ) )
64- return false
65- if ( ! isMap ( catalog . value ) )
66- return false
67-
68- for ( const item of catalog . value . items ) {
69- if ( isScalar ( item . key ) && isScalar ( item . value ) ) {
70- if ( callback ( item as CatalogEntry ) )
71- return true
72- }
73- }
74-
75- return false
76- }
77-
7840 getDependencyInfoByOffset ( root : Node , offset : number ) : DependencyInfo < Node > | undefined {
7941 if ( ! isMap ( root ) )
8042 return
8143
8244 let result : DependencyInfo < Node > | undefined
8345
84- this . traverseCatalogs ( root , ( item ) => {
46+ traverseYamlCatalogs ( root , ( entry ) => {
8547 if (
86- isInRange ( offset , item . value ! . range ! )
87- || isInRange ( offset , item . key . range ! )
48+ isInRange ( offset , entry . value ! . range ! )
49+ || isInRange ( offset , entry . key . range ! )
8850 ) {
8951 result = {
90- nameNode : item . key ,
91- versionNode : item . value ! ,
92- name : String ( item . key . value ) ,
93- version : String ( item . value ! . value ) ,
52+ nameNode : entry . key ,
53+ versionNode : entry . value ! ,
54+ name : String ( entry . key . value ) ,
55+ version : String ( entry . value ! . value ) ,
9456 }
9557 return true
9658 }
0 commit comments