UNPKG

@grafana/ui

Version:
1 lines 6.84 kB
{"version":3,"file":"suggestions.mjs","sources":["../../../../src/components/Monaco/suggestions.ts"],"sourcesContent":["import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\nimport { CodeEditorSuggestionItem, CodeEditorSuggestionItemKind, CodeEditorSuggestionProvider, Monaco } from './types';\n\n/**\n * @internal -- only exported for tests\n */\nexport function findInsertIndex(line: string): { index: number; prefix: string } {\n for (let i = line.length - 1; i > 0; i--) {\n const ch = line.charAt(i);\n if (ch === '$') {\n return {\n index: i,\n prefix: line.substring(i),\n };\n }\n\n // Keep these seperators\n if (ch === ' ' || ch === '\\t' || ch === '\"' || ch === \"'\") {\n return {\n index: i + 1,\n prefix: line.substring(i + 1),\n };\n }\n }\n return {\n index: 0,\n prefix: line,\n };\n}\n\nfunction getCompletionItems(\n monaco: Monaco,\n prefix: string,\n suggestions: CodeEditorSuggestionItem[],\n range: monacoType.IRange\n): monacoType.languages.CompletionItem[] {\n const items: monacoType.languages.CompletionItem[] = [];\n for (const suggestion of suggestions) {\n if (prefix && !suggestion.label.startsWith(prefix)) {\n continue; // skip non-matching suggestions\n }\n\n items.push({\n ...suggestion,\n kind: mapKinds(monaco, suggestion.kind),\n range,\n insertText: suggestion.insertText ?? suggestion.label,\n });\n }\n return items;\n}\n\nfunction mapKinds(monaco: Monaco, sug?: CodeEditorSuggestionItemKind): monacoType.languages.CompletionItemKind {\n switch (sug) {\n case CodeEditorSuggestionItemKind.Method:\n return monaco.languages.CompletionItemKind.Method;\n case CodeEditorSuggestionItemKind.Field:\n return monaco.languages.CompletionItemKind.Field;\n case CodeEditorSuggestionItemKind.Property:\n return monaco.languages.CompletionItemKind.Property;\n case CodeEditorSuggestionItemKind.Constant:\n return monaco.languages.CompletionItemKind.Constant;\n case CodeEditorSuggestionItemKind.Text:\n return monaco.languages.CompletionItemKind.Text;\n }\n return monaco.languages.CompletionItemKind.Text;\n}\n\n/**\n * @alpha\n */\nexport function registerSuggestions(\n monaco: Monaco,\n language: string,\n getSuggestions: CodeEditorSuggestionProvider,\n modelId: string\n): monacoType.IDisposable | undefined {\n if (!language || !getSuggestions) {\n return undefined;\n }\n return monaco.languages.registerCompletionItemProvider(language, {\n triggerCharacters: ['$'],\n\n provideCompletionItems: (model, position, context) => {\n // only return these suggestions for the specified modelId\n // prevents duplicate suggestions when multiple editors are open\n if (model.id !== modelId) {\n return undefined;\n }\n const range = {\n startLineNumber: position.lineNumber,\n endLineNumber: position.lineNumber,\n startColumn: position.column,\n endColumn: position.column,\n };\n\n // Simple check if this was triggered by pressing `$`\n if (context.triggerCharacter === '$') {\n range.startColumn = position.column - 1;\n return {\n suggestions: getCompletionItems(monaco, '$', getSuggestions(), range),\n };\n }\n\n // Find the replacement region\n const currentLine = model.getValueInRange({\n startLineNumber: position.lineNumber,\n startColumn: 1,\n endLineNumber: position.lineNumber,\n endColumn: position.column,\n });\n\n const { index, prefix } = findInsertIndex(currentLine);\n range.startColumn = index + 1;\n\n const suggestions = getCompletionItems(monaco, prefix, getSuggestions(), range);\n if (suggestions.length) {\n // NOTE, this will replace any language provided suggestions\n return { suggestions };\n }\n\n // Default language suggestions\n return undefined;\n },\n });\n}\n"],"names":[],"mappings":";;AAOO,SAAS,gBAAgB,IAAiD,EAAA;AAC/E,EAAA,KAAA,IAAS,IAAI,IAAK,CAAA,MAAA,GAAS,CAAG,EAAA,CAAA,GAAI,GAAG,CAAK,EAAA,EAAA;AACxC,IAAM,MAAA,EAAA,GAAK,IAAK,CAAA,MAAA,CAAO,CAAC,CAAA;AACxB,IAAA,IAAI,OAAO,GAAK,EAAA;AACd,MAAO,OAAA;AAAA,QACL,KAAO,EAAA,CAAA;AAAA,QACP,MAAA,EAAQ,IAAK,CAAA,SAAA,CAAU,CAAC;AAAA,OAC1B;AAAA;AAIF,IAAA,IAAI,OAAO,GAAO,IAAA,EAAA,KAAO,OAAQ,EAAO,KAAA,GAAA,IAAO,OAAO,GAAK,EAAA;AACzD,MAAO,OAAA;AAAA,QACL,OAAO,CAAI,GAAA,CAAA;AAAA,QACX,MAAQ,EAAA,IAAA,CAAK,SAAU,CAAA,CAAA,GAAI,CAAC;AAAA,OAC9B;AAAA;AACF;AAEF,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACV;AACF;AAEA,SAAS,kBACP,CAAA,MAAA,EACA,MACA,EAAA,WAAA,EACA,KACuC,EAAA;AApCzC,EAAA,IAAA,EAAA;AAqCE,EAAA,MAAM,QAA+C,EAAC;AACtD,EAAA,KAAA,MAAW,cAAc,WAAa,EAAA;AACpC,IAAA,IAAI,UAAU,CAAC,UAAA,CAAW,KAAM,CAAA,UAAA,CAAW,MAAM,CAAG,EAAA;AAClD,MAAA;AAAA;AAGF,IAAA,KAAA,CAAM,IAAK,CAAA;AAAA,MACT,GAAG,UAAA;AAAA,MACH,IAAM,EAAA,QAAA,CAAS,MAAQ,EAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACtC,KAAA;AAAA,MACA,UAAY,EAAA,CAAA,EAAA,GAAA,UAAA,CAAW,UAAX,KAAA,IAAA,GAAA,EAAA,GAAyB,UAAW,CAAA;AAAA,KACjD,CAAA;AAAA;AAEH,EAAO,OAAA,KAAA;AACT;AAEA,SAAS,QAAA,CAAS,QAAgB,GAA6E,EAAA;AAC7G,EAAA,QAAQ,GAAK;AAAA,IACX,KAAK,4BAA6B,CAAA,MAAA;AAChC,MAAO,OAAA,MAAA,CAAO,UAAU,kBAAmB,CAAA,MAAA;AAAA,IAC7C,KAAK,4BAA6B,CAAA,KAAA;AAChC,MAAO,OAAA,MAAA,CAAO,UAAU,kBAAmB,CAAA,KAAA;AAAA,IAC7C,KAAK,4BAA6B,CAAA,QAAA;AAChC,MAAO,OAAA,MAAA,CAAO,UAAU,kBAAmB,CAAA,QAAA;AAAA,IAC7C,KAAK,4BAA6B,CAAA,QAAA;AAChC,MAAO,OAAA,MAAA,CAAO,UAAU,kBAAmB,CAAA,QAAA;AAAA,IAC7C,KAAK,4BAA6B,CAAA,IAAA;AAChC,MAAO,OAAA,MAAA,CAAO,UAAU,kBAAmB,CAAA,IAAA;AAAA;AAE/C,EAAO,OAAA,MAAA,CAAO,UAAU,kBAAmB,CAAA,IAAA;AAC7C;AAKO,SAAS,mBACd,CAAA,MAAA,EACA,QACA,EAAA,cAAA,EACA,OACoC,EAAA;AACpC,EAAI,IAAA,CAAC,QAAY,IAAA,CAAC,cAAgB,EAAA;AAChC,IAAO,OAAA,KAAA,CAAA;AAAA;AAET,EAAO,OAAA,MAAA,CAAO,SAAU,CAAA,8BAAA,CAA+B,QAAU,EAAA;AAAA,IAC/D,iBAAA,EAAmB,CAAC,GAAG,CAAA;AAAA,IAEvB,sBAAwB,EAAA,CAAC,KAAO,EAAA,QAAA,EAAU,OAAY,KAAA;AAGpD,MAAI,IAAA,KAAA,CAAM,OAAO,OAAS,EAAA;AACxB,QAAO,OAAA,KAAA,CAAA;AAAA;AAET,MAAA,MAAM,KAAQ,GAAA;AAAA,QACZ,iBAAiB,QAAS,CAAA,UAAA;AAAA,QAC1B,eAAe,QAAS,CAAA,UAAA;AAAA,QACxB,aAAa,QAAS,CAAA,MAAA;AAAA,QACtB,WAAW,QAAS,CAAA;AAAA,OACtB;AAGA,MAAI,IAAA,OAAA,CAAQ,qBAAqB,GAAK,EAAA;AACpC,QAAM,KAAA,CAAA,WAAA,GAAc,SAAS,MAAS,GAAA,CAAA;AACtC,QAAO,OAAA;AAAA,UACL,aAAa,kBAAmB,CAAA,MAAA,EAAQ,GAAK,EAAA,cAAA,IAAkB,KAAK;AAAA,SACtE;AAAA;AAIF,MAAM,MAAA,WAAA,GAAc,MAAM,eAAgB,CAAA;AAAA,QACxC,iBAAiB,QAAS,CAAA,UAAA;AAAA,QAC1B,WAAa,EAAA,CAAA;AAAA,QACb,eAAe,QAAS,CAAA,UAAA;AAAA,QACxB,WAAW,QAAS,CAAA;AAAA,OACrB,CAAA;AAED,MAAA,MAAM,EAAE,KAAA,EAAO,MAAO,EAAA,GAAI,gBAAgB,WAAW,CAAA;AACrD,MAAA,KAAA,CAAM,cAAc,KAAQ,GAAA,CAAA;AAE5B,MAAA,MAAM,cAAc,kBAAmB,CAAA,MAAA,EAAQ,MAAQ,EAAA,cAAA,IAAkB,KAAK,CAAA;AAC9E,MAAA,IAAI,YAAY,MAAQ,EAAA;AAEtB,QAAA,OAAO,EAAE,WAAY,EAAA;AAAA;AAIvB,MAAO,OAAA,KAAA,CAAA;AAAA;AACT,GACD,CAAA;AACH;;;;"}