From 08ffcfdf16f59656cf23bed522aa7898555ab3bb Mon Sep 17 00:00:00 2001 From: Matias Chomicki Date: Fri, 14 Oct 2022 10:29:03 +0200 Subject: [PATCH] feat(loki-monaco-editor): escape autocompleted label values (#56890) --- .../monaco-completion-provider/completions.test.ts | 12 +++++++++++- .../monaco-completion-provider/completions.ts | 3 ++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/public/app/plugins/datasource/loki/components/monaco-query-field/monaco-completion-provider/completions.test.ts b/public/app/plugins/datasource/loki/components/monaco-query-field/monaco-completion-provider/completions.test.ts index 6fcb67ff375..a113a23a65b 100644 --- a/public/app/plugins/datasource/loki/components/monaco-query-field/monaco-completion-provider/completions.test.ts +++ b/public/app/plugins/datasource/loki/components/monaco-query-field/monaco-completion-provider/completions.test.ts @@ -24,7 +24,7 @@ const history = [ ]; const labelNames = ['place', 'source']; -const labelValues = ['moon', 'luna']; +const labelValues = ['moon', 'luna', 'server\\1']; const extractedLabelKeys = ['extracted', 'label']; const otherLabels: Label[] = [ { @@ -244,6 +244,11 @@ describe('getCompletions', () => { label: 'luna', type: 'LABEL_VALUE', }, + { + insertText: '"server\\\\1"', + label: 'server\\1', + type: 'LABEL_VALUE', + }, ]); completions = await getCompletions({ ...situation, betweenQuotes: true }, completionProvider); @@ -259,6 +264,11 @@ describe('getCompletions', () => { label: 'luna', type: 'LABEL_VALUE', }, + { + insertText: 'server\\\\1', + label: 'server\\1', + type: 'LABEL_VALUE', + }, ]); }); diff --git a/public/app/plugins/datasource/loki/components/monaco-query-field/monaco-completion-provider/completions.ts b/public/app/plugins/datasource/loki/components/monaco-query-field/monaco-completion-provider/completions.ts index 098c02c1c04..c82a18752c0 100644 --- a/public/app/plugins/datasource/loki/components/monaco-query-field/monaco-completion-provider/completions.ts +++ b/public/app/plugins/datasource/loki/components/monaco-query-field/monaco-completion-provider/completions.ts @@ -1,3 +1,4 @@ +import { escapeLabelValueInExactSelector } from '../../../languageUtils'; import { AGGREGATION_OPERATORS, RANGE_VEC_FUNCTIONS } from '../../../syntax'; import { CompletionDataProvider } from './CompletionDataProvider'; @@ -197,7 +198,7 @@ async function getLabelValuesForMetricCompletions( return values.map((text) => ({ type: 'LABEL_VALUE', label: text, - insertText: betweenQuotes ? text : `"${text}"`, + insertText: betweenQuotes ? escapeLabelValueInExactSelector(text) : `"${escapeLabelValueInExactSelector(text)}"`, })); }