1
1
import { useRef , useEffect } from 'react' ;
2
- import { type Monaco , type monacoTypes } from '@grafana/ui' ;
2
+ import { type Monaco , type monacoTypes , type MonacoEditor } from '@grafana/ui' ;
3
3
import { languages } from 'monaco-editor' ;
4
- import aggregationData from './aggregation.json' ;
4
+ import { STAGE_OPERATORS , EXPRESSION_OPERATORS , ACCUMULATORS , CONVERSION_OPERATORS , QUERY_OPERATORS } from '@mongodb-js/mongodb-constants'
5
5
6
6
// Supports JSON only right now
7
7
class CompletionProvider implements monacoTypes . languages . CompletionItemProvider {
8
- constructor ( private readonly editor : monacoTypes . editor . IStandaloneCodeEditor ) { }
8
+ constructor ( private readonly editor : MonacoEditor ) { }
9
9
10
10
provideCompletionItems (
11
11
model : monacoTypes . editor . ITextModel ,
@@ -40,18 +40,30 @@ class CompletionProvider implements monacoTypes.languages.CompletionItemProvider
40
40
endColumn : word . endColumn ,
41
41
} ;
42
42
43
- const suggestions : languages . CompletionItem [ ] = aggregationData [ 'stages' ] . map ( ( s ) => ( {
44
- label : `"${ s [ 'name' ] } "` ,
43
+ const stageSuggestions : languages . CompletionItem [ ] = STAGE_OPERATORS . map ( ( stage ) => {
44
+ // Add double quotation marks
45
+ const snippet = stage . snippet . replace ( / ( \s * ) ( [ a - z A - Z ] + ) \s * : / g, '$1"$2": ' ) ;
46
+ return {
47
+ label : `"${ stage . name } "` ,
48
+ kind : languages . CompletionItemKind . Function ,
49
+ insertText : `"\\${ stage . name } ": ${ snippet } ` ,
50
+ range : range ,
51
+ detail : stage . meta ,
52
+ documentation : stage . description ,
53
+ insertTextRules : languages . CompletionItemInsertTextRule . InsertAsSnippet ,
54
+ } } ) ;
55
+
56
+ const expressionSuggestions : languages . CompletionItem [ ] = [ ...EXPRESSION_OPERATORS , ...ACCUMULATORS , ...CONVERSION_OPERATORS , ...QUERY_OPERATORS ] . map ( ( expression ) => ( {
57
+ label : `"${ expression . name } "` ,
45
58
kind : languages . CompletionItemKind . Function ,
46
- insertText : s [ 'insertText' ] ? s [ 'insertText' ] : `"\\${ s [ ' name' ] } ": {\n\t$0\n }` ,
59
+ insertText : `"\\${ expression . name } ": \${1:expression }` ,
47
60
range : range ,
48
- detail : 'stage' ,
49
- documentation : s [ 'description' ] ,
61
+ detail : expression . meta ,
50
62
insertTextRules : languages . CompletionItemInsertTextRule . InsertAsSnippet ,
51
63
} ) ) ;
52
64
53
65
return {
54
- suggestions : suggestions ,
66
+ suggestions : [ ... stageSuggestions , ... expressionSuggestions ] ,
55
67
} ;
56
68
}
57
69
}
@@ -64,7 +76,7 @@ export function useAutocomplete() {
64
76
} ;
65
77
} , [ ] ) ;
66
78
67
- return ( editor : monacoTypes . editor . IStandaloneCodeEditor , monaco : Monaco ) => {
79
+ return ( editor : MonacoEditor , monaco : Monaco ) => {
68
80
const provider = new CompletionProvider ( editor ) ;
69
81
const { dispose } = monaco . languages . registerCompletionItemProvider ( 'json' , provider ) ;
70
82
autocompleteDisposeFun . current = dispose ;
0 commit comments