{"version":3,"file":"CodeEditor.mjs","sources":["../../../../src/components/CodeMirror/CodeEditor.tsx"],"sourcesContent":["import { acceptCompletion, autocompletion, startCompletion } from '@codemirror/autocomplete';\nimport { EditorState, Prec } from '@codemirror/state';\nimport { keymap } from '@codemirror/view';\nimport { vscodeDark, vscodeLight } from '@uiw/codemirror-theme-vscode';\nimport CodeMirror, { EditorView } from '@uiw/react-codemirror';\nimport { memo, useMemo } from 'react';\n\nimport { t } from '@grafana/i18n';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { Alert } from '../Alert/Alert';\n\nimport {\n  type CodeMirrorCompletionMode,\n  type CodeMirrorCompletionSource,\n  type CodeMirrorEditorProps,\n  type CodeMirrorExtension,\n} from './types';\nimport { useLanguageExtension } from './useLanguageExtension';\n\nconst getCompletionExtensions = (\n  sources: readonly CodeMirrorCompletionSource[] | undefined,\n  mode: CodeMirrorCompletionMode\n): CodeMirrorExtension[] => {\n  if (!sources || sources.length === 0) {\n    return [];\n  }\n\n  if (mode === 'override') {\n    return [autocompletion({ override: [...sources] }), autocompleteSpaceKeymap];\n  }\n\n  // Merge: enable autocompletion and contribute the sources via language data\n  // so they're combined with whatever the active language registers.\n  return [\n    autocompletion(),\n    autocompleteSpaceKeymap,\n    ...sources.map((source) => EditorState.languageData.of(() => [{ autocomplete: source }])),\n  ];\n};\n\nconst getAccessibilityExtensions = (\n  ariaLabel: string | undefined,\n  ariaLabelledby: string | undefined\n): CodeMirrorExtension[] => {\n  if (!ariaLabel && !ariaLabelledby) {\n    return [];\n  }\n\n  return [\n    EditorView.contentAttributes.of({\n      ...(ariaLabel ? { 'aria-label': ariaLabel } : {}),\n      ...(ariaLabelledby ? { 'aria-labelledby': ariaLabelledby } : {}),\n    }),\n  ];\n};\n\n// Bind Tab to accept completions before the default indent behavior\nconst autocompleteTabKeymap = Prec.highest(\n  keymap.of([\n    {\n      key: 'Tab',\n      run: acceptCompletion,\n    },\n  ])\n);\n\nconst autocompleteSpaceKeymap = Prec.highest(\n  keymap.of([\n    {\n      key: 'Space',\n      run: (view) => {\n        if (view.state.readOnly) {\n          return false;\n        }\n\n        view.dispatch(view.state.replaceSelection(' '));\n        startCompletion(view);\n        return true;\n      },\n    },\n  ])\n);\n\nexport const CodeEditor = memo(function CodeEditor({\n  value,\n  language,\n  height = '200px',\n  onChange,\n  'aria-label': ariaLabel,\n  'aria-labelledby': ariaLabelledby,\n  completionSources,\n  completionMode = 'merge',\n  extensions: additionalExtensions,\n}: CodeMirrorEditorProps) {\n  const theme = useTheme2();\n  const { extension: languageExtension, error: languageExtensionError } = useLanguageExtension(language);\n\n  const extensions = useMemo(\n    () => [\n      autocompleteTabKeymap,\n      ...getAccessibilityExtensions(ariaLabel, ariaLabelledby),\n      ...(languageExtension ? [languageExtension] : []),\n      ...getCompletionExtensions(completionSources, completionMode),\n      ...(additionalExtensions ?? []),\n    ],\n    [ariaLabel, ariaLabelledby, languageExtension, completionSources, completionMode, additionalExtensions]\n  );\n  return (\n    <>\n      {languageExtensionError && (\n        <Alert title={t('grafana-ui.code-mirror.language-load-failed', 'Syntax highlighting failed to load')}>\n          {t(\n            'grafana-ui.code-mirror.language-load-failed-description',\n            'The editor will continue without language-specific features.'\n          )}\n        </Alert>\n      )}\n      <CodeMirror\n        theme={theme.isDark ? vscodeDark : vscodeLight}\n        value={value}\n        height={height}\n        extensions={extensions}\n        onChange={onChange}\n      />\n    </>\n  );\n});\n"],"names":["CodeEditor"],"mappings":";;;;;;;;;;;;;AAoBA,MAAM,uBAAA,GAA0B,CAC9B,OAAA,EACA,IAAA,KAC0B;AAC1B,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,OAAO,CAAC,cAAA,CAAe,EAAE,QAAA,EAAU,CAAC,GAAG,OAAO,CAAA,EAAG,CAAA,EAAG,uBAAuB,CAAA;AAAA,EAC7E;AAIA,EAAA,OAAO;AAAA,IACL,cAAA,EAAe;AAAA,IACf,uBAAA;AAAA,IACA,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,WAAW,WAAA,CAAY,YAAA,CAAa,EAAA,CAAG,MAAM,CAAC,EAAE,YAAA,EAAc,MAAA,EAAQ,CAAC,CAAC;AAAA,GAC1F;AACF,CAAA;AAEA,MAAM,0BAAA,GAA6B,CACjC,SAAA,EACA,cAAA,KAC0B;AAC1B,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,cAAA,EAAgB;AACjC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,UAAA,CAAW,kBAAkB,EAAA,CAAG;AAAA,MAC9B,GAAI,SAAA,GAAY,EAAE,YAAA,EAAc,SAAA,KAAc,EAAC;AAAA,MAC/C,GAAI,cAAA,GAAiB,EAAE,iBAAA,EAAmB,cAAA,KAAmB;AAAC,KAC/D;AAAA,GACH;AACF,CAAA;AAGA,MAAM,wBAAwB,IAAA,CAAK,OAAA;AAAA,EACjC,OAAO,EAAA,CAAG;AAAA,IACR;AAAA,MACE,GAAA,EAAK,KAAA;AAAA,MACL,GAAA,EAAK;AAAA;AACP,GACD;AACH,CAAA;AAEA,MAAM,0BAA0B,IAAA,CAAK,OAAA;AAAA,EACnC,OAAO,EAAA,CAAG;AAAA,IACR;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MACL,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,QAAA,IAAI,IAAA,CAAK,MAAM,QAAA,EAAU;AACvB,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAC9C,QAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AACF,GACD;AACH,CAAA;AAEO,MAAM,UAAA,GAAa,IAAA,CAAK,SAASA,WAAAA,CAAW;AAAA,EACjD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA,GAAS,OAAA;AAAA,EACT,QAAA;AAAA,EACA,YAAA,EAAc,SAAA;AAAA,EACd,iBAAA,EAAmB,cAAA;AAAA,EACnB,iBAAA;AAAA,EACA,cAAA,GAAiB,OAAA;AAAA,EACjB,UAAA,EAAY;AACd,CAAA,EAA0B;AACxB,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,MAAM,EAAE,SAAA,EAAW,iBAAA,EAAmB,OAAO,sBAAA,EAAuB,GAAI,qBAAqB,QAAQ,CAAA;AAErG,EAAA,MAAM,UAAA,GAAa,OAAA;AAAA,IACjB,MAAM;AAAA,MACJ,qBAAA;AAAA,MACA,GAAG,0BAAA,CAA2B,SAAA,EAAW,cAAc,CAAA;AAAA,MACvD,GAAI,iBAAA,GAAoB,CAAC,iBAAiB,IAAI,EAAC;AAAA,MAC/C,GAAG,uBAAA,CAAwB,iBAAA,EAAmB,cAAc,CAAA;AAAA,MAC5D,GAAI,sDAAwB;AAAC,KAC/B;AAAA,IACA,CAAC,SAAA,EAAW,cAAA,EAAgB,iBAAA,EAAmB,iBAAA,EAAmB,gBAAgB,oBAAoB;AAAA,GACxG;AACA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,sBAAA,wBACE,KAAA,EAAA,EAAM,KAAA,EAAO,CAAA,CAAE,6CAAA,EAA+C,oCAAoC,CAAA,EAChG,QAAA,EAAA,CAAA;AAAA,MACC,yDAAA;AAAA,MACA;AAAA,KACF,EACF,CAAA;AAAA,oBAEF,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA,CAAM,MAAA,GAAS,UAAA,GAAa,WAAA;AAAA,QACnC,KAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ,CAAC;;;;"}