{"version":3,"file":"completions.cjs","sources":["../../../../../src/components/monaco-query-field/monaco-completion-provider/completions.ts"],"sourcesContent":["// Core grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/completions.ts\nimport UFuzzy from '@leeoniya/ufuzzy';\nimport { type languages } from 'monaco-editor';\n\nimport { type TimeRange } from '@grafana/data';\nimport { config } from '@grafana/runtime';\n\nimport { DEFAULT_COMPLETION_LIMIT } from '../../../constants';\nimport { escapeLabelValueInExactSelector, prometheusRegularEscape } from '../../../escaping';\nimport { getFunctions } from '../../../promql';\nimport { isValidLegacyName } from '../../../utf8_support';\n\nimport { type DataProvider } from './data_provider';\nimport { type TriggerType } from './monaco-completion-provider';\nimport type { Label, Situation } from './situation';\nimport { NeverCaseError } from './util';\n// FIXME: we should not load this from the \"outside\", but we cannot do that while we have the \"old\" query-field too\n\nexport type CompletionType = 'HISTORY' | 'FUNCTION' | 'METRIC_NAME' | 'DURATION' | 'LABEL_NAME' | 'LABEL_VALUE';\n\n// We cannot use languages.CompletionItemInsertTextRule.InsertAsSnippet because grafana-prometheus package isn't compatible\n// It should first change the moduleResolution to bundler for TS to correctly resolve the types\n// https://github.com/grafana/grafana/pull/96450\nconst InsertAsSnippet = 4;\n\ntype Completion = {\n  type: CompletionType;\n  label: string;\n  insertText: string;\n  insertTextRules?: languages.CompletionItemInsertTextRule;\n  detail?: string;\n  documentation?: string;\n  triggerOnInsert?: boolean;\n};\n\nconst metricNamesSearch = {\n  // see https://github.com/leeoniya/uFuzzy?tab=readme-ov-file#how-it-works for details\n  multiInsert: new UFuzzy({ intraMode: 0 }),\n  singleError: new UFuzzy({ intraMode: 1 }),\n};\n\n// Snippet Marker is  telling monaco where to show the cursor and maybe a help text\n// With help text example: ${1:labelName}\n// labelName will be shown as selected. So user would know what to type next\nconst snippetMarker = '${1:}';\n\ninterface MetricFilterOptions {\n  metricNames: string[];\n  inputText: string;\n  limit: number;\n}\n\nexport function filterMetricNames({ metricNames, inputText, limit }: MetricFilterOptions): string[] {\n  if (!inputText?.trim()) {\n    return metricNames.slice(0, limit);\n  }\n\n  const terms = metricNamesSearch.multiInsert.split(inputText); // e.g. 'some_metric_name or-another' -> ['some', 'metric', 'name', 'or', 'another']\n  const isComplexSearch = terms.length > 4;\n  const fuzzyResults = isComplexSearch\n    ? metricNamesSearch.multiInsert.filter(metricNames, inputText) // for complex searches, prioritize performance by using MultiInsert fuzzy search\n    : metricNamesSearch.singleError.filter(metricNames, inputText); // for simple searches, prioritize flexibility by using SingleError fuzzy search\n\n  return fuzzyResults ? fuzzyResults.slice(0, limit).map((idx) => metricNames[idx]) : [];\n}\n\n// we order items like: history, functions, metrics\nasync function getAllMetricNamesCompletions(\n  searchTerm: string | undefined,\n  dataProvider: DataProvider,\n  timeRange: TimeRange\n): Promise<Completion[]> {\n  let metricNames = await dataProvider.queryMetricNames(timeRange, searchTerm);\n\n  return dataProvider.metricNamesToMetrics(metricNames).map((metric) => ({\n    type: 'METRIC_NAME',\n    label: metric.name,\n    detail: `${metric.name} : ${metric.type}`,\n    documentation: metric.help,\n    ...(metric.isUtf8\n      ? {\n          insertText: `{\"${metric.name}\"${snippetMarker}}`,\n          insertTextRules: InsertAsSnippet,\n        }\n      : {\n          insertText: metric.name,\n        }),\n  }));\n}\n\nconst getFunctionCompletions: () => Completion[] = () => {\n  return getFunctions().map((f) => ({\n    type: 'FUNCTION',\n    label: f.label,\n    insertText: f.insertText ?? '', // i don't know what to do when this is nullish. it should not be.\n    detail: f.detail,\n    documentation: f.documentation,\n  }));\n};\n\nasync function getFunctionsOnlyCompletions(): Promise<Completion[]> {\n  return Promise.resolve(getFunctionCompletions());\n}\n\nasync function getAllFunctionsAndMetricNamesCompletions(\n  searchTerm: string | undefined,\n  dataProvider: DataProvider,\n  timeRange: TimeRange\n): Promise<Completion[]> {\n  const metricNames = await getAllMetricNamesCompletions(searchTerm, dataProvider, timeRange);\n  return [...getFunctionCompletions(), ...metricNames];\n}\n\nconst DURATION_COMPLETIONS: Completion[] = [\n  '$__interval',\n  '$__range',\n  '$__rate_interval',\n  '1m',\n  '5m',\n  '10m',\n  '30m',\n  '1h',\n  '1d',\n].map((text) => ({\n  type: 'DURATION',\n  label: text,\n  insertText: text,\n}));\n\nfunction getAllHistoryCompletions(dataProvider: DataProvider): Completion[] {\n  // function getAllHistoryCompletions(queryHistory: PromHistoryItem[]): Completion[] {\n  // NOTE: the typescript types are wrong. historyItem.query.expr can be undefined\n  const allHistory = dataProvider.getHistory();\n  // FIXME: find a better history-limit\n  return allHistory.slice(0, 10).map((expr) => ({\n    type: 'HISTORY',\n    label: expr,\n    insertText: expr,\n  }));\n}\n\nfunction makeSelector(metricName: string | undefined, labels: Label[]): string | undefined {\n  if (metricName === undefined && labels.length === 0) {\n    return undefined;\n  }\n\n  const allLabels = [...labels];\n\n  // we transform the metricName to a label, if it exists\n  if (metricName !== undefined) {\n    allLabels.push({ name: '__name__', value: metricName, op: '=' });\n  }\n\n  const allLabelTexts = allLabels.map(\n    (label) => `${label.name}${label.op}\"${escapeLabelValueInExactSelector(label.value)}\"`\n  );\n\n  return `{${allLabelTexts.join(',')}}`;\n}\n\nasync function getLabelNames(\n  metric: string | undefined,\n  otherLabels: Label[],\n  dataProvider: DataProvider,\n  timeRange: TimeRange\n): Promise<string[]> {\n  const selector = makeSelector(metric, otherLabels);\n  const labelNames = await dataProvider.queryLabelKeys(timeRange, selector, DEFAULT_COMPLETION_LIMIT);\n  // Exclude __name__ from output\n  otherLabels.push({ name: '__name__', value: '', op: '!=' });\n  const usedLabelNames = new Set(otherLabels.map((l) => l.name));\n  // names used in the query\n  return labelNames.filter((l) => !usedLabelNames.has(l));\n}\n\nasync function getLabelNamesForCompletions(\n  metric: string | undefined,\n  suffix: string,\n  triggerOnInsert: boolean,\n  otherLabels: Label[],\n  dataProvider: DataProvider,\n  timeRange: TimeRange\n): Promise<Completion[]> {\n  const labelNames = await getLabelNames(metric, otherLabels, dataProvider, timeRange);\n  return labelNames.map((text) => {\n    const isUtf8 = !isValidLegacyName(text);\n    return {\n      type: 'LABEL_NAME',\n      label: text,\n      ...(isUtf8\n        ? {\n            insertText: `\"${text}\"${suffix}`,\n            insertTextRules: InsertAsSnippet,\n          }\n        : {\n            insertText: `${text}${suffix}`,\n          }),\n      triggerOnInsert,\n    };\n  });\n}\n\nasync function getLabelNamesForSelectorCompletions(\n  metric: string | undefined,\n  otherLabels: Label[],\n  dataProvider: DataProvider,\n  timeRange: TimeRange\n): Promise<Completion[]> {\n  return getLabelNamesForCompletions(metric, '=', true, otherLabels, dataProvider, timeRange);\n}\n\nasync function getLabelNamesForByCompletions(\n  metric: string | undefined,\n  otherLabels: Label[],\n  dataProvider: DataProvider,\n  timeRange: TimeRange\n): Promise<Completion[]> {\n  return getLabelNamesForCompletions(metric, '', false, otherLabels, dataProvider, timeRange);\n}\n\nasync function getLabelValues(\n  metric: string | undefined,\n  labelName: string,\n  otherLabels: Label[],\n  dataProvider: DataProvider,\n  timeRange: TimeRange\n): Promise<string[]> {\n  const selector = makeSelector(metric, otherLabels);\n  return await dataProvider.queryLabelValues(timeRange, labelName, selector);\n}\n\nasync function getLabelValuesForMetricCompletions(\n  metric: string | undefined,\n  labelName: string,\n  betweenQuotes: boolean,\n  otherLabels: Label[],\n  dataProvider: DataProvider,\n  timeRange: TimeRange\n): Promise<Completion[]> {\n  const values = await getLabelValues(metric, labelName, otherLabels, dataProvider, timeRange);\n  return values.map((text) => ({\n    type: 'LABEL_VALUE',\n    label: text,\n    insertText: formatLabelValueForCompletion(text, betweenQuotes),\n  }));\n}\n\nfunction formatLabelValueForCompletion(value: string, betweenQuotes: boolean): string {\n  const text = config.featureToggles.prometheusSpecialCharsInLabelValues ? prometheusRegularEscape(value) : value;\n  return betweenQuotes ? text : `\"${text}\"`;\n}\n\nexport async function getCompletions(\n  situation: Situation,\n  dataProvider: DataProvider,\n  timeRange: TimeRange,\n  searchTerm?: string,\n  triggerType: TriggerType = 'full'\n): Promise<Completion[]> {\n  switch (situation.type) {\n    case 'IN_DURATION':\n      return Promise.resolve(DURATION_COMPLETIONS);\n    case 'IN_FUNCTION':\n      return triggerType === 'full'\n        ? getAllFunctionsAndMetricNamesCompletions(searchTerm, dataProvider, timeRange)\n        : getFunctionsOnlyCompletions();\n    case 'AT_ROOT': {\n      return triggerType === 'full'\n        ? getAllFunctionsAndMetricNamesCompletions(searchTerm, dataProvider, timeRange)\n        : getFunctionsOnlyCompletions();\n    }\n    case 'EMPTY': {\n      if (triggerType === 'partial') {\n        return Promise.resolve(getFunctionCompletions());\n      }\n      const metricNames = await getAllMetricNamesCompletions(searchTerm, dataProvider, timeRange);\n      const historyCompletions = getAllHistoryCompletions(dataProvider);\n      return Promise.resolve([...historyCompletions, ...getFunctionCompletions(), ...metricNames]);\n    }\n    case 'IN_LABEL_SELECTOR_NO_LABEL_NAME':\n      return getLabelNamesForSelectorCompletions(situation.metricName, situation.otherLabels, dataProvider, timeRange);\n    case 'IN_GROUPING':\n      return getLabelNamesForByCompletions(situation.metricName, situation.otherLabels, dataProvider, timeRange);\n    case 'IN_LABEL_SELECTOR_WITH_LABEL_NAME':\n      return getLabelValuesForMetricCompletions(\n        situation.metricName,\n        situation.labelName,\n        situation.betweenQuotes,\n        situation.otherLabels,\n        dataProvider,\n        timeRange\n      );\n    default:\n      throw new NeverCaseError(situation);\n  }\n}\n"],"names":["UFuzzy","getFunctions","escapeLabelValueInExactSelector","DEFAULT_COMPLETION_LIMIT","isValidLegacyName","config","prometheusRegularEscape","NeverCaseError"],"mappings":"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"}