{"version":3,"file":"3620.0dfd49f78dc93c695e30.js","mappings":"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","sources":["webpack://grafana/./public/app/plugins/datasource/cloudwatch/aws_url.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/language.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/CloudWatchLink.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/query/getStatsGroups.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/LogsQueryField.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/LogsQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MetricStatEditor/MetricStatEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MetricsQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/guards.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/PanelQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MetricsQueryHeader.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryHeader.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MetricStatEditor/FilterItem.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MetricStatEditor/Dimensions.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/Forms.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/Alias.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/expressions.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/SQLGenerator.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/utils.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLBuilderSelectRow.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLFilter.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLGroupBy.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLOrderByGroup.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLBuilderEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/metric-math/definition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/monarch/register.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MathExpressionQueryField.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/definition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLCodeEditor.tsx","webpack://grafana/./.yarn/__virtual__/react-use-virtual-00326e70ba/3/opt/drone/yarncache/react-use-npm-17.3.2-a032cbeb01-7379460f51.zip/node_modules/react-use/esm/useCustomCompareEffect.js","webpack://grafana/./.yarn/__virtual__/react-use-virtual-00326e70ba/3/opt/drone/yarncache/react-use-npm-17.3.2-a032cbeb01-7379460f51.zip/node_modules/react-use/esm/misc/isDeepEqual.js","webpack://grafana/./.yarn/__virtual__/react-use-virtual-00326e70ba/3/opt/drone/yarncache/react-use-npm-17.3.2-a032cbeb01-7379460f51.zip/node_modules/react-use/esm/useDeepCompareEffect.js","webpack://grafana/./public/app/plugins/datasource/cloudwatch/hooks.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/monarch/commands.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/syntax.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/utils.ts","webpack://grafana/../../opt/drone/yarncache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip/node_modules/fast-deep-equal/react.js","webpack://grafana/../../opt/drone/yarncache/jsurl-npm-0.1.5-9e17f93783-50b614908d.zip/node_modules/jsurl/index.js","webpack://grafana/../../opt/drone/yarncache/jsurl-npm-0.1.5-9e17f93783-50b614908d.zip/node_modules/jsurl/lib/jsurl.js"],"sourcesContent":["const JSURL = require('jsurl');\n\nexport interface AwsUrl {\n end: string;\n start: string;\n timeType?: 'ABSOLUTE' | 'RELATIVE';\n tz?: 'local' | 'UTC';\n unit?: string;\n editorString: string;\n isLiveTail: boolean;\n source: string[];\n}\n\nexport function encodeUrl(obj: AwsUrl, region: string): string {\n return `https://${region}.console.aws.amazon.com/cloudwatch/home?region=${region}#logs-insights:queryDetail=${JSURL.stringify(\n obj\n )}`;\n}\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\ninterface CloudWatchLanguage extends monacoType.languages.IMonarchLanguage {\n keywords: string[];\n operators: string[];\n builtinFunctions: string[];\n}\n\nexport const SELECT = 'SELECT';\nexport const FROM = 'FROM';\nexport const WHERE = 'WHERE';\nexport const GROUP = 'GROUP';\nexport const ORDER = 'ORDER';\nexport const BY = 'BY';\nexport const DESC = 'DESC';\nexport const ASC = 'ASC';\nexport const LIMIT = 'LIMIT';\nexport const WITH = 'WITH';\nexport const SCHEMA = 'SCHEMA';\n\nexport const KEYWORDS = [SELECT, FROM, WHERE, GROUP, ORDER, BY, DESC, ASC, LIMIT, WITH, SCHEMA];\nexport const STATISTICS = ['AVG', 'COUNT', 'MAX', 'MIN', 'SUM'];\n\nexport const AND = 'AND';\nexport const LOGICAL_OPERATORS = [AND];\n\nexport const EQUALS = '=';\nexport const NOT_EQUALS = '!=';\nexport const COMPARISON_OPERATORS = [EQUALS, NOT_EQUALS];\n\nexport const language: CloudWatchLanguage = {\n defaultToken: '',\n tokenPostfix: '.sql',\n ignoreCase: true,\n brackets: [\n { open: '[', close: ']', token: 'delimiter.square' },\n { open: '(', close: ')', token: 'delimiter.parenthesis' },\n ],\n keywords: KEYWORDS,\n operators: LOGICAL_OPERATORS,\n builtinFunctions: STATISTICS,\n tokenizer: {\n root: [\n [/\\$[a-zA-Z0-9-_]+/, 'variable'],\n { include: '@comments' },\n { include: '@whitespace' },\n { include: '@numbers' },\n { include: '@strings' },\n { include: '@complexIdentifiers' },\n [/[;,.]/, 'delimiter'],\n [/[()]/, '@brackets'],\n [\n /[\\w@#$]+/,\n {\n cases: {\n '@keywords': 'keyword',\n '@operators': 'operator',\n '@builtinFunctions': 'predefined',\n '@default': 'identifier',\n },\n },\n ],\n [/[=!%&+\\-*/|~^]/, 'operator'], // TODO: strip these options\n ],\n whitespace: [[/\\s+/, 'white']],\n comments: [[/--+.*/, 'comment']],\n comment: [\n [/[^*/]+/, 'comment'],\n [/./, 'comment'],\n ],\n numbers: [\n [/0[xX][0-9a-fA-F]*/, 'number'],\n [/[$][+-]*\\d*(\\.\\d*)?/, 'number'],\n [/((\\d+(\\.\\d*)?)|(\\.\\d+))([eE][\\-+]?\\d+)?/, 'number'],\n ],\n strings: [\n [/N'/, { token: 'string', next: '@string' }],\n [/'/, { token: 'string', next: '@string' }],\n [/\"/, { token: 'type', next: '@string_double' }],\n ],\n string: [\n [/[^']+/, 'string'],\n [/''/, 'string'],\n [/'/, { token: 'string', next: '@pop' }],\n ],\n string_double: [\n [/[^\\\\\"]+/, 'type'],\n [/\"/, 'type', '@pop'],\n ],\n complexIdentifiers: [\n [/\\[/, { token: 'identifier.quote', next: '@bracketedIdentifier' }],\n [/\"/, { token: 'identifier.quote', next: '@quotedIdentifier' }],\n ],\n bracketedIdentifier: [\n [/[^\\]]+/, 'identifier'],\n [/]]/, 'identifier'],\n [/]/, { token: 'identifier.quote', next: '@pop' }],\n ],\n quotedIdentifier: [\n [/[^\"]+/, 'identifier'],\n [/\"\"/, 'identifier'],\n [/\"/, { token: 'identifier.quote', next: '@pop' }],\n ],\n },\n};\n\nexport const conf: monacoType.languages.LanguageConfiguration = {\n comments: {\n lineComment: '--',\n blockComment: ['/*', '*/'],\n },\n brackets: [\n ['{', '}'],\n ['[', ']'],\n ['(', ')'],\n ],\n autoClosingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n ],\n surroundingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n ],\n};\n","import React, { Component } from 'react';\n\nimport { PanelData } from '@grafana/data';\nimport { Icon } from '@grafana/ui';\n\nimport { encodeUrl, AwsUrl } from '../aws_url';\nimport { CloudWatchDatasource } from '../datasource';\nimport { CloudWatchLogsQuery } from '../types';\n\ninterface Props {\n query: CloudWatchLogsQuery;\n panelData?: PanelData;\n datasource: CloudWatchDatasource;\n}\n\ninterface State {\n href: string;\n}\n\nexport default class CloudWatchLink extends Component {\n state: State = { href: '' };\n\n async componentDidUpdate(prevProps: Props) {\n const { panelData: panelDataNew } = this.props;\n const { panelData: panelDataOld } = prevProps;\n\n if (panelDataOld !== panelDataNew && panelDataNew?.request) {\n const href = this.getExternalLink();\n this.setState({ href });\n }\n }\n\n getExternalLink(): string {\n const { query, panelData, datasource } = this.props;\n\n const range = panelData?.request?.range;\n\n if (!range) {\n return '';\n }\n\n const start = range.from.toISOString();\n const end = range.to.toISOString();\n\n const urlProps: AwsUrl = {\n end,\n start,\n timeType: 'ABSOLUTE',\n tz: 'UTC',\n editorString: query.expression ?? '',\n isLiveTail: false,\n source: query.logGroupNames ?? [],\n };\n\n return encodeUrl(urlProps, datasource.getActualRegion(query.region));\n }\n\n render() {\n const { href } = this.state;\n return (\n \n CloudWatch Logs Insights\n \n );\n }\n}\n","const byRE = /\\s+by\\s+/im;\n\n/**\n * groups look like this: (@a.foo)( as )(bar),\n * group 1 is the field, group 2 is \" as \" and group 3 is the alias\n * this regex will not advance past any non-identifier or whitespace characters, e.g. |\n */\nconst groupsRE = /([\\w$@().]+)(?:(\\s+as\\s+)([\\w$]+))?\\s*,?\\s*/iy;\n\nexport function getStatsGroups(query: string): string[] {\n let groups = [];\n\n // find \" by \"\n let b;\n if ((b = query.match(byRE))) {\n // continue incremental scanning from there for groups & aliases\n groupsRE.lastIndex = b.index! + b[0].length;\n\n let g;\n while ((g = groupsRE.exec(query))) {\n groups.push(g[2] ? g[3] : g[1]);\n groupsRE.lastIndex = g.index + g[0].length;\n }\n }\n\n return groups;\n}\n","import { css } from '@emotion/css';\nimport { intersectionBy, debounce, unionBy } from 'lodash';\nimport { LanguageMap, languages as prismLanguages } from 'prismjs';\nimport React, { ReactNode } from 'react';\nimport { Node, Plugin } from 'slate';\nimport { Editor } from 'slate-react';\n\nimport { AbsoluteTimeRange, QueryEditorProps, SelectableValue } from '@grafana/data';\nimport {\n BracesPlugin,\n LegacyForms,\n MultiSelect,\n QueryField,\n SlatePrism,\n TypeaheadInput,\n TypeaheadOutput,\n} from '@grafana/ui';\nimport { InputActionMeta } from '@grafana/ui/src/components/Select/types';\nimport { notifyApp } from 'app/core/actions';\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { dispatch } from 'app/store/store';\nimport { ExploreId } from 'app/types';\n\nimport { CloudWatchDatasource } from '../datasource';\nimport { CloudWatchLanguageProvider } from '../language_provider';\nimport syntax from '../syntax';\nimport { CloudWatchJsonData, CloudWatchLogsQuery, CloudWatchQuery } from '../types';\nimport { getStatsGroups } from '../utils/query/getStatsGroups';\nimport { appendTemplateVariables } from '../utils/utils';\n\nimport QueryHeader from './QueryHeader';\n\nexport interface CloudWatchLogsQueryFieldProps\n extends QueryEditorProps {\n absoluteRange: AbsoluteTimeRange;\n onLabelsRefresh?: () => void;\n ExtraFieldElement?: ReactNode;\n exploreId: ExploreId;\n allowCustomValue?: boolean;\n}\n\nconst containerClass = css`\n flex-grow: 1;\n min-height: 35px;\n`;\n\nconst rowGap = css`\n gap: 3px;\n`;\n\ninterface State {\n selectedLogGroups: Array>;\n availableLogGroups: Array>;\n loadingLogGroups: boolean;\n invalidLogGroups: boolean;\n hint:\n | {\n message: string;\n fix: {\n label: string;\n action: () => void;\n };\n }\n | undefined;\n}\n\nexport class CloudWatchLogsQueryField extends React.PureComponent {\n state: State = {\n selectedLogGroups:\n (this.props.query as CloudWatchLogsQuery).logGroupNames?.map((logGroup) => ({\n value: logGroup,\n label: logGroup,\n })) ?? [],\n availableLogGroups: [],\n invalidLogGroups: false,\n loadingLogGroups: false,\n hint: undefined,\n };\n\n plugins: Array>;\n\n constructor(props: CloudWatchLogsQueryFieldProps, context: React.Context) {\n super(props, context);\n\n this.plugins = [\n BracesPlugin(),\n SlatePrism(\n {\n onlyIn: (node: Node) => node.object === 'block' && node.type === 'code_block',\n getSyntax: (node: Node) => 'cloudwatch',\n },\n { ...(prismLanguages as LanguageMap), cloudwatch: syntax }\n ),\n ];\n }\n\n fetchLogGroupOptions = async (region: string, logGroupNamePrefix?: string) => {\n try {\n const logGroups: string[] = await this.props.datasource.describeLogGroups({\n refId: this.props.query.refId,\n region,\n logGroupNamePrefix,\n });\n\n return logGroups.map((logGroup) => ({\n value: logGroup,\n label: logGroup,\n }));\n } catch (err) {\n let errMessage = 'unknown error';\n if (typeof err !== 'string') {\n try {\n errMessage = JSON.stringify(err);\n } catch (e) {}\n } else {\n errMessage = err;\n }\n dispatch(notifyApp(createErrorNotification(errMessage)));\n return [];\n }\n };\n\n onLogGroupSearch = (searchTerm: string, region: string, actionMeta: InputActionMeta) => {\n if (actionMeta.action !== 'input-change') {\n return Promise.resolve();\n }\n\n // No need to fetch matching log groups if the search term isn't valid\n // This is also useful for preventing searches when a user is typing out a log group with template vars\n // See https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_LogGroup.html for the source of the pattern below\n const logGroupNamePattern = /^[\\.\\-_/#A-Za-z0-9]+$/;\n if (!logGroupNamePattern.test(searchTerm)) {\n return Promise.resolve();\n }\n\n this.setState({\n loadingLogGroups: true,\n });\n\n return this.fetchLogGroupOptions(region, searchTerm)\n .then((matchingLogGroups) => {\n this.setState((state) => ({\n availableLogGroups: unionBy(state.availableLogGroups, matchingLogGroups, 'value'),\n }));\n })\n .finally(() => {\n this.setState({\n loadingLogGroups: false,\n });\n });\n };\n\n onLogGroupSearchDebounced = debounce(this.onLogGroupSearch, 300);\n\n componentDidMount = () => {\n const { query, onChange } = this.props;\n\n this.setState({\n loadingLogGroups: true,\n });\n\n query.region &&\n this.fetchLogGroupOptions(query.region).then((logGroups) => {\n this.setState((state) => {\n const selectedLogGroups = state.selectedLogGroups;\n if (onChange) {\n const nextQuery = {\n ...query,\n logGroupNames: selectedLogGroups.map((group) => group.value!),\n };\n\n onChange(nextQuery);\n }\n\n return {\n loadingLogGroups: false,\n availableLogGroups: logGroups,\n selectedLogGroups,\n };\n });\n });\n };\n\n onChangeQuery = (value: string) => {\n // Send text change to parent\n const { query, onChange } = this.props;\n const { selectedLogGroups } = this.state;\n\n if (onChange) {\n const nextQuery = {\n ...query,\n expression: value,\n logGroupNames: selectedLogGroups?.map((logGroupName) => logGroupName.value!) ?? [],\n statsGroups: getStatsGroups(value),\n };\n onChange(nextQuery);\n }\n };\n\n setSelectedLogGroups = (selectedLogGroups: Array>) => {\n this.setState({\n selectedLogGroups,\n });\n\n const { onChange, query } = this.props;\n onChange?.({\n ...(query as CloudWatchLogsQuery),\n logGroupNames: selectedLogGroups.map((logGroupName) => logGroupName.value!) ?? [],\n });\n };\n\n setCustomLogGroups = (v: string) => {\n const customLogGroup: SelectableValue = { value: v, label: v };\n const selectedLogGroups = [...this.state.selectedLogGroups, customLogGroup];\n this.setSelectedLogGroups(selectedLogGroups);\n };\n\n onRegionChange = async (v: string) => {\n this.setState({\n loadingLogGroups: true,\n });\n const logGroups = await this.fetchLogGroupOptions(v);\n this.setState((state) => {\n const selectedLogGroups = intersectionBy(state.selectedLogGroups, logGroups, 'value');\n const { onChange, query } = this.props;\n if (onChange) {\n const nextQuery = {\n ...query,\n logGroupNames: selectedLogGroups.map((group) => group.value!),\n };\n\n onChange(nextQuery);\n }\n return {\n availableLogGroups: logGroups,\n selectedLogGroups: selectedLogGroups,\n loadingLogGroups: false,\n };\n });\n };\n\n onTypeahead = async (typeahead: TypeaheadInput): Promise => {\n const { datasource, query } = this.props;\n const { selectedLogGroups } = this.state;\n\n if (!datasource.languageProvider) {\n return { suggestions: [] };\n }\n\n const cloudwatchLanguageProvider = datasource.languageProvider as CloudWatchLanguageProvider;\n const { history, absoluteRange } = this.props;\n const { prefix, text, value, wrapperClasses, labelKey, editor } = typeahead;\n\n return await cloudwatchLanguageProvider.provideCompletionItems(\n { text, value, prefix, wrapperClasses, labelKey, editor },\n {\n history,\n absoluteRange,\n logGroupNames: selectedLogGroups.map((logGroup) => logGroup.value!),\n region: query.region,\n }\n );\n };\n\n onQueryFieldClick = (_event: Event | React.MouseEvent, _editor: Editor, next: () => any) => {\n const { selectedLogGroups, loadingLogGroups } = this.state;\n\n const queryFieldDisabled = loadingLogGroups || selectedLogGroups.length === 0;\n\n if (queryFieldDisabled) {\n this.setState({\n invalidLogGroups: true,\n });\n }\n\n next();\n };\n\n onOpenLogGroupMenu = () => {\n this.setState({\n invalidLogGroups: false,\n });\n };\n\n render() {\n const { onRunQuery, onChange, ExtraFieldElement, data, query, datasource, allowCustomValue } = this.props;\n const { selectedLogGroups, availableLogGroups, loadingLogGroups, hint, invalidLogGroups } = this.state;\n\n const showError = data && data.error && data.error.refId === query.refId;\n const cleanText = datasource.languageProvider ? datasource.languageProvider.cleanText : undefined;\n\n const MAX_LOG_GROUPS = 20;\n\n return (\n <>\n \n
\n {\n this.setSelectedLogGroups(v);\n }}\n onCreateOption={(v) => {\n this.setCustomLogGroups(v);\n }}\n onBlur={this.props.onRunQuery}\n className={containerClass}\n closeMenuOnSelect={false}\n isClearable={true}\n invalid={invalidLogGroups}\n isOptionDisabled={() => selectedLogGroups.length >= MAX_LOG_GROUPS}\n placeholder=\"Choose Log Groups\"\n maxVisibleValues={4}\n noOptionsMessage=\"No log groups available\"\n isLoading={loadingLogGroups}\n onOpenMenu={this.onOpenLogGroupMenu}\n onInputChange={(value, actionMeta) => {\n this.onLogGroupSearchDebounced(value, query.region, actionMeta);\n }}\n />\n }\n />\n
\n
\n
\n \n
\n {ExtraFieldElement}\n
\n {hint && (\n
\n
\n {hint.message}\n \n {hint.fix.label}\n \n
\n
\n )}\n {showError ? (\n
\n
{data?.error?.message}
\n
\n ) : null}\n \n );\n }\n}\n","// Libraries\nimport { css } from '@emotion/css';\nimport React, { memo } from 'react';\n\n// Types\nimport { AbsoluteTimeRange, QueryEditorProps } from '@grafana/data';\nimport { InlineFormLabel } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../datasource';\nimport { CloudWatchJsonData, CloudWatchLogsQuery, CloudWatchQuery } from '../types';\n\nimport CloudWatchLink from './CloudWatchLink';\nimport { CloudWatchLogsQueryField } from './LogsQueryField';\n\ntype Props = QueryEditorProps & {\n allowCustomValue?: boolean;\n};\n\nconst labelClass = css`\n margin-left: 3px;\n flex-grow: 0;\n`;\n\nexport const CloudWatchLogsQueryEditor = memo(function CloudWatchLogsQueryEditor(props: Props) {\n const { query, data, datasource, onRunQuery, onChange, exploreId, allowCustomValue = false } = props;\n\n let absolute: AbsoluteTimeRange;\n if (data?.request?.range?.from) {\n const { range } = data.request;\n absolute = {\n from: range.from.valueOf(),\n to: range.to.valueOf(),\n };\n } else {\n absolute = {\n from: Date.now() - 10000,\n to: Date.now(),\n };\n }\n\n return (\n \n \n \n }\n />\n );\n});\n\nexport default CloudWatchLogsQueryEditor;\n","import React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { EditorField, EditorFieldGroup, EditorRow, EditorRows } from '@grafana/experimental';\nimport { Select, Switch } from '@grafana/ui';\n\nimport { Dimensions } from '..';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { useDimensionKeys, useMetrics, useNamespaces } from '../../hooks';\nimport { CloudWatchMetricsQuery } from '../../types';\nimport { appendTemplateVariables, toOption } from '../../utils/utils';\n\nexport type Props = {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n disableExpressions?: boolean;\n onChange: (value: CloudWatchMetricsQuery) => void;\n onRunQuery: () => void;\n};\n\nexport function MetricStatEditor({\n query,\n datasource,\n disableExpressions = false,\n onChange,\n onRunQuery,\n}: React.PropsWithChildren) {\n const { region, namespace, metricName, dimensions } = query;\n const namespaces = useNamespaces(datasource);\n const metrics = useMetrics(datasource, region, namespace);\n const dimensionKeys = useDimensionKeys(datasource, region, namespace, metricName, dimensions ?? {});\n\n const onQueryChange = (query: CloudWatchMetricsQuery) => {\n onChange(query);\n onRunQuery();\n };\n\n const onNamespaceChange = async (query: CloudWatchMetricsQuery) => {\n const validatedQuery = await validateMetricName(query);\n onQueryChange(validatedQuery);\n };\n\n const validateMetricName = async (query: CloudWatchMetricsQuery) => {\n let { metricName, namespace, region } = query;\n if (!metricName) {\n return query;\n }\n await datasource.getMetrics(namespace, region).then((result: Array>) => {\n if (!result.find((metric) => metric.value === metricName)) {\n metricName = '';\n }\n });\n return { ...query, metricName };\n };\n\n return (\n \n \n \n \n {\n if (namespace) {\n onNamespaceChange({ ...query, namespace });\n }\n }}\n />\n \n \n {\n if (metricName) {\n onQueryChange({ ...query, metricName });\n }\n }}\n />\n \n\n \n s !== query.statistic).map(toOption)\n )}\n onChange={({ value: statistic }) => {\n if (\n !statistic ||\n (!datasource.standardStatistics.includes(statistic) &&\n !/^p\\d{2}(?:\\.\\d{1,2})?$/.test(statistic) &&\n !statistic.startsWith('$'))\n ) {\n return;\n }\n\n onQueryChange({ ...query, statistic });\n }}\n />\n \n \n \n\n \n \n onQueryChange({ ...query, dimensions })}\n dimensionKeys={dimensionKeys}\n disableExpressions={disableExpressions}\n datasource={datasource}\n />\n \n \n {!disableExpressions && (\n \n \n {\n onQueryChange({\n ...query,\n matchExact: e.currentTarget.checked,\n });\n }}\n />\n \n \n )}\n \n );\n}\n","import React, { ChangeEvent, PureComponent } from 'react';\n\nimport { QueryEditorProps } from '@grafana/data';\nimport { EditorField, EditorRow, Space } from '@grafana/experimental';\nimport { Input } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../datasource';\nimport { isMetricsQuery } from '../guards';\nimport {\n CloudWatchJsonData,\n CloudWatchMetricsQuery,\n CloudWatchQuery,\n MetricEditorMode,\n MetricQueryType,\n} from '../types';\n\nimport QueryHeader from './QueryHeader';\n\nimport { Alias, MathExpressionQueryField, MetricStatEditor, SQLBuilderEditor, SQLCodeEditor } from './';\n\nexport type Props = QueryEditorProps;\n\ninterface State {\n sqlCodeEditorIsDirty: boolean;\n}\n\nexport const normalizeQuery = ({\n namespace,\n metricName,\n expression,\n dimensions,\n region,\n id,\n alias,\n statistic,\n period,\n sqlExpression,\n metricQueryType,\n metricEditorMode,\n ...rest\n}: CloudWatchMetricsQuery): CloudWatchMetricsQuery => {\n const normalizedQuery = {\n queryMode: 'Metrics' as const,\n namespace: namespace ?? '',\n metricName: metricName ?? '',\n expression: expression ?? '',\n dimensions: dimensions ?? {},\n region: region ?? 'default',\n id: id ?? '',\n alias: alias ?? '',\n statistic: statistic ?? 'Average',\n period: period ?? '',\n metricQueryType: metricQueryType ?? MetricQueryType.Search,\n metricEditorMode: metricEditorMode ?? MetricEditorMode.Builder,\n sqlExpression: sqlExpression ?? '',\n ...rest,\n };\n return !rest.hasOwnProperty('matchExact') ? { ...normalizedQuery, matchExact: true } : normalizedQuery;\n};\n\nexport class MetricsQueryEditor extends PureComponent {\n state = {\n sqlCodeEditorIsDirty: false,\n };\n\n componentDidMount = () => {\n const metricsQuery = this.props.query as CloudWatchMetricsQuery;\n const query = normalizeQuery(metricsQuery);\n this.props.onChange(query);\n };\n\n onChange = (query: CloudWatchQuery) => {\n const { onChange, onRunQuery } = this.props;\n onChange(query);\n onRunQuery();\n };\n\n render() {\n const { onRunQuery, datasource } = this.props;\n const metricsQuery = this.props.query as CloudWatchMetricsQuery;\n const query = normalizeQuery(metricsQuery);\n\n return (\n <>\n {\n if (isMetricsQuery(newQuery) && newQuery.metricEditorMode !== query.metricEditorMode) {\n this.setState({ sqlCodeEditorIsDirty: false });\n }\n this.onChange(newQuery);\n }}\n sqlCodeEditorIsDirty={this.state.sqlCodeEditorIsDirty}\n />\n \n\n {query.metricQueryType === MetricQueryType.Search && (\n <>\n {query.metricEditorMode === MetricEditorMode.Builder && (\n \n )}\n {query.metricEditorMode === MetricEditorMode.Code && (\n this.props.onChange({ ...query, expression })}\n datasource={datasource}\n >\n )}\n \n )}\n {query.metricQueryType === MetricQueryType.Query && (\n <>\n {query.metricEditorMode === MetricEditorMode.Code && (\n {\n if (!this.state.sqlCodeEditorIsDirty) {\n this.setState({ sqlCodeEditorIsDirty: true });\n }\n this.props.onChange({ ...metricsQuery, sqlExpression });\n }}\n onRunQuery={onRunQuery}\n datasource={datasource}\n />\n )}\n\n {query.metricEditorMode === MetricEditorMode.Builder && (\n <>\n \n \n )}\n \n )}\n \n \n \n ) =>\n this.onChange({ ...metricsQuery, id: event.target.value })\n }\n type=\"text\"\n invalid={!!query.id && !/^$|^[a-z][a-zA-Z0-9_]*$/.test(query.id)}\n value={query.id}\n />\n \n\n \n ) =>\n this.onChange({ ...metricsQuery, period: event.target.value })\n }\n />\n \n\n \n this.onChange({ ...metricsQuery, alias: value })}\n />\n \n \n \n );\n }\n}\n","import { CloudWatchMetricsQuery, CloudWatchQuery } from './types';\n\nexport const isMetricsQuery = (query: CloudWatchQuery): query is CloudWatchMetricsQuery => {\n return query.queryMode === 'Metrics';\n};\n","import React, { PureComponent } from 'react';\n\nimport { QueryEditorProps, ExploreMode } from '@grafana/data';\n\nimport { CloudWatchDatasource } from '../datasource';\nimport { CloudWatchJsonData, CloudWatchQuery } from '../types';\n\nimport LogsQueryEditor from './LogsQueryEditor';\nimport { MetricsQueryEditor } from './MetricsQueryEditor';\n\nexport type Props = QueryEditorProps;\n\nexport class PanelQueryEditor extends PureComponent {\n render() {\n const { query } = this.props;\n const apiMode = query.queryMode ?? 'Metrics';\n\n return (\n <>\n {apiMode === ExploreMode.Logs ? (\n \n ) : (\n \n )}\n \n );\n }\n}\n","import React, { useCallback, useState } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { InlineSelect, FlexItem } from '@grafana/experimental';\nimport { Button, ConfirmModal, RadioButtonGroup } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../datasource';\nimport { CloudWatchMetricsQuery, CloudWatchQuery, MetricEditorMode, MetricQueryType } from '../types';\n\ninterface MetricsQueryHeaderProps {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n onChange: (query: CloudWatchQuery) => void;\n onRunQuery: () => void;\n sqlCodeEditorIsDirty: boolean;\n}\n\nconst metricEditorModes: Array> = [\n { label: 'Metric Search', value: MetricQueryType.Search },\n { label: 'Metric Query', value: MetricQueryType.Query },\n];\n\nconst editorModes = [\n { label: 'Builder', value: MetricEditorMode.Builder },\n { label: 'Code', value: MetricEditorMode.Code },\n];\n\nconst MetricsQueryHeader: React.FC = ({\n query,\n sqlCodeEditorIsDirty,\n onChange,\n onRunQuery,\n}) => {\n const { metricEditorMode, metricQueryType } = query;\n const [showConfirm, setShowConfirm] = useState(false);\n\n const onEditorModeChange = useCallback(\n (newMetricEditorMode: MetricEditorMode) => {\n if (\n sqlCodeEditorIsDirty &&\n metricQueryType === MetricQueryType.Query &&\n metricEditorMode === MetricEditorMode.Code\n ) {\n setShowConfirm(true);\n return;\n }\n onChange({ ...query, metricEditorMode: newMetricEditorMode });\n },\n [setShowConfirm, onChange, sqlCodeEditorIsDirty, query, metricEditorMode, metricQueryType]\n );\n\n return (\n <>\n m.value === metricQueryType)}\n options={metricEditorModes}\n onChange={({ value }) => {\n onChange({ ...query, metricQueryType: value });\n }}\n />\n \n\n \n\n {query.metricQueryType === MetricQueryType.Query && query.metricEditorMode === MetricEditorMode.Code && (\n \n )}\n\n {\n setShowConfirm(false);\n onChange({ ...query, metricEditorMode: MetricEditorMode.Builder });\n }}\n onDismiss={() => setShowConfirm(false)}\n />\n \n );\n};\n\nexport default MetricsQueryHeader;\n","import { pick } from 'lodash';\nimport React from 'react';\n\nimport { ExploreMode, SelectableValue } from '@grafana/data';\nimport { EditorHeader, InlineSelect } from '@grafana/experimental';\n\nimport { CloudWatchDatasource } from '../datasource';\nimport { useRegions } from '../hooks';\nimport { CloudWatchQuery, CloudWatchQueryMode } from '../types';\n\nimport MetricsQueryHeader from './MetricsQueryHeader';\n\ninterface QueryHeaderProps {\n query: CloudWatchQuery;\n datasource: CloudWatchDatasource;\n onChange: (query: CloudWatchQuery) => void;\n onRunQuery: () => void;\n sqlCodeEditorIsDirty: boolean;\n onRegionChange?: (region: string) => Promise;\n}\n\nconst apiModes: Array> = [\n { label: 'CloudWatch Metrics', value: 'Metrics' },\n { label: 'CloudWatch Logs', value: 'Logs' },\n];\n\nconst QueryHeader: React.FC = ({\n query,\n sqlCodeEditorIsDirty,\n datasource,\n onChange,\n onRunQuery,\n onRegionChange,\n}) => {\n const { queryMode, region } = query;\n\n const [regions, regionIsLoading] = useRegions(datasource);\n\n const onQueryModeChange = ({ value }: SelectableValue) => {\n if (value !== queryMode) {\n const commonProps = pick(query, 'id', 'region', 'namespace', 'refId', 'hide', 'key', 'queryType', 'datasource');\n onChange({\n ...commonProps,\n queryMode: value,\n } as CloudWatchQuery);\n }\n };\n\n const onRegion = async ({ value }: SelectableValue) => {\n if (onRegionChange) {\n await onRegionChange(value ?? 'default');\n }\n onChange({\n ...query,\n region: value,\n } as CloudWatchQuery);\n };\n\n return (\n \n region && onRegion({ value: region })}\n options={regions}\n isLoading={regionIsLoading}\n />\n\n \n\n {queryMode !== ExploreMode.Logs && (\n \n )}\n \n );\n};\n\nexport default QueryHeader;\n","import { css, cx } from '@emotion/css';\nimport React, { FunctionComponent, useMemo } from 'react';\nimport { useAsyncFn } from 'react-use';\n\nimport { GrafanaTheme2, SelectableValue, toOption } from '@grafana/data';\nimport { InputGroup, AccessoryButton } from '@grafana/experimental';\nimport { Select, stylesFactory, useTheme2 } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../datasource';\nimport { CloudWatchMetricsQuery, Dimensions } from '../../types';\nimport { appendTemplateVariables } from '../../utils/utils';\n\nimport { DimensionFilterCondition } from './Dimensions';\n\nexport interface Props {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n filter: DimensionFilterCondition;\n dimensionKeys: Array>;\n disableExpressions: boolean;\n onChange: (value: DimensionFilterCondition) => void;\n onDelete: () => void;\n}\n\nconst wildcardOption = { value: '*', label: '*' };\n\nconst excludeCurrentKey = (dimensions: Dimensions, currentKey: string | undefined) =>\n Object.entries(dimensions ?? {}).reduce((acc, [key, value]) => {\n if (key !== currentKey) {\n return { ...acc, [key]: value };\n }\n return acc;\n }, {});\n\nexport const FilterItem: FunctionComponent = ({\n filter,\n query: { region, namespace, metricName, dimensions },\n datasource,\n dimensionKeys,\n disableExpressions,\n onChange,\n onDelete,\n}) => {\n const dimensionsExcludingCurrentKey = useMemo(\n () => excludeCurrentKey(dimensions ?? {}, filter.key),\n [dimensions, filter]\n );\n\n const loadDimensionValues = async () => {\n if (!filter.key) {\n return [];\n }\n\n return datasource\n .getDimensionValues(region, namespace, metricName, filter.key, dimensionsExcludingCurrentKey)\n .then((result: Array>) => {\n if (result.length && !disableExpressions) {\n result.unshift(wildcardOption);\n }\n return appendTemplateVariables(datasource, result);\n });\n };\n\n const [state, loadOptions] = useAsyncFn(loadDimensionValues, [filter.key, dimensions]);\n const theme = useTheme2();\n const styles = getOperatorStyles(theme);\n\n return (\n
\n \n {\n if (change.label) {\n onChange({ key: change.label, value: undefined });\n }\n }}\n />\n\n =\n\n {\n if (change.value) {\n onChange({ ...filter, value: change.value });\n }\n }}\n />\n \n \n
\n );\n};\n\nconst getOperatorStyles = stylesFactory((theme: GrafanaTheme2) => ({\n root: css({\n padding: theme.spacing(0, 1),\n alignSelf: 'center',\n }),\n}));\n","import { isEqual } from 'lodash';\nimport React, { useMemo, useState } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { EditorList } from '@grafana/experimental';\n\nimport { CloudWatchDatasource } from '../../datasource';\nimport { CloudWatchMetricsQuery, Dimensions as DimensionsType } from '../../types';\n\nimport { FilterItem } from './FilterItem';\n\nexport interface Props {\n query: CloudWatchMetricsQuery;\n onChange: (dimensions: DimensionsType) => void;\n datasource: CloudWatchDatasource;\n dimensionKeys: Array>;\n disableExpressions: boolean;\n}\n\nexport interface DimensionFilterCondition {\n key?: string;\n operator?: string;\n value?: string;\n}\n\nconst dimensionsToFilterConditions = (dimensions: DimensionsType | undefined) =>\n Object.entries(dimensions ?? {}).reduce((acc, [key, value]) => {\n if (value && typeof value === 'string') {\n const filter = {\n key,\n value,\n operator: '=',\n };\n return [...acc, filter];\n }\n return acc;\n }, []);\n\nconst filterConditionsToDimensions = (filters: DimensionFilterCondition[]) => {\n return filters.reduce((acc, { key, value }) => {\n if (key && value) {\n return { ...acc, [key]: value };\n }\n return acc;\n }, {});\n};\n\nexport const Dimensions: React.FC = ({ query, datasource, dimensionKeys, disableExpressions, onChange }) => {\n const dimensionFilters = useMemo(() => dimensionsToFilterConditions(query.dimensions), [query.dimensions]);\n const [items, setItems] = useState(dimensionFilters);\n const onDimensionsChange = (newItems: Array>) => {\n setItems(newItems);\n\n // The onChange event should only be triggered in the case there is a complete dimension object.\n // So when a new key is added that does not yet have a value, it should not trigger an onChange event.\n const newDimensions = filterConditionsToDimensions(newItems);\n if (!isEqual(newDimensions, query.dimensions)) {\n onChange(newDimensions);\n }\n };\n\n return (\n \n );\n};\n\nfunction makeRenderFilter(\n datasource: CloudWatchDatasource,\n query: CloudWatchMetricsQuery,\n dimensionKeys: Array>,\n disableExpressions: boolean\n) {\n function renderFilter(\n item: DimensionFilterCondition,\n onChange: (item: DimensionFilterCondition) => void,\n onDelete: () => void\n ) {\n return (\n onChange(item)}\n datasource={datasource}\n query={query}\n disableExpressions={disableExpressions}\n dimensionKeys={dimensionKeys}\n onDelete={onDelete}\n />\n );\n }\n\n return renderFilter;\n}\n","import React, { InputHTMLAttributes, FunctionComponent } from 'react';\n\nimport { InlineFormLabel } from '@grafana/ui';\n\nexport interface Props extends InputHTMLAttributes {\n label: string;\n tooltip?: string;\n children?: React.ReactNode;\n}\n\nexport const QueryField: FunctionComponent> = ({ label, tooltip, children }) => (\n <>\n \n {label}\n \n {children}\n \n);\n\nexport const QueryInlineField: FunctionComponent = ({ ...props }) => {\n return (\n
\n \n
\n
\n
\n
\n );\n};\n","import { debounce } from 'lodash';\nimport React, { FunctionComponent, useState } from 'react';\n\nimport { Input } from '@grafana/ui';\n\nexport interface Props {\n onChange: (alias: any) => void;\n value: string;\n}\n\nexport const Alias: FunctionComponent = ({ value = '', onChange }) => {\n const [alias, setAlias] = useState(value);\n\n const propagateOnChange = debounce(onChange, 1500);\n\n onChange = (e: any) => {\n setAlias(e.target.value);\n propagateOnChange(e.target.value);\n };\n\n return ;\n};\n","export enum QueryEditorPropertyType {\n String = 'string',\n}\n\nexport interface QueryEditorProperty {\n type: QueryEditorPropertyType;\n name?: string;\n}\n\nexport type QueryEditorOperatorType = string | boolean | number;\ntype QueryEditorOperatorValueType = QueryEditorOperatorType | QueryEditorOperatorType[];\n\nexport interface QueryEditorOperator {\n name?: string;\n value?: T;\n}\n\nexport interface QueryEditorOperatorExpression {\n type: QueryEditorExpressionType.Operator;\n property: QueryEditorProperty;\n operator: QueryEditorOperator;\n}\n\nexport interface QueryEditorArrayExpression {\n type: QueryEditorExpressionType.And | QueryEditorExpressionType.Or;\n expressions: QueryEditorExpression[] | QueryEditorArrayExpression[];\n}\n\nexport interface QueryEditorPropertyExpression {\n type: QueryEditorExpressionType.Property;\n property: QueryEditorProperty;\n}\n\nexport enum QueryEditorExpressionType {\n Property = 'property',\n Operator = 'operator',\n Or = 'or',\n And = 'and',\n GroupBy = 'groupBy',\n Function = 'function',\n FunctionParameter = 'functionParameter',\n}\n\nexport type QueryEditorExpression =\n | QueryEditorArrayExpression\n | QueryEditorPropertyExpression\n | QueryEditorGroupByExpression\n | QueryEditorFunctionExpression\n | QueryEditorFunctionParameterExpression\n | QueryEditorOperatorExpression;\n\nexport interface QueryEditorGroupByExpression {\n type: QueryEditorExpressionType.GroupBy;\n property: QueryEditorProperty;\n}\n\nexport interface QueryEditorFunctionExpression {\n type: QueryEditorExpressionType.Function;\n name?: string;\n parameters?: QueryEditorFunctionParameterExpression[];\n}\n\nexport interface QueryEditorFunctionParameterExpression {\n type: QueryEditorExpressionType.FunctionParameter;\n name?: string;\n}\n","import { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_srv';\n\nimport {\n QueryEditorArrayExpression,\n QueryEditorExpression,\n QueryEditorExpressionType,\n QueryEditorFunctionExpression,\n QueryEditorOperatorExpression,\n QueryEditorPropertyExpression,\n} from '../expressions';\nimport { SQLExpression } from '../types';\n\nexport default class SQLGenerator {\n constructor(private templateSrv: TemplateSrv = getTemplateSrv()) {}\n\n expressionToSqlQuery({\n select,\n from,\n where,\n groupBy,\n orderBy,\n orderByDirection,\n limit,\n }: SQLExpression): string | undefined {\n if (!from || !select?.name || !select?.parameters?.length) {\n return undefined;\n }\n\n let parts: string[] = [];\n this.appendSelect(select, parts);\n this.appendFrom(from, parts);\n this.appendWhere(where, parts, true, where?.expressions?.length ?? 0);\n this.appendGroupBy(groupBy, parts);\n this.appendOrderBy(orderBy, orderByDirection, parts);\n this.appendLimit(limit, parts);\n\n return parts.join(' ');\n }\n\n private appendSelect(select: QueryEditorFunctionExpression | undefined, parts: string[]) {\n parts.push('SELECT');\n this.appendFunction(select, parts);\n }\n\n private appendFrom(from: QueryEditorPropertyExpression | QueryEditorFunctionExpression | undefined, parts: string[]) {\n parts.push('FROM');\n from?.type === QueryEditorExpressionType.Function\n ? this.appendFunction(from, parts)\n : parts.push(this.formatValue(from?.property?.name ?? ''));\n }\n\n private appendWhere(\n filter: QueryEditorExpression | undefined,\n parts: string[],\n isTopLevelExpression: boolean,\n topLevelExpressionsCount: number\n ) {\n if (!filter) {\n return;\n }\n\n const hasChildExpressions = 'expressions' in filter && filter.expressions.length > 0;\n if (isTopLevelExpression && hasChildExpressions) {\n parts.push('WHERE');\n }\n\n if (filter.type === QueryEditorExpressionType.And) {\n const andParts: string[] = [];\n filter.expressions.map((exp) => this.appendWhere(exp, andParts, false, topLevelExpressionsCount));\n if (andParts.length === 0) {\n return;\n }\n const andCombined = andParts.join(' AND ');\n const wrapInParentheses = !isTopLevelExpression && topLevelExpressionsCount > 1 && andParts.length > 1;\n return parts.push(wrapInParentheses ? `(${andCombined})` : andCombined);\n }\n\n if (filter.type === QueryEditorExpressionType.Or) {\n const orParts: string[] = [];\n filter.expressions.map((exp) => this.appendWhere(exp, orParts, false, topLevelExpressionsCount));\n if (orParts.length === 0) {\n return;\n }\n const orCombined = orParts.join(' OR ');\n const wrapInParentheses = !isTopLevelExpression && topLevelExpressionsCount > 1 && orParts.length > 1;\n parts.push(wrapInParentheses ? `(${orCombined})` : orCombined);\n return;\n }\n\n if (filter.type === QueryEditorExpressionType.Operator) {\n return this.appendOperator(filter, parts);\n }\n }\n\n private appendGroupBy(groupBy: QueryEditorArrayExpression | undefined, parts: string[]) {\n const groupByParts: string[] = [];\n for (const expression of groupBy?.expressions ?? []) {\n if (expression?.type !== QueryEditorExpressionType.GroupBy || !expression.property.name) {\n continue;\n }\n groupByParts.push(this.formatValue(expression.property.name));\n }\n\n if (groupByParts.length > 0) {\n parts.push(`GROUP BY ${groupByParts.join(', ')}`);\n }\n }\n\n private appendOrderBy(\n orderBy: QueryEditorFunctionExpression | undefined,\n orderByDirection: string | undefined,\n parts: string[]\n ) {\n if (orderBy) {\n parts.push('ORDER BY');\n this.appendFunction(orderBy, parts);\n parts.push(orderByDirection ?? 'ASC');\n }\n }\n\n private appendLimit(limit: number | undefined, parts: string[]) {\n limit && parts.push(`LIMIT ${limit}`);\n }\n\n private appendOperator(expression: QueryEditorOperatorExpression, parts: string[], prefix?: string) {\n const { property, operator } = expression;\n\n if (!property.name || !operator.name || !operator.value) {\n return;\n }\n\n parts.push(`${this.formatValue(property.name)} ${operator.name} '${operator.value}'`);\n }\n\n private appendFunction(select: QueryEditorFunctionExpression | undefined, parts: string[]) {\n if (!select?.name) {\n return;\n }\n\n const params = (select.parameters ?? [])\n .map((p) => p.name && this.formatValue(p.name))\n .filter(Boolean)\n .join(', ');\n\n parts.push(`${select.name}(${params})`);\n }\n\n private formatValue(label: string): string {\n const specialCharacters = /[/\\s\\.-]/; // slash, space, dot or dash\n\n const interpolated = this.templateSrv.replace(label, {}, 'raw');\n if (specialCharacters.test(interpolated)) {\n return `\"${label}\"`;\n }\n\n return label;\n }\n}\n","import { SCHEMA } from '../../cloudwatch-sql/language';\nimport {\n QueryEditorExpressionType,\n QueryEditorPropertyType,\n QueryEditorFunctionParameterExpression,\n QueryEditorArrayExpression,\n QueryEditorOperatorExpression,\n QueryEditorGroupByExpression,\n} from '../../expressions';\nimport { SQLExpression, CloudWatchMetricsQuery, Dimensions } from '../../types';\n\nimport { SelectableValue } from './../../../../../../../packages/grafana-data/src/types/select';\n\nexport function getMetricNameFromExpression(selectExpression: SQLExpression['select']): string | undefined {\n return selectExpression?.parameters?.[0].name;\n}\n\nexport function getNamespaceFromExpression(fromExpression: SQLExpression['from']): string | undefined {\n // It's just a simple `FROM \"AWS/EC2\"` expression\n if (fromExpression?.type === QueryEditorExpressionType.Property) {\n return fromExpression.property.name; // PR TODO: do we need to test the type here? It can only be string?\n }\n\n // It's a more complicated `FROM SCHEMA(\"AWS/EC2\", ...)` expression\n if (fromExpression?.type === QueryEditorExpressionType.Function) {\n // TODO: do we need to test the name of the function?\n return fromExpression.parameters?.[0].name;\n }\n\n return undefined;\n}\n\nexport function getSchemaLabelKeys(fromExpression: SQLExpression['from']): string[] | undefined {\n // Schema label keys are second to n arguments in the from expression function\n if (fromExpression?.type === QueryEditorExpressionType.Function && fromExpression?.parameters?.length) {\n if (fromExpression?.parameters?.length <= 1) {\n return [];\n }\n\n // ignore the first arg (the namespace)\n const paramExpressions = fromExpression?.parameters.slice(1);\n return paramExpressions.reduce((acc, curr) => (curr.name ? [...acc, curr.name] : acc), []);\n }\n\n return undefined;\n}\n\nexport function isUsingWithSchema(fromExpression: SQLExpression['from']): boolean {\n return fromExpression?.type === QueryEditorExpressionType.Function && fromExpression.name === SCHEMA;\n}\n\n/** Given a partial operator expression, return a non-partial if it's valid, or undefined */\nexport function sanitizeOperator(\n expression: Partial\n): QueryEditorOperatorExpression | undefined {\n const key = expression.property?.name;\n const value = expression.operator?.value;\n const operator = expression.operator?.name;\n\n if (key && value && operator) {\n return {\n type: QueryEditorExpressionType.Operator,\n property: {\n type: QueryEditorPropertyType.String,\n name: key,\n },\n operator: {\n value,\n name: operator,\n },\n };\n }\n\n return undefined;\n}\n\n/**\n * Given an array of Expressions, flattens them to the leaf Operator expressions.\n * Note, this loses context of any nested ANDs or ORs, so will not be useful once we support nested conditions */\nfunction flattenOperatorExpressions(\n expressions: QueryEditorArrayExpression['expressions']\n): QueryEditorOperatorExpression[] {\n return expressions.flatMap((expression) => {\n if (expression.type === QueryEditorExpressionType.Operator) {\n return expression;\n }\n\n if (expression.type === QueryEditorExpressionType.And || expression.type === QueryEditorExpressionType.Or) {\n return flattenOperatorExpressions(expression.expressions);\n }\n\n // Expressions that we don't expect to find in the WHERE filter will be ignored\n return [];\n });\n}\n\n/** Returns a flattened list of WHERE filters, losing all context of nested filters or AND vs OR. Not suitable\n * if the UI supports nested conditions\n */\nexport function getFlattenedFilters(sql: SQLExpression): QueryEditorOperatorExpression[] {\n const where = sql.where;\n return flattenOperatorExpressions(where?.expressions ?? []);\n}\n\n/**\n * Given an array of Expressions, flattens them to the leaf Operator expressions.\n * Note, this loses context of any nested ANDs or ORs, so will not be useful once we support nested conditions */\nfunction flattenGroupByExpressions(\n expressions: QueryEditorArrayExpression['expressions']\n): QueryEditorGroupByExpression[] {\n return expressions.flatMap((expression) => {\n if (expression.type === QueryEditorExpressionType.GroupBy) {\n return expression;\n }\n\n // Expressions that we don't expect to find in the GROUP BY will be ignored\n return [];\n });\n}\n\n/** Returns a flattened list of GROUP BY expressions, losing all context of nested filters or AND vs OR.\n */\nexport function getFlattenedGroupBys(sql: SQLExpression): QueryEditorGroupByExpression[] {\n const groupBy = sql.groupBy;\n return flattenGroupByExpressions(groupBy?.expressions ?? []);\n}\n\n/** Converts a string array to a Dimensions object with null values **/\nexport function stringArrayToDimensions(arr: string[]): Dimensions {\n return arr.reduce((acc, curr) => {\n if (curr) {\n return { ...acc, [curr]: null };\n }\n return acc;\n }, {});\n}\n\nexport function setSql(query: CloudWatchMetricsQuery, sql: SQLExpression): CloudWatchMetricsQuery {\n return {\n ...query,\n sql: {\n ...(query.sql ?? {}),\n ...sql,\n },\n };\n}\n\nexport function setNamespace(query: CloudWatchMetricsQuery, namespace: string | undefined): CloudWatchMetricsQuery {\n const sql = query.sql ?? {};\n //updating `namespace` props for CloudWatchMetricsQuery\n query.namespace = namespace ? namespace : '';\n\n if (namespace === undefined) {\n return setSql(query, {\n from: undefined,\n });\n }\n\n // It's just a simple `FROM \"AWS/EC2\"` expression\n if (!sql.from || sql.from.type === QueryEditorExpressionType.Property) {\n return setSql(query, {\n from: {\n type: QueryEditorExpressionType.Property,\n property: {\n type: QueryEditorPropertyType.String,\n name: namespace,\n },\n },\n });\n }\n\n // It's a more complicated `FROM SCHEMA(\"AWS/EC2\", ...)` expression\n if (sql.from.type === QueryEditorExpressionType.Function) {\n const namespaceParam: QueryEditorFunctionParameterExpression = {\n type: QueryEditorExpressionType.FunctionParameter,\n name: namespace,\n };\n\n const labelKeys = (sql.from.parameters ?? []).slice(1);\n\n return setSql(query, {\n from: {\n type: QueryEditorExpressionType.Function,\n name: SCHEMA,\n parameters: [namespaceParam, ...labelKeys],\n },\n });\n }\n\n // TODO: do the with schema bit\n return query;\n}\n\nexport function setSchemaLabels(\n query: CloudWatchMetricsQuery,\n schemaLabels: Array> | SelectableValue\n): CloudWatchMetricsQuery {\n const sql = query.sql ?? {};\n schemaLabels = Array.isArray(schemaLabels) ? schemaLabels.map((l) => l.value) : [schemaLabels.value];\n\n // schema labels are the second parameter in the schema function. `... FROM SCHEMA(\"AWS/EC2\", label1, label2 ...)`\n if (sql.from?.type === QueryEditorExpressionType.Function && sql.from.parameters?.length) {\n const parameters: QueryEditorFunctionParameterExpression[] = (schemaLabels ?? []).map((label: string) => ({\n type: QueryEditorExpressionType.FunctionParameter,\n name: label,\n }));\n const namespaceParam = (sql.from.parameters ?? [])[0];\n\n return setSql(query, {\n from: {\n type: QueryEditorExpressionType.Function,\n name: SCHEMA,\n parameters: [namespaceParam, ...parameters],\n },\n });\n }\n\n return query;\n}\n\nexport function setMetricName(query: CloudWatchMetricsQuery, metricName: string): CloudWatchMetricsQuery {\n const param: QueryEditorFunctionParameterExpression = {\n type: QueryEditorExpressionType.FunctionParameter,\n name: metricName,\n };\n\n return setSql(query, {\n select: {\n type: QueryEditorExpressionType.Function,\n ...(query.sql?.select ?? {}),\n parameters: [param],\n },\n });\n}\n\nexport function removeMetricName(query: CloudWatchMetricsQuery): CloudWatchMetricsQuery {\n const queryWithNoParams = { ...query };\n delete queryWithNoParams.sql?.select?.parameters;\n\n return queryWithNoParams;\n}\n\nexport function setAggregation(query: CloudWatchMetricsQuery, aggregation: string): CloudWatchMetricsQuery {\n return setSql(query, {\n select: {\n type: QueryEditorExpressionType.Function,\n ...(query.sql?.select ?? {}),\n name: aggregation,\n },\n });\n}\n\nexport function setOrderBy(query: CloudWatchMetricsQuery, aggregation: string): CloudWatchMetricsQuery {\n return setSql(query, {\n orderBy: {\n type: QueryEditorExpressionType.Function,\n name: aggregation,\n },\n });\n}\n\nexport function setWithSchema(query: CloudWatchMetricsQuery, withSchema: boolean): CloudWatchMetricsQuery {\n const namespace = getNamespaceFromExpression((query.sql ?? {}).from);\n\n if (withSchema) {\n const namespaceParam: QueryEditorFunctionParameterExpression = {\n type: QueryEditorExpressionType.FunctionParameter,\n name: namespace,\n };\n\n return setSql(query, {\n from: {\n type: QueryEditorExpressionType.Function,\n name: SCHEMA,\n parameters: [namespaceParam],\n },\n });\n }\n\n return setSql(query, {\n from: {\n type: QueryEditorExpressionType.Property,\n property: {\n type: QueryEditorPropertyType.String,\n name: namespace,\n },\n },\n });\n}\n\n/** Sets the left hand side (InstanceId) in an OperatorExpression\n * Accepts a partial expression to use in an editor\n */\nexport function setOperatorExpressionProperty(\n expression: Partial,\n property: string\n): QueryEditorOperatorExpression {\n return {\n type: QueryEditorExpressionType.Operator,\n property: {\n type: QueryEditorPropertyType.String,\n name: property,\n },\n operator: expression.operator ?? {},\n };\n}\n\n/** Sets the operator (\"==\") in an OperatorExpression\n * Accepts a partial expression to use in an editor\n */\nexport function setOperatorExpressionName(\n expression: Partial,\n name: string\n): QueryEditorOperatorExpression {\n return {\n type: QueryEditorExpressionType.Operator,\n property: expression.property ?? {\n type: QueryEditorPropertyType.String,\n },\n operator: {\n ...expression.operator,\n name,\n },\n };\n}\n\n/** Sets the right hand side (\"i-abc123445\") in an OperatorExpression\n * Accepts a partial expression to use in an editor\n */\nexport function setOperatorExpressionValue(\n expression: Partial,\n value: string\n): QueryEditorOperatorExpression {\n return {\n type: QueryEditorExpressionType.Operator,\n property: expression.property ?? {\n type: QueryEditorPropertyType.String,\n },\n operator: {\n ...expression.operator,\n value,\n },\n };\n}\n\n/** Creates a GroupByExpression for a specified field\n */\nexport function setGroupByField(field: string): QueryEditorGroupByExpression {\n return {\n type: QueryEditorExpressionType.GroupBy,\n property: {\n type: QueryEditorPropertyType.String,\n name: field,\n },\n };\n}\n","import React, { useEffect, useMemo } from 'react';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { EditorField, EditorFieldGroup } from '@grafana/experimental';\nimport { Select, Switch } from '@grafana/ui';\n\nimport { STATISTICS } from '../../cloudwatch-sql/language';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { useDimensionKeys, useMetrics, useNamespaces } from '../../hooks';\nimport { CloudWatchMetricsQuery } from '../../types';\nimport { appendTemplateVariables } from '../../utils/utils';\n\nimport {\n getMetricNameFromExpression,\n getNamespaceFromExpression,\n getSchemaLabelKeys as getSchemaLabels,\n isUsingWithSchema,\n removeMetricName,\n setAggregation,\n setMetricName,\n setNamespace,\n setSchemaLabels,\n setWithSchema,\n stringArrayToDimensions,\n} from './utils';\n\ninterface SQLBuilderSelectRowProps {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n onQueryChange: (query: CloudWatchMetricsQuery) => void;\n}\n\nconst AGGREGATIONS = STATISTICS.map(toOption);\n\nconst SQLBuilderSelectRow: React.FC = ({ datasource, query, onQueryChange }) => {\n const sql = query.sql ?? {};\n\n const aggregation = sql.select?.name;\n useEffect(() => {\n if (!aggregation) {\n onQueryChange(setAggregation(query, STATISTICS[0]));\n }\n }, [aggregation, onQueryChange, query]);\n\n const metricName = getMetricNameFromExpression(sql.select);\n const namespace = getNamespaceFromExpression(sql.from);\n const schemaLabels = getSchemaLabels(sql.from);\n const withSchemaEnabled = isUsingWithSchema(sql.from);\n\n const namespaceOptions = useNamespaces(datasource);\n const metricOptions = useMetrics(datasource, query.region, namespace);\n const existingFilters = useMemo(() => stringArrayToDimensions(schemaLabels ?? []), [schemaLabels]);\n const unusedDimensionKeys = useDimensionKeys(datasource, query.region, namespace, metricName, existingFilters);\n const dimensionKeys = useMemo(\n () => (schemaLabels?.length ? [...unusedDimensionKeys, ...schemaLabels.map(toOption)] : unusedDimensionKeys),\n [unusedDimensionKeys, schemaLabels]\n );\n\n const onNamespaceChange = async (query: CloudWatchMetricsQuery) => {\n const validatedQuery = await validateMetricName(query);\n onQueryChange(validatedQuery);\n };\n\n const validateMetricName = async (query: CloudWatchMetricsQuery) => {\n let { region, sql } = query;\n await datasource.getMetrics(query.namespace, region).then((result: Array>) => {\n if (!result.some((metric) => metric.value === metricName)) {\n sql = removeMetricName(query).sql;\n }\n });\n return { ...query, sql };\n };\n\n return (\n <>\n \n \n value && onNamespaceChange(setNamespace(query, value))}\n menuShouldPortal\n />\n \n\n \n \n ev.target instanceof HTMLInputElement && onQueryChange(setWithSchema(query, ev.target.checked))\n }\n />\n \n\n {withSchemaEnabled && (\n \n item && onQueryChange(setSchemaLabels(query, item))}\n menuShouldPortal\n />\n \n )}\n \n\n \n \n value && onQueryChange(setMetricName(query, value))}\n menuShouldPortal\n />\n \n\n \n value && onQueryChange(setAggregation(query, value))}\n menuShouldPortal\n />\n \n \n \n );\n};\n\nexport default SQLBuilderSelectRow;\n","import React, { useMemo, useState } from 'react';\nimport { useAsyncFn } from 'react-use';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { AccessoryButton, EditorList, InputGroup } from '@grafana/experimental';\nimport { Select } from '@grafana/ui';\n\nimport { COMPARISON_OPERATORS, EQUALS } from '../../cloudwatch-sql/language';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { QueryEditorExpressionType, QueryEditorOperatorExpression, QueryEditorPropertyType } from '../../expressions';\nimport { useDimensionKeys } from '../../hooks';\nimport { CloudWatchMetricsQuery } from '../../types';\nimport { appendTemplateVariables } from '../../utils/utils';\n\nimport {\n getFlattenedFilters,\n getMetricNameFromExpression,\n getNamespaceFromExpression,\n sanitizeOperator,\n setOperatorExpressionName,\n setOperatorExpressionProperty,\n setOperatorExpressionValue,\n setSql,\n} from './utils';\n\ninterface SQLFilterProps {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n onQueryChange: (query: CloudWatchMetricsQuery) => void;\n}\n\nconst OPERATORS = COMPARISON_OPERATORS.map(toOption);\n\nconst SQLFilter: React.FC = ({ query, onQueryChange, datasource }) => {\n const filtersFromQuery = useMemo(() => getFlattenedFilters(query.sql ?? {}), [query.sql]);\n const [filters, setFilters] = useState(filtersFromQuery);\n\n const onChange = (newItems: Array>) => {\n // As new (empty object) items come in, with need to make sure they have the correct type\n const cleaned = newItems.map(\n (v): QueryEditorOperatorExpression => ({\n type: QueryEditorExpressionType.Operator,\n property: v.property ?? { type: QueryEditorPropertyType.String },\n operator: v.operator ?? {\n name: EQUALS,\n },\n })\n );\n\n setFilters(cleaned);\n\n // Only save valid and complete filters into the query state\n const validExpressions: QueryEditorOperatorExpression[] = [];\n for (const operatorExpression of cleaned) {\n const validated = sanitizeOperator(operatorExpression);\n if (validated) {\n validExpressions.push(validated);\n }\n }\n\n const where = validExpressions.length\n ? {\n type: QueryEditorExpressionType.And as const,\n expressions: validExpressions,\n }\n : undefined;\n\n onQueryChange(setSql(query, { where }));\n };\n\n return ;\n};\n\n// Making component functions in the render body is not recommended, but it works for now.\n// If some problems arise (perhaps with state going missing), consider this to be a potential cause\nfunction makeRenderFilter(datasource: CloudWatchDatasource, query: CloudWatchMetricsQuery) {\n function renderFilter(\n item: Partial,\n onChange: (item: QueryEditorOperatorExpression) => void,\n onDelete: () => void\n ) {\n return ;\n }\n\n return renderFilter;\n}\n\nexport default SQLFilter;\n\ninterface FilterItemProps {\n datasource: CloudWatchDatasource;\n query: CloudWatchMetricsQuery;\n filter: Partial;\n onChange: (item: QueryEditorOperatorExpression) => void;\n onDelete: () => void;\n}\n\nconst FilterItem: React.FC = (props) => {\n const { datasource, query, filter, onChange, onDelete } = props;\n const sql = query.sql ?? {};\n\n const namespace = getNamespaceFromExpression(sql.from);\n const metricName = getMetricNameFromExpression(sql.select);\n\n const dimensionKeys = useDimensionKeys(datasource, query.region, namespace, metricName);\n\n const loadDimensionValues = async () => {\n if (!filter.property?.name) {\n return [];\n }\n\n return datasource\n .getDimensionValues(query.region, namespace, metricName, filter.property.name, {})\n .then((result: Array>) => {\n return appendTemplateVariables(datasource, result);\n });\n };\n\n const [state, loadOptions] = useAsyncFn(loadDimensionValues, [\n query.region,\n namespace,\n metricName,\n filter.property?.name,\n ]);\n\n return (\n \n value && onChange(setOperatorExpressionProperty(filter, value))}\n menuShouldPortal\n />\n\n value && onChange(setOperatorExpressionName(filter, value))}\n menuShouldPortal\n />\n\n value && onChange(setOperatorExpressionValue(filter, value))}\n menuShouldPortal\n />\n\n \n \n );\n};\n","import React, { useMemo, useState } from 'react';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { AccessoryButton, EditorList, InputGroup } from '@grafana/experimental';\nimport { Select } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../datasource';\nimport { QueryEditorExpressionType, QueryEditorGroupByExpression, QueryEditorPropertyType } from '../../expressions';\nimport { useDimensionKeys } from '../../hooks';\nimport { CloudWatchMetricsQuery } from '../../types';\n\nimport {\n getFlattenedGroupBys,\n getMetricNameFromExpression,\n getNamespaceFromExpression,\n setGroupByField,\n setSql,\n} from './utils';\n\ninterface SQLGroupByProps {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n onQueryChange: (query: CloudWatchMetricsQuery) => void;\n}\n\nconst SQLGroupBy: React.FC = ({ query, datasource, onQueryChange }) => {\n const sql = query.sql ?? {};\n const groupBysFromQuery = useMemo(() => getFlattenedGroupBys(query.sql ?? {}), [query.sql]);\n const [items, setItems] = useState(groupBysFromQuery);\n\n const namespace = getNamespaceFromExpression(sql.from);\n const metricName = getMetricNameFromExpression(sql.select);\n\n const baseOptions = useDimensionKeys(datasource, query.region, namespace, metricName);\n const options = useMemo(\n // Exclude options we've already selected\n () => baseOptions.filter((option) => !groupBysFromQuery.some((v) => v.property.name === option.value)),\n [baseOptions, groupBysFromQuery]\n );\n\n const onChange = (newItems: Array>) => {\n // As new (empty object) items come in, with need to make sure they have the correct type\n const cleaned = newItems.map(\n (v): QueryEditorGroupByExpression => ({\n type: QueryEditorExpressionType.GroupBy,\n property: {\n type: QueryEditorPropertyType.String,\n name: v.property?.name,\n },\n })\n );\n\n setItems(cleaned);\n\n // Only save complete expressions into the query state;\n const completeExpressions = cleaned.filter((v) => v.property?.name);\n\n const groupBy = completeExpressions.length\n ? {\n type: QueryEditorExpressionType.And as const,\n expressions: completeExpressions,\n }\n : undefined;\n\n onQueryChange(setSql(query, { groupBy }));\n };\n\n return ;\n};\n\nfunction makeRenderItem(options: Array>) {\n function renderItem(\n item: Partial,\n onChange: (item: QueryEditorGroupByExpression) => void,\n onDelete: () => void\n ) {\n return ;\n }\n\n return renderItem;\n}\n\ninterface GroupByItemProps {\n options: Array>;\n item: Partial;\n onChange: (item: QueryEditorGroupByExpression) => void;\n onDelete: () => void;\n}\n\nconst GroupByItem: React.FC = (props) => {\n const { options, item, onChange, onDelete } = props;\n const fieldName = item.property?.name;\n\n return (\n \n value && onChange(setGroupByField(value))}\n menuShouldPortal\n />\n\n \n \n );\n};\n\nexport default SQLGroupBy;\n","import React from 'react';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { AccessoryButton, EditorField, EditorFieldGroup } from '@grafana/experimental';\nimport { Select } from '@grafana/ui';\n\nimport { ASC, DESC, STATISTICS } from '../../cloudwatch-sql/language';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { CloudWatchMetricsQuery } from '../../types';\nimport { appendTemplateVariables } from '../../utils/utils';\n\nimport { setOrderBy, setSql } from './utils';\n\ninterface SQLBuilderSelectRowProps {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n onQueryChange: (query: CloudWatchMetricsQuery) => void;\n}\n\nconst orderByDirections: Array> = [\n { label: ASC, value: ASC },\n { label: DESC, value: DESC },\n];\n\nconst SQLOrderByGroup: React.FC = ({ query, onQueryChange, datasource }) => {\n const sql = query.sql ?? {};\n const orderBy = sql.orderBy?.name;\n const orderByDirection = sql.orderByDirection;\n\n return (\n \n \n <>\n value && onQueryChange(setOrderBy(query, value))}\n options={appendTemplateVariables(datasource, STATISTICS.map(toOption))}\n value={orderBy ? toOption(orderBy) : null}\n menuShouldPortal\n />\n {orderBy && (\n onQueryChange(setSql(query, { orderBy: undefined }))}\n />\n )}\n \n \n\n \n item && onQueryChange(setSql(query, { orderByDirection: item.value }))}\n menuShouldPortal\n />\n \n \n );\n};\n\nexport default SQLOrderByGroup;\n","import React, { useCallback, useEffect, useState } from 'react';\n\nimport { EditorField, EditorRow, EditorRows } from '@grafana/experimental';\nimport { Input } from '@grafana/ui';\n\nimport SQLGenerator from '../../cloudwatch-sql/SQLGenerator';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { CloudWatchMetricsQuery } from '../../types';\n\nimport SQLBuilderSelectRow from './SQLBuilderSelectRow';\nimport SQLFilter from './SQLFilter';\nimport SQLGroupBy from './SQLGroupBy';\nimport SQLOrderByGroup from './SQLOrderByGroup';\nimport { setSql } from './utils';\n\nexport type Props = {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n onChange: (value: CloudWatchMetricsQuery) => void;\n onRunQuery: () => void;\n};\n\nexport function SQLBuilderEditor({ query, datasource, onChange, onRunQuery }: React.PropsWithChildren) {\n const sql = query.sql ?? {};\n\n const onQueryChange = useCallback(\n (query: CloudWatchMetricsQuery) => {\n const sqlGenerator = new SQLGenerator();\n const sqlString = sqlGenerator.expressionToSqlQuery(query.sql ?? {});\n const fullQuery = {\n ...query,\n sqlExpression: sqlString,\n };\n\n onChange(fullQuery);\n onRunQuery();\n },\n [onChange, onRunQuery]\n );\n\n const [sqlPreview, setSQLPreview] = useState();\n useEffect(() => {\n const sqlGenerator = new SQLGenerator();\n const sqlString = sqlGenerator.expressionToSqlQuery(query.sql ?? {});\n if (sqlPreview !== sqlString) {\n setSQLPreview(sqlString);\n }\n }, [query, sqlPreview, setSQLPreview]);\n\n return (\n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n\n \n\n \n {\n const val = e.currentTarget.valueAsNumber;\n onQueryChange(setSql(query, { limit: isNaN(val) ? undefined : val }));\n }}\n type=\"number\"\n min={1}\n />\n \n \n\n {sqlPreview && (\n \n {process.env.NODE_ENV === 'development' &&
{JSON.stringify(query.sql ?? {}, null, 2)}
}\n
{sqlPreview ?? ''}
\n
\n )}\n
\n );\n}\n","import { LanguageDefinition } from '../monarch/register';\n\nconst cloudWatchMetricMathLanguageDefinition: LanguageDefinition = {\n id: 'cloudwatch-MetricMath',\n extensions: [],\n aliases: [],\n mimetypes: [],\n loader: () => import('./language'),\n};\nexport default cloudWatchMetricMathLanguageDefinition;\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\nimport { Monaco } from '@grafana/ui';\n\nimport { CompletionItemProvider } from './CompletionItemProvider';\n\nexport type LanguageDefinition = {\n id: string;\n extensions: string[];\n aliases: string[];\n mimetypes: string[];\n loader: () => Promise<{\n language: monacoType.languages.IMonarchLanguage;\n conf: monacoType.languages.LanguageConfiguration;\n }>;\n};\n\nexport const registerLanguage = (\n monaco: Monaco,\n language: LanguageDefinition,\n completionItemProvider: CompletionItemProvider\n) => {\n const { id, loader } = language;\n\n const languages = monaco.languages.getLanguages();\n if (languages.find((l) => l.id === id)) {\n return;\n }\n\n monaco.languages.register({ id });\n loader().then((monarch) => {\n monaco.languages.setMonarchTokensProvider(id, monarch.language);\n monaco.languages.setLanguageConfiguration(id, monarch.conf);\n monaco.languages.registerCompletionItemProvider(id, completionItemProvider.getCompletionProvider(monaco, language));\n });\n};\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport React, { useCallback, useRef } from 'react';\n\nimport { CodeEditor, Monaco } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../datasource';\nimport language from '../metric-math/definition';\nimport { TRIGGER_SUGGEST } from '../monarch/commands';\nimport { registerLanguage } from '../monarch/register';\n\nexport interface Props {\n onChange: (query: string) => void;\n onRunQuery: () => void;\n expression: string;\n datasource: CloudWatchDatasource;\n}\n\nexport function MathExpressionQueryField({\n expression: query,\n onChange,\n onRunQuery,\n datasource,\n}: React.PropsWithChildren) {\n const containerRef = useRef(null);\n const onEditorMount = useCallback(\n (editor: monacoType.editor.IStandaloneCodeEditor, monaco: Monaco) => {\n editor.onDidFocusEditorText(() => editor.trigger(TRIGGER_SUGGEST.id, TRIGGER_SUGGEST.id, {}));\n editor.addCommand(monaco.KeyMod.Shift | monaco.KeyCode.Enter, () => {\n const text = editor.getValue();\n onChange(text);\n onRunQuery();\n });\n\n // auto resizes the editor to be the height of the content it holds\n // this code comes from the Prometheus query editor.\n // We may wish to consider abstracting it into the grafana/ui repo in the future\n const updateElementHeight = () => {\n const containerDiv = containerRef.current;\n if (containerDiv !== null && editor.getContentHeight() < 200) {\n const pixelHeight = editor.getContentHeight();\n containerDiv.style.height = `${pixelHeight}px`;\n containerDiv.style.width = '100%';\n const pixelWidth = containerDiv.clientWidth;\n editor.layout({ width: pixelWidth, height: pixelHeight });\n }\n };\n\n editor.onDidContentSizeChange(updateElementHeight);\n updateElementHeight();\n },\n [onChange, onRunQuery]\n );\n\n return (\n
\n {\n if (value !== query) {\n onChange(value);\n onRunQuery();\n }\n }}\n onBeforeEditorMount={(monaco: Monaco) =>\n registerLanguage(monaco, language, datasource.metricMathCompletionItemProvider)\n }\n onEditorDidMount={onEditorMount}\n />\n
\n );\n}\n","import { LanguageDefinition } from '../monarch/register';\n\nconst cloudWatchSqlLanguageDefinition: LanguageDefinition = {\n id: 'cloudwatch-sql',\n extensions: ['.cloudwatchSql'],\n aliases: ['CloudWatch', 'cloudwatch', 'CloudWatchSQL'],\n mimetypes: [],\n loader: () => import('./language'),\n};\nexport default cloudWatchSqlLanguageDefinition;\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport React, { FunctionComponent, useCallback, useEffect } from 'react';\n\nimport { CodeEditor, Monaco } from '@grafana/ui';\n\nimport language from '../cloudwatch-sql/definition';\nimport { CloudWatchDatasource } from '../datasource';\nimport { TRIGGER_SUGGEST } from '../monarch/commands';\nimport { registerLanguage } from '../monarch/register';\n\nexport interface Props {\n region: string;\n sql: string;\n onChange: (sql: string) => void;\n onRunQuery: () => void;\n datasource: CloudWatchDatasource;\n}\n\nexport const SQLCodeEditor: FunctionComponent = ({ region, sql, onChange, onRunQuery, datasource }) => {\n useEffect(() => {\n datasource.sqlCompletionItemProvider.setRegion(region);\n }, [region, datasource]);\n\n const onEditorMount = useCallback(\n (editor: monacoType.editor.IStandaloneCodeEditor, monaco: Monaco) => {\n editor.onDidFocusEditorText(() => editor.trigger(TRIGGER_SUGGEST.id, TRIGGER_SUGGEST.id, {}));\n editor.addCommand(monaco.KeyMod.Shift | monaco.KeyCode.Enter, () => {\n const text = editor.getValue();\n onChange(text);\n onRunQuery();\n });\n },\n [onChange, onRunQuery]\n );\n\n return (\n {\n if (value !== sql) {\n onChange(value);\n }\n }}\n showMiniMap={false}\n showLineNumbers={true}\n onBeforeEditorMount={(monaco: Monaco) => registerLanguage(monaco, language, datasource.sqlCompletionItemProvider)}\n onEditorDidMount={onEditorMount}\n />\n );\n};\n","import { useEffect, useRef } from 'react';\nvar isPrimitive = function (val) { return val !== Object(val); };\nvar useCustomCompareEffect = function (effect, deps, depsEqual) {\n if (process.env.NODE_ENV !== 'production') {\n if (!(deps instanceof Array) || !deps.length) {\n console.warn('`useCustomCompareEffect` should not be used with no dependencies. Use React.useEffect instead.');\n }\n if (deps.every(isPrimitive)) {\n console.warn('`useCustomCompareEffect` should not be used with dependencies that are all primitive values. Use React.useEffect instead.');\n }\n if (typeof depsEqual !== 'function') {\n console.warn('`useCustomCompareEffect` should be used with depsEqual callback for comparing deps list');\n }\n }\n var ref = useRef(undefined);\n if (!ref.current || !depsEqual(deps, ref.current)) {\n ref.current = deps;\n }\n useEffect(effect, ref.current);\n};\nexport default useCustomCompareEffect;\n","import isDeepEqualReact from 'fast-deep-equal/react';\nexport default isDeepEqualReact;\n","import useCustomCompareEffect from './useCustomCompareEffect';\nimport isDeepEqual from './misc/isDeepEqual';\nvar isPrimitive = function (val) { return val !== Object(val); };\nvar useDeepCompareEffect = function (effect, deps) {\n if (process.env.NODE_ENV !== 'production') {\n if (!(deps instanceof Array) || !deps.length) {\n console.warn('`useDeepCompareEffect` should not be used with no dependencies. Use React.useEffect instead.');\n }\n if (deps.every(isPrimitive)) {\n console.warn('`useDeepCompareEffect` should not be used with dependencies that are all primitive values. Use React.useEffect instead.');\n }\n }\n useCustomCompareEffect(effect, deps, isDeepEqual);\n};\nexport default useDeepCompareEffect;\n","import { useEffect, useState } from 'react';\nimport { useDeepCompareEffect } from 'react-use';\n\nimport { SelectableValue, toOption } from '@grafana/data';\n\nimport { CloudWatchDatasource } from './datasource';\nimport { Dimensions } from './types';\nimport { appendTemplateVariables } from './utils/utils';\n\nexport const useRegions = (datasource: CloudWatchDatasource): [Array>, boolean] => {\n const [regionsIsLoading, setRegionsIsLoading] = useState(false);\n const [regions, setRegions] = useState>>([{ label: 'default', value: 'default' }]);\n\n useEffect(() => {\n setRegionsIsLoading(true);\n\n const variableOptionGroup = {\n label: 'Template Variables',\n options: datasource.getVariables().map(toOption),\n };\n\n datasource\n .getRegions()\n .then((regions: Array>) => setRegions([...regions, variableOptionGroup]))\n .finally(() => setRegionsIsLoading(false));\n }, [datasource]);\n\n return [regions, regionsIsLoading];\n};\n\nexport const useNamespaces = (datasource: CloudWatchDatasource) => {\n const [namespaces, setNamespaces] = useState>>([]);\n useEffect(() => {\n datasource.getNamespaces().then((namespaces) => {\n setNamespaces(appendTemplateVariables(datasource, namespaces));\n });\n }, [datasource]);\n\n return namespaces;\n};\n\nexport const useMetrics = (datasource: CloudWatchDatasource, region: string, namespace: string | undefined) => {\n const [metrics, setMetrics] = useState>>([]);\n useEffect(() => {\n datasource.getMetrics(namespace, region).then((result: Array>) => {\n setMetrics(appendTemplateVariables(datasource, result));\n });\n }, [datasource, region, namespace]);\n\n return metrics;\n};\n\nexport const useDimensionKeys = (\n datasource: CloudWatchDatasource,\n region: string,\n namespace: string | undefined,\n metricName: string | undefined,\n dimensionFilter?: Dimensions\n) => {\n const [dimensionKeys, setDimensionKeys] = useState>>([]);\n\n // doing deep comparison to avoid making new api calls to list metrics unless dimension filter object props changes\n useDeepCompareEffect(() => {\n datasource\n .getDimensionKeys(namespace, region, dimensionFilter, metricName)\n .then((result: Array>) => {\n setDimensionKeys(appendTemplateVariables(datasource, result));\n });\n }, [datasource, region, namespace, metricName, dimensionFilter]);\n\n return dimensionKeys;\n};\n","export const TRIGGER_SUGGEST = {\n id: 'editor.action.triggerSuggest',\n title: '',\n};\n","import { Grammar } from 'prismjs';\n\nimport { CompletionItem } from '@grafana/ui';\n\nexport const QUERY_COMMANDS: CompletionItem[] = [\n {\n label: 'fields',\n documentation: 'Retrieves the specified fields from log events',\n },\n { label: 'display', documentation: 'Specifies which fields to display in the query results' },\n {\n label: 'filter',\n documentation: 'Filters the results of a query based on one or more conditions',\n },\n {\n label: 'stats',\n documentation: 'Calculates aggregate statistics based on the values of log fields',\n },\n { label: 'sort', documentation: 'Sorts the retrieved log events' },\n { label: 'limit', documentation: 'Specifies the number of log events returned by the query' },\n {\n label: 'parse',\n documentation:\n 'Extracts data from a log field, creating one or more ephemeral fields that you can process further in the query',\n },\n];\n\nexport const COMPARISON_OPERATORS = ['=', '!=', '<', '<=', '>', '>='];\nexport const ARITHMETIC_OPERATORS = ['+', '-', '*', '/', '^', '%'];\n\nexport const NUMERIC_OPERATORS = [\n {\n label: 'abs',\n detail: 'abs(a)',\n documentation: 'Absolute value.',\n },\n {\n label: 'ceil',\n detail: 'ceil(a)',\n documentation: 'Round to ceiling (the smallest integer that is greater than the value of a).',\n },\n {\n label: 'floor',\n detail: 'floor(a)',\n documentation: 'Round to floor (the largest integer that is smaller than the value of a).',\n },\n {\n label: 'greatest',\n detail: 'greatest(a,b, ... z)',\n documentation: 'Returns the largest value.',\n },\n {\n label: 'least',\n detail: 'least(a, b, ... z)',\n documentation: 'Returns the smallest value.',\n },\n {\n label: 'log',\n detail: 'log(a)',\n documentation: 'Natural logarithm.',\n },\n {\n label: 'sqrt',\n detail: 'sqrt(a)',\n documentation: 'Square root.',\n },\n];\n\nexport const GENERAL_FUNCTIONS = [\n {\n label: 'ispresent',\n detail: 'ispresent(fieldname)',\n documentation: 'Returns true if the field exists.',\n },\n {\n label: 'coalesce',\n detail: 'coalesce(fieldname1, fieldname2, ... fieldnamex)',\n documentation: 'Returns the first non-null value from the list.',\n },\n];\n\nexport const STRING_FUNCTIONS = [\n {\n label: 'isempty',\n detail: 'isempty(fieldname)',\n documentation: 'Returns true if the field is missing or is an empty string.',\n },\n {\n label: 'isblank',\n detail: 'isblank(fieldname)',\n documentation: 'Returns true if the field is missing, an empty string, or contains only white space.',\n },\n {\n label: 'concat',\n detail: 'concat(string1, string2, ... stringz)',\n documentation: 'Concatenates the strings.',\n },\n {\n label: 'ltrim',\n detail: 'ltrim(string) or ltrim(string1, string2)',\n documentation:\n 'Remove white space from the left of the string. If the function has a second string argument, it removes the characters of string2 from the left of string1.',\n },\n {\n label: 'rtrim',\n detail: 'rtrim(string) or rtrim(string1, string2)',\n documentation:\n 'Remove white space from the right of the string. If the function has a second string argument, it removes the characters of string2 from the right of string1.',\n },\n {\n label: 'trim',\n detail: 'trim(string) or trim(string1, string2)',\n documentation:\n 'Remove white space from both ends of the string. If the function has a second string argument, it removes the characters of string2 from both sides of string1.',\n },\n {\n label: 'strlen',\n detail: 'strlen(string)',\n documentation: 'Returns the length of the string in Unicode code points.',\n },\n {\n label: 'toupper',\n detail: 'toupper(string)',\n documentation: 'Converts the string to uppercase.',\n },\n {\n label: 'tolower',\n detail: 'tolower(string)',\n documentation: 'Converts the string to lowercase.',\n },\n {\n label: 'substr',\n detail: 'substr(string1, x), or substr(string1, x, y)',\n documentation:\n 'Returns a substring from the index specified by the number argument to the end of the string. If the function has a second number argument, it contains the length of the substring to be retrieved.',\n },\n {\n label: 'replace',\n detail: 'replace(string1, string2, string3)',\n documentation: 'Replaces all instances of string2 in string1 with string3.',\n },\n {\n label: 'strcontains',\n detail: 'strcontains(string1, string2)',\n documentation: 'Returns 1 if string1 contains string2 and 0 otherwise.',\n },\n];\n\nexport const DATETIME_FUNCTIONS = [\n {\n label: 'bin',\n detail: 'bin(period)',\n documentation: 'Rounds the value of @timestamp to the given period and then truncates.',\n },\n {\n label: 'datefloor',\n detail: 'datefloor(a, period)',\n documentation: 'Truncates the timestamp to the given period.',\n },\n {\n label: 'dateceil',\n detail: 'dateceil(a, period)',\n documentation: 'Rounds up the timestamp to the given period and then truncates.',\n },\n {\n label: 'fromMillis',\n detail: 'fromMillis(fieldname)',\n documentation:\n 'Interprets the input field as the number of milliseconds since the Unix epoch and converts it to a timestamp.',\n },\n {\n label: 'toMillis',\n detail: 'toMillis(fieldname)',\n documentation:\n 'Converts the timestamp found in the named field into a number representing the milliseconds since the Unix epoch.',\n },\n];\n\nexport const IP_FUNCTIONS = [\n {\n label: 'isValidIp',\n detail: 'isValidIp(fieldname)',\n documentation: 'Returns true if the field is a valid v4 or v6 IP address.',\n },\n {\n label: 'isValidIpV4',\n detail: 'isValidIpV4(fieldname)',\n documentation: 'Returns true if the field is a valid v4 IP address.',\n },\n {\n label: 'isValidIpV6',\n detail: 'isValidIpV6(fieldname)',\n documentation: 'Returns true if the field is a valid v6 IP address.',\n },\n {\n label: 'isIpInSubnet',\n detail: 'isIpInSubnet(fieldname, string)',\n documentation: 'Returns true if the field is a valid v4 or v6 IP address within the specified v4 or v6 subnet.',\n },\n {\n label: 'isIpv4InSubnet',\n detail: 'isIpv4InSubnet(fieldname, string)',\n documentation: 'Returns true if the field is a valid v4 IP address within the specified v4 subnet.',\n },\n {\n label: 'isIpv6InSubnet',\n detail: 'isIpv6InSubnet(fieldname, string)',\n documentation: 'Returns true if the field is a valid v6 IP address within the specified v6 subnet.',\n },\n];\n\nexport const BOOLEAN_FUNCTIONS = [\n {\n label: 'ispresent',\n detail: 'ispresent(fieldname)',\n documentation: 'Returns true if the field exists.',\n },\n {\n label: 'isempty',\n detail: 'isempty(fieldname)',\n documentation: 'Returns true if the field is missing or is an empty string.',\n },\n {\n label: 'isblank',\n detail: 'isblank(fieldname)',\n documentation: 'Returns true if the field is missing, an empty string, or contains only white space.',\n },\n {\n label: 'strcontains',\n detail: 'strcontains(string1, string2)',\n documentation: 'Returns 1 if string1 contains string2 and 0 otherwise.',\n },\n ...IP_FUNCTIONS,\n];\n\nexport const AGGREGATION_FUNCTIONS_STATS = [\n {\n label: 'avg',\n detail: 'avg(NumericFieldname)',\n documentation: 'The average of the values in the specified field.',\n },\n {\n label: 'count',\n detail: 'count(fieldname) or count(*)',\n documentation: 'Counts the log records.',\n },\n {\n label: 'count_distinct',\n detail: 'count_distinct(fieldname)',\n documentation: 'Returns the number of unique values for the field.',\n },\n {\n label: 'max',\n detail: 'max(fieldname)',\n documentation: 'The maximum of the values for this log field in the queried logs.',\n },\n {\n label: 'min',\n detail: 'min(fieldname)',\n documentation: 'The minimum of the values for this log field in the queried logs.',\n },\n {\n label: 'pct',\n detail: 'pct(fieldname, value)',\n documentation: 'A percentile indicates the relative standing of a value in a datas.',\n },\n {\n label: 'stddev',\n detail: 'stddev(NumericFieldname)',\n documentation: 'The standard deviation of the values in the specified field.',\n },\n {\n label: 'sum',\n detail: 'sum(NumericFieldname)',\n documentation: 'The sum of the values in the specified field.',\n },\n];\n\nexport const NON_AGGREGATION_FUNCS_STATS = [\n {\n label: 'earliest',\n detail: 'earliest(fieldname)',\n documentation:\n 'Returns the value of fieldName from the log event that has the earliest time stamp in the queried logs.',\n },\n {\n label: 'latest',\n detail: 'latest(fieldname)',\n documentation:\n 'Returns the value of fieldName from the log event that has the latest time stamp in the queried logs.',\n },\n {\n label: 'sortsFirst',\n detail: 'sortsFirst(fieldname)',\n documentation: 'Returns the value of fieldName that sorts first in the queried logs.',\n },\n {\n label: 'sortsLast',\n detail: 'sortsLast(fieldname)',\n documentation: 'Returns the value of fieldName that sorts last in the queried logs.',\n },\n];\n\nexport const STATS_FUNCS = [...AGGREGATION_FUNCTIONS_STATS, ...NON_AGGREGATION_FUNCS_STATS];\n\nexport const KEYWORDS = ['as', 'like', 'by', 'in', 'desc', 'asc'];\nexport const FIELD_AND_FILTER_FUNCTIONS = [\n ...NUMERIC_OPERATORS,\n ...GENERAL_FUNCTIONS,\n ...STRING_FUNCTIONS,\n ...DATETIME_FUNCTIONS,\n ...IP_FUNCTIONS,\n];\n\nexport const FUNCTIONS = [...FIELD_AND_FILTER_FUNCTIONS, ...STATS_FUNCS];\n\nconst tokenizer: Grammar = {\n comment: {\n pattern: /^#.*/,\n greedy: true,\n },\n backticks: {\n pattern: /`.*?`/,\n alias: 'string',\n greedy: true,\n },\n quote: {\n pattern: /\".*?\"/,\n alias: 'string',\n greedy: true,\n },\n regex: {\n pattern: /\\/.*?\\/(?=\\||\\s*$|,)/,\n greedy: true,\n },\n 'query-command': {\n pattern: new RegExp(`\\\\b(?:${QUERY_COMMANDS.map((command) => command.label).join('|')})\\\\b`, 'i'),\n alias: 'function',\n },\n function: {\n pattern: new RegExp(`\\\\b(?:${FUNCTIONS.map((f) => f.label).join('|')})\\\\b`, 'i'),\n },\n keyword: {\n pattern: new RegExp(`(\\\\s+)(${KEYWORDS.join('|')})(?=\\\\s+)`, 'i'),\n lookbehind: true,\n },\n // 'log-group-name': {\n // pattern: /[\\.\\-_/#A-Za-z0-9]+/,\n // },\n 'field-name': {\n pattern: /(@?[_a-zA-Z]+[_.0-9a-zA-Z]*)|(`((\\\\`)|([^`]))*?`)/,\n greedy: true,\n },\n number: /\\b-?\\d+((\\.\\d*)?([eE][+-]?\\d+)?)?\\b/,\n 'command-separator': {\n pattern: /\\|/,\n alias: 'punctuation',\n },\n 'comparison-operator': {\n pattern: /([<>]=?)|(!?=)/,\n },\n punctuation: /[{}()`,.]/,\n whitespace: /\\s+/,\n};\n\nexport default tokenizer;\n","import { SelectableValue } from '@grafana/data';\n\nimport { CloudWatchDatasource } from './../datasource';\n\nexport const toOption = (value: string) => ({ label: value, value });\n\nexport const appendTemplateVariables = (datasource: CloudWatchDatasource, values: SelectableValue[]) => [\n ...values,\n { label: 'Template Variables', options: datasource.getVariables().map(toOption) },\n];\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (key === '_owner' && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner.\n // _owner contains circular references\n // and is not needed when comparing the actual elements (and not their owners)\n continue;\n }\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","module.exports = require('./lib/jsurl');","/**\n * Copyright (c) 2011 Bruno Jouhier \n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n//\n(function(exports) {\n\t\"use strict\";\n\texports.stringify = function stringify(v) {\n\t\tfunction encode(s) {\n\t\t\treturn !/[^\\w-.]/.test(s) ? s : s.replace(/[^\\w-.]/g, function(ch) {\n\t\t\t\tif (ch === '$') return '!';\n\t\t\t\tch = ch.charCodeAt(0);\n\t\t\t\t// thanks to Douglas Crockford for the negative slice trick\n\t\t\t\treturn ch < 0x100 ? '*' + ('00' + ch.toString(16)).slice(-2) : '**' + ('0000' + ch.toString(16)).slice(-4);\n\t\t\t});\n\t\t}\n\n\t\tvar tmpAry;\n\n\t\tswitch (typeof v) {\n\t\t\tcase 'number':\n\t\t\t\treturn isFinite(v) ? '~' + v : '~null';\n\t\t\tcase 'boolean':\n\t\t\t\treturn '~' + v;\n\t\t\tcase 'string':\n\t\t\t\treturn \"~'\" + encode(v);\n\t\t\tcase 'object':\n\t\t\t\tif (!v) return '~null';\n\n\t\t\t\ttmpAry = [];\n\n\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\tfor (var i = 0; i < v.length; i++) {\n\t\t\t\t\t\ttmpAry[i] = stringify(v[i]) || '~null';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn '~(' + (tmpAry.join('') || '~') + ')';\n\t\t\t\t} else {\n\t\t\t\t\tfor (var key in v) {\n\t\t\t\t\t\tif (v.hasOwnProperty(key)) {\n\t\t\t\t\t\t\tvar val = stringify(v[key]);\n\n\t\t\t\t\t\t\t// skip undefined and functions\n\t\t\t\t\t\t\tif (val) {\n\t\t\t\t\t\t\t\ttmpAry.push(encode(key) + val);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn '~(' + tmpAry.join('~') + ')';\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\t// function, undefined\n\t\t\t\treturn;\n\t\t}\n\t};\n\n\tvar reserved = {\n\t\t\"true\": true,\n\t\t\"false\": false,\n\t\t\"null\": null\n\t};\n\n\texports.parse = function(s) {\n\t\tif (!s) return s;\n\t\ts = s.replace(/%(25)*27/g, \"'\");\n\t\tvar i = 0,\n\t\t\tlen = s.length;\n\n\t\tfunction eat(expected) {\n\t\t\tif (s.charAt(i) !== expected) throw new Error(\"bad JSURL syntax: expected \" + expected + \", got \" + (s && s.charAt(i)));\n\t\t\ti++;\n\t\t}\n\n\t\tfunction decode() {\n\t\t\tvar beg = i,\n\t\t\t\tch, r = \"\";\n\t\t\twhile (i < len && (ch = s.charAt(i)) !== '~' && ch !== ')') {\n\t\t\t\tswitch (ch) {\n\t\t\t\t\tcase '*':\n\t\t\t\t\t\tif (beg < i) r += s.substring(beg, i);\n\t\t\t\t\t\tif (s.charAt(i + 1) === '*') r += String.fromCharCode(parseInt(s.substring(i + 2, i + 6), 16)), beg = (i += 6);\n\t\t\t\t\t\telse r += String.fromCharCode(parseInt(s.substring(i + 1, i + 3), 16)), beg = (i += 3);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '!':\n\t\t\t\t\t\tif (beg < i) r += s.substring(beg, i);\n\t\t\t\t\t\tr += '$', beg = ++i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn r + s.substring(beg, i);\n\t\t}\n\n\t\treturn (function parseOne() {\n\t\t\tvar result, ch, beg;\n\t\t\teat('~');\n\t\t\tswitch (ch = s.charAt(i)) {\n\t\t\t\tcase '(':\n\t\t\t\t\ti++;\n\t\t\t\t\tif (s.charAt(i) === '~') {\n\t\t\t\t\t\tresult = [];\n\t\t\t\t\t\tif (s.charAt(i + 1) === ')') i++;\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t\tresult.push(parseOne());\n\t\t\t\t\t\t\t} while (s.charAt(i) === '~');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t\tif (s.charAt(i) !== ')') {\n\t\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t\tvar key = decode();\n\t\t\t\t\t\t\t\tresult[key] = parseOne();\n\t\t\t\t\t\t\t} while (s.charAt(i) === '~' && ++i);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\teat(')');\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"'\":\n\t\t\t\t\ti++;\n\t\t\t\t\tresult = decode();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbeg = i++;\n\t\t\t\t\twhile (i < len && /[^)~]/.test(s.charAt(i)))\n\t\t\t\t\ti++;\n\t\t\t\t\tvar sub = s.substring(beg, i);\n\t\t\t\t\tif (/[\\d\\-]/.test(ch)) {\n\t\t\t\t\t\tresult = parseFloat(sub);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = reserved[sub];\n\t\t\t\t\t\tif (typeof result === \"undefined\") throw new Error(\"bad value keyword: \" + sub);\n\t\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t})();\n\t}\n\n\texports.tryParse = function(s, def) {\n\t\ttry {\n\t\t\treturn exports.parse(s);\n\t\t} catch (ex) {\n\t\t\treturn def;\n\t\t}\n\t}\n\n})(typeof exports !== 'undefined' ? exports : (window.JSURL = window.JSURL || {}));\n"],"names":["JSURL","require","encodeUrl","obj","region","stringify","SELECT","FROM","WHERE","GROUP","ORDER","BY","DESC","ASC","LIMIT","WITH","SCHEMA","KEYWORDS","STATISTICS","AND","LOGICAL_OPERATORS","EQUALS","NOT_EQUALS","COMPARISON_OPERATORS","language","defaultToken","tokenPostfix","ignoreCase","brackets","open","close","token","keywords","operators","builtinFunctions","tokenizer","root","include","cases","whitespace","comments","comment","numbers","strings","next","string","string_double","complexIdentifiers","bracketedIdentifier","quotedIdentifier","conf","lineComment","blockComment","autoClosingPairs","surroundingPairs","CloudWatchLink","Component","href","prevProps","panelData","panelDataNew","this","props","panelDataOld","request","getExternalLink","setState","query","datasource","range","start","from","toISOString","urlProps","end","to","timeType","tz","editorString","expression","isLiveTail","source","logGroupNames","getActualRegion","render","state","target","rel","Icon","name","byRE","groupsRE","getStatsGroups","b","groups","match","g","lastIndex","index","length","exec","push","containerClass","css","rowGap","CloudWatchLogsQueryField","React","constructor","context","super","selectedLogGroups","map","logGroup","value","label","availableLogGroups","invalidLogGroups","loadingLogGroups","hint","undefined","async","logGroupNamePrefix","describeLogGroups","refId","err","errMessage","JSON","e","dispatch","notifyApp","createErrorNotification","searchTerm","actionMeta","action","Promise","resolve","test","fetchLogGroupOptions","then","matchingLogGroups","unionBy","finally","debounce","onLogGroupSearch","onChange","logGroups","nextQuery","group","logGroupName","statsGroups","v","customLogGroup","setSelectedLogGroups","intersectionBy","languageProvider","suggestions","cloudwatchLanguageProvider","history","absoluteRange","prefix","text","wrapperClasses","labelKey","editor","typeahead","provideCompletionItems","_event","_editor","plugins","BracesPlugin","SlatePrism","onlyIn","node","object","type","getSyntax","prismLanguages","cloudwatch","syntax","onRunQuery","ExtraFieldElement","data","allowCustomValue","showError","error","cleanText","QueryHeader","sqlCodeEditorIsDirty","onRegionChange","className","LegacyForms","labelWidth","inputEl","MultiSelect","menuShouldPortal","options","appendTemplateVariables","onCreateOption","setCustomLogGroups","onBlur","closeMenuOnSelect","isClearable","invalid","isOptionDisabled","placeholder","maxVisibleValues","noOptionsMessage","isLoading","onOpenMenu","onOpenLogGroupMenu","onInputChange","onLogGroupSearchDebounced","QueryField","additionalPlugins","onChangeQuery","onClick","onQueryFieldClick","onTypeahead","portalOrigin","disabled","message","fix","labelClass","CloudWatchLogsQueryEditor","memo","exploreId","absolute","valueOf","Date","now","InlineFormLabel","width","tooltip","MetricStatEditor","disableExpressions","namespace","metricName","dimensions","namespaces","useNamespaces","metrics","useMetrics","dimensionKeys","useDimensionKeys","onQueryChange","validateMetricName","getMetrics","result","find","metric","EditorRows","EditorRow","EditorFieldGroup","EditorField","Select","validatedQuery","onNamespaceChange","inputId","toOption","statistic","standardStatistics","filter","s","includes","startsWith","optional","Switch","id","matchExact","currentTarget","checked","normalizeQuery","alias","period","sqlExpression","metricQueryType","metricEditorMode","rest","normalizedQuery","queryMode","MetricQueryType","MetricEditorMode","hasOwnProperty","MetricsQueryEditor","PureComponent","metricsQuery","newQuery","isMetricsQuery","Space","sql","Input","event","PanelQueryEditor","apiMode","ExploreMode","LogsQueryEditor","metricEditorModes","editorModes","showConfirm","setShowConfirm","useState","onEditorModeChange","useCallback","newMetricEditorMode","InlineSelect","m","FlexItem","grow","RadioButtonGroup","size","Button","variant","ConfirmModal","isOpen","title","body","confirmText","dismissText","icon","onConfirm","onDismiss","apiModes","regions","regionIsLoading","useRegions","EditorHeader","onRegion","commonProps","pick","wildcardOption","FilterItem","onDelete","dimensionsExcludingCurrentKey","useMemo","currentKey","Object","entries","reduce","acc","key","excludeCurrentKey","loadOptions","useAsyncFn","getDimensionValues","unshift","theme","useTheme2","styles","getOperatorStyles","InputGroup","change","cx","loading","AccessoryButton","stylesFactory","padding","spacing","alignSelf","Dimensions","dimensionFilters","dimensionsToFilterConditions","operator","items","setItems","EditorList","newItems","newDimensions","isEqual","renderItem","makeRenderFilter","item","Alias","setAlias","propagateOnChange","QueryEditorPropertyType","QueryEditorExpressionType","SQLGenerator","templateSrv","getTemplateSrv","expressionToSqlQuery","select","where","groupBy","orderBy","orderByDirection","limit","parameters","parts","appendSelect","appendFrom","appendWhere","expressions","appendGroupBy","appendOrderBy","appendLimit","join","appendFunction","Function","formatValue","property","isTopLevelExpression","topLevelExpressionsCount","hasChildExpressions","And","andParts","exp","andCombined","wrapInParentheses","Or","Operator","appendOperator","orParts","orCombined","groupByParts","GroupBy","params","p","Boolean","interpolated","replace","getMetricNameFromExpression","selectExpression","getNamespaceFromExpression","fromExpression","Property","sanitizeOperator","String","flattenOperatorExpressions","flatMap","getFlattenedFilters","getFlattenedGroupBys","setSql","setAggregation","aggregation","AGGREGATIONS","useEffect","schemaLabels","slice","curr","getSchemaLabels","withSchemaEnabled","namespaceOptions","metricOptions","existingFilters","unusedDimensionKeys","some","queryWithNoParams","removeMetricName","namespaceParam","FunctionParameter","labelKeys","setNamespace","ev","HTMLInputElement","withSchema","setWithSchema","isMulti","Array","isArray","l","setSchemaLabels","param","setMetricName","OPERATORS","filtersFromQuery","filters","setFilters","cleaned","validExpressions","operatorExpression","validated","setOperatorExpressionValue","makeRenderItem","GroupByItem","fieldName","field","groupBysFromQuery","baseOptions","option","completeExpressions","orderByDirections","setOrderBy","SQLBuilderEditor","sqlString","fullQuery","sqlPreview","setSQLPreview","val","valueAsNumber","isNaN","min","process","extensions","aliases","mimetypes","loader","registerLanguage","monaco","completionItemProvider","languages","getLanguages","register","monarch","setMonarchTokensProvider","setLanguageConfiguration","registerCompletionItemProvider","getCompletionProvider","MathExpressionQueryField","containerRef","useRef","onEditorMount","onDidFocusEditorText","trigger","TRIGGER_SUGGEST","addCommand","KeyMod","Shift","KeyCode","Enter","getValue","updateElementHeight","containerDiv","current","getContentHeight","pixelHeight","style","height","pixelWidth","clientWidth","layout","onDidContentSizeChange","ref","CodeEditor","monacoOptions","scrollBeyondLastLine","fontSize","lineNumbers","renderLineHighlight","scrollbar","vertical","horizontal","suggestFontSize","wordWrap","onBeforeEditorMount","metricMathCompletionItemProvider","onEditorDidMount","SQLCodeEditor","sqlCompletionItemProvider","setRegion","showMiniMap","showLineNumbers","effect","deps","depsEqual","isDeepEqual","regionsIsLoading","setRegionsIsLoading","setRegions","variableOptionGroup","getVariables","getRegions","setNamespaces","getNamespaces","setMetrics","dimensionFilter","setDimensionKeys","useDeepCompareEffect","getDimensionKeys","QUERY_COMMANDS","documentation","NUMERIC_OPERATORS","detail","STRING_FUNCTIONS","DATETIME_FUNCTIONS","IP_FUNCTIONS","BOOLEAN_FUNCTIONS","AGGREGATION_FUNCTIONS_STATS","STATS_FUNCS","FIELD_AND_FILTER_FUNCTIONS","FUNCTIONS","pattern","greedy","backticks","quote","regex","RegExp","command","function","f","keyword","lookbehind","number","punctuation","values","module","exports","equal","a","i","keys","flags","prototype","toString","call","$$typeof","encode","ch","charCodeAt","tmpAry","isFinite","reserved","parse","len","eat","expected","charAt","Error","decode","beg","r","substring","fromCharCode","parseInt","parseOne","sub","parseFloat","tryParse","def","ex"],"sourceRoot":""}