{"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":"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"}