{"version":3,"file":"data_provider.cjs","sources":["../../../../../src/components/monaco-query-field/monaco-completion-provider/data_provider.ts"],"sourcesContent":["import { type HistoryItem, type TimeRange } from '@grafana/data';\n\nimport { DEFAULT_COMPLETION_LIMIT, METRIC_LABEL } from '../../../constants';\nimport { type PrometheusLanguageProviderInterface } from '../../../language_provider';\nimport { removeQuotesIfExist } from '../../../language_utils';\nimport { type PromQuery } from '../../../types';\nimport { escapeForUtf8Support, isValidLegacyName } from '../../../utf8_support';\n\nexport const CODE_MODE_SUGGESTIONS_INCOMPLETE_EVENT = 'codeModeSuggestionsIncomplete';\n\ntype SuggestionsIncompleteEvent = CustomEvent<{\n  limit: number;\n  datasourceUid: string;\n}>;\n\nexport function isSuggestionsIncompleteEvent(e: Event): e is SuggestionsIncompleteEvent {\n  return (\n    e.type === CODE_MODE_SUGGESTIONS_INCOMPLETE_EVENT &&\n    'detail' in e &&\n    typeof e.detail === 'object' &&\n    e.detail !== null &&\n    'limit' in e.detail &&\n    'datasourceUid' in e.detail\n  );\n}\n\ninterface Metric {\n  name: string;\n  help: string;\n  type: string;\n  isUtf8?: boolean;\n}\n\nexport interface DataProviderParams {\n  languageProvider: PrometheusLanguageProviderInterface;\n  historyProvider: Array<HistoryItem<PromQuery>>;\n}\n\nexport class DataProvider {\n  readonly languageProvider: PrometheusLanguageProviderInterface;\n  readonly historyProvider: Array<HistoryItem<PromQuery>>;\n\n  readonly queryLabelKeys: typeof this.languageProvider.queryLabelKeys;\n  readonly queryLabelValues: typeof this.languageProvider.queryLabelValues;\n  /**\n   * The text that's been typed so far within the current {@link Monaco.Range | Range}.\n   *\n   * @remarks\n   * This is useful with fuzzy searching items to provide as Monaco autocomplete suggestions.\n   */\n  private inputInRange: string;\n\n  constructor(params: DataProviderParams) {\n    this.languageProvider = params.languageProvider;\n    this.historyProvider = params.historyProvider;\n    this.inputInRange = '';\n\n    this.queryLabelKeys = this.languageProvider.queryLabelKeys.bind(this.languageProvider);\n    this.queryLabelValues = this.languageProvider.queryLabelValues.bind(this.languageProvider);\n\n    // Ensure metadata is loaded for completions. The builder mode triggers this via its own\n    // components, but the code editor does not, so we need to fetch it here if not already cached.\n    const existingMetadata = this.languageProvider.retrieveMetricsMetadata();\n    if (Object.keys(existingMetadata).length === 0) {\n      this.languageProvider.queryMetricsMetadata();\n    }\n  }\n\n  /**\n   * Queries metric names with optional filtering.\n   * Safely constructs regex patterns and handles errors.\n   */\n  queryMetricNames = async (timeRange: TimeRange, searchTerm: string | undefined): Promise<string[]> => {\n    try {\n      let match: string | undefined;\n      if (searchTerm) {\n        const escapedWord = escapeForUtf8Support(removeQuotesIfExist(searchTerm));\n        match = `{__name__=~\".*${escapedWord}.*\"}`;\n      }\n\n      const result = await this.languageProvider.queryLabelValues(\n        timeRange,\n        METRIC_LABEL,\n        match,\n        DEFAULT_COMPLETION_LIMIT\n      );\n\n      return Array.isArray(result) ? result : [];\n    } catch (error) {\n      console.warn('Failed to query metric names:', error);\n      return [];\n    }\n  };\n\n  getHistory(): string[] {\n    return this.historyProvider.map((h) => h.query.expr).filter(Boolean);\n  }\n\n  getAllMetricNames(): string[] {\n    return this.languageProvider.retrieveMetrics();\n  }\n\n  metricNamesToMetrics(metricNames: string[]): Metric[] {\n    const metricsMetadata = this.languageProvider.retrieveMetricsMetadata();\n    const result: Metric[] = metricNames.map((m) => {\n      const metaItem = metricsMetadata?.[m];\n      return {\n        name: m,\n        help: metaItem?.help ?? '',\n        type: metaItem?.type ?? '',\n        isUtf8: !isValidLegacyName(m),\n      };\n    });\n\n    return result;\n  }\n\n  private setInputInRange(textInput: string): void {\n    this.inputInRange = textInput;\n  }\n\n  get monacoSettings() {\n    return {\n      inputInRange: this.inputInRange,\n      setInputInRange: this.setInputInRange.bind(this),\n    };\n  }\n}\n"],"names":["escapeForUtf8Support","removeQuotesIfExist","METRIC_LABEL","DEFAULT_COMPLETION_LIMIT","isValidLegacyName"],"mappings":"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"}