1{"version":3,"file":"cloudwatchPlugin.0e38943fa459e872fe93.js","mappings":"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","sources":["webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/XrayLinkConfig.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ThrottlingErrorMessage.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/memoizedDebounce.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language_provider.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/rxjs/increasingInterval.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/datalinks.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/logsRetry.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/types.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/LinkedToken.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/tokenUtils.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/CompletionItemProvider.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/linkedTokenBuilder.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/statementPosition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/suggestionKind.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/datasource.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/annotations_query_ctrl.ts","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/TemplateTag/TemplateTag.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/inlineArrayTransformer/inlineArrayTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/stripIndentTransformer/stripIndentTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/trimResultTransformer/trimResultTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/commaLists/commaLists.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/commaListsAnd/commaListsAnd.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/commaListsOr/commaListsOr.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/splitStringTransformer/splitStringTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/removeNonPrintingValuesTransformer/removeNonPrintingValuesTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/html/html.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/replaceSubstitutionTransformer/replaceSubstitutionTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/safeHtml/safeHtml.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/replaceResultTransformer/replaceResultTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/oneLine/oneLine.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/oneLineTrim/oneLineTrim.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/oneLineCommaLists/oneLineCommaLists.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/oneLineCommaListsOr/oneLineCommaListsOr.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/oneLineCommaListsAnd/oneLineCommaListsAnd.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/inlineLists/inlineLists.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/oneLineInlineLists/oneLineInlineLists.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/stripIndent/stripIndent.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/stripIndents/stripIndents.js","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/LogsCheatSheet.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/module.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ConfigEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MetaInspector.tsx"],"sourcesContent":["import React from 'react';\nimport { css } from '@emotion/css';\nimport { Alert, InlineField, useStyles2 } from '@grafana/ui';\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { DataSourcePicker } from '@grafana/runtime';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n infoText: css`\n padding-bottom: ${theme.spacing(2)};\n color: ${theme.colors.text.secondary};\n `,\n});\n\ninterface Props {\n datasourceUid?: string;\n onChange: (uid: string) => void;\n}\n\nconst xRayDsId = 'grafana-x-ray-datasource';\n\nexport function XrayLinkConfig({ datasourceUid, onChange }: Props) {\n const hasXrayDatasource = Boolean(getDatasourceSrv().getList({ pluginId: xRayDsId }).length);\n\n const styles = useStyles2(getStyles);\n\n return (\n <>\n <h3 className=\"page-heading\">X-ray trace link</h3>\n\n <div className={styles.infoText}>\n Grafana will automatically create a link to a trace in X-ray data source if logs contain @xrayTraceId field\n </div>\n\n {!hasXrayDatasource && (\n <Alert\n title={\n 'There is no X-ray datasource to link to. First add an X-ray data source and then link it to Cloud Watch. '\n }\n severity=\"info\"\n />\n )}\n\n <div className=\"gf-form-group\">\n <InlineField\n htmlFor=\"data-source-picker\"\n label=\"Data source\"\n labelWidth={28}\n tooltip=\"X-ray data source containing traces\"\n >\n <DataSourcePicker\n pluginId={xRayDsId}\n onChange={(ds) => onChange(ds.uid)}\n current={datasourceUid}\n noDefault={true}\n />\n </InlineField>\n </div>\n </>\n );\n}\n","import React, { FunctionComponent } from 'react';\n\nexport interface Props {\n region: string;\n}\n\nexport const ThrottlingErrorMessage: FunctionComponent<Props> = ({ region }) => (\n <p>\n Please visit the \n <a\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-link\"\n href={`https://${region}.console.aws.amazon.com/servicequotas/home?region=${region}#!/services/monitoring/quotas/L-5E141212`}\n >\n AWS Service Quotas console\n </a>\n to request a quota increase or see our \n <a\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-link\"\n href=\"https://grafana.com/docs/grafana/latest/datasources/cloudwatch/#service-quotas\"\n >\n documentation\n </a>\n to learn more.\n </p>\n);\n","import { debounce, memoize } from 'lodash';\n\nexport default (func: (...args: any[]) => void, wait = 7000) => {\n const mem = memoize(\n (...args) =>\n debounce(func, wait, {\n leading: true,\n }),\n (...args) => JSON.stringify(args)\n );\n\n return (...args: any[]) => mem(...args)(...args);\n};\n","import { sortedUniq } from 'lodash';\nimport { lastValueFrom } from 'rxjs';\nimport Prism, { Grammar } from 'prismjs';\nimport { AbsoluteTimeRange, HistoryItem, LanguageProvider } from '@grafana/data';\nimport { CompletionItemGroup, SearchFunctionType, Token, TypeaheadInput, TypeaheadOutput } from '@grafana/ui';\n\nimport syntax, {\n AGGREGATION_FUNCTIONS_STATS,\n BOOLEAN_FUNCTIONS,\n DATETIME_FUNCTIONS,\n FIELD_AND_FILTER_FUNCTIONS,\n IP_FUNCTIONS,\n NUMERIC_OPERATORS,\n QUERY_COMMANDS,\n STRING_FUNCTIONS,\n} from './syntax';\nimport { CloudWatchQuery, TSDBResponse } from './types';\nimport { CloudWatchDatasource } from './datasource';\n\nexport type CloudWatchHistoryItem = HistoryItem<CloudWatchQuery>;\n\ntype TypeaheadContext = {\n history?: CloudWatchHistoryItem[];\n absoluteRange?: AbsoluteTimeRange;\n logGroupNames?: string[];\n region: string;\n};\n\nexport class CloudWatchLanguageProvider extends LanguageProvider {\n started = false;\n declare initialRange: AbsoluteTimeRange;\n datasource: CloudWatchDatasource;\n\n constructor(datasource: CloudWatchDatasource, initialValues?: any) {\n super();\n\n this.datasource = datasource;\n\n Object.assign(this, initialValues);\n }\n\n // Strip syntax chars\n cleanText = (s: string) => s.replace(/[()]/g, '').trim();\n\n getSyntax(): Grammar {\n return syntax;\n }\n\n request = (url: string, params?: any): Promise<TSDBResponse> => {\n return lastValueFrom(this.datasource.awsRequest(url, params));\n };\n\n start = () => {\n if (!this.startTask) {\n this.startTask = Promise.resolve().then(() => {\n this.started = true;\n return [];\n });\n }\n\n return this.startTask;\n };\n\n isStatsQuery(query: string): boolean {\n const grammar = this.getSyntax();\n const tokens = Prism.tokenize(query, grammar) ?? [];\n\n return !!tokens.find(\n (token) =>\n typeof token !== 'string' &&\n token.content.toString().toLowerCase() === 'stats' &&\n token.type === 'query-command'\n );\n }\n\n /**\n * Return suggestions based on input that can be then plugged into a typeahead dropdown.\n * Keep this DOM-free for testing\n * @param input\n * @param context Is optional in types but is required in case we are doing getLabelCompletionItems\n * @param context.absoluteRange Required in case we are doing getLabelCompletionItems\n * @param context.history Optional used only in getEmptyCompletionItems\n */\n async provideCompletionItems(input: TypeaheadInput, context?: TypeaheadContext): Promise<TypeaheadOutput> {\n const { value } = input;\n\n // Get tokens\n const tokens = value?.data.get('tokens');\n\n if (!tokens || !tokens.length) {\n return { suggestions: [] };\n }\n\n const curToken: Token = tokens.filter(\n (token: any) =>\n token.offsets.start <= value!.selection?.start?.offset && token.offsets.end >= value!.selection?.start?.offset\n )[0];\n\n const isFirstToken = !curToken.prev;\n const prevToken = prevNonWhitespaceToken(curToken);\n\n const isCommandStart = isFirstToken || (!isFirstToken && prevToken?.types.includes('command-separator'));\n if (isCommandStart) {\n return this.getCommandCompletionItems();\n }\n\n if (isInsideFunctionParenthesis(curToken)) {\n return await this.getFieldCompletionItems(context?.logGroupNames ?? [], context?.region || 'default');\n }\n\n if (isAfterKeyword('by', curToken)) {\n return this.handleKeyword(context);\n }\n\n if (prevToken?.types.includes('comparison-operator')) {\n return this.handleComparison(context);\n }\n\n const commandToken = previousCommandToken(curToken);\n if (commandToken) {\n return await this.handleCommand(commandToken, curToken, context);\n }\n\n return {\n suggestions: [],\n };\n }\n\n private fetchedFieldsCache:\n | {\n time: number;\n logGroups: string[];\n fields: string[];\n }\n | undefined;\n\n private fetchFields = async (logGroups: string[], region: string): Promise<string[]> => {\n if (\n this.fetchedFieldsCache &&\n Date.now() - this.fetchedFieldsCache.time < 30 * 1000 &&\n sortedUniq(this.fetchedFieldsCache.logGroups).join('|') === sortedUniq(logGroups).join('|')\n ) {\n return this.fetchedFieldsCache.fields;\n }\n\n const results = await Promise.all(\n logGroups.map((logGroup) => this.datasource.getLogGroupFields({ logGroupName: logGroup, region }))\n );\n\n const fields = [\n ...new Set<string>(\n results.reduce((acc: string[], cur) => acc.concat(cur.logGroupFields?.map((f) => f.name) as string[]), [])\n ).values(),\n ];\n\n this.fetchedFieldsCache = {\n time: Date.now(),\n logGroups,\n fields,\n };\n\n return fields;\n };\n\n private handleKeyword = async (context?: TypeaheadContext): Promise<TypeaheadOutput> => {\n const suggs = await this.getFieldCompletionItems(context?.logGroupNames ?? [], context?.region || 'default');\n const functionSuggestions: CompletionItemGroup[] = [\n {\n searchFunctionType: SearchFunctionType.Prefix,\n label: 'Functions',\n items: STRING_FUNCTIONS.concat(DATETIME_FUNCTIONS, IP_FUNCTIONS),\n },\n ];\n suggs.suggestions.push(...functionSuggestions);\n\n return suggs;\n };\n\n private handleCommand = async (\n commandToken: Token,\n curToken: Token,\n context?: TypeaheadContext\n ): Promise<TypeaheadOutput> => {\n const queryCommand = commandToken.content.toLowerCase();\n const prevToken = prevNonWhitespaceToken(curToken);\n const currentTokenIsFirstArg = prevToken === commandToken;\n\n if (queryCommand === 'sort') {\n return this.handleSortCommand(currentTokenIsFirstArg, curToken, context);\n }\n\n if (queryCommand === 'parse') {\n if (currentTokenIsFirstArg) {\n return await this.getFieldCompletionItems(context?.logGroupNames ?? [], context?.region || 'default');\n }\n }\n\n const currentTokenIsAfterCommandAndEmpty = isTokenType(commandToken.next, 'whitespace') && !commandToken.next?.next;\n const currentTokenIsAfterCommand =\n currentTokenIsAfterCommandAndEmpty || nextNonWhitespaceToken(commandToken) === curToken;\n\n const currentTokenIsComma = isTokenType(curToken, 'punctuation', ',');\n const currentTokenIsCommaOrAfterComma = currentTokenIsComma || isTokenType(prevToken, 'punctuation', ',');\n\n // We only show suggestions if we are after a command or after a comma which is a field separator\n if (!(currentTokenIsAfterCommand || currentTokenIsCommaOrAfterComma)) {\n return { suggestions: [] };\n }\n\n if (['display', 'fields'].includes(queryCommand)) {\n const typeaheadOutput = await this.getFieldCompletionItems(\n context?.logGroupNames ?? [],\n context?.region || 'default'\n );\n typeaheadOutput.suggestions.push(...this.getFieldAndFilterFunctionCompletionItems().suggestions);\n\n return typeaheadOutput;\n }\n\n if (queryCommand === 'stats') {\n const typeaheadOutput = this.getStatsAggCompletionItems();\n if (currentTokenIsComma || currentTokenIsAfterCommandAndEmpty) {\n typeaheadOutput?.suggestions.forEach((group) => {\n group.skipFilter = true;\n });\n }\n return typeaheadOutput;\n }\n\n if (queryCommand === 'filter' && currentTokenIsFirstArg) {\n const sugg = await this.getFieldCompletionItems(context?.logGroupNames ?? [], context?.region || 'default');\n const boolFuncs = this.getBoolFuncCompletionItems();\n sugg.suggestions.push(...boolFuncs.suggestions);\n return sugg;\n }\n return { suggestions: [] };\n };\n\n private async handleSortCommand(\n isFirstArgument: boolean,\n curToken: Token,\n context?: TypeaheadContext\n ): Promise<TypeaheadOutput> {\n if (isFirstArgument) {\n return await this.getFieldCompletionItems(context?.logGroupNames ?? [], context?.region || 'default');\n } else if (isTokenType(prevNonWhitespaceToken(curToken), 'field-name')) {\n // suggest sort options\n return {\n suggestions: [\n {\n searchFunctionType: SearchFunctionType.Prefix,\n label: 'Sort Order',\n items: [\n {\n label: 'asc',\n },\n { label: 'desc' },\n ],\n },\n ],\n };\n }\n\n return { suggestions: [] };\n }\n\n private handleComparison = async (context?: TypeaheadContext) => {\n const fieldsSuggestions = await this.getFieldCompletionItems(\n context?.logGroupNames ?? [],\n context?.region || 'default'\n );\n const comparisonSuggestions = this.getComparisonCompletionItems();\n fieldsSuggestions.suggestions.push(...comparisonSuggestions.suggestions);\n return fieldsSuggestions;\n };\n\n private getCommandCompletionItems = (): TypeaheadOutput => {\n return {\n suggestions: [{ searchFunctionType: SearchFunctionType.Prefix, label: 'Commands', items: QUERY_COMMANDS }],\n };\n };\n\n private getFieldAndFilterFunctionCompletionItems = (): TypeaheadOutput => {\n return {\n suggestions: [\n { searchFunctionType: SearchFunctionType.Prefix, label: 'Functions', items: FIELD_AND_FILTER_FUNCTIONS },\n ],\n };\n };\n\n private getStatsAggCompletionItems = (): TypeaheadOutput => {\n return {\n suggestions: [\n { searchFunctionType: SearchFunctionType.Prefix, label: 'Functions', items: AGGREGATION_FUNCTIONS_STATS },\n ],\n };\n };\n\n private getBoolFuncCompletionItems = (): TypeaheadOutput => {\n return {\n suggestions: [\n {\n searchFunctionType: SearchFunctionType.Prefix,\n label: 'Functions',\n items: BOOLEAN_FUNCTIONS,\n },\n ],\n };\n };\n\n private getComparisonCompletionItems = (): TypeaheadOutput => {\n return {\n suggestions: [\n {\n searchFunctionType: SearchFunctionType.Prefix,\n label: 'Functions',\n items: NUMERIC_OPERATORS.concat(BOOLEAN_FUNCTIONS),\n },\n ],\n };\n };\n\n private getFieldCompletionItems = async (logGroups: string[], region: string): Promise<TypeaheadOutput> => {\n const fields = await this.fetchFields(logGroups, region);\n\n return {\n suggestions: [\n {\n label: 'Fields',\n items: fields.map((field) => ({\n label: field,\n insertText: field.match(/@?[_a-zA-Z]+[_.0-9a-zA-Z]*/) ? undefined : `\\`${field}\\``,\n })),\n },\n ],\n };\n };\n}\n\nfunction nextNonWhitespaceToken(token: Token): Token | null {\n let curToken = token;\n\n while (curToken.next) {\n if (curToken.next.types.includes('whitespace')) {\n curToken = curToken.next;\n } else {\n return curToken.next;\n }\n }\n\n return null;\n}\n\nfunction prevNonWhitespaceToken(token: Token): Token | null {\n let curToken = token;\n\n while (curToken.prev) {\n if (isTokenType(curToken.prev, 'whitespace')) {\n curToken = curToken.prev;\n } else {\n return curToken.prev;\n }\n }\n\n return null;\n}\n\nfunction previousCommandToken(startToken: Token): Token | null {\n let thisToken = startToken;\n while (!!thisToken.prev) {\n thisToken = thisToken.prev;\n if (\n thisToken.types.includes('query-command') &&\n (!thisToken.prev || isTokenType(prevNonWhitespaceToken(thisToken), 'command-separator'))\n ) {\n return thisToken;\n }\n }\n return null;\n}\n\nconst funcsWithFieldArgs = [\n 'avg',\n 'count',\n 'count_distinct',\n 'earliest',\n 'latest',\n 'sortsFirst',\n 'sortsLast',\n 'max',\n 'min',\n 'pct',\n 'stddev',\n 'ispresent',\n 'fromMillis',\n 'toMillis',\n 'isempty',\n 'isblank',\n 'isValidIp',\n 'isValidIpV4',\n 'isValidIpV6',\n 'isIpInSubnet',\n 'isIpv4InSubnet',\n 'isIpv6InSubnet',\n].map((funcName) => funcName.toLowerCase());\n\n/**\n * Returns true if cursor is currently inside a function parenthesis for example `count(|)` or `count(@mess|)` should\n * return true.\n */\nfunction isInsideFunctionParenthesis(curToken: Token): boolean {\n const prevToken = prevNonWhitespaceToken(curToken);\n\n if (!prevToken) {\n return false;\n }\n\n const parenthesisToken = curToken.content === '(' ? curToken : prevToken.content === '(' ? prevToken : undefined;\n if (parenthesisToken) {\n const maybeFunctionToken = prevNonWhitespaceToken(parenthesisToken);\n if (maybeFunctionToken) {\n return (\n funcsWithFieldArgs.includes(maybeFunctionToken.content.toLowerCase()) &&\n maybeFunctionToken.types.includes('function')\n );\n }\n }\n return false;\n}\n\nfunction isAfterKeyword(keyword: string, token: Token): boolean {\n const maybeKeyword = getPreviousTokenExcluding(token, [\n 'whitespace',\n 'function',\n 'punctuation',\n 'field-name',\n 'number',\n ]);\n if (isTokenType(maybeKeyword, 'keyword', 'by')) {\n const prev = getPreviousTokenExcluding(token, ['whitespace']);\n if (prev === maybeKeyword || isTokenType(prev, 'punctuation', ',')) {\n return true;\n }\n }\n return false;\n}\n\nfunction isTokenType(token: Token | undefined | null, type: string, content?: string): boolean {\n if (!token?.types.includes(type)) {\n return false;\n }\n if (content) {\n if (token?.content.toLowerCase() !== content) {\n return false;\n }\n }\n return true;\n}\n\ntype TokenDef = string | { type: string; value: string };\nfunction getPreviousTokenExcluding(token: Token, exclude: TokenDef[]): Token | undefined | null {\n let curToken = token.prev;\n main: while (curToken) {\n for (const item of exclude) {\n if (typeof item === 'string') {\n if (curToken.types.includes(item)) {\n curToken = curToken.prev;\n continue main;\n }\n } else {\n if (curToken.types.includes(item.type) && curToken.content.toLowerCase() === item.value) {\n curToken = curToken.prev;\n continue main;\n }\n }\n }\n break;\n }\n return curToken;\n}\n","import { SchedulerLike, Observable, SchedulerAction, Subscriber, asyncScheduler } from 'rxjs';\n\n/**\n * Creates an Observable that emits sequential numbers after increasing intervals of time\n * starting with `startPeriod`, ending with `endPeriod` and incrementing by `step`.\n */\nexport const increasingInterval = (\n { startPeriod = 0, endPeriod = 5000, step = 1000 },\n scheduler: SchedulerLike = asyncScheduler\n): Observable<number> => {\n return new Observable<number>((subscriber) => {\n const state: IntervalState = {\n subscriber,\n counter: 0,\n period: startPeriod,\n step,\n endPeriod,\n };\n\n subscriber.add(scheduler.schedule(dispatch, startPeriod, state));\n return subscriber;\n });\n};\n\nfunction dispatch(this: SchedulerAction<IntervalState>, state?: IntervalState) {\n if (!state) {\n return;\n }\n const { subscriber, counter, period, step, endPeriod } = state;\n subscriber.next(counter);\n const newPeriod = Math.min(period + step, endPeriod);\n this.schedule({ subscriber, counter: counter + 1, period: newPeriod, step, endPeriod }, newPeriod);\n}\n\ninterface IntervalState {\n subscriber: Subscriber<number>;\n counter: number;\n period: number;\n endPeriod: number;\n step: number;\n}\n","import { DataFrame, DataLink, DataQueryRequest, DataQueryResponse, ScopedVars, TimeRange } from '@grafana/data';\nimport { CloudWatchLogsQuery, CloudWatchQuery } from '../types';\nimport { AwsUrl, encodeUrl } from '../aws_url';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\ntype ReplaceFn = (\n target?: string,\n scopedVars?: ScopedVars,\n displayErrorIfIsMultiTemplateVariable?: boolean,\n fieldName?: string\n) => string;\n\nexport async function addDataLinksToLogsResponse(\n response: DataQueryResponse,\n request: DataQueryRequest<CloudWatchQuery>,\n range: TimeRange,\n replaceFn: ReplaceFn,\n getRegion: (region: string) => string,\n tracingDatasourceUid?: string\n): Promise<void> {\n const replace = (target: string, fieldName?: string) => replaceFn(target, request.scopedVars, true, fieldName);\n\n for (const dataFrame of response.data as DataFrame[]) {\n const curTarget = request.targets.find((target) => target.refId === dataFrame.refId) as CloudWatchLogsQuery;\n const interpolatedRegion = getRegion(replace(curTarget.region ?? '', 'region'));\n\n for (const field of dataFrame.fields) {\n if (field.name === '@xrayTraceId' && tracingDatasourceUid) {\n getRegion(replace(curTarget.region ?? '', 'region'));\n const xrayLink = await createInternalXrayLink(tracingDatasourceUid, interpolatedRegion);\n if (xrayLink) {\n field.config.links = [xrayLink];\n }\n } else {\n // Right now we add generic link to open the query in xray console to every field so it shows in the logs row\n // details. Unfortunately this also creates link for all values inside table which look weird.\n field.config.links = [createAwsConsoleLink(curTarget, range, interpolatedRegion, replace)];\n }\n }\n }\n}\n\nasync function createInternalXrayLink(datasourceUid: string, region: string) {\n let ds;\n try {\n ds = await getDataSourceSrv().get(datasourceUid);\n } catch (e) {\n console.error('Could not load linked xray data source, it was probably deleted after it was linked', e);\n return undefined;\n }\n\n return {\n title: ds.name,\n url: '',\n internal: {\n query: { query: '${__value.raw}', queryType: 'getTrace', region: region },\n datasourceUid: datasourceUid,\n datasourceName: ds.name,\n },\n } as DataLink;\n}\n\nfunction createAwsConsoleLink(\n target: CloudWatchLogsQuery,\n range: TimeRange,\n region: string,\n replace: (target: string, fieldName?: string) => string\n) {\n const interpolatedExpression = target.expression ? replace(target.expression) : '';\n const interpolatedGroups = target.logGroupNames?.map((logGroup: string) => replace(logGroup, 'log groups')) ?? [];\n\n const urlProps: AwsUrl = {\n end: range.to.toISOString(),\n start: range.from.toISOString(),\n timeType: 'ABSOLUTE',\n tz: 'UTC',\n editorString: interpolatedExpression,\n isLiveTail: false,\n source: interpolatedGroups,\n };\n\n const encodedUrl = encodeUrl(urlProps, region);\n return {\n url: encodedUrl,\n title: 'View in CloudWatch console',\n targetBlank: true,\n };\n}\n","import { Observable, Subscription } from 'rxjs';\nimport { FetchError, toDataQueryResponse } from '@grafana/runtime';\nimport { StartQueryRequest } from '../types';\nimport { DataFrame, DataFrameJSON, DataQueryError } from '@grafana/data';\n\ntype Result = { frames: DataFrameJSON[]; error?: string };\n\nconst defaultTimeout = 30_000;\n\n/**\n * A retry strategy specifically for cloud watch logs query. Cloud watch logs queries need first starting the query\n * and the polling for the results. The start query can fail because of the concurrent queries rate limit,\n * and so we hove to retry the start query call if there is already lot of queries running.\n *\n * As we send multiple queries in single request some can fail and some can succeed and we have to also handle those\n * cases by only retrying the failed queries. We retry the failed queries until we hit the time limit or all queries\n * succeed and only then we pass the data forward. This means we wait longer but makes the code a bit simpler as we\n * can treat starting the query and polling as steps in a pipeline.\n * @param queryFun\n * @param targets\n * @param options\n */\nexport function runWithRetry(\n queryFun: (targets: StartQueryRequest[]) => Observable<DataFrame[]>,\n targets: StartQueryRequest[],\n options: {\n timeout?: number;\n timeoutFunc?: (retry: number, startTime: number) => boolean;\n retryWaitFunc?: (retry: number) => number;\n } = {}\n): Observable<{ frames: DataFrame[]; error?: DataQueryError }> {\n const startTime = new Date();\n let retries = 0;\n let timerID: any;\n let subscription: Subscription;\n let collected = {};\n\n const timeoutFunction = options.timeoutFunc\n ? options.timeoutFunc\n : (retry: number, startTime: number) => {\n return Date.now() >= startTime + (options.timeout === undefined ? defaultTimeout : options.timeout);\n };\n\n const retryWaitFunction = options.retryWaitFunc\n ? options.retryWaitFunc\n : (retry: number) => {\n return Math.pow(2, retry) * 1000 + Math.random() * 100;\n };\n\n return new Observable((observer) => {\n // Run function is where the logic takes place. We have it in a function so we can call it recursively.\n function run(currentQueryParams: StartQueryRequest[]) {\n subscription = queryFun(currentQueryParams).subscribe({\n next(frames) {\n // In case we successfully finished, merge the current response with whatever we already collected.\n const collectedPreviously = toDataQueryResponse({ data: { results: collected } }).data || [];\n observer.next({ frames: [...collectedPreviously, ...frames] });\n observer.complete();\n },\n error(error: FetchError<{ results?: Record<string, Result> }> | string) {\n // In case of error we first try to figure out what kind of error it is\n\n // This means it was a generic 500 error probably so we just pass it on\n if (typeof error === 'string') {\n observer.error(error);\n return;\n }\n\n // In case of multiple queries this some can error while some may be ok\n const errorData = splitErrorData(error);\n\n if (!errorData) {\n // Not sure what happened but the error structure wasn't what we expected\n observer.error(error);\n return;\n }\n\n if (!errorData!.errors.length) {\n // So there is no limit error but some other errors so nothing to retry so we just pass it as it would be\n // otherwise.\n observer.error(error);\n return;\n }\n\n if (timeoutFunction(retries, startTime.valueOf())) {\n // We timed out but we could have started some queries\n if (Object.keys(collected).length || Object.keys(errorData.good).length) {\n const dataResponse = toDataQueryResponse({\n data: {\n results: {\n ...(errorData.good ?? {}),\n ...(collected ?? {}),\n },\n },\n });\n dataResponse.error = {\n ...(dataResponse.error ?? {}),\n message: `Some queries timed out: ${errorData.errorMessage}`,\n };\n // So we consider this a partial success and pass the data forward but also with error to be shown to\n // the user.\n observer.next({\n error: dataResponse.error,\n frames: dataResponse.data,\n });\n observer.complete();\n } else {\n // So we timed out and there was no data to pass forward so we just pass the error\n const dataResponse = toDataQueryResponse({ data: { results: error.data?.results ?? {} } });\n observer.error(dataResponse.error);\n }\n return;\n }\n\n collected = {\n ...collected,\n ...errorData!.good,\n };\n\n timerID = setTimeout(\n () => {\n retries++;\n console.log(`Attempt ${retries}`);\n run(errorData!.errors);\n },\n // We want to know how long to wait for the next retry. First time this will be 0.\n retryWaitFunction(retries + 1)\n );\n },\n });\n }\n run(targets);\n return () => {\n // We clear only the latest timer and subscription but the observable should complete after one response so\n // there should not be more things running at the same time.\n clearTimeout(timerID);\n subscription.unsubscribe();\n };\n });\n}\n\nfunction splitErrorData(error: FetchError<{ results?: Record<string, Result> }>) {\n const results = error.data?.results;\n if (!results) {\n return undefined;\n }\n return Object.keys(results).reduce<{\n errors: StartQueryRequest[];\n good: Record<string, Result>;\n errorMessage: string;\n }>(\n (acc, refId) => {\n if (results[refId].error?.startsWith('LimitExceededException')) {\n acc.errorMessage = results[refId].error!;\n acc.errors.push(error.config.data.queries.find((q: any) => q.refId === refId));\n } else {\n acc.good[refId] = results[refId];\n }\n return acc;\n },\n { errors: [], good: {}, errorMessage: '' }\n );\n}\n","import { monacoTypes } from '@grafana/ui';\n\nexport enum TokenType {\n Parenthesis = 'delimiter.parenthesis.sql',\n Whitespace = 'white.sql',\n Keyword = 'keyword.sql',\n Delimiter = 'delimiter.sql',\n Operator = 'operator.sql',\n Identifier = 'identifier.sql',\n Type = 'type.sql',\n Function = 'predefined.sql',\n Number = 'number.sql',\n String = 'string.sql',\n Variable = 'variable.sql',\n}\n\nexport enum StatementPosition {\n Unknown,\n SelectKeyword,\n AfterSelectKeyword,\n AfterSelectFuncFirstArgument,\n AfterFromKeyword,\n SchemaFuncFirstArgument,\n SchemaFuncExtraArgument,\n FromKeyword,\n AfterFrom,\n WhereKey,\n WhereComparisonOperator,\n WhereValue,\n AfterWhereValue,\n AfterGroupByKeywords,\n AfterGroupBy,\n AfterOrderByKeywords,\n AfterOrderByFunction,\n AfterOrderByDirection,\n}\n\nexport enum SuggestionKind {\n SelectKeyword,\n FunctionsWithArguments,\n Metrics,\n FromKeyword,\n SchemaKeyword,\n Namespaces,\n LabelKeys,\n WhereKeyword,\n GroupByKeywords,\n OrderByKeywords,\n FunctionsWithoutArguments,\n LimitKeyword,\n SortOrderDirectionKeyword,\n ComparisonOperators,\n LabelValues,\n LogicalOperators,\n}\n\nexport enum CompletionItemPriority {\n High = 'a',\n MediumHigh = 'd',\n Medium = 'g',\n MediumLow = 'k',\n Low = 'q',\n}\n\nexport interface Editor {\n tokenize: (value: string, languageId: string) => monacoTypes.Token[][];\n}\n\nexport interface Range {\n containsPosition: (range: monacoTypes.IRange, position: monacoTypes.IPosition) => boolean;\n}\n\nexport interface Monaco {\n editor: Editor;\n Range: Range;\n}\n","import { monacoTypes } from '@grafana/ui';\nimport { TokenType } from './types';\n\nexport class LinkedToken {\n constructor(\n public type: string,\n public value: string,\n public range: monacoTypes.IRange,\n public previous: LinkedToken | null,\n public next: LinkedToken | null\n ) {}\n\n isKeyword(): boolean {\n return this.type === TokenType.Keyword;\n }\n\n isWhiteSpace(): boolean {\n return this.type === TokenType.Whitespace;\n }\n\n isParenthesis(): boolean {\n return this.type === TokenType.Parenthesis;\n }\n\n isIdentifier(): boolean {\n return this.type === TokenType.Identifier;\n }\n\n isString(): boolean {\n return this.type === TokenType.String;\n }\n\n isDoubleQuotedString(): boolean {\n return this.type === TokenType.Type;\n }\n\n isVariable(): boolean {\n return this.type === TokenType.Variable;\n }\n\n isFunction(): boolean {\n return this.type === TokenType.Function;\n }\n\n is(type: TokenType, value?: string | number | boolean): boolean {\n const isType = this.type === type;\n return value !== undefined ? isType && this.value === value : isType;\n }\n\n getPreviousNonWhiteSpaceToken(): LinkedToken | null {\n let curr = this.previous;\n while (curr != null) {\n if (!curr.isWhiteSpace()) {\n return curr;\n }\n curr = curr.previous;\n }\n return null;\n }\n\n getPreviousOfType(type: TokenType, value?: string): LinkedToken | null {\n let curr = this.previous;\n while (curr != null) {\n const isType = curr.type === type;\n if (value !== undefined ? isType && curr.value === value : isType) {\n return curr;\n }\n curr = curr.previous;\n }\n return null;\n }\n\n getPreviousUntil(type: TokenType, ignoreTypes: TokenType[], value?: string): LinkedToken[] | null {\n let tokens: LinkedToken[] = [];\n let curr = this.previous;\n while (curr != null) {\n if (ignoreTypes.some((t) => t === curr?.type)) {\n curr = curr.previous;\n continue;\n }\n\n const isType = curr.type === type;\n if (value !== undefined ? isType && curr.value === value : isType) {\n return tokens;\n }\n if (!curr.isWhiteSpace()) {\n tokens.push(curr);\n }\n curr = curr.previous;\n }\n\n return tokens;\n }\n\n getNextUntil(type: TokenType, ignoreTypes: TokenType[], value?: string): LinkedToken[] | null {\n let tokens: LinkedToken[] = [];\n let curr = this.next;\n while (curr != null) {\n if (ignoreTypes.some((t) => t === curr?.type)) {\n curr = curr.next;\n continue;\n }\n\n const isType = curr.type === type;\n if (value !== undefined ? isType && curr.value === value : isType) {\n return tokens;\n }\n if (!curr.isWhiteSpace()) {\n tokens.push(curr);\n }\n curr = curr.next;\n }\n\n return tokens;\n }\n\n getPreviousKeyword(): LinkedToken | null {\n let curr = this.previous;\n while (curr != null) {\n if (curr.isKeyword()) {\n return curr;\n }\n curr = curr.previous;\n }\n return null;\n }\n\n getNextNonWhiteSpaceToken(): LinkedToken | null {\n let curr = this.next;\n while (curr != null) {\n if (!curr.isWhiteSpace()) {\n return curr;\n }\n curr = curr.next;\n }\n return null;\n }\n\n getNextOfType(type: TokenType, value?: string): LinkedToken | null {\n let curr = this.next;\n while (curr != null) {\n const isType = curr.type === type;\n if (value !== undefined ? isType && curr.value === value : isType) {\n return curr;\n }\n curr = curr.next;\n }\n return null;\n }\n}\n","import { LinkedToken } from './LinkedToken';\nimport { FROM, SCHEMA, SELECT } from '../language';\nimport { TokenType } from './types';\n\nexport const getSelectToken = (currentToken: LinkedToken | null) =>\n currentToken?.getPreviousOfType(TokenType.Keyword, SELECT) ?? null;\n\nexport const getSelectStatisticToken = (currentToken: LinkedToken | null) => {\n const assumedStatisticToken = getSelectToken(currentToken)?.getNextNonWhiteSpaceToken();\n return assumedStatisticToken?.isVariable() || assumedStatisticToken?.isFunction() ? assumedStatisticToken : null;\n};\n\nexport const getMetricNameToken = (currentToken: LinkedToken | null) => {\n // statistic function is followed by `(` and then an argument\n const assumedMetricNameToken = getSelectStatisticToken(currentToken)?.next?.next;\n return assumedMetricNameToken?.isVariable() || assumedMetricNameToken?.isIdentifier() ? assumedMetricNameToken : null;\n};\n\nexport const getFromKeywordToken = (currentToken: LinkedToken | null) => {\n const selectToken = getSelectToken(currentToken);\n return selectToken?.getNextOfType(TokenType.Keyword, FROM);\n};\n\nexport const getNamespaceToken = (currentToken: LinkedToken | null) => {\n const fromToken = getFromKeywordToken(currentToken);\n const nextNonWhiteSpace = fromToken?.getNextNonWhiteSpaceToken();\n if (\n nextNonWhiteSpace?.isDoubleQuotedString() ||\n (nextNonWhiteSpace?.isVariable() && nextNonWhiteSpace?.value.toUpperCase() !== SCHEMA)\n ) {\n // schema is not used\n return nextNonWhiteSpace;\n } else if (nextNonWhiteSpace?.isKeyword() && nextNonWhiteSpace.next?.is(TokenType.Parenthesis, '(')) {\n // schema is specified\n const assumedNamespaceToken = nextNonWhiteSpace.next?.next;\n if (assumedNamespaceToken?.isDoubleQuotedString() || assumedNamespaceToken?.isVariable()) {\n return assumedNamespaceToken;\n }\n }\n return null;\n};\n","import type { Monaco, monacoTypes } from '@grafana/ui';\nimport { getTemplateSrv, TemplateSrv } from '@grafana/runtime';\nimport { uniq } from 'lodash';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { linkedTokenBuilder } from './linkedTokenBuilder';\nimport { getSuggestionKinds } from './suggestionKind';\nimport { getStatementPosition } from './statementPosition';\nimport { TRIGGER_SUGGEST } from './commands';\nimport { TokenType, SuggestionKind, CompletionItemPriority, StatementPosition } from './types';\nimport { LinkedToken } from './LinkedToken';\nimport {\n BY,\n FROM,\n GROUP,\n LIMIT,\n ORDER,\n SCHEMA,\n SELECT,\n ASC,\n DESC,\n WHERE,\n COMPARISON_OPERATORS,\n LOGICAL_OPERATORS,\n STATISTICS,\n} from '../language';\nimport { getMetricNameToken, getNamespaceToken } from './tokenUtils';\n\ntype CompletionItem = monacoTypes.languages.CompletionItem;\n\nexport class CompletionItemProvider {\n region: string;\n templateVariables: string[];\n\n constructor(private datasource: CloudWatchDatasource, private templateSrv: TemplateSrv = getTemplateSrv()) {\n this.templateVariables = this.datasource.getVariables();\n this.region = datasource.getActualRegion();\n }\n\n setRegion(region: string) {\n this.region = region;\n }\n\n getCompletionProvider(monaco: Monaco) {\n return {\n triggerCharacters: [' ', '$', ',', '(', \"'\"],\n provideCompletionItems: async (model: monacoTypes.editor.ITextModel, position: monacoTypes.IPosition) => {\n const currentToken = linkedTokenBuilder(monaco, model, position);\n const statementPosition = getStatementPosition(currentToken);\n const suggestionKinds = getSuggestionKinds(statementPosition);\n const suggestions = await this.getSuggestions(\n monaco,\n currentToken,\n suggestionKinds,\n statementPosition,\n position\n );\n\n return {\n suggestions,\n };\n },\n };\n }\n\n private async getSuggestions(\n monaco: Monaco,\n currentToken: LinkedToken | null,\n suggestionKinds: SuggestionKind[],\n statementPosition: StatementPosition,\n position: monacoTypes.IPosition\n ): Promise<CompletionItem[]> {\n let suggestions: CompletionItem[] = [];\n const invalidRangeToken = currentToken?.isWhiteSpace() || currentToken?.isParenthesis();\n const range =\n invalidRangeToken || !currentToken?.range ? monaco.Range.fromPositions(position) : currentToken?.range;\n\n const toCompletionItem = (value: string, rest: Partial<CompletionItem> = {}) => {\n const item: CompletionItem = {\n label: value,\n insertText: value,\n kind: monaco.languages.CompletionItemKind.Field,\n range,\n sortText: CompletionItemPriority.Medium,\n ...rest,\n };\n return item;\n };\n\n function addSuggestion(value: string, rest: Partial<CompletionItem> = {}) {\n suggestions = [...suggestions, toCompletionItem(value, rest)];\n }\n\n for (const suggestion of suggestionKinds) {\n switch (suggestion) {\n case SuggestionKind.SelectKeyword:\n addSuggestion(SELECT, {\n insertText: `${SELECT} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.FunctionsWithArguments:\n STATISTICS.map((s) =>\n addSuggestion(s, {\n insertText: `${s}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Function,\n })\n );\n break;\n\n case SuggestionKind.FunctionsWithoutArguments:\n STATISTICS.map((s) =>\n addSuggestion(s, {\n insertText: `${s}() `,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Function,\n })\n );\n break;\n\n case SuggestionKind.Metrics:\n {\n const namespaceToken = getNamespaceToken(currentToken);\n if (namespaceToken?.value) {\n // if a namespace is specified, only suggest metrics for the namespace\n const metrics = await this.datasource.getMetrics(\n this.templateSrv.replace(namespaceToken?.value.replace(/\\\"/g, '')),\n this.templateSrv.replace(this.region)\n );\n metrics.map((m) => addSuggestion(m.value));\n } else {\n // If no namespace is specified in the query, just list all metrics\n const metrics = await this.datasource.getAllMetrics(this.templateSrv.replace(this.region));\n uniq(metrics.map((m) => m.metricName)).map((m) => addSuggestion(m, { insertText: m }));\n }\n }\n break;\n\n case SuggestionKind.FromKeyword:\n addSuggestion(FROM, {\n insertText: `${FROM} `,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.SchemaKeyword:\n addSuggestion(SCHEMA, {\n sortText: CompletionItemPriority.High,\n insertText: `${SCHEMA}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Function,\n });\n break;\n\n case SuggestionKind.Namespaces:\n const metricNameToken = getMetricNameToken(currentToken);\n let namespaces = [];\n if (metricNameToken?.value) {\n // if a metric is specified, only suggest namespaces that actually have that metric\n const metrics = await this.datasource.getAllMetrics(this.region);\n const metricName = this.templateSrv.replace(metricNameToken.value);\n namespaces = metrics.filter((m) => m.metricName === metricName).map((m) => m.namespace);\n } else {\n // if no metric is specified, just suggest all namespaces\n const ns = await this.datasource.getNamespaces();\n namespaces = ns.map((n) => n.value);\n }\n namespaces.map((n) => addSuggestion(`\"${n}\"`, { insertText: `\"${n}\"` }));\n break;\n\n case SuggestionKind.LabelKeys:\n {\n const metricNameToken = getMetricNameToken(currentToken);\n const namespaceToken = getNamespaceToken(currentToken);\n if (namespaceToken?.value) {\n let dimensionFilter = {};\n let labelKeyTokens;\n if (statementPosition === StatementPosition.SchemaFuncExtraArgument) {\n labelKeyTokens = namespaceToken?.getNextUntil(TokenType.Parenthesis, [\n TokenType.Delimiter,\n TokenType.Whitespace,\n ]);\n } else if (statementPosition === StatementPosition.AfterGroupByKeywords) {\n labelKeyTokens = currentToken?.getPreviousUntil(TokenType.Keyword, [\n TokenType.Delimiter,\n TokenType.Whitespace,\n ]);\n }\n dimensionFilter = (labelKeyTokens || []).reduce((acc, curr) => {\n return { ...acc, [curr.value]: null };\n }, {});\n const keys = await this.datasource.getDimensionKeys(\n this.templateSrv.replace(namespaceToken.value.replace(/\\\"/g, '')),\n this.templateSrv.replace(this.region),\n dimensionFilter,\n metricNameToken?.value ?? ''\n );\n keys.map((m) => {\n const key = /[\\s\\.-]/.test(m.value) ? `\"${m.value}\"` : m.value;\n addSuggestion(key);\n });\n }\n }\n break;\n\n case SuggestionKind.LabelValues:\n {\n const namespaceToken = getNamespaceToken(currentToken);\n const metricNameToken = getMetricNameToken(currentToken);\n const labelKey = currentToken?.getPreviousNonWhiteSpaceToken()?.getPreviousNonWhiteSpaceToken();\n if (namespaceToken?.value && labelKey?.value && metricNameToken?.value) {\n const values = await this.datasource.getDimensionValues(\n this.templateSrv.replace(this.region),\n this.templateSrv.replace(namespaceToken.value.replace(/\\\"/g, '')),\n this.templateSrv.replace(metricNameToken.value),\n this.templateSrv.replace(labelKey.value),\n {}\n );\n values.map((o) =>\n addSuggestion(`'${o.value}'`, { insertText: `'${o.value}' `, command: TRIGGER_SUGGEST })\n );\n }\n }\n break;\n\n case SuggestionKind.LogicalOperators:\n LOGICAL_OPERATORS.map((o) =>\n addSuggestion(`${o}`, {\n insertText: `${o} `,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.MediumHigh,\n })\n );\n break;\n\n case SuggestionKind.WhereKeyword:\n addSuggestion(`${WHERE}`, {\n insertText: `${WHERE} `,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.High,\n });\n break;\n\n case SuggestionKind.ComparisonOperators:\n COMPARISON_OPERATORS.map((o) => addSuggestion(`${o}`, { insertText: `${o} `, command: TRIGGER_SUGGEST }));\n break;\n\n case SuggestionKind.GroupByKeywords:\n addSuggestion(`${GROUP} ${BY}`, {\n insertText: `${GROUP} ${BY} `,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.MediumHigh,\n });\n break;\n\n case SuggestionKind.OrderByKeywords:\n addSuggestion(`${ORDER} ${BY}`, {\n insertText: `${ORDER} ${BY} `,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.Medium,\n });\n break;\n\n case SuggestionKind.LimitKeyword:\n addSuggestion(LIMIT, { insertText: `${LIMIT} `, sortText: CompletionItemPriority.MediumLow });\n break;\n\n case SuggestionKind.SortOrderDirectionKeyword:\n [ASC, DESC].map((s) =>\n addSuggestion(s, {\n insertText: `${s} `,\n command: TRIGGER_SUGGEST,\n })\n );\n break;\n }\n }\n\n // always suggest template variables\n this.templateVariables.map((v) => {\n addSuggestion(v, {\n range,\n label: v,\n insertText: v,\n kind: monaco.languages.CompletionItemKind.Variable,\n sortText: CompletionItemPriority.Low,\n });\n });\n\n return suggestions;\n }\n}\n","import type { monacoTypes } from '@grafana/ui';\n\nimport language from '../definition';\nimport { LinkedToken } from './LinkedToken';\nimport { Monaco, TokenType } from './types';\n\nexport function linkedTokenBuilder(\n monaco: Monaco,\n model: monacoTypes.editor.ITextModel,\n position: monacoTypes.IPosition\n) {\n let current: LinkedToken | null = null;\n let previous: LinkedToken | null = null;\n const tokensPerLine = monaco.editor.tokenize(model.getValue() ?? '', language.id);\n\n for (let lineIndex = 0; lineIndex < tokensPerLine.length; lineIndex++) {\n const tokens = tokensPerLine[lineIndex];\n // In case position is first column in new line, add empty whitespace token so that links are not broken\n if (!tokens.length && previous) {\n const token: monacoTypes.Token = {\n offset: 0,\n type: TokenType.Whitespace,\n language: language.id,\n _tokenBrand: undefined,\n };\n tokens.push(token);\n }\n\n for (let columnIndex = 0; columnIndex < tokens.length; columnIndex++) {\n const token = tokens[columnIndex];\n let endColumn =\n tokens.length > columnIndex + 1 ? tokens[columnIndex + 1].offset + 1 : model.getLineLength(lineIndex + 1) + 1;\n\n const range: monacoTypes.IRange = {\n startLineNumber: lineIndex + 1,\n startColumn: token.offset === 0 ? 0 : token.offset + 1,\n endLineNumber: lineIndex + 1,\n endColumn,\n };\n\n const value = model.getValueInRange(range);\n const sqlToken: LinkedToken = new LinkedToken(token.type, value, range, previous, null);\n\n if (monaco.Range.containsPosition(range, position)) {\n current = sqlToken;\n }\n\n if (previous) {\n previous.next = sqlToken;\n }\n previous = sqlToken;\n }\n }\n return current;\n}\n","import { AND, ASC, BY, DESC, EQUALS, FROM, GROUP, NOT_EQUALS, ORDER, SCHEMA, SELECT, WHERE } from '../language';\nimport { LinkedToken } from './LinkedToken';\nimport { StatementPosition, TokenType } from './types';\n\nexport function getStatementPosition(currentToken: LinkedToken | null): StatementPosition {\n const previousNonWhiteSpace = currentToken?.getPreviousNonWhiteSpaceToken();\n const previousKeyword = currentToken?.getPreviousKeyword();\n\n const previousIsSlash = currentToken?.getPreviousNonWhiteSpaceToken()?.is(TokenType.Operator, '/');\n if (\n currentToken === null ||\n (currentToken.isWhiteSpace() && currentToken.previous === null) ||\n (currentToken.is(TokenType.Keyword, SELECT) && currentToken.previous === null) ||\n previousIsSlash ||\n (currentToken.isIdentifier() && (previousIsSlash || currentToken?.previous === null))\n ) {\n return StatementPosition.SelectKeyword;\n }\n\n if (previousNonWhiteSpace?.value === SELECT) {\n return StatementPosition.AfterSelectKeyword;\n }\n\n if (\n (previousNonWhiteSpace?.is(TokenType.Parenthesis, '(') || currentToken?.is(TokenType.Parenthesis, '()')) &&\n previousKeyword?.value === SELECT\n ) {\n return StatementPosition.AfterSelectFuncFirstArgument;\n }\n\n if (previousKeyword?.value === SELECT && previousNonWhiteSpace?.isParenthesis()) {\n return StatementPosition.FromKeyword;\n }\n\n if (previousNonWhiteSpace?.value === FROM) {\n return StatementPosition.AfterFromKeyword;\n }\n\n if (\n (previousNonWhiteSpace?.is(TokenType.Parenthesis, '(') || currentToken?.is(TokenType.Parenthesis, '()')) &&\n previousKeyword?.value === SCHEMA\n ) {\n return StatementPosition.SchemaFuncFirstArgument;\n }\n\n if (previousKeyword?.value === SCHEMA && previousNonWhiteSpace?.is(TokenType.Delimiter, ',')) {\n return StatementPosition.SchemaFuncExtraArgument;\n }\n\n if (\n (previousKeyword?.value === FROM && previousNonWhiteSpace?.isDoubleQuotedString()) ||\n (previousKeyword?.value === FROM && previousNonWhiteSpace?.isVariable()) ||\n (previousKeyword?.value === SCHEMA && previousNonWhiteSpace?.is(TokenType.Parenthesis, ')'))\n ) {\n return StatementPosition.AfterFrom;\n }\n\n if (\n previousKeyword?.value === WHERE &&\n (previousNonWhiteSpace?.isKeyword() ||\n previousNonWhiteSpace?.is(TokenType.Parenthesis, '(') ||\n previousNonWhiteSpace?.is(TokenType.Operator, AND))\n ) {\n return StatementPosition.WhereKey;\n }\n\n if (\n previousKeyword?.value === WHERE &&\n (previousNonWhiteSpace?.isIdentifier() || previousNonWhiteSpace?.isDoubleQuotedString())\n ) {\n return StatementPosition.WhereComparisonOperator;\n }\n\n if (\n previousKeyword?.value === WHERE &&\n (previousNonWhiteSpace?.is(TokenType.Operator, EQUALS) || previousNonWhiteSpace?.is(TokenType.Operator, NOT_EQUALS))\n ) {\n return StatementPosition.WhereValue;\n }\n\n if (\n previousKeyword?.value === WHERE &&\n (previousNonWhiteSpace?.isString() || previousNonWhiteSpace?.is(TokenType.Parenthesis, ')'))\n ) {\n return StatementPosition.AfterWhereValue;\n }\n\n if (\n previousKeyword?.is(TokenType.Keyword, BY) &&\n previousKeyword?.getPreviousKeyword()?.is(TokenType.Keyword, GROUP) &&\n (previousNonWhiteSpace?.is(TokenType.Keyword, BY) || previousNonWhiteSpace?.is(TokenType.Delimiter, ','))\n ) {\n return StatementPosition.AfterGroupByKeywords;\n }\n\n if (\n previousKeyword?.is(TokenType.Keyword, BY) &&\n previousKeyword?.getPreviousKeyword()?.is(TokenType.Keyword, GROUP) &&\n (previousNonWhiteSpace?.isIdentifier() || previousNonWhiteSpace?.isDoubleQuotedString())\n ) {\n return StatementPosition.AfterGroupBy;\n }\n\n if (\n previousNonWhiteSpace?.is(TokenType.Keyword, BY) &&\n previousNonWhiteSpace?.getPreviousKeyword()?.is(TokenType.Keyword, ORDER)\n ) {\n return StatementPosition.AfterOrderByKeywords;\n }\n\n if (\n previousKeyword?.is(TokenType.Keyword, BY) &&\n previousKeyword?.getPreviousKeyword()?.is(TokenType.Keyword, ORDER) &&\n previousNonWhiteSpace?.is(TokenType.Parenthesis) &&\n previousNonWhiteSpace?.getPreviousNonWhiteSpaceToken()?.is(TokenType.Function)\n ) {\n return StatementPosition.AfterOrderByFunction;\n }\n\n if (previousKeyword?.is(TokenType.Keyword, DESC) || previousKeyword?.is(TokenType.Keyword, ASC)) {\n return StatementPosition.AfterOrderByDirection;\n }\n\n return StatementPosition.Unknown;\n}\n","import { StatementPosition, SuggestionKind } from './types';\n\nexport function getSuggestionKinds(statementPosition: StatementPosition): SuggestionKind[] {\n switch (statementPosition) {\n case StatementPosition.SelectKeyword:\n return [SuggestionKind.SelectKeyword];\n case StatementPosition.AfterSelectKeyword:\n return [SuggestionKind.FunctionsWithArguments];\n case StatementPosition.AfterSelectFuncFirstArgument:\n return [SuggestionKind.Metrics];\n case StatementPosition.AfterFromKeyword:\n return [SuggestionKind.Namespaces, SuggestionKind.SchemaKeyword];\n case StatementPosition.SchemaFuncFirstArgument:\n return [SuggestionKind.Namespaces];\n case StatementPosition.SchemaFuncExtraArgument:\n return [SuggestionKind.LabelKeys];\n case StatementPosition.FromKeyword:\n return [SuggestionKind.FromKeyword];\n case StatementPosition.AfterFrom:\n return [\n SuggestionKind.WhereKeyword,\n SuggestionKind.GroupByKeywords,\n SuggestionKind.OrderByKeywords,\n SuggestionKind.LimitKeyword,\n ];\n case StatementPosition.WhereKey:\n return [SuggestionKind.LabelKeys];\n case StatementPosition.WhereComparisonOperator:\n return [SuggestionKind.ComparisonOperators];\n case StatementPosition.WhereValue:\n return [SuggestionKind.LabelValues];\n case StatementPosition.AfterWhereValue:\n return [\n SuggestionKind.LogicalOperators,\n SuggestionKind.GroupByKeywords,\n SuggestionKind.OrderByKeywords,\n SuggestionKind.LimitKeyword,\n ];\n case StatementPosition.AfterGroupByKeywords:\n return [SuggestionKind.LabelKeys];\n case StatementPosition.AfterGroupBy:\n return [SuggestionKind.OrderByKeywords, SuggestionKind.LimitKeyword];\n case StatementPosition.AfterOrderByKeywords:\n return [SuggestionKind.FunctionsWithoutArguments];\n case StatementPosition.AfterOrderByFunction:\n return [SuggestionKind.SortOrderDirectionKeyword, SuggestionKind.LimitKeyword];\n case StatementPosition.AfterOrderByDirection:\n return [SuggestionKind.LimitKeyword];\n }\n\n return [];\n}\n","import React from 'react';\nimport angular from 'angular';\nimport { find, findLast, isEmpty, isString, set } from 'lodash';\nimport { from, lastValueFrom, merge, Observable, of, throwError, zip } from 'rxjs';\nimport { catchError, concatMap, finalize, map, mergeMap, repeat, scan, share, takeWhile, tap } from 'rxjs/operators';\nimport { DataSourceWithBackend, FetchError, getBackendSrv, toDataQueryResponse } from '@grafana/runtime';\nimport { RowContextOptions } from '@grafana/ui/src/components/Logs/LogRowContextProvider';\nimport {\n DataFrame,\n DataQueryError,\n DataQueryErrorType,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n DataSourceWithLogsContextSupport,\n dateMath,\n LoadingState,\n LogRowModel,\n rangeUtil,\n ScopedVars,\n TableData,\n TimeRange,\n toLegacyResponseData,\n} from '@grafana/data';\n\nimport { notifyApp } from 'app/core/actions';\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { AppNotificationTimeout } from 'app/types';\nimport { store } from 'app/store/store';\nimport { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_srv';\nimport { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { ThrottlingErrorMessage } from './components/ThrottlingErrorMessage';\nimport memoizedDebounce from './memoizedDebounce';\nimport {\n MetricEditorMode,\n CloudWatchJsonData,\n CloudWatchLogsQuery,\n CloudWatchLogsQueryStatus,\n CloudWatchMetricsQuery,\n CloudWatchQuery,\n DescribeLogGroupsRequest,\n GetLogEventsRequest,\n GetLogGroupFieldsRequest,\n GetLogGroupFieldsResponse,\n isCloudWatchLogsQuery,\n LogAction,\n MetricQueryType,\n MetricQuery,\n MetricRequest,\n StartQueryRequest,\n TSDBResponse,\n Dimensions,\n MetricFindSuggestData,\n CloudWatchLogsRequest,\n} from './types';\nimport { CloudWatchLanguageProvider } from './language_provider';\nimport { VariableWithMultiSupport } from 'app/features/variables/types';\nimport { increasingInterval } from './utils/rxjs/increasingInterval';\nimport { toTestingStatus } from '@grafana/runtime/src/utils/queryResponse';\nimport { addDataLinksToLogsResponse } from './utils/datalinks';\nimport { runWithRetry } from './utils/logsRetry';\nimport { CompletionItemProvider } from './cloudwatch-sql/completion/CompletionItemProvider';\n\nconst DS_QUERY_ENDPOINT = '/api/ds/query';\n\n// Constants also defined in tsdb/cloudwatch/cloudwatch.go\nconst LOG_IDENTIFIER_INTERNAL = '__log__grafana_internal__';\nconst LOGSTREAM_IDENTIFIER_INTERNAL = '__logstream__grafana_internal__';\n\nconst displayAlert = (datasourceName: string, region: string) =>\n store.dispatch(\n notifyApp(\n createErrorNotification(\n `CloudWatch request limit reached in ${region} for data source ${datasourceName}`,\n '',\n React.createElement(ThrottlingErrorMessage, { region }, null)\n )\n )\n );\n\nconst displayCustomError = (title: string, message: string) =>\n store.dispatch(notifyApp(createErrorNotification(title, message)));\n\nexport const MAX_ATTEMPTS = 5;\n\nexport class CloudWatchDatasource\n extends DataSourceWithBackend<CloudWatchQuery, CloudWatchJsonData>\n implements DataSourceWithLogsContextSupport {\n proxyUrl: any;\n defaultRegion: any;\n datasourceName: string;\n languageProvider: CloudWatchLanguageProvider;\n sqlCompletionItemProvider: CompletionItemProvider;\n tracingDataSourceUid?: string;\n logsTimeout: string;\n\n type = 'cloudwatch';\n standardStatistics = ['Average', 'Maximum', 'Minimum', 'Sum', 'SampleCount'];\n\n debouncedAlert: (datasourceName: string, region: string) => void = memoizedDebounce(\n displayAlert,\n AppNotificationTimeout.Error\n );\n debouncedCustomAlert: (title: string, message: string) => void = memoizedDebounce(\n displayCustomError,\n AppNotificationTimeout.Error\n );\n logQueries: Record<string, { id: string; region: string; statsQuery: boolean }> = {};\n\n constructor(\n instanceSettings: DataSourceInstanceSettings<CloudWatchJsonData>,\n private readonly templateSrv: TemplateSrv = getTemplateSrv(),\n private readonly timeSrv: TimeSrv = getTimeSrv()\n ) {\n super(instanceSettings);\n this.proxyUrl = instanceSettings.url;\n this.defaultRegion = instanceSettings.jsonData.defaultRegion;\n this.datasourceName = instanceSettings.name;\n this.languageProvider = new CloudWatchLanguageProvider(this);\n this.tracingDataSourceUid = instanceSettings.jsonData.tracingDatasourceUid;\n this.logsTimeout = instanceSettings.jsonData.logsTimeout || '15m';\n this.sqlCompletionItemProvider = new CompletionItemProvider(this);\n }\n\n query(options: DataQueryRequest<CloudWatchQuery>): Observable<DataQueryResponse> {\n options = angular.copy(options);\n\n let queries = options.targets.filter((item) => item.id !== '' || item.hide !== true);\n const { logQueries, metricsQueries } = this.getTargetsByQueryMode(queries);\n\n const dataQueryResponses: Array<Observable<DataQueryResponse>> = [];\n if (logQueries.length > 0) {\n dataQueryResponses.push(this.handleLogQueries(logQueries, options));\n }\n\n if (metricsQueries.length > 0) {\n dataQueryResponses.push(this.handleMetricQueries(metricsQueries, options));\n }\n\n // No valid targets, return the empty result to save a round trip.\n if (isEmpty(dataQueryResponses)) {\n return of({\n data: [],\n state: LoadingState.Done,\n });\n }\n\n return merge(...dataQueryResponses);\n }\n\n /**\n * Handle log query. The log query works by starting the query on the CloudWatch and then periodically polling for\n * results.\n * @param logQueries\n * @param options\n */\n handleLogQueries = (\n logQueries: CloudWatchLogsQuery[],\n options: DataQueryRequest<CloudWatchQuery>\n ): Observable<DataQueryResponse> => {\n const validLogQueries = logQueries.filter((item) => item.logGroupNames?.length);\n if (logQueries.length > validLogQueries.length) {\n return of({ data: [], error: { message: 'Log group is required' } });\n }\n\n // No valid targets, return the empty result to save a round trip.\n if (isEmpty(validLogQueries)) {\n return of({ data: [], state: LoadingState.Done });\n }\n\n const queryParams = logQueries.map((target: CloudWatchLogsQuery) => ({\n queryString: target.expression || '',\n refId: target.refId,\n logGroupNames: target.logGroupNames,\n region: this.replace(this.getActualRegion(target.region), options.scopedVars, true, 'region'),\n }));\n\n return runWithRetry(\n (targets: StartQueryRequest[]) => {\n return this.makeLogActionRequest('StartQuery', targets, {\n makeReplacements: true,\n scopedVars: options.scopedVars,\n skipCache: true,\n });\n },\n queryParams,\n {\n timeout: rangeUtil.intervalToMs(this.logsTimeout),\n }\n ).pipe(\n mergeMap(({ frames, error }: { frames: DataFrame[]; error?: DataQueryError }) =>\n // This queries for the results\n this.logsQuery(\n frames.map((dataFrame) => ({\n queryId: dataFrame.fields[0].values.get(0),\n region: dataFrame.meta?.custom?.['Region'] ?? 'default',\n refId: dataFrame.refId!,\n statsGroups: (logQueries.find((target) => target.refId === dataFrame.refId)! as CloudWatchLogsQuery)\n .statsGroups,\n }))\n ).pipe(\n map((response: DataQueryResponse) => {\n if (!response.error && error) {\n response.error = error;\n }\n return response;\n })\n )\n ),\n mergeMap((dataQueryResponse) => {\n return from(\n (async () => {\n await addDataLinksToLogsResponse(\n dataQueryResponse,\n options,\n this.timeSrv.timeRange(),\n this.replace.bind(this),\n this.getActualRegion.bind(this),\n this.tracingDataSourceUid\n );\n\n return dataQueryResponse;\n })()\n );\n })\n );\n };\n\n filterMetricQuery({\n region,\n metricQueryType,\n metricEditorMode,\n expression,\n metricName,\n namespace,\n sqlExpression,\n statistic,\n dimensions,\n ...rest\n }: CloudWatchMetricsQuery): boolean {\n if (!region) {\n return false;\n }\n\n if (metricQueryType === MetricQueryType.Search && metricEditorMode === MetricEditorMode.Builder) {\n return !!namespace && !!metricName && !!statistic;\n } else if (metricQueryType === MetricQueryType.Search && metricEditorMode === MetricEditorMode.Code) {\n return !!expression;\n } else if (metricQueryType === MetricQueryType.Query) {\n // still TBD how to validate the visual query builder for SQL\n return !!sqlExpression;\n }\n\n throw new Error('invalid metric editor mode');\n }\n\n handleMetricQueries = (\n metricQueries: CloudWatchMetricsQuery[],\n options: DataQueryRequest<CloudWatchQuery>\n ): Observable<DataQueryResponse> => {\n const validMetricsQueries = metricQueries.filter(this.filterMetricQuery).map(\n (item: CloudWatchMetricsQuery): MetricQuery => {\n item.region = this.replace(this.getActualRegion(item.region), options.scopedVars, true, 'region');\n item.namespace = this.replace(item.namespace, options.scopedVars, true, 'namespace');\n item.metricName = this.replace(item.metricName, options.scopedVars, true, 'metric name');\n item.dimensions = this.convertDimensionFormat(item.dimensions ?? {}, options.scopedVars);\n item.statistic = this.templateSrv.replace(item.statistic, options.scopedVars);\n item.period = String(this.getPeriod(item, options)); // use string format for period in graph query, and alerting\n item.id = this.templateSrv.replace(item.id, options.scopedVars);\n item.expression = this.templateSrv.replace(item.expression, options.scopedVars);\n item.sqlExpression = this.templateSrv.replace(item.sqlExpression, options.scopedVars, 'raw');\n\n return {\n intervalMs: options.intervalMs,\n maxDataPoints: options.maxDataPoints,\n ...item,\n type: 'timeSeriesQuery',\n datasource: this.getRef(),\n };\n }\n );\n\n // No valid targets, return the empty result to save a round trip.\n if (isEmpty(validMetricsQueries)) {\n return of({ data: [] });\n }\n\n const request = {\n from: options?.range?.from.valueOf().toString(),\n to: options?.range?.to.valueOf().toString(),\n queries: validMetricsQueries,\n };\n\n return this.performTimeSeriesQuery(request, options.range);\n };\n\n /**\n * Checks progress and polls data of a started logs query with some retry logic.\n * @param queryParams\n */\n logsQuery(\n queryParams: Array<{\n queryId: string;\n refId: string;\n limit?: number;\n region: string;\n statsGroups?: string[];\n }>\n ): Observable<DataQueryResponse> {\n this.logQueries = {};\n queryParams.forEach((param) => {\n this.logQueries[param.refId] = {\n id: param.queryId,\n region: param.region,\n statsQuery: (param.statsGroups?.length ?? 0) > 0 ?? false,\n };\n });\n\n const dataFrames = increasingInterval({ startPeriod: 100, endPeriod: 1000, step: 300 }).pipe(\n concatMap((_) => this.makeLogActionRequest('GetQueryResults', queryParams, { skipCache: true })),\n repeat(),\n share()\n );\n\n const consecutiveFailedAttempts = dataFrames.pipe(\n scan(\n ({ failures, prevRecordsMatched }, frames) => {\n failures++;\n for (const frame of frames) {\n const recordsMatched = frame.meta?.stats?.find((stat) => stat.displayName === 'Records scanned')?.value!;\n if (recordsMatched > (prevRecordsMatched[frame.refId!] ?? 0)) {\n failures = 0;\n }\n prevRecordsMatched[frame.refId!] = recordsMatched;\n }\n\n return { failures, prevRecordsMatched };\n },\n { failures: 0, prevRecordsMatched: {} as Record<string, number> }\n ),\n map(({ failures }) => failures),\n share()\n );\n\n const queryResponse: Observable<DataQueryResponse> = zip(dataFrames, consecutiveFailedAttempts).pipe(\n tap(([dataFrames]) => {\n for (const frame of dataFrames) {\n if (\n [\n CloudWatchLogsQueryStatus.Complete,\n CloudWatchLogsQueryStatus.Cancelled,\n CloudWatchLogsQueryStatus.Failed,\n ].includes(frame.meta?.custom?.['Status']) &&\n this.logQueries.hasOwnProperty(frame.refId!)\n ) {\n delete this.logQueries[frame.refId!];\n }\n }\n }),\n map(([dataFrames, failedAttempts]) => {\n if (failedAttempts >= MAX_ATTEMPTS) {\n for (const frame of dataFrames) {\n set(frame, 'meta.custom.Status', CloudWatchLogsQueryStatus.Cancelled);\n }\n }\n\n return {\n data: dataFrames,\n key: 'test-key',\n state: dataFrames.every((dataFrame) =>\n [\n CloudWatchLogsQueryStatus.Complete,\n CloudWatchLogsQueryStatus.Cancelled,\n CloudWatchLogsQueryStatus.Failed,\n ].includes(dataFrame.meta?.custom?.['Status'])\n )\n ? LoadingState.Done\n : LoadingState.Loading,\n error:\n failedAttempts >= MAX_ATTEMPTS\n ? {\n message: `error: query timed out after ${MAX_ATTEMPTS} attempts`,\n type: DataQueryErrorType.Timeout,\n }\n : undefined,\n };\n }),\n takeWhile(({ state }) => state !== LoadingState.Error && state !== LoadingState.Done, true)\n );\n\n return withTeardown(queryResponse, () => this.stopQueries());\n }\n\n stopQueries() {\n if (Object.keys(this.logQueries).length > 0) {\n this.makeLogActionRequest(\n 'StopQuery',\n Object.values(this.logQueries).map((logQuery) => ({ queryId: logQuery.id, region: logQuery.region })),\n {\n makeReplacements: false,\n skipCache: true,\n }\n ).pipe(\n finalize(() => {\n this.logQueries = {};\n })\n );\n }\n }\n\n async describeLogGroups(params: DescribeLogGroupsRequest): Promise<string[]> {\n const dataFrames = await lastValueFrom(this.makeLogActionRequest('DescribeLogGroups', [params]));\n\n const logGroupNames = dataFrames[0]?.fields[0]?.values.toArray() ?? [];\n return logGroupNames;\n }\n\n async getLogGroupFields(params: GetLogGroupFieldsRequest): Promise<GetLogGroupFieldsResponse> {\n const dataFrames = await lastValueFrom(this.makeLogActionRequest('GetLogGroupFields', [params]));\n\n const fieldNames = dataFrames[0].fields[0].values.toArray();\n const fieldPercentages = dataFrames[0].fields[1].values.toArray();\n const getLogGroupFieldsResponse = {\n logGroupFields: fieldNames.map((val, i) => ({ name: val, percent: fieldPercentages[i] })) ?? [],\n };\n\n return getLogGroupFieldsResponse;\n }\n\n getLogRowContext = async (\n row: LogRowModel,\n { limit = 10, direction = 'BACKWARD' }: RowContextOptions = {}\n ): Promise<{ data: DataFrame[] }> => {\n let logStreamField = null;\n let logField = null;\n\n for (const field of row.dataFrame.fields) {\n if (field.name === LOGSTREAM_IDENTIFIER_INTERNAL) {\n logStreamField = field;\n if (logField !== null) {\n break;\n }\n } else if (field.name === LOG_IDENTIFIER_INTERNAL) {\n logField = field;\n if (logStreamField !== null) {\n break;\n }\n }\n }\n\n const requestParams: GetLogEventsRequest = {\n limit,\n startFromHead: direction !== 'BACKWARD',\n logGroupName: parseLogGroupName(logField!.values.get(row.rowIndex)),\n logStreamName: logStreamField!.values.get(row.rowIndex),\n };\n\n if (direction === 'BACKWARD') {\n requestParams.endTime = row.timeEpochMs;\n } else {\n requestParams.startTime = row.timeEpochMs;\n }\n\n const dataFrames = await lastValueFrom(this.makeLogActionRequest('GetLogEvents', [requestParams]));\n\n return {\n data: dataFrames,\n };\n };\n\n getVariables() {\n return this.templateSrv.getVariables().map((v) => `$${v.name}`);\n }\n\n getPeriod(target: CloudWatchMetricsQuery, options: any) {\n let period = this.templateSrv.replace(target.period, options.scopedVars) as any;\n if (period && period.toLowerCase() !== 'auto') {\n if (/^\\d+$/.test(period)) {\n period = parseInt(period, 10);\n } else {\n period = rangeUtil.intervalToSeconds(period);\n }\n\n if (period < 1) {\n period = 1;\n }\n }\n\n return period || '';\n }\n\n performTimeSeriesQuery(request: MetricRequest, { from, to }: TimeRange): Observable<any> {\n return this.awsRequest(DS_QUERY_ENDPOINT, request).pipe(\n map((res) => {\n const dataframes: DataFrame[] = toDataQueryResponse({ data: res }).data;\n if (!dataframes || dataframes.length <= 0) {\n return { data: [] };\n }\n\n const lastError = findLast(res.results, (v) => !!v.error);\n\n return {\n data: dataframes,\n error: lastError ? { message: lastError.error } : null,\n };\n }),\n catchError((err) => {\n const isFrameError = err.data.results;\n\n // Error is not frame specific\n if (!isFrameError && err.data && err.data.message === 'Metric request error' && err.data.error) {\n err.message = err.data.error;\n return throwError(() => err);\n }\n\n // The error is either for a specific frame or for all the frames\n const results: Array<{ error?: string }> = Object.values(err.data.results);\n const firstErrorResult = results.find((r) => r.error);\n if (firstErrorResult) {\n err.message = firstErrorResult.error;\n }\n\n if (results.some((r) => r.error && /^Throttling:.*/.test(r.error))) {\n const failedRedIds = Object.keys(err.data.results);\n const regionsAffected = Object.values(request.queries).reduce(\n (res: string[], { refId, region }) =>\n (refId && !failedRedIds.includes(refId)) || res.includes(region) ? res : [...res, region],\n []\n ) as string[];\n regionsAffected.forEach((region) => {\n const actualRegion = this.getActualRegion(region);\n if (actualRegion) {\n this.debouncedAlert(this.datasourceName, actualRegion);\n }\n });\n }\n\n return throwError(() => err);\n })\n );\n }\n\n transformSuggestDataFromDataframes(suggestData: TSDBResponse): MetricFindSuggestData[] {\n const frames = toDataQueryResponse({ data: suggestData }).data as DataFrame[];\n const table = toLegacyResponseData(frames[0]) as TableData;\n\n return table.rows.map(([text, value]) => ({\n text,\n value,\n label: value,\n }));\n }\n\n doMetricQueryRequest(subtype: string, parameters: any): Promise<MetricFindSuggestData[]> {\n const range = this.timeSrv.timeRange();\n return lastValueFrom(\n this.awsRequest(DS_QUERY_ENDPOINT, {\n from: range.from.valueOf().toString(),\n to: range.to.valueOf().toString(),\n queries: [\n {\n refId: 'metricFindQuery',\n intervalMs: 1, // dummy\n maxDataPoints: 1, // dummy\n datasource: this.getRef(),\n type: 'metricFindQuery',\n subtype: subtype,\n ...parameters,\n },\n ],\n }).pipe(\n map((r) => {\n return this.transformSuggestDataFromDataframes(r);\n })\n )\n );\n }\n\n makeLogActionRequest(\n subtype: LogAction,\n queryParams: CloudWatchLogsRequest[],\n options: {\n scopedVars?: ScopedVars;\n makeReplacements?: boolean;\n skipCache?: boolean;\n } = {\n makeReplacements: true,\n skipCache: false,\n }\n ): Observable<DataFrame[]> {\n const range = this.timeSrv.timeRange();\n\n const requestParams = {\n from: range.from.valueOf().toString(),\n to: range.to.valueOf().toString(),\n queries: queryParams.map((param: CloudWatchLogsRequest) => ({\n refId: (param as StartQueryRequest).refId || 'A',\n intervalMs: 1, // dummy\n maxDataPoints: 1, // dummy\n datasource: this.getRef(),\n type: 'logAction',\n subtype: subtype,\n ...param,\n })),\n };\n\n if (options.makeReplacements) {\n requestParams.queries.forEach((query: CloudWatchLogsRequest) => {\n const fieldsToReplace: Array<\n keyof (GetLogEventsRequest & StartQueryRequest & DescribeLogGroupsRequest & GetLogGroupFieldsRequest)\n > = ['queryString', 'logGroupNames', 'logGroupName', 'logGroupNamePrefix'];\n\n const anyQuery: any = query;\n for (const fieldName of fieldsToReplace) {\n if (query.hasOwnProperty(fieldName)) {\n if (Array.isArray(anyQuery[fieldName])) {\n anyQuery[fieldName] = anyQuery[fieldName].map((val: string) =>\n this.replace(val, options.scopedVars, true, fieldName)\n );\n } else {\n anyQuery[fieldName] = this.replace(anyQuery[fieldName], options.scopedVars, true, fieldName);\n }\n }\n }\n // TODO: seems to be some sort of bug that we don't really send region with all queries. This means\n // if you select different than default region in editor you will get results for autocomplete from wrong\n // region.\n if (anyQuery.region) {\n anyQuery.region = this.replace(anyQuery.region, options.scopedVars, true, 'region');\n anyQuery.region = this.getActualRegion(anyQuery.region);\n }\n });\n }\n\n const resultsToDataFrames = (val: any): DataFrame[] => toDataQueryResponse(val).data || [];\n let headers = {};\n if (options.skipCache) {\n headers = {\n 'X-Cache-Skip': true,\n };\n }\n\n return this.awsRequest(DS_QUERY_ENDPOINT, requestParams, headers).pipe(\n map((response) => resultsToDataFrames({ data: response })),\n catchError((err: FetchError) => {\n if (err.status === 400) {\n throw err;\n }\n\n if (err.data?.error) {\n throw err.data.error;\n } else if (err.data?.message) {\n // In PROD we do not supply .error\n throw err.data.message;\n }\n\n throw err;\n })\n );\n }\n\n getRegions(): Promise<Array<{ label: string; value: string; text: string }>> {\n return this.doMetricQueryRequest('regions', null).then((regions: any) => [\n { label: 'default', value: 'default', text: 'default' },\n ...regions,\n ]);\n }\n\n getNamespaces() {\n return this.doMetricQueryRequest('namespaces', null);\n }\n\n async getMetrics(namespace: string | undefined, region?: string) {\n if (!namespace) {\n return [];\n }\n\n return this.doMetricQueryRequest('metrics', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n namespace: this.templateSrv.replace(namespace),\n });\n }\n\n async getAllMetrics(region: string): Promise<Array<{ metricName: string; namespace: string }>> {\n const values = await this.doMetricQueryRequest('all_metrics', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n });\n\n return values.map((v) => ({ metricName: v.label, namespace: v.text }));\n }\n\n async getDimensionKeys(\n namespace: string | undefined,\n region: string,\n dimensionFilters: Dimensions = {},\n metricName = ''\n ) {\n if (!namespace) {\n return [];\n }\n\n return this.doMetricQueryRequest('dimension_keys', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n namespace: this.templateSrv.replace(namespace),\n dimensionFilters: this.convertDimensionFormat(dimensionFilters, {}),\n metricName,\n });\n }\n\n async getDimensionValues(\n region: string,\n namespace: string | undefined,\n metricName: string | undefined,\n dimensionKey: string,\n filterDimensions: {}\n ) {\n if (!namespace || !metricName) {\n return [];\n }\n\n const values = await this.doMetricQueryRequest('dimension_values', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n namespace: this.templateSrv.replace(namespace),\n metricName: this.templateSrv.replace(metricName.trim()),\n dimensionKey: this.templateSrv.replace(dimensionKey),\n dimensions: this.convertDimensionFormat(filterDimensions, {}),\n });\n\n return values;\n }\n\n getEbsVolumeIds(region: string, instanceId: string) {\n return this.doMetricQueryRequest('ebs_volume_ids', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n instanceId: this.templateSrv.replace(instanceId),\n });\n }\n\n getEc2InstanceAttribute(region: string, attributeName: string, filters: any) {\n return this.doMetricQueryRequest('ec2_instance_attribute', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n attributeName: this.templateSrv.replace(attributeName),\n filters: filters,\n });\n }\n\n getResourceARNs(region: string, resourceType: string, tags: any) {\n return this.doMetricQueryRequest('resource_arns', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n resourceType: this.templateSrv.replace(resourceType),\n tags: tags,\n });\n }\n\n async metricFindQuery(query: string) {\n let region;\n let namespace;\n let metricName;\n let filterJson;\n\n const regionQuery = query.match(/^regions\\(\\)/);\n if (regionQuery) {\n return this.getRegions();\n }\n\n const namespaceQuery = query.match(/^namespaces\\(\\)/);\n if (namespaceQuery) {\n return this.getNamespaces();\n }\n\n const metricNameQuery = query.match(/^metrics\\(([^\\)]+?)(,\\s?([^,]+?))?\\)/);\n if (metricNameQuery) {\n namespace = metricNameQuery[1];\n region = metricNameQuery[3];\n return this.getMetrics(namespace, region);\n }\n\n const dimensionKeysQuery = query.match(/^dimension_keys\\(([^\\)]+?)(,\\s?([^,]+?))?\\)/);\n if (dimensionKeysQuery) {\n namespace = dimensionKeysQuery[1];\n region = dimensionKeysQuery[3];\n return this.getDimensionKeys(namespace, region);\n }\n\n const dimensionValuesQuery = query.match(\n /^dimension_values\\(([^,]+?),\\s?([^,]+?),\\s?([^,]+?),\\s?([^,]+?)(,\\s?(.+))?\\)/\n );\n if (dimensionValuesQuery) {\n region = dimensionValuesQuery[1];\n namespace = dimensionValuesQuery[2];\n metricName = dimensionValuesQuery[3];\n const dimensionKey = dimensionValuesQuery[4];\n filterJson = {};\n if (dimensionValuesQuery[6]) {\n filterJson = JSON.parse(this.templateSrv.replace(dimensionValuesQuery[6]));\n }\n\n return this.getDimensionValues(region, namespace, metricName, dimensionKey, filterJson);\n }\n\n const ebsVolumeIdsQuery = query.match(/^ebs_volume_ids\\(([^,]+?),\\s?([^,]+?)\\)/);\n if (ebsVolumeIdsQuery) {\n region = ebsVolumeIdsQuery[1];\n const instanceId = ebsVolumeIdsQuery[2];\n return this.getEbsVolumeIds(region, instanceId);\n }\n\n const ec2InstanceAttributeQuery = query.match(/^ec2_instance_attribute\\(([^,]+?),\\s?([^,]+?),\\s?(.+?)\\)/);\n if (ec2InstanceAttributeQuery) {\n region = ec2InstanceAttributeQuery[1];\n const targetAttributeName = ec2InstanceAttributeQuery[2];\n filterJson = JSON.parse(this.templateSrv.replace(ec2InstanceAttributeQuery[3]));\n return this.getEc2InstanceAttribute(region, targetAttributeName, filterJson);\n }\n\n const resourceARNsQuery = query.match(/^resource_arns\\(([^,]+?),\\s?([^,]+?),\\s?(.+?)\\)/);\n if (resourceARNsQuery) {\n region = resourceARNsQuery[1];\n const resourceType = resourceARNsQuery[2];\n const tagsJSON = JSON.parse(this.templateSrv.replace(resourceARNsQuery[3]));\n return this.getResourceARNs(region, resourceType, tagsJSON);\n }\n\n const statsQuery = query.match(/^statistics\\(\\)/);\n if (statsQuery) {\n return this.standardStatistics.map((s: string) => ({ value: s, label: s, text: s }));\n }\n\n return Promise.resolve([]);\n }\n\n annotationQuery(options: any) {\n const annotation = options.annotation;\n const statistic = this.templateSrv.replace(annotation.statistic);\n const defaultPeriod = annotation.prefixMatching ? '' : '300';\n let period = annotation.period || defaultPeriod;\n period = parseInt(period, 10);\n const parameters = {\n prefixMatching: annotation.prefixMatching,\n region: this.templateSrv.replace(this.getActualRegion(annotation.region)),\n namespace: this.templateSrv.replace(annotation.namespace),\n metricName: this.templateSrv.replace(annotation.metricName),\n dimensions: this.convertDimensionFormat(annotation.dimensions, {}),\n statistic: statistic,\n period: period,\n actionPrefix: annotation.actionPrefix || '',\n alarmNamePrefix: annotation.alarmNamePrefix || '',\n };\n\n return lastValueFrom(\n this.awsRequest(DS_QUERY_ENDPOINT, {\n from: options.range.from.valueOf().toString(),\n to: options.range.to.valueOf().toString(),\n queries: [\n {\n refId: 'annotationQuery',\n datasource: this.getRef(),\n type: 'annotationQuery',\n ...parameters,\n },\n ],\n }).pipe(\n map((r) => {\n const frames = toDataQueryResponse({ data: r }).data as DataFrame[];\n const table = toLegacyResponseData(frames[0]) as TableData;\n return table.rows.map((v) => ({\n annotation: annotation,\n time: Date.parse(v[0]),\n title: v[1],\n tags: [v[2]],\n text: v[3],\n }));\n })\n )\n );\n }\n\n targetContainsTemplate(target: any) {\n return (\n this.templateSrv.variableExists(target.region) ||\n this.templateSrv.variableExists(target.namespace) ||\n this.templateSrv.variableExists(target.metricName) ||\n this.templateSrv.variableExists(target.expression!) ||\n target.logGroupNames?.some((logGroup: string) => this.templateSrv.variableExists(logGroup)) ||\n find(target.dimensions, (v, k) => this.templateSrv.variableExists(k) || this.templateSrv.variableExists(v))\n );\n }\n\n async testDatasource() {\n // use billing metrics for test\n const region = this.defaultRegion;\n const namespace = 'AWS/Billing';\n const metricName = 'EstimatedCharges';\n const dimensions = {};\n\n try {\n await this.getDimensionValues(region ?? '', namespace, metricName, 'ServiceName', dimensions);\n return {\n status: 'success',\n message: 'Data source is working',\n };\n } catch (error) {\n return toTestingStatus(error);\n }\n }\n\n awsRequest(url: string, data: MetricRequest, headers: Record<string, any> = {}): Observable<TSDBResponse> {\n const options = {\n method: 'POST',\n url,\n data,\n headers,\n };\n\n return getBackendSrv()\n .fetch<TSDBResponse>(options)\n .pipe(map((result) => result.data));\n }\n\n getDefaultRegion() {\n return this.defaultRegion;\n }\n\n getActualRegion(region?: string) {\n if (region === 'default' || region === undefined || region === '') {\n return this.getDefaultRegion();\n }\n return region;\n }\n\n showContextToggle() {\n return true;\n }\n\n convertToCloudWatchTime(date: any, roundUp: any) {\n if (isString(date)) {\n date = dateMath.parse(date, roundUp);\n }\n return Math.round(date.valueOf() / 1000);\n }\n\n convertDimensionFormat(dimensions: Dimensions, scopedVars: ScopedVars) {\n return Object.entries(dimensions).reduce((result, [key, value]) => {\n key = this.replace(key, scopedVars, true, 'dimension keys');\n\n if (Array.isArray(value)) {\n return { ...result, [key]: value };\n }\n\n if (!value) {\n return { ...result, [key]: null };\n }\n\n const valueVar = this.templateSrv\n .getVariables()\n .find(({ name }) => name === this.templateSrv.getVariableName(value));\n if (valueVar) {\n if (((valueVar as unknown) as VariableWithMultiSupport).multi) {\n const values = this.templateSrv.replace(value, scopedVars, 'pipe').split('|');\n return { ...result, [key]: values };\n }\n return { ...result, [key]: [this.templateSrv.replace(value, scopedVars)] };\n }\n\n return { ...result, [key]: [value] };\n }, {});\n }\n\n replace(\n target?: string,\n scopedVars?: ScopedVars,\n displayErrorIfIsMultiTemplateVariable?: boolean,\n fieldName?: string\n ) {\n if (displayErrorIfIsMultiTemplateVariable && !!target) {\n const variable = this.templateSrv\n .getVariables()\n .find(({ name }) => name === this.templateSrv.getVariableName(target));\n if (variable && ((variable as unknown) as VariableWithMultiSupport).multi) {\n this.debouncedCustomAlert(\n 'CloudWatch templating error',\n `Multi template variables are not supported for ${fieldName || target}`\n );\n }\n }\n\n return this.templateSrv.replace(target, scopedVars);\n }\n\n getQueryDisplayText(query: CloudWatchQuery) {\n if (query.queryMode === 'Logs') {\n return query.expression ?? '';\n } else {\n return JSON.stringify(query);\n }\n }\n\n getTargetsByQueryMode = (targets: CloudWatchQuery[]) => {\n const logQueries: CloudWatchLogsQuery[] = [];\n const metricsQueries: CloudWatchMetricsQuery[] = [];\n\n targets.forEach((query) => {\n const mode = query.queryMode ?? 'Metrics';\n if (mode === 'Logs') {\n logQueries.push(query as CloudWatchLogsQuery);\n } else {\n metricsQueries.push(query as CloudWatchMetricsQuery);\n }\n });\n\n return {\n logQueries,\n metricsQueries,\n };\n };\n\n interpolateVariablesInQueries(queries: CloudWatchQuery[], scopedVars: ScopedVars): CloudWatchQuery[] {\n if (!queries.length) {\n return queries;\n }\n\n return queries.map((query) => ({\n ...query,\n region: this.getActualRegion(this.replace(query.region, scopedVars)),\n expression: this.replace(query.expression, scopedVars),\n\n ...(!isCloudWatchLogsQuery(query) && this.interpolateMetricsQueryVariables(query, scopedVars)),\n }));\n }\n\n interpolateMetricsQueryVariables(\n query: CloudWatchMetricsQuery,\n scopedVars: ScopedVars\n ): Pick<CloudWatchMetricsQuery, 'alias' | 'metricName' | 'namespace' | 'period' | 'dimensions' | 'sqlExpression'> {\n return {\n alias: this.replace(query.alias, scopedVars),\n metricName: this.replace(query.metricName, scopedVars),\n namespace: this.replace(query.namespace, scopedVars),\n period: this.replace(query.period, scopedVars),\n sqlExpression: this.replace(query.sqlExpression, scopedVars),\n dimensions: Object.entries(query.dimensions ?? {}).reduce((prev, [key, value]) => {\n if (Array.isArray(value)) {\n return { ...prev, [key]: value };\n }\n\n return { ...prev, [this.replace(key, scopedVars)]: this.replace(value, scopedVars) };\n }, {}),\n };\n }\n}\n\nfunction withTeardown<T = any>(observable: Observable<T>, onUnsubscribe: () => void): Observable<T> {\n return new Observable<T>((subscriber) => {\n const innerSub = observable.subscribe({\n next: (val) => subscriber.next(val),\n error: (err) => subscriber.next(err),\n complete: () => subscriber.complete(),\n });\n\n return () => {\n innerSub.unsubscribe();\n onUnsubscribe();\n };\n });\n}\n\nfunction parseLogGroupName(logIdentifier: string): string {\n const colonIndex = logIdentifier.lastIndexOf(':');\n return logIdentifier.substr(colonIndex + 1);\n}\n","import { defaultsDeep } from 'lodash';\nimport { CloudWatchAnnotationQuery } from './types';\n\nexport class CloudWatchAnnotationsQueryCtrl {\n static templateUrl = 'partials/annotations.editor.html';\n declare annotation: any;\n\n /** @ngInject */\n constructor($scope: any) {\n this.annotation = $scope.ctrl.annotation;\n\n defaultsDeep(this.annotation, {\n namespace: '',\n metricName: '',\n expression: '',\n dimensions: {},\n region: 'default',\n id: '',\n alias: '',\n statistic: 'Average',\n matchExact: true,\n prefixMatching: false,\n actionPrefix: '',\n alarmNamePrefix: '',\n });\n\n this.onChange = this.onChange.bind(this);\n }\n\n onChange(query: CloudWatchAnnotationQuery) {\n Object.assign(this.annotation, query);\n }\n}\n","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['', ''], ['', '']);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class TemplateTag\n * @classdesc Consumes a pipeline of composable transformer plugins and produces a template tag.\n */\nvar TemplateTag = function () {\n /**\n * constructs a template tag\n * @constructs TemplateTag\n * @param {...Object} [...transformers] - an array or arguments list of transformers\n * @return {Function} - a template tag\n */\n function TemplateTag() {\n var _this = this;\n\n for (var _len = arguments.length, transformers = Array(_len), _key = 0; _key < _len; _key++) {\n transformers[_key] = arguments[_key];\n }\n\n _classCallCheck(this, TemplateTag);\n\n this.tag = function (strings) {\n for (var _len2 = arguments.length, expressions = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n expressions[_key2 - 1] = arguments[_key2];\n }\n\n if (typeof strings === 'function') {\n // if the first argument passed is a function, assume it is a template tag and return\n // an intermediary tag that processes the template using the aforementioned tag, passing the\n // result to our tag\n return _this.interimTag.bind(_this, strings);\n }\n\n if (typeof strings === 'string') {\n // if the first argument passed is a string, just transform it\n return _this.transformEndResult(strings);\n }\n\n // else, return a transformed end result of processing the template with our tag\n strings = strings.map(_this.transformString.bind(_this));\n return _this.transformEndResult(strings.reduce(_this.processSubstitutions.bind(_this, expressions)));\n };\n\n // if first argument is an array, extrude it as a list of transformers\n if (transformers.length > 0 && Array.isArray(transformers[0])) {\n transformers = transformers[0];\n }\n\n // if any transformers are functions, this means they are not initiated - automatically initiate them\n this.transformers = transformers.map(function (transformer) {\n return typeof transformer === 'function' ? transformer() : transformer;\n });\n\n // return an ES2015 template tag\n return this.tag;\n }\n\n /**\n * Applies all transformers to a template literal tagged with this method.\n * If a function is passed as the first argument, assumes the function is a template tag\n * and applies it to the template, returning a template tag.\n * @param {(Function|String|Array<String>)} strings - Either a template tag or an array containing template strings separated by identifier\n * @param {...*} ...expressions - Optional list of substitution values.\n * @return {(String|Function)} - Either an intermediary tag function or the results of processing the template.\n */\n\n\n _createClass(TemplateTag, [{\n key: 'interimTag',\n\n\n /**\n * An intermediary template tag that receives a template tag and passes the result of calling the template with the received\n * template tag to our own template tag.\n * @param {Function} nextTag - the received template tag\n * @param {Array<String>} template - the template to process\n * @param {...*} ...substitutions - `substitutions` is an array of all substitutions in the template\n * @return {*} - the final processed value\n */\n value: function interimTag(previousTag, template) {\n for (var _len3 = arguments.length, substitutions = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n substitutions[_key3 - 2] = arguments[_key3];\n }\n\n return this.tag(_templateObject, previousTag.apply(undefined, [template].concat(substitutions)));\n }\n\n /**\n * Performs bulk processing on the tagged template, transforming each substitution and then\n * concatenating the resulting values into a string.\n * @param {Array<*>} substitutions - an array of all remaining substitutions present in this template\n * @param {String} resultSoFar - this iteration's result string so far\n * @param {String} remainingPart - the template chunk after the current substitution\n * @return {String} - the result of joining this iteration's processed substitution with the result\n */\n\n }, {\n key: 'processSubstitutions',\n value: function processSubstitutions(substitutions, resultSoFar, remainingPart) {\n var substitution = this.transformSubstitution(substitutions.shift(), resultSoFar);\n return ''.concat(resultSoFar, substitution, remainingPart);\n }\n\n /**\n * Iterate through each transformer, applying the transformer's `onString` method to the template\n * strings before all substitutions are processed.\n * @param {String} str - The input string\n * @return {String} - The final results of processing each transformer\n */\n\n }, {\n key: 'transformString',\n value: function transformString(str) {\n var cb = function cb(res, transform) {\n return transform.onString ? transform.onString(res) : res;\n };\n return this.transformers.reduce(cb, str);\n }\n\n /**\n * When a substitution is encountered, iterates through each transformer and applies the transformer's\n * `onSubstitution` method to the substitution.\n * @param {*} substitution - The current substitution\n * @param {String} resultSoFar - The result up to and excluding this substitution.\n * @return {*} - The final result of applying all substitution transformations.\n */\n\n }, {\n key: 'transformSubstitution',\n value: function transformSubstitution(substitution, resultSoFar) {\n var cb = function cb(res, transform) {\n return transform.onSubstitution ? transform.onSubstitution(res, resultSoFar) : res;\n };\n return this.transformers.reduce(cb, substitution);\n }\n\n /**\n * Iterates through each transformer, applying the transformer's `onEndResult` method to the\n * template literal after all substitutions have finished processing.\n * @param {String} endResult - The processed template, just before it is returned from the tag\n * @return {String} - The final results of processing each transformer\n */\n\n }, {\n key: 'transformEndResult',\n value: function transformEndResult(endResult) {\n var cb = function cb(res, transform) {\n return transform.onEndResult ? transform.onEndResult(res) : res;\n };\n return this.transformers.reduce(cb, endResult);\n }\n }]);\n\n return TemplateTag;\n}();\n\nexport default TemplateTag;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9UZW1wbGF0ZVRhZy9UZW1wbGF0ZVRhZy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInRyYW5zZm9ybWVycyIsInRhZyIsInN0cmluZ3MiLCJleHByZXNzaW9ucyIsImludGVyaW1UYWciLCJiaW5kIiwidHJhbnNmb3JtRW5kUmVzdWx0IiwibWFwIiwidHJhbnNmb3JtU3RyaW5nIiwicmVkdWNlIiwicHJvY2Vzc1N1YnN0aXR1dGlvbnMiLCJsZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJ0cmFuc2Zvcm1lciIsInByZXZpb3VzVGFnIiwidGVtcGxhdGUiLCJzdWJzdGl0dXRpb25zIiwicmVzdWx0U29GYXIiLCJyZW1haW5pbmdQYXJ0Iiwic3Vic3RpdHV0aW9uIiwidHJhbnNmb3JtU3Vic3RpdHV0aW9uIiwic2hpZnQiLCJjb25jYXQiLCJzdHIiLCJjYiIsInJlcyIsInRyYW5zZm9ybSIsIm9uU3RyaW5nIiwib25TdWJzdGl0dXRpb24iLCJlbmRSZXN1bHQiLCJvbkVuZFJlc3VsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7OztJQUlxQkEsVztBQUNuQjs7Ozs7O0FBTUEseUJBQTZCO0FBQUE7O0FBQUEsc0NBQWRDLFlBQWM7QUFBZEEsa0JBQWM7QUFBQTs7QUFBQTs7QUFBQSxTQXVCN0JDLEdBdkI2QixHQXVCdkIsVUFBQ0MsT0FBRCxFQUE2QjtBQUFBLHlDQUFoQkMsV0FBZ0I7QUFBaEJBLG1CQUFnQjtBQUFBOztBQUNqQyxVQUFJLE9BQU9ELE9BQVAsS0FBbUIsVUFBdkIsRUFBbUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EsZUFBTyxNQUFLRSxVQUFMLENBQWdCQyxJQUFoQixRQUEyQkgsT0FBM0IsQ0FBUDtBQUNEOztBQUVELFVBQUksT0FBT0EsT0FBUCxLQUFtQixRQUF2QixFQUFpQztBQUMvQjtBQUNBLGVBQU8sTUFBS0ksa0JBQUwsQ0FBd0JKLE9BQXhCLENBQVA7QUFDRDs7QUFFRDtBQUNBQSxnQkFBVUEsUUFBUUssR0FBUixDQUFZLE1BQUtDLGVBQUwsQ0FBcUJILElBQXJCLE9BQVosQ0FBVjtBQUNBLGFBQU8sTUFBS0Msa0JBQUwsQ0FDTEosUUFBUU8sTUFBUixDQUFlLE1BQUtDLG9CQUFMLENBQTBCTCxJQUExQixRQUFxQ0YsV0FBckMsQ0FBZixDQURLLENBQVA7QUFHRCxLQXpDNEI7O0FBQzNCO0FBQ0EsUUFBSUgsYUFBYVcsTUFBYixHQUFzQixDQUF0QixJQUEyQkMsTUFBTUMsT0FBTixDQUFjYixhQUFhLENBQWIsQ0FBZCxDQUEvQixFQUErRDtBQUM3REEscUJBQWVBLGFBQWEsQ0FBYixDQUFmO0FBQ0Q7O0FBRUQ7QUFDQSxTQUFLQSxZQUFMLEdBQW9CQSxhQUFhTyxHQUFiLENBQWlCLHVCQUFlO0FBQ2xELGFBQU8sT0FBT08sV0FBUCxLQUF1QixVQUF2QixHQUFvQ0EsYUFBcEMsR0FBb0RBLFdBQTNEO0FBQ0QsS0FGbUIsQ0FBcEI7O0FBSUE7QUFDQSxXQUFPLEtBQUtiLEdBQVo7QUFDRDs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7QUE0QkE7Ozs7Ozs7OytCQVFXYyxXLEVBQWFDLFEsRUFBNEI7QUFBQSx5Q0FBZkMsYUFBZTtBQUFmQSxxQkFBZTtBQUFBOztBQUNsRCxhQUFPLEtBQUtoQixHQUFaLGtCQUFrQmMsOEJBQVlDLFFBQVosU0FBeUJDLGFBQXpCLEVBQWxCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7O3lDQVFxQkEsYSxFQUFlQyxXLEVBQWFDLGEsRUFBZTtBQUM5RCxVQUFNQyxlQUFlLEtBQUtDLHFCQUFMLENBQ25CSixjQUFjSyxLQUFkLEVBRG1CLEVBRW5CSixXQUZtQixDQUFyQjtBQUlBLGFBQU8sR0FBR0ssTUFBSCxDQUFVTCxXQUFWLEVBQXVCRSxZQUF2QixFQUFxQ0QsYUFBckMsQ0FBUDtBQUNEOztBQUVEOzs7Ozs7Ozs7b0NBTWdCSyxHLEVBQUs7QUFDbkIsVUFBTUMsS0FBSyxTQUFMQSxFQUFLLENBQUNDLEdBQUQsRUFBTUMsU0FBTjtBQUFBLGVBQ1RBLFVBQVVDLFFBQVYsR0FBcUJELFVBQVVDLFFBQVYsQ0FBbUJGLEdBQW5CLENBQXJCLEdBQStDQSxHQUR0QztBQUFBLE9BQVg7QUFFQSxhQUFPLEtBQUsxQixZQUFMLENBQWtCUyxNQUFsQixDQUF5QmdCLEVBQXpCLEVBQTZCRCxHQUE3QixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7MENBT3NCSixZLEVBQWNGLFcsRUFBYTtBQUMvQyxVQUFNTyxLQUFLLFNBQUxBLEVBQUssQ0FBQ0MsR0FBRCxFQUFNQyxTQUFOO0FBQUEsZUFDVEEsVUFBVUUsY0FBVixHQUNJRixVQUFVRSxjQUFWLENBQXlCSCxHQUF6QixFQUE4QlIsV0FBOUIsQ0FESixHQUVJUSxHQUhLO0FBQUEsT0FBWDtBQUlBLGFBQU8sS0FBSzFCLFlBQUwsQ0FBa0JTLE1BQWxCLENBQXlCZ0IsRUFBekIsRUFBNkJMLFlBQTdCLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7O3VDQU1tQlUsUyxFQUFXO0FBQzVCLFVBQU1MLEtBQUssU0FBTEEsRUFBSyxDQUFDQyxHQUFELEVBQU1DLFNBQU47QUFBQSxlQUNUQSxVQUFVSSxXQUFWLEdBQXdCSixVQUFVSSxXQUFWLENBQXNCTCxHQUF0QixDQUF4QixHQUFxREEsR0FENUM7QUFBQSxPQUFYO0FBRUEsYUFBTyxLQUFLMUIsWUFBTCxDQUFrQlMsTUFBbEIsQ0FBeUJnQixFQUF6QixFQUE2QkssU0FBN0IsQ0FBUDtBQUNEOzs7Ozs7ZUFuSGtCL0IsVyIsImZpbGUiOiJUZW1wbGF0ZVRhZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGNsYXNzIFRlbXBsYXRlVGFnXG4gKiBAY2xhc3NkZXNjIENvbnN1bWVzIGEgcGlwZWxpbmUgb2YgY29tcG9zYWJsZSB0cmFuc2Zvcm1lciBwbHVnaW5zIGFuZCBwcm9kdWNlcyBhIHRlbXBsYXRlIHRhZy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVtcGxhdGVUYWcge1xuICAvKipcbiAgICogY29uc3RydWN0cyBhIHRlbXBsYXRlIHRhZ1xuICAgKiBAY29uc3RydWN0cyBUZW1wbGF0ZVRhZ1xuICAgKiBAcGFyYW0gIHsuLi5PYmplY3R9IFsuLi50cmFuc2Zvcm1lcnNdIC0gYW4gYXJyYXkgb3IgYXJndW1lbnRzIGxpc3Qgb2YgdHJhbnNmb3JtZXJzXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSAgICAgICAgICAgICAgICAgICAgLSBhIHRlbXBsYXRlIHRhZ1xuICAgKi9cbiAgY29uc3RydWN0b3IoLi4udHJhbnNmb3JtZXJzKSB7XG4gICAgLy8gaWYgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIGV4dHJ1ZGUgaXQgYXMgYSBsaXN0IG9mIHRyYW5zZm9ybWVyc1xuICAgIGlmICh0cmFuc2Zvcm1lcnMubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVyc1swXSkpIHtcbiAgICAgIHRyYW5zZm9ybWVycyA9IHRyYW5zZm9ybWVyc1swXTtcbiAgICB9XG5cbiAgICAvLyBpZiBhbnkgdHJhbnNmb3JtZXJzIGFyZSBmdW5jdGlvbnMsIHRoaXMgbWVhbnMgdGhleSBhcmUgbm90IGluaXRpYXRlZCAtIGF1dG9tYXRpY2FsbHkgaW5pdGlhdGUgdGhlbVxuICAgIHRoaXMudHJhbnNmb3JtZXJzID0gdHJhbnNmb3JtZXJzLm1hcCh0cmFuc2Zvcm1lciA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIHRyYW5zZm9ybWVyID09PSAnZnVuY3Rpb24nID8gdHJhbnNmb3JtZXIoKSA6IHRyYW5zZm9ybWVyO1xuICAgIH0pO1xuXG4gICAgLy8gcmV0dXJuIGFuIEVTMjAxNSB0ZW1wbGF0ZSB0YWdcbiAgICByZXR1cm4gdGhpcy50YWc7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhbGwgdHJhbnNmb3JtZXJzIHRvIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWdnZWQgd2l0aCB0aGlzIG1ldGhvZC5cbiAgICogSWYgYSBmdW5jdGlvbiBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCBhc3N1bWVzIHRoZSBmdW5jdGlvbiBpcyBhIHRlbXBsYXRlIHRhZ1xuICAgKiBhbmQgYXBwbGllcyBpdCB0byB0aGUgdGVtcGxhdGUsIHJldHVybmluZyBhIHRlbXBsYXRlIHRhZy5cbiAgICogQHBhcmFtICB7KEZ1bmN0aW9ufFN0cmluZ3xBcnJheTxTdHJpbmc+KX0gc3RyaW5ncyAgICAgICAgLSBFaXRoZXIgYSB0ZW1wbGF0ZSB0YWcgb3IgYW4gYXJyYXkgY29udGFpbmluZyB0ZW1wbGF0ZSBzdHJpbmdzIHNlcGFyYXRlZCBieSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSAgey4uLip9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4cHJlc3Npb25zIC0gT3B0aW9uYWwgbGlzdCBvZiBzdWJzdGl0dXRpb24gdmFsdWVzLlxuICAgKiBAcmV0dXJuIHsoU3RyaW5nfEZ1bmN0aW9uKX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEVpdGhlciBhbiBpbnRlcm1lZGlhcnkgdGFnIGZ1bmN0aW9uIG9yIHRoZSByZXN1bHRzIG9mIHByb2Nlc3NpbmcgdGhlIHRlbXBsYXRlLlxuICAgKi9cbiAgdGFnID0gKHN0cmluZ3MsIC4uLmV4cHJlc3Npb25zKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzdHJpbmdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBpZiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIGlzIGEgZnVuY3Rpb24sIGFzc3VtZSBpdCBpcyBhIHRlbXBsYXRlIHRhZyBhbmQgcmV0dXJuXG4gICAgICAvLyBhbiBpbnRlcm1lZGlhcnkgdGFnIHRoYXQgcHJvY2Vzc2VzIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgYWZvcmVtZW50aW9uZWQgdGFnLCBwYXNzaW5nIHRoZVxuICAgICAgLy8gcmVzdWx0IHRvIG91ciB0YWdcbiAgICAgIHJldHVybiB0aGlzLmludGVyaW1UYWcuYmluZCh0aGlzLCBzdHJpbmdzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHN0cmluZ3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBpZiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIGlzIGEgc3RyaW5nLCBqdXN0IHRyYW5zZm9ybSBpdFxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRW5kUmVzdWx0KHN0cmluZ3MpO1xuICAgIH1cblxuICAgIC8vIGVsc2UsIHJldHVybiBhIHRyYW5zZm9ybWVkIGVuZCByZXN1bHQgb2YgcHJvY2Vzc2luZyB0aGUgdGVtcGxhdGUgd2l0aCBvdXIgdGFnXG4gICAgc3RyaW5ncyA9IHN0cmluZ3MubWFwKHRoaXMudHJhbnNmb3JtU3RyaW5nLmJpbmQodGhpcykpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUVuZFJlc3VsdChcbiAgICAgIHN0cmluZ3MucmVkdWNlKHRoaXMucHJvY2Vzc1N1YnN0aXR1dGlvbnMuYmluZCh0aGlzLCBleHByZXNzaW9ucykpLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFuIGludGVybWVkaWFyeSB0ZW1wbGF0ZSB0YWcgdGhhdCByZWNlaXZlcyBhIHRlbXBsYXRlIHRhZyBhbmQgcGFzc2VzIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgcmVjZWl2ZWRcbiAgICogdGVtcGxhdGUgdGFnIHRvIG91ciBvd24gdGVtcGxhdGUgdGFnLlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gICAgICAgIG5leHRUYWcgICAgICAgICAgLSB0aGUgcmVjZWl2ZWQgdGVtcGxhdGUgdGFnXG4gICAqIEBwYXJhbSAge0FycmF5PFN0cmluZz59ICAgdGVtcGxhdGUgICAgICAgICAtIHRoZSB0ZW1wbGF0ZSB0byBwcm9jZXNzXG4gICAqIEBwYXJhbSAgey4uLip9ICAgICAgICAgICAgLi4uc3Vic3RpdHV0aW9ucyAtIGBzdWJzdGl0dXRpb25zYCBpcyBhbiBhcnJheSBvZiBhbGwgc3Vic3RpdHV0aW9ucyBpbiB0aGUgdGVtcGxhdGVcbiAgICogQHJldHVybiB7Kn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGhlIGZpbmFsIHByb2Nlc3NlZCB2YWx1ZVxuICAgKi9cbiAgaW50ZXJpbVRhZyhwcmV2aW91c1RhZywgdGVtcGxhdGUsIC4uLnN1YnN0aXR1dGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy50YWdgJHtwcmV2aW91c1RhZyh0ZW1wbGF0ZSwgLi4uc3Vic3RpdHV0aW9ucyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBidWxrIHByb2Nlc3Npbmcgb24gdGhlIHRhZ2dlZCB0ZW1wbGF0ZSwgdHJhbnNmb3JtaW5nIGVhY2ggc3Vic3RpdHV0aW9uIGFuZCB0aGVuXG4gICAqIGNvbmNhdGVuYXRpbmcgdGhlIHJlc3VsdGluZyB2YWx1ZXMgaW50byBhIHN0cmluZy5cbiAgICogQHBhcmFtICB7QXJyYXk8Kj59IHN1YnN0aXR1dGlvbnMgLSBhbiBhcnJheSBvZiBhbGwgcmVtYWluaW5nIHN1YnN0aXR1dGlvbnMgcHJlc2VudCBpbiB0aGlzIHRlbXBsYXRlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gICByZXN1bHRTb0ZhciAgIC0gdGhpcyBpdGVyYXRpb24ncyByZXN1bHQgc3RyaW5nIHNvIGZhclxuICAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgcmVtYWluaW5nUGFydCAtIHRoZSB0ZW1wbGF0ZSBjaHVuayBhZnRlciB0aGUgY3VycmVudCBzdWJzdGl0dXRpb25cbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgICAgICAgLSB0aGUgcmVzdWx0IG9mIGpvaW5pbmcgdGhpcyBpdGVyYXRpb24ncyBwcm9jZXNzZWQgc3Vic3RpdHV0aW9uIHdpdGggdGhlIHJlc3VsdFxuICAgKi9cbiAgcHJvY2Vzc1N1YnN0aXR1dGlvbnMoc3Vic3RpdHV0aW9ucywgcmVzdWx0U29GYXIsIHJlbWFpbmluZ1BhcnQpIHtcbiAgICBjb25zdCBzdWJzdGl0dXRpb24gPSB0aGlzLnRyYW5zZm9ybVN1YnN0aXR1dGlvbihcbiAgICAgIHN1YnN0aXR1dGlvbnMuc2hpZnQoKSxcbiAgICAgIHJlc3VsdFNvRmFyLFxuICAgICk7XG4gICAgcmV0dXJuICcnLmNvbmNhdChyZXN1bHRTb0Zhciwgc3Vic3RpdHV0aW9uLCByZW1haW5pbmdQYXJ0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIHRocm91Z2ggZWFjaCB0cmFuc2Zvcm1lciwgYXBwbHlpbmcgdGhlIHRyYW5zZm9ybWVyJ3MgYG9uU3RyaW5nYCBtZXRob2QgdG8gdGhlIHRlbXBsYXRlXG4gICAqIHN0cmluZ3MgYmVmb3JlIGFsbCBzdWJzdGl0dXRpb25zIGFyZSBwcm9jZXNzZWQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAgc3RyIC0gVGhlIGlucHV0IHN0cmluZ1xuICAgKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAtIFRoZSBmaW5hbCByZXN1bHRzIG9mIHByb2Nlc3NpbmcgZWFjaCB0cmFuc2Zvcm1lclxuICAgKi9cbiAgdHJhbnNmb3JtU3RyaW5nKHN0cikge1xuICAgIGNvbnN0IGNiID0gKHJlcywgdHJhbnNmb3JtKSA9PlxuICAgICAgdHJhbnNmb3JtLm9uU3RyaW5nID8gdHJhbnNmb3JtLm9uU3RyaW5nKHJlcykgOiByZXM7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJzLnJlZHVjZShjYiwgc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGEgc3Vic3RpdHV0aW9uIGlzIGVuY291bnRlcmVkLCBpdGVyYXRlcyB0aHJvdWdoIGVhY2ggdHJhbnNmb3JtZXIgYW5kIGFwcGxpZXMgdGhlIHRyYW5zZm9ybWVyJ3NcbiAgICogYG9uU3Vic3RpdHV0aW9uYCBtZXRob2QgdG8gdGhlIHN1YnN0aXR1dGlvbi5cbiAgICogQHBhcmFtICB7Kn0gICAgICBzdWJzdGl0dXRpb24gLSBUaGUgY3VycmVudCBzdWJzdGl0dXRpb25cbiAgICogQHBhcmFtICB7U3RyaW5nfSByZXN1bHRTb0ZhciAgLSBUaGUgcmVzdWx0IHVwIHRvIGFuZCBleGNsdWRpbmcgdGhpcyBzdWJzdGl0dXRpb24uXG4gICAqIEByZXR1cm4geyp9ICAgICAgICAgICAgICAgICAgIC0gVGhlIGZpbmFsIHJlc3VsdCBvZiBhcHBseWluZyBhbGwgc3Vic3RpdHV0aW9uIHRyYW5zZm9ybWF0aW9ucy5cbiAgICovXG4gIHRyYW5zZm9ybVN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgY29uc3QgY2IgPSAocmVzLCB0cmFuc2Zvcm0pID0+XG4gICAgICB0cmFuc2Zvcm0ub25TdWJzdGl0dXRpb25cbiAgICAgICAgPyB0cmFuc2Zvcm0ub25TdWJzdGl0dXRpb24ocmVzLCByZXN1bHRTb0ZhcilcbiAgICAgICAgOiByZXM7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJzLnJlZHVjZShjYiwgc3Vic3RpdHV0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIGVhY2ggdHJhbnNmb3JtZXIsIGFwcGx5aW5nIHRoZSB0cmFuc2Zvcm1lcidzIGBvbkVuZFJlc3VsdGAgbWV0aG9kIHRvIHRoZVxuICAgKiB0ZW1wbGF0ZSBsaXRlcmFsIGFmdGVyIGFsbCBzdWJzdGl0dXRpb25zIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy5cbiAgICogQHBhcmFtICB7U3RyaW5nfSBlbmRSZXN1bHQgLSBUaGUgcHJvY2Vzc2VkIHRlbXBsYXRlLCBqdXN0IGJlZm9yZSBpdCBpcyByZXR1cm5lZCBmcm9tIHRoZSB0YWdcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgLSBUaGUgZmluYWwgcmVzdWx0cyBvZiBwcm9jZXNzaW5nIGVhY2ggdHJhbnNmb3JtZXJcbiAgICovXG4gIHRyYW5zZm9ybUVuZFJlc3VsdChlbmRSZXN1bHQpIHtcbiAgICBjb25zdCBjYiA9IChyZXMsIHRyYW5zZm9ybSkgPT5cbiAgICAgIHRyYW5zZm9ybS5vbkVuZFJlc3VsdCA/IHRyYW5zZm9ybS5vbkVuZFJlc3VsdChyZXMpIDogcmVzO1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybWVycy5yZWR1Y2UoY2IsIGVuZFJlc3VsdCk7XG4gIH1cbn1cbiJdfQ==","var defaults = {\n separator: '',\n conjunction: '',\n serial: false\n};\n\n/**\n * Converts an array substitution to a string containing a list\n * @param {String} [opts.separator = ''] - the character that separates each item\n * @param {String} [opts.conjunction = ''] - replace the last separator with this\n * @param {Boolean} [opts.serial = false] - include the separator before the conjunction? (Oxford comma use-case)\n *\n * @return {Object} - a TemplateTag transformer\n */\nvar inlineArrayTransformer = function inlineArrayTransformer() {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaults;\n return {\n onSubstitution: function onSubstitution(substitution, resultSoFar) {\n // only operate on arrays\n if (Array.isArray(substitution)) {\n var arrayLength = substitution.length;\n var separator = opts.separator;\n var conjunction = opts.conjunction;\n var serial = opts.serial;\n // join each item in the array into a string where each item is separated by separator\n // be sure to maintain indentation\n var indent = resultSoFar.match(/(\\n?[^\\S\\n]+)$/);\n if (indent) {\n substitution = substitution.join(separator + indent[1]);\n } else {\n substitution = substitution.join(separator + ' ');\n }\n // if conjunction is set, replace the last separator with conjunction, but only if there is more than one substitution\n if (conjunction && arrayLength > 1) {\n var separatorIndex = substitution.lastIndexOf(separator);\n substitution = substitution.slice(0, separatorIndex) + (serial ? separator : '') + ' ' + conjunction + substitution.slice(separatorIndex + 1);\n }\n }\n return substitution;\n }\n };\n};\n\nexport default inlineArrayTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmxpbmVBcnJheVRyYW5zZm9ybWVyL2lubGluZUFycmF5VHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsiZGVmYXVsdHMiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiIsInNlcmlhbCIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJvcHRzIiwib25TdWJzdGl0dXRpb24iLCJzdWJzdGl0dXRpb24iLCJyZXN1bHRTb0ZhciIsIkFycmF5IiwiaXNBcnJheSIsImFycmF5TGVuZ3RoIiwibGVuZ3RoIiwiaW5kZW50IiwibWF0Y2giLCJqb2luIiwic2VwYXJhdG9ySW5kZXgiLCJsYXN0SW5kZXhPZiIsInNsaWNlIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxXQUFXO0FBQ2ZDLGFBQVcsRUFESTtBQUVmQyxlQUFhLEVBRkU7QUFHZkMsVUFBUTtBQUhPLENBQWpCOztBQU1BOzs7Ozs7OztBQVFBLElBQU1DLHlCQUF5QixTQUF6QkEsc0JBQXlCO0FBQUEsTUFBQ0MsSUFBRCx1RUFBUUwsUUFBUjtBQUFBLFNBQXNCO0FBQ25ETSxrQkFEbUQsMEJBQ3BDQyxZQURvQyxFQUN0QkMsV0FEc0IsRUFDVDtBQUN4QztBQUNBLFVBQUlDLE1BQU1DLE9BQU4sQ0FBY0gsWUFBZCxDQUFKLEVBQWlDO0FBQy9CLFlBQU1JLGNBQWNKLGFBQWFLLE1BQWpDO0FBQ0EsWUFBTVgsWUFBWUksS0FBS0osU0FBdkI7QUFDQSxZQUFNQyxjQUFjRyxLQUFLSCxXQUF6QjtBQUNBLFlBQU1DLFNBQVNFLEtBQUtGLE1BQXBCO0FBQ0E7QUFDQTtBQUNBLFlBQU1VLFNBQVNMLFlBQVlNLEtBQVosQ0FBa0IsZ0JBQWxCLENBQWY7QUFDQSxZQUFJRCxNQUFKLEVBQVk7QUFDVk4seUJBQWVBLGFBQWFRLElBQWIsQ0FBa0JkLFlBQVlZLE9BQU8sQ0FBUCxDQUE5QixDQUFmO0FBQ0QsU0FGRCxNQUVPO0FBQ0xOLHlCQUFlQSxhQUFhUSxJQUFiLENBQWtCZCxZQUFZLEdBQTlCLENBQWY7QUFDRDtBQUNEO0FBQ0EsWUFBSUMsZUFBZVMsY0FBYyxDQUFqQyxFQUFvQztBQUNsQyxjQUFNSyxpQkFBaUJULGFBQWFVLFdBQWIsQ0FBeUJoQixTQUF6QixDQUF2QjtBQUNBTSx5QkFDRUEsYUFBYVcsS0FBYixDQUFtQixDQUFuQixFQUFzQkYsY0FBdEIsS0FDQ2IsU0FBU0YsU0FBVCxHQUFxQixFQUR0QixJQUVBLEdBRkEsR0FHQUMsV0FIQSxHQUlBSyxhQUFhVyxLQUFiLENBQW1CRixpQkFBaUIsQ0FBcEMsQ0FMRjtBQU1EO0FBQ0Y7QUFDRCxhQUFPVCxZQUFQO0FBQ0Q7QUE1QmtELEdBQXRCO0FBQUEsQ0FBL0I7O0FBK0JBLGVBQWVILHNCQUFmIiwiZmlsZSI6ImlubGluZUFycmF5VHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBkZWZhdWx0cyA9IHtcbiAgc2VwYXJhdG9yOiAnJyxcbiAgY29uanVuY3Rpb246ICcnLFxuICBzZXJpYWw6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhcnJheSBzdWJzdGl0dXRpb24gdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3RcbiAqIEBwYXJhbSAge1N0cmluZ30gW29wdHMuc2VwYXJhdG9yID0gJyddIC0gdGhlIGNoYXJhY3RlciB0aGF0IHNlcGFyYXRlcyBlYWNoIGl0ZW1cbiAqIEBwYXJhbSAge1N0cmluZ30gW29wdHMuY29uanVuY3Rpb24gPSAnJ10gIC0gcmVwbGFjZSB0aGUgbGFzdCBzZXBhcmF0b3Igd2l0aCB0aGlzXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbb3B0cy5zZXJpYWwgPSBmYWxzZV0gLSBpbmNsdWRlIHRoZSBzZXBhcmF0b3IgYmVmb3JlIHRoZSBjb25qdW5jdGlvbj8gKE94Zm9yZCBjb21tYSB1c2UtY2FzZSlcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgPSAob3B0cyA9IGRlZmF1bHRzKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgLy8gb25seSBvcGVyYXRlIG9uIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KHN1YnN0aXR1dGlvbikpIHtcbiAgICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gc3Vic3RpdHV0aW9uLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNlcGFyYXRvciA9IG9wdHMuc2VwYXJhdG9yO1xuICAgICAgY29uc3QgY29uanVuY3Rpb24gPSBvcHRzLmNvbmp1bmN0aW9uO1xuICAgICAgY29uc3Qgc2VyaWFsID0gb3B0cy5zZXJpYWw7XG4gICAgICAvLyBqb2luIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgaW50byBhIHN0cmluZyB3aGVyZSBlYWNoIGl0ZW0gaXMgc2VwYXJhdGVkIGJ5IHNlcGFyYXRvclxuICAgICAgLy8gYmUgc3VyZSB0byBtYWludGFpbiBpbmRlbnRhdGlvblxuICAgICAgY29uc3QgaW5kZW50ID0gcmVzdWx0U29GYXIubWF0Y2goLyhcXG4/W15cXFNcXG5dKykkLyk7XG4gICAgICBpZiAoaW5kZW50KSB7XG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbi5qb2luKHNlcGFyYXRvciArIGluZGVudFsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb24uam9pbihzZXBhcmF0b3IgKyAnICcpO1xuICAgICAgfVxuICAgICAgLy8gaWYgY29uanVuY3Rpb24gaXMgc2V0LCByZXBsYWNlIHRoZSBsYXN0IHNlcGFyYXRvciB3aXRoIGNvbmp1bmN0aW9uLCBidXQgb25seSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHN1YnN0aXR1dGlvblxuICAgICAgaWYgKGNvbmp1bmN0aW9uICYmIGFycmF5TGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHN1YnN0aXR1dGlvbi5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgICAgICBzdWJzdGl0dXRpb24gPVxuICAgICAgICAgIHN1YnN0aXR1dGlvbi5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCkgK1xuICAgICAgICAgIChzZXJpYWwgPyBzZXBhcmF0b3IgOiAnJykgK1xuICAgICAgICAgICcgJyArXG4gICAgICAgICAgY29uanVuY3Rpb24gK1xuICAgICAgICAgIHN1YnN0aXR1dGlvbi5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3Vic3RpdHV0aW9uO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGlubGluZUFycmF5VHJhbnNmb3JtZXI7XG4iXX0=","function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/**\n * strips indentation from a template literal\n * @param {String} type = 'initial' - whether to remove all indentation or just leading indentation. can be 'all' or 'initial'\n * @return {Object} - a TemplateTag transformer\n */\nvar stripIndentTransformer = function stripIndentTransformer() {\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'initial';\n return {\n onEndResult: function onEndResult(endResult) {\n if (type === 'initial') {\n // remove the shortest leading indentation from each line\n var match = endResult.match(/^[^\\S\\n]*(?=\\S)/gm);\n var indent = match && Math.min.apply(Math, _toConsumableArray(match.map(function (el) {\n return el.length;\n })));\n if (indent) {\n var regexp = new RegExp('^.{' + indent + '}', 'gm');\n return endResult.replace(regexp, '');\n }\n return endResult;\n }\n if (type === 'all') {\n // remove all indentation from each line\n return endResult.replace(/^[^\\S\\n]+/gm, '');\n }\n throw new Error('Unknown type: ' + type);\n }\n };\n};\n\nexport default stripIndentTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudFRyYW5zZm9ybWVyL3N0cmlwSW5kZW50VHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsInR5cGUiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsIm1hdGNoIiwiaW5kZW50IiwiTWF0aCIsIm1pbiIsIm1hcCIsImVsIiwibGVuZ3RoIiwicmVnZXhwIiwiUmVnRXhwIiwicmVwbGFjZSIsIkVycm9yIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7OztBQUtBLElBQU1BLHlCQUF5QixTQUF6QkEsc0JBQXlCO0FBQUEsTUFBQ0MsSUFBRCx1RUFBUSxTQUFSO0FBQUEsU0FBdUI7QUFDcERDLGVBRG9ELHVCQUN4Q0MsU0FEd0MsRUFDN0I7QUFDckIsVUFBSUYsU0FBUyxTQUFiLEVBQXdCO0FBQ3RCO0FBQ0EsWUFBTUcsUUFBUUQsVUFBVUMsS0FBVixDQUFnQixtQkFBaEIsQ0FBZDtBQUNBLFlBQU1DLFNBQVNELFNBQVNFLEtBQUtDLEdBQUwsZ0NBQVlILE1BQU1JLEdBQU4sQ0FBVTtBQUFBLGlCQUFNQyxHQUFHQyxNQUFUO0FBQUEsU0FBVixDQUFaLEVBQXhCO0FBQ0EsWUFBSUwsTUFBSixFQUFZO0FBQ1YsY0FBTU0sU0FBUyxJQUFJQyxNQUFKLFNBQWlCUCxNQUFqQixRQUE0QixJQUE1QixDQUFmO0FBQ0EsaUJBQU9GLFVBQVVVLE9BQVYsQ0FBa0JGLE1BQWxCLEVBQTBCLEVBQTFCLENBQVA7QUFDRDtBQUNELGVBQU9SLFNBQVA7QUFDRDtBQUNELFVBQUlGLFNBQVMsS0FBYixFQUFvQjtBQUNsQjtBQUNBLGVBQU9FLFVBQVVVLE9BQVYsQ0FBa0IsYUFBbEIsRUFBaUMsRUFBakMsQ0FBUDtBQUNEO0FBQ0QsWUFBTSxJQUFJQyxLQUFKLG9CQUEyQmIsSUFBM0IsQ0FBTjtBQUNEO0FBakJtRCxHQUF2QjtBQUFBLENBQS9COztBQW9CQSxlQUFlRCxzQkFBZiIsImZpbGUiOiJzdHJpcEluZGVudFRyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzdHJpcHMgaW5kZW50YXRpb24gZnJvbSBhIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZSA9ICdpbml0aWFsJyAtIHdoZXRoZXIgdG8gcmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBvciBqdXN0IGxlYWRpbmcgaW5kZW50YXRpb24uIGNhbiBiZSAnYWxsJyBvciAnaW5pdGlhbCdcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAtIGEgVGVtcGxhdGVUYWcgdHJhbnNmb3JtZXJcbiAqL1xuY29uc3Qgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciA9ICh0eXBlID0gJ2luaXRpYWwnKSA9PiAoe1xuICBvbkVuZFJlc3VsdChlbmRSZXN1bHQpIHtcbiAgICBpZiAodHlwZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAvLyByZW1vdmUgdGhlIHNob3J0ZXN0IGxlYWRpbmcgaW5kZW50YXRpb24gZnJvbSBlYWNoIGxpbmVcbiAgICAgIGNvbnN0IG1hdGNoID0gZW5kUmVzdWx0Lm1hdGNoKC9eW15cXFNcXG5dKig/PVxcUykvZ20pO1xuICAgICAgY29uc3QgaW5kZW50ID0gbWF0Y2ggJiYgTWF0aC5taW4oLi4ubWF0Y2gubWFwKGVsID0+IGVsLmxlbmd0aCkpO1xuICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGBeLnske2luZGVudH19YCwgJ2dtJyk7XG4gICAgICAgIHJldHVybiBlbmRSZXN1bHQucmVwbGFjZShyZWdleHAsICcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbmRSZXN1bHQ7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnYWxsJykge1xuICAgICAgLy8gcmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBmcm9tIGVhY2ggbGluZVxuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9eW15cXFNcXG5dKy9nbSwgJycpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZTogJHt0eXBlfWApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmlwSW5kZW50VHJhbnNmb3JtZXI7XG4iXX0=","/**\n * TemplateTag transformer that trims whitespace on the end result of a tagged template\n * @param {String} side = '' - The side of the string to trim. Can be 'start' or 'end' (alternatively 'left' or 'right')\n * @return {Object} - a TemplateTag transformer\n */\nvar trimResultTransformer = function trimResultTransformer() {\n var side = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return {\n onEndResult: function onEndResult(endResult) {\n if (side === '') {\n return endResult.trim();\n }\n\n side = side.toLowerCase();\n\n if (side === 'start' || side === 'left') {\n return endResult.replace(/^\\s*/, '');\n }\n\n if (side === 'end' || side === 'right') {\n return endResult.replace(/\\s*$/, '');\n }\n\n throw new Error('Side not supported: ' + side);\n }\n };\n};\n\nexport default trimResultTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmltUmVzdWx0VHJhbnNmb3JtZXIvdHJpbVJlc3VsdFRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInNpZGUiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJFcnJvciJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0FBS0EsSUFBTUEsd0JBQXdCLFNBQXhCQSxxQkFBd0I7QUFBQSxNQUFDQyxJQUFELHVFQUFRLEVBQVI7QUFBQSxTQUFnQjtBQUM1Q0MsZUFENEMsdUJBQ2hDQyxTQURnQyxFQUNyQjtBQUNyQixVQUFJRixTQUFTLEVBQWIsRUFBaUI7QUFDZixlQUFPRSxVQUFVQyxJQUFWLEVBQVA7QUFDRDs7QUFFREgsYUFBT0EsS0FBS0ksV0FBTCxFQUFQOztBQUVBLFVBQUlKLFNBQVMsT0FBVCxJQUFvQkEsU0FBUyxNQUFqQyxFQUF5QztBQUN2QyxlQUFPRSxVQUFVRyxPQUFWLENBQWtCLE1BQWxCLEVBQTBCLEVBQTFCLENBQVA7QUFDRDs7QUFFRCxVQUFJTCxTQUFTLEtBQVQsSUFBa0JBLFNBQVMsT0FBL0IsRUFBd0M7QUFDdEMsZUFBT0UsVUFBVUcsT0FBVixDQUFrQixNQUFsQixFQUEwQixFQUExQixDQUFQO0FBQ0Q7O0FBRUQsWUFBTSxJQUFJQyxLQUFKLDBCQUFpQ04sSUFBakMsQ0FBTjtBQUNEO0FBakIyQyxHQUFoQjtBQUFBLENBQTlCOztBQW9CQSxlQUFlRCxxQkFBZiIsImZpbGUiOiJ0cmltUmVzdWx0VHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyIHRoYXQgdHJpbXMgd2hpdGVzcGFjZSBvbiB0aGUgZW5kIHJlc3VsdCBvZiBhIHRhZ2dlZCB0ZW1wbGF0ZVxuICogQHBhcmFtICB7U3RyaW5nfSBzaWRlID0gJycgLSBUaGUgc2lkZSBvZiB0aGUgc3RyaW5nIHRvIHRyaW0uIENhbiBiZSAnc3RhcnQnIG9yICdlbmQnIChhbHRlcm5hdGl2ZWx5ICdsZWZ0JyBvciAncmlnaHQnKVxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciA9IChzaWRlID0gJycpID0+ICh7XG4gIG9uRW5kUmVzdWx0KGVuZFJlc3VsdCkge1xuICAgIGlmIChzaWRlID09PSAnJykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC50cmltKCk7XG4gICAgfVxuXG4gICAgc2lkZSA9IHNpZGUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChzaWRlID09PSAnc3RhcnQnIHx8IHNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9eXFxzKi8sICcnKTtcbiAgICB9XG5cbiAgICBpZiAoc2lkZSA9PT0gJ2VuZCcgfHwgc2lkZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZGUgbm90IHN1cHBvcnRlZDogJHtzaWRlfWApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lcjtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaLists = new TemplateTag(inlineArrayTransformer({ separator: ',' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzL2NvbW1hTGlzdHMuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsImNvbW1hTGlzdHMiLCJzZXBhcmF0b3IiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsZ0JBQXhCO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MsMEJBQWxDOztBQUVBLElBQU1DLGFBQWEsSUFBSUosV0FBSixDQUNqQkUsdUJBQXVCLEVBQUVHLFdBQVcsR0FBYixFQUF2QixDQURpQixFQUVqQkosc0JBRmlCLEVBR2pCRSxxQkFIaUIsQ0FBbkI7O0FBTUEsZUFBZUMsVUFBZiIsImZpbGUiOiJjb21tYUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IGNvbW1hTGlzdHMgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJyB9KSxcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFMaXN0cztcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaListsAnd = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'and' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaListsAnd;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzQW5kL2NvbW1hTGlzdHNBbmQuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsImNvbW1hTGlzdHNBbmQiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZ0JBQWdCLElBQUlKLFdBQUosQ0FDcEJFLHVCQUF1QixFQUFFRyxXQUFXLEdBQWIsRUFBa0JDLGFBQWEsS0FBL0IsRUFBdkIsQ0FEb0IsRUFFcEJMLHNCQUZvQixFQUdwQkUscUJBSG9CLENBQXRCOztBQU1BLGVBQWVDLGFBQWYiLCJmaWxlIjoiY29tbWFMaXN0c0FuZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBjb21tYUxpc3RzQW5kID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyKHsgc2VwYXJhdG9yOiAnLCcsIGNvbmp1bmN0aW9uOiAnYW5kJyB9KSxcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFMaXN0c0FuZDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaListsOr = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'or' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaListsOr;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzT3IvY29tbWFMaXN0c09yLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJjb21tYUxpc3RzT3IiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZUFBZSxJQUFJSixXQUFKLENBQ25CRSx1QkFBdUIsRUFBRUcsV0FBVyxHQUFiLEVBQWtCQyxhQUFhLElBQS9CLEVBQXZCLENBRG1CLEVBRW5CTCxzQkFGbUIsRUFHbkJFLHFCQUhtQixDQUFyQjs7QUFNQSxlQUFlQyxZQUFmIiwiZmlsZSI6ImNvbW1hTGlzdHNPci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBjb21tYUxpc3RzT3IgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJywgY29uanVuY3Rpb246ICdvcicgfSksXG4gIHN0cmlwSW5kZW50VHJhbnNmb3JtZXIsXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hTGlzdHNPcjtcbiJdfQ==","var splitStringTransformer = function splitStringTransformer(splitBy) {\n return {\n onSubstitution: function onSubstitution(substitution, resultSoFar) {\n if (splitBy != null && typeof splitBy === 'string') {\n if (typeof substitution === 'string' && substitution.includes(splitBy)) {\n substitution = substitution.split(splitBy);\n }\n } else {\n throw new Error('You need to specify a string character to split by.');\n }\n return substitution;\n }\n };\n};\n\nexport default splitStringTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyL3NwbGl0U3RyaW5nVHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsic3BsaXRTdHJpbmdUcmFuc2Zvcm1lciIsIm9uU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwicmVzdWx0U29GYXIiLCJzcGxpdEJ5IiwiaW5jbHVkZXMiLCJzcGxpdCIsIkVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSx5QkFBeUIsU0FBekJBLHNCQUF5QjtBQUFBLFNBQVk7QUFDekNDLGtCQUR5QywwQkFDMUJDLFlBRDBCLEVBQ1pDLFdBRFksRUFDQztBQUN4QyxVQUFJQyxXQUFXLElBQVgsSUFBbUIsT0FBT0EsT0FBUCxLQUFtQixRQUExQyxFQUFvRDtBQUNsRCxZQUFJLE9BQU9GLFlBQVAsS0FBd0IsUUFBeEIsSUFBb0NBLGFBQWFHLFFBQWIsQ0FBc0JELE9BQXRCLENBQXhDLEVBQXdFO0FBQ3RFRix5QkFBZUEsYUFBYUksS0FBYixDQUFtQkYsT0FBbkIsQ0FBZjtBQUNEO0FBQ0YsT0FKRCxNQUlPO0FBQ0wsY0FBTSxJQUFJRyxLQUFKLENBQVUscURBQVYsQ0FBTjtBQUNEO0FBQ0QsYUFBT0wsWUFBUDtBQUNEO0FBVndDLEdBQVo7QUFBQSxDQUEvQjs7QUFhQSxlQUFlRixzQkFBZiIsImZpbGUiOiJzcGxpdFN0cmluZ1RyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgc3BsaXRTdHJpbmdUcmFuc2Zvcm1lciA9IHNwbGl0QnkgPT4gKHtcbiAgb25TdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uLCByZXN1bHRTb0Zhcikge1xuICAgIGlmIChzcGxpdEJ5ICE9IG51bGwgJiYgdHlwZW9mIHNwbGl0QnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZW9mIHN1YnN0aXR1dGlvbiA9PT0gJ3N0cmluZycgJiYgc3Vic3RpdHV0aW9uLmluY2x1ZGVzKHNwbGl0QnkpKSB7XG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbi5zcGxpdChzcGxpdEJ5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzcGVjaWZ5IGEgc3RyaW5nIGNoYXJhY3RlciB0byBzcGxpdCBieS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgfSxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyO1xuIl19","var isValidValue = function isValidValue(x) {\n return x != null && !Number.isNaN(x) && typeof x !== 'boolean';\n};\n\nvar removeNonPrintingValuesTransformer = function removeNonPrintingValuesTransformer() {\n return {\n onSubstitution: function onSubstitution(substitution) {\n if (Array.isArray(substitution)) {\n return substitution.filter(isValidValue);\n }\n if (isValidValue(substitution)) {\n return substitution;\n }\n return '';\n }\n };\n};\n\nexport default removeNonPrintingValuesTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyL3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsiaXNWYWxpZFZhbHVlIiwieCIsIk51bWJlciIsImlzTmFOIiwicmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lciIsIm9uU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxlQUFlLFNBQWZBLFlBQWU7QUFBQSxTQUNuQkMsS0FBSyxJQUFMLElBQWEsQ0FBQ0MsT0FBT0MsS0FBUCxDQUFhRixDQUFiLENBQWQsSUFBaUMsT0FBT0EsQ0FBUCxLQUFhLFNBRDNCO0FBQUEsQ0FBckI7O0FBR0EsSUFBTUcscUNBQXFDLFNBQXJDQSxrQ0FBcUM7QUFBQSxTQUFPO0FBQ2hEQyxrQkFEZ0QsMEJBQ2pDQyxZQURpQyxFQUNuQjtBQUMzQixVQUFJQyxNQUFNQyxPQUFOLENBQWNGLFlBQWQsQ0FBSixFQUFpQztBQUMvQixlQUFPQSxhQUFhRyxNQUFiLENBQW9CVCxZQUFwQixDQUFQO0FBQ0Q7QUFDRCxVQUFJQSxhQUFhTSxZQUFiLENBQUosRUFBZ0M7QUFDOUIsZUFBT0EsWUFBUDtBQUNEO0FBQ0QsYUFBTyxFQUFQO0FBQ0Q7QUFUK0MsR0FBUDtBQUFBLENBQTNDOztBQVlBLGVBQWVGLGtDQUFmIiwiZmlsZSI6InJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpc1ZhbGlkVmFsdWUgPSB4ID0+XG4gIHggIT0gbnVsbCAmJiAhTnVtYmVyLmlzTmFOKHgpICYmIHR5cGVvZiB4ICE9PSAnYm9vbGVhbic7XG5cbmNvbnN0IHJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIgPSAoKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzdWJzdGl0dXRpb24pKSB7XG4gICAgICByZXR1cm4gc3Vic3RpdHV0aW9uLmZpbHRlcihpc1ZhbGlkVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXNWYWxpZFZhbHVlKHN1YnN0aXR1dGlvbikpIHtcbiAgICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfSxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCByZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport splitStringTransformer from '../splitStringTransformer';\nimport removeNonPrintingValuesTransformer from '../removeNonPrintingValuesTransformer';\n\nvar html = new TemplateTag(splitStringTransformer('\\n'), removeNonPrintingValuesTransformer, inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);\n\nexport default html;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odG1sL2h0bWwuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInNwbGl0U3RyaW5nVHJhbnNmb3JtZXIiLCJyZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyIiwiaHRtbCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxrQ0FBUCxNQUErQyx1Q0FBL0M7O0FBRUEsSUFBTUMsT0FBTyxJQUFJTixXQUFKLENBQ1hJLHVCQUF1QixJQUF2QixDQURXLEVBRVhDLGtDQUZXLEVBR1hILHNCQUhXLEVBSVhELHNCQUpXLEVBS1hFLHFCQUxXLENBQWI7O0FBUUEsZUFBZUcsSUFBZiIsImZpbGUiOiJodG1sLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgc3BsaXRTdHJpbmdUcmFuc2Zvcm1lciBmcm9tICcuLi9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyJztcbmltcG9ydCByZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyIGZyb20gJy4uL3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXInO1xuXG5jb25zdCBodG1sID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyKCdcXG4nKSxcbiAgcmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lcixcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcixcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgaHRtbDtcbiJdfQ==","var replaceSubstitutionTransformer = function replaceSubstitutionTransformer(replaceWhat, replaceWith) {\n return {\n onSubstitution: function onSubstitution(substitution, resultSoFar) {\n if (replaceWhat == null || replaceWith == null) {\n throw new Error('replaceSubstitutionTransformer requires at least 2 arguments.');\n }\n\n // Do not touch if null or undefined\n if (substitution == null) {\n return substitution;\n } else {\n return substitution.toString().replace(replaceWhat, replaceWith);\n }\n }\n };\n};\n\nexport default replaceSubstitutionTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIvcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lciIsInJlcGxhY2VXaGF0IiwicmVwbGFjZVdpdGgiLCJvblN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsInJlc3VsdFNvRmFyIiwiRXJyb3IiLCJ0b1N0cmluZyIsInJlcGxhY2UiXSwibWFwcGluZ3MiOiJBQUFBLElBQU1BLGlDQUFpQyxTQUFqQ0EsOEJBQWlDLENBQUNDLFdBQUQsRUFBY0MsV0FBZDtBQUFBLFNBQStCO0FBQ3BFQyxrQkFEb0UsMEJBQ3JEQyxZQURxRCxFQUN2Q0MsV0FEdUMsRUFDMUI7QUFDeEMsVUFBSUosZUFBZSxJQUFmLElBQXVCQyxlQUFlLElBQTFDLEVBQWdEO0FBQzlDLGNBQU0sSUFBSUksS0FBSixDQUNKLCtEQURJLENBQU47QUFHRDs7QUFFRDtBQUNBLFVBQUlGLGdCQUFnQixJQUFwQixFQUEwQjtBQUN4QixlQUFPQSxZQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBT0EsYUFBYUcsUUFBYixHQUF3QkMsT0FBeEIsQ0FBZ0NQLFdBQWhDLEVBQTZDQyxXQUE3QyxDQUFQO0FBQ0Q7QUFDRjtBQWRtRSxHQUEvQjtBQUFBLENBQXZDOztBQWlCQSxlQUFlRiw4QkFBZiIsImZpbGUiOiJyZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIgPSAocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgaWYgKHJlcGxhY2VXaGF0ID09IG51bGwgfHwgcmVwbGFjZVdpdGggPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAncmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyIHJlcXVpcmVzIGF0IGxlYXN0IDIgYXJndW1lbnRzLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERvIG5vdCB0b3VjaCBpZiBudWxsIG9yIHVuZGVmaW5lZFxuICAgIGlmIChzdWJzdGl0dXRpb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbi50b1N0cmluZygpLnJlcGxhY2UocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKTtcbiAgICB9XG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport splitStringTransformer from '../splitStringTransformer';\nimport replaceSubstitutionTransformer from '../replaceSubstitutionTransformer';\n\nvar safeHtml = new TemplateTag(splitStringTransformer('\\n'), inlineArrayTransformer, stripIndentTransformer, trimResultTransformer, replaceSubstitutionTransformer(/&/g, '&'), replaceSubstitutionTransformer(/</g, '<'), replaceSubstitutionTransformer(/>/g, '>'), replaceSubstitutionTransformer(/\"/g, '"'), replaceSubstitutionTransformer(/'/g, '''), replaceSubstitutionTransformer(/`/g, '`'));\n\nexport default safeHtml;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zYWZlSHRtbC9zYWZlSHRtbC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwic3BsaXRTdHJpbmdUcmFuc2Zvcm1lciIsInJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lciIsInNhZmVIdG1sIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLDhCQUFQLE1BQTJDLG1DQUEzQzs7QUFFQSxJQUFNQyxXQUFXLElBQUlOLFdBQUosQ0FDZkksdUJBQXVCLElBQXZCLENBRGUsRUFFZkYsc0JBRmUsRUFHZkQsc0JBSGUsRUFJZkUscUJBSmUsRUFLZkUsK0JBQStCLElBQS9CLEVBQXFDLE9BQXJDLENBTGUsRUFNZkEsK0JBQStCLElBQS9CLEVBQXFDLE1BQXJDLENBTmUsRUFPZkEsK0JBQStCLElBQS9CLEVBQXFDLE1BQXJDLENBUGUsRUFRZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBUmUsRUFTZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBVGUsRUFVZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBVmUsQ0FBakI7O0FBYUEsZUFBZUMsUUFBZiIsImZpbGUiOiJzYWZlSHRtbC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHNwbGl0U3RyaW5nVHJhbnNmb3JtZXIgZnJvbSAnLi4vc3BsaXRTdHJpbmdUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcic7XG5cbmNvbnN0IHNhZmVIdG1sID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyKCdcXG4nKSxcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcixcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuICByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoLyYvZywgJyZhbXA7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvPC9nLCAnJmx0OycpLFxuICByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoLz4vZywgJyZndDsnKSxcbiAgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyKC9cIi9nLCAnJnF1b3Q7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvJy9nLCAnJiN4Mjc7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvYC9nLCAnJiN4NjA7JyksXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBzYWZlSHRtbDtcbiJdfQ==","/**\n * Replaces tabs, newlines and spaces with the chosen value when they occur in sequences\n * @param {(String|RegExp)} replaceWhat - the value or pattern that should be replaced\n * @param {*} replaceWith - the replacement value\n * @return {Object} - a TemplateTag transformer\n */\nvar replaceResultTransformer = function replaceResultTransformer(replaceWhat, replaceWith) {\n return {\n onEndResult: function onEndResult(endResult) {\n if (replaceWhat == null || replaceWith == null) {\n throw new Error('replaceResultTransformer requires at least 2 arguments.');\n }\n return endResult.replace(replaceWhat, replaceWith);\n }\n };\n};\n\nexport default replaceResultTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIvcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VXaGF0IiwicmVwbGFjZVdpdGgiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsIkVycm9yIiwicmVwbGFjZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztBQU1BLElBQU1BLDJCQUEyQixTQUEzQkEsd0JBQTJCLENBQUNDLFdBQUQsRUFBY0MsV0FBZDtBQUFBLFNBQStCO0FBQzlEQyxlQUQ4RCx1QkFDbERDLFNBRGtELEVBQ3ZDO0FBQ3JCLFVBQUlILGVBQWUsSUFBZixJQUF1QkMsZUFBZSxJQUExQyxFQUFnRDtBQUM5QyxjQUFNLElBQUlHLEtBQUosQ0FDSix5REFESSxDQUFOO0FBR0Q7QUFDRCxhQUFPRCxVQUFVRSxPQUFWLENBQWtCTCxXQUFsQixFQUErQkMsV0FBL0IsQ0FBUDtBQUNEO0FBUjZELEdBQS9CO0FBQUEsQ0FBakM7O0FBV0EsZUFBZUYsd0JBQWYiLCJmaWxlIjoicmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBsYWNlcyB0YWJzLCBuZXdsaW5lcyBhbmQgc3BhY2VzIHdpdGggdGhlIGNob3NlbiB2YWx1ZSB3aGVuIHRoZXkgb2NjdXIgaW4gc2VxdWVuY2VzXG4gKiBAcGFyYW0gIHsoU3RyaW5nfFJlZ0V4cCl9IHJlcGxhY2VXaGF0IC0gdGhlIHZhbHVlIG9yIHBhdHRlcm4gdGhhdCBzaG91bGQgYmUgcmVwbGFjZWRcbiAqIEBwYXJhbSAgeyp9ICAgICAgICAgICAgICAgcmVwbGFjZVdpdGggLSB0aGUgcmVwbGFjZW1lbnQgdmFsdWVcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciA9IChyZXBsYWNlV2hhdCwgcmVwbGFjZVdpdGgpID0+ICh7XG4gIG9uRW5kUmVzdWx0KGVuZFJlc3VsdCkge1xuICAgIGlmIChyZXBsYWNlV2hhdCA9PSBudWxsIHx8IHJlcGxhY2VXaXRoID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciByZXF1aXJlcyBhdCBsZWFzdCAyIGFyZ3VtZW50cy4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKHJlcGxhY2VXaGF0LCByZXBsYWNlV2l0aCk7XG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyO1xuIl19","import TemplateTag from '../TemplateTag';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLine = new TemplateTag(replaceResultTransformer(/(?:\\n(?:\\s*))+/g, ' '), trimResultTransformer);\n\nexport default oneLine;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lL29uZUxpbmUuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxVQUFVLElBQUlILFdBQUosQ0FDZEUseUJBQXlCLGlCQUF6QixFQUE0QyxHQUE1QyxDQURjLEVBRWRELHFCQUZjLENBQWhCOztBQUtBLGVBQWVFLE9BQWYiLCJmaWxlIjoib25lTGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IG9uZUxpbmUgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcigvKD86XFxuKD86XFxzKikpKy9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lO1xuIl19","import TemplateTag from '../TemplateTag';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineTrim = new TemplateTag(replaceResultTransformer(/(?:\\n\\s*)/g, ''), trimResultTransformer);\n\nexport default oneLineTrim;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lVHJpbS9vbmVMaW5lVHJpbS5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsIm9uZUxpbmVUcmltIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxjQUFjLElBQUlILFdBQUosQ0FDbEJFLHlCQUF5QixZQUF6QixFQUF1QyxFQUF2QyxDQURrQixFQUVsQkQscUJBRmtCLENBQXBCOztBQUtBLGVBQWVFLFdBQWYiLCJmaWxlIjoib25lTGluZVRyaW0uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lVHJpbSA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXG5cXHMqKS9nLCAnJyksXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG9uZUxpbmVUcmltO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaLists = new TemplateTag(inlineArrayTransformer({ separator: ',' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0cy9vbmVMaW5lQ29tbWFMaXN0cy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lQ29tbWFMaXN0cyIsInNlcGFyYXRvciJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyx3QkFBUCxNQUFxQyw2QkFBckM7O0FBRUEsSUFBTUMsb0JBQW9CLElBQUlKLFdBQUosQ0FDeEJDLHVCQUF1QixFQUFFSSxXQUFXLEdBQWIsRUFBdkIsQ0FEd0IsRUFFeEJGLHlCQUF5QixVQUF6QixFQUFxQyxHQUFyQyxDQUZ3QixFQUd4QkQscUJBSHdCLENBQTFCOztBQU1BLGVBQWVFLGlCQUFmIiwiZmlsZSI6Im9uZUxpbmVDb21tYUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lQ29tbWFMaXN0cyA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcih7IHNlcGFyYXRvcjogJywnIH0pLFxuICByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIoLyg/OlxccyspL2csICcgJyksXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG9uZUxpbmVDb21tYUxpc3RzO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaListsOr = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'or' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaListsOr;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0c09yL29uZUxpbmVDb21tYUxpc3RzT3IuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwicmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIiwib25lTGluZUNvbW1hTGlzdHNPciIsInNlcGFyYXRvciIsImNvbmp1bmN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxzQkFBc0IsSUFBSUosV0FBSixDQUMxQkMsdUJBQXVCLEVBQUVJLFdBQVcsR0FBYixFQUFrQkMsYUFBYSxJQUEvQixFQUF2QixDQUQwQixFQUUxQkgseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRjBCLEVBRzFCRCxxQkFIMEIsQ0FBNUI7O0FBTUEsZUFBZUUsbUJBQWYiLCJmaWxlIjoib25lTGluZUNvbW1hTGlzdHNPci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgaW5saW5lQXJyYXlUcmFuc2Zvcm1lciBmcm9tICcuLi9pbmxpbmVBcnJheVRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcbmltcG9ydCByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyJztcblxuY29uc3Qgb25lTGluZUNvbW1hTGlzdHNPciA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcih7IHNlcGFyYXRvcjogJywnLCBjb25qdW5jdGlvbjogJ29yJyB9KSxcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lQ29tbWFMaXN0c09yO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaListsAnd = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'and' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaListsAnd;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0c0FuZC9vbmVMaW5lQ29tbWFMaXN0c0FuZC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lQ29tbWFMaXN0c0FuZCIsInNlcGFyYXRvciIsImNvbmp1bmN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyx1QkFBdUIsSUFBSUosV0FBSixDQUMzQkMsdUJBQXVCLEVBQUVJLFdBQVcsR0FBYixFQUFrQkMsYUFBYSxLQUEvQixFQUF2QixDQUQyQixFQUUzQkgseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRjJCLEVBRzNCRCxxQkFIMkIsQ0FBN0I7O0FBTUEsZUFBZUUsb0JBQWYiLCJmaWxlIjoib25lTGluZUNvbW1hTGlzdHNBbmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IG9uZUxpbmVDb21tYUxpc3RzQW5kID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyKHsgc2VwYXJhdG9yOiAnLCcsIGNvbmp1bmN0aW9uOiAnYW5kJyB9KSxcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lQ29tbWFMaXN0c0FuZDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar inlineLists = new TemplateTag(inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);\n\nexport default inlineLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmxpbmVMaXN0cy9pbmxpbmVMaXN0cy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwiaW5saW5lTGlzdHMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsZ0JBQXhCO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MsMEJBQWxDOztBQUVBLElBQU1DLGNBQWMsSUFBSUosV0FBSixDQUNsQkUsc0JBRGtCLEVBRWxCRCxzQkFGa0IsRUFHbEJFLHFCQUhrQixDQUFwQjs7QUFNQSxlQUFlQyxXQUFmIiwiZmlsZSI6ImlubGluZUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IGlubGluZUxpc3RzID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyLFxuICBzdHJpcEluZGVudFRyYW5zZm9ybWVyLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBpbmxpbmVMaXN0cztcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineInlineLists = new TemplateTag(inlineArrayTransformer, replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineInlineLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lSW5saW5lTGlzdHMvb25lTGluZUlubGluZUxpc3RzLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsIm9uZUxpbmVJbmxpbmVMaXN0cyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyx3QkFBUCxNQUFxQyw2QkFBckM7O0FBRUEsSUFBTUMscUJBQXFCLElBQUlKLFdBQUosQ0FDekJDLHNCQUR5QixFQUV6QkUseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRnlCLEVBR3pCRCxxQkFIeUIsQ0FBM0I7O0FBTUEsZUFBZUUsa0JBQWYiLCJmaWxlIjoib25lTGluZUlubGluZUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lSW5saW5lTGlzdHMgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIsXG4gIHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcigvKD86XFxzKykvZywgJyAnKSxcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgb25lTGluZUlubGluZUxpc3RzO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar stripIndent = new TemplateTag(stripIndentTransformer, trimResultTransformer);\n\nexport default stripIndent;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudC9zdHJpcEluZGVudC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJzdHJpcEluZGVudCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsY0FBYyxJQUFJSCxXQUFKLENBQ2xCQyxzQkFEa0IsRUFFbEJDLHFCQUZrQixDQUFwQjs7QUFLQSxlQUFlQyxXQUFmIiwiZmlsZSI6InN0cmlwSW5kZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBzdHJpcEluZGVudCA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgc3RyaXBJbmRlbnQ7XG4iXX0=","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar stripIndents = new TemplateTag(stripIndentTransformer('all'), trimResultTransformer);\n\nexport default stripIndents;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudHMvc3RyaXBJbmRlbnRzLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInN0cmlwSW5kZW50cyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZUFBZSxJQUFJSCxXQUFKLENBQ25CQyx1QkFBdUIsS0FBdkIsQ0FEbUIsRUFFbkJDLHFCQUZtQixDQUFyQjs7QUFLQSxlQUFlQyxZQUFmIiwiZmlsZSI6InN0cmlwSW5kZW50cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcblxuY29uc3Qgc3RyaXBJbmRlbnRzID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzdHJpcEluZGVudFRyYW5zZm9ybWVyKCdhbGwnKSxcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgc3RyaXBJbmRlbnRzO1xuIl19","import React, { PureComponent } from 'react';\nimport { stripIndent, stripIndents } from 'common-tags';\nimport { QueryEditorHelpProps } from '@grafana/data';\nimport Prism from 'prismjs';\nimport tokenizer from '../syntax';\nimport { flattenTokens } from '@grafana/ui/src/slate-plugins/slate-prism';\nimport { css, cx } from '@emotion/css';\nimport { CloudWatchQuery } from '../types';\n\ninterface QueryExample {\n category: string;\n examples: Array<{\n title: string;\n expr: string;\n }>;\n}\n\nconst CLIQ_EXAMPLES: QueryExample[] = [\n {\n category: 'Lambda',\n examples: [\n {\n title: 'View latency statistics for 5-minute intervals',\n expr: stripIndents`filter @type = \"REPORT\" |\n stats avg(@duration), max(@duration), min(@duration) by bin(5m)`,\n },\n {\n title: 'Determine the amount of overprovisioned memory',\n expr: stripIndent`\n filter @type = \"REPORT\" |\n stats max(@memorySize / 1024 / 1024) as provisonedMemoryMB,\n min(@maxMemoryUsed / 1024 / 1024) as smallestMemoryRequestMB,\n avg(@maxMemoryUsed / 1024 / 1024) as avgMemoryUsedMB,\n max(@maxMemoryUsed / 1024 / 1024) as maxMemoryUsedMB,\n provisonedMemoryMB - maxMemoryUsedMB as overProvisionedMB`,\n },\n {\n title: 'Find the most expensive requests',\n expr: stripIndents`filter @type = \"REPORT\" |\n fields @requestId, @billedDuration |\n sort by @billedDuration desc`,\n },\n ],\n },\n\n {\n category: 'VPC Flow Logs',\n examples: [\n {\n title: 'Average, min, and max byte transfers by source and destination IP addresses',\n expr: `stats avg(bytes), min(bytes), max(bytes) by srcAddr, dstAddr`,\n },\n {\n title: 'IP addresses using UDP transfer protocol',\n expr: 'filter protocol=17 | stats count(*) by srcAddr',\n },\n {\n title: 'Top 10 byte transfers by source and destination IP addresses',\n expr: stripIndents`stats sum(bytes) as bytesTransferred by srcAddr, dstAddr |\n sort bytesTransferred desc |\n limit 10`,\n },\n {\n title: 'Top 20 source IP addresses with highest number of rejected requests',\n expr: stripIndents`filter action=\"REJECT\" |\n stats count(*) as numRejections by srcAddr |\n sort numRejections desc |\n limit 20`,\n },\n ],\n },\n {\n category: 'CloudTrail',\n examples: [\n {\n title: 'Number of log entries by service, event type, and region',\n expr: 'stats count(*) by eventSource, eventName, awsRegion',\n },\n\n {\n title: 'Number of log entries by region and EC2 event type',\n expr: stripIndents`filter eventSource=\"ec2.amazonaws.com\" |\n stats count(*) as eventCount by eventName, awsRegion |\n sort eventCount desc`,\n },\n\n {\n title: 'Regions, usernames, and ARNs of newly created IAM users',\n expr: stripIndents`filter eventName=\"CreateUser\" |\n fields awsRegion, requestParameters.userName, responseElements.user.arn`,\n },\n ],\n },\n {\n category: 'Common Queries',\n examples: [\n {\n title: '25 most recently added log events',\n expr: stripIndents`fields @timestamp, @message |\n sort @timestamp desc |\n limit 25`,\n },\n {\n title: 'Number of exceptions logged every 5 minutes',\n expr: stripIndents`filter @message like /Exception/ |\n stats count(*) as exceptionCount by bin(5m) |\n sort exceptionCount desc`,\n },\n {\n title: 'List of log events that are not exceptions',\n expr: 'fields @message | filter @message not like /Exception/',\n },\n ],\n },\n {\n category: 'Route 53',\n examples: [\n {\n title: 'Number of requests received every 10 minutes by edge location',\n expr: 'stats count(*) by queryType, bin(10m)',\n },\n {\n title: 'Number of unsuccessful requests by domain',\n expr: 'filter responseCode=\"SERVFAIL\" | stats count(*) by queryName',\n },\n {\n title: 'Number of requests received every 10 minutes by edge location',\n expr: 'stats count(*) as numRequests by resolverIp | sort numRequests desc | limit 10',\n },\n ],\n },\n {\n category: 'AWS AppSync',\n examples: [\n {\n title: 'Number of unique HTTP status codes',\n expr: stripIndents`fields ispresent(graphQLAPIId) as isApi |\n filter isApi |\n filter logType = \"RequestSummary\" |\n stats count() as statusCount by statusCode |\n sort statusCount desc`,\n },\n {\n title: 'Top 10 resolvers with maximum latency',\n expr: stripIndents`fields resolverArn, duration |\n filter logType = \"Tracing\" |\n sort duration desc |\n limit 10`,\n },\n {\n title: 'Most frequently invoked resolvers',\n expr: stripIndents`fields ispresent(resolverArn) as isRes |\n stats count() as invocationCount by resolverArn |\n filter isRes |\n filter logType = \"Tracing\" |\n sort invocationCount desc |\n limit 10`,\n },\n {\n title: 'Resolvers with most errors in mapping templates',\n expr: stripIndents`fields ispresent(resolverArn) as isRes |\n stats count() as errorCount by resolverArn, logType |\n filter isRes and (logType = \"RequestMapping\" or logType = \"ResponseMapping\") and fieldInError |\n sort errorCount desc |\n limit 10`,\n },\n {\n title: 'Field latency statistics',\n expr: stripIndents`fields requestId, latency |\n filter logType = \"RequestSummary\" |\n sort latency desc |\n limit 10`,\n },\n {\n title: 'Resolver latency statistics',\n expr: stripIndents`fields ispresent(resolverArn) as isRes |\n filter isRes |\n filter logType = \"Tracing\" |\n stats min(duration), max(duration), avg(duration) as avgDur by resolverArn |\n sort avgDur desc |\n limit 10`,\n },\n {\n title: 'Top 10 requests with maximum latency',\n expr: stripIndents`fields requestId, latency |\n filter logType = \"RequestSummary\" |\n sort latency desc |\n limit 10`,\n },\n ],\n },\n];\n\nfunction renderHighlightedMarkup(code: string, keyPrefix: string) {\n const grammar = tokenizer;\n const tokens = flattenTokens(Prism.tokenize(code, grammar));\n const spans = tokens\n .filter((token) => typeof token !== 'string')\n .map((token, i) => {\n return (\n <span\n className={`prism-token token ${token.types.join(' ')} ${token.aliases.join(' ')}`}\n key={`${keyPrefix}-token-${i}`}\n >\n {token.content}\n </span>\n );\n });\n\n return <div className=\"slate-query-field\">{spans}</div>;\n}\n\nconst exampleCategory = css`\n margin-top: 5px;\n`;\n\nexport default class LogsCheatSheet extends PureComponent<\n QueryEditorHelpProps<CloudWatchQuery>,\n { userExamples: string[] }\n> {\n onClickExample(query: CloudWatchQuery) {\n this.props.onClickExample(query);\n }\n\n renderExpression(expr: string, keyPrefix: string) {\n return (\n <div\n className=\"cheat-sheet-item__example\"\n key={expr}\n onClick={(e) =>\n this.onClickExample({ refId: 'A', expression: expr, queryMode: 'Logs', region: 'default', id: 'A' })\n }\n >\n <pre>{renderHighlightedMarkup(expr, keyPrefix)}</pre>\n </div>\n );\n }\n\n renderLogsCheatSheet() {\n return (\n <div>\n <h2>CloudWatch Logs Cheat Sheet</h2>\n {CLIQ_EXAMPLES.map((cat, i) => (\n <div key={`${cat.category}-${i}`}>\n <div className={`cheat-sheet-item__title ${cx(exampleCategory)}`}>{cat.category}</div>\n {cat.examples.map((item, j) => (\n <div className=\"cheat-sheet-item\" key={`item-${j}`}>\n <h4>{item.title}</h4>\n {this.renderExpression(item.expr, `item-${j}`)}\n </div>\n ))}\n </div>\n ))}\n </div>\n );\n }\n\n render() {\n return (\n <div>\n <h3>CloudWatch Logs cheat sheet</h3>\n {CLIQ_EXAMPLES.map((cat, i) => (\n <div key={`cat-${i}`}>\n <div className={`cheat-sheet-item__title ${cx(exampleCategory)}`}>{cat.category}</div>\n {cat.examples.map((item, j) => (\n <div className=\"cheat-sheet-item\" key={`item-${j}`}>\n <h4>{item.title}</h4>\n {this.renderExpression(item.expr, `item-${j}`)}\n </div>\n ))}\n </div>\n ))}\n </div>\n );\n }\n}\n","import { DataSourcePlugin } from '@grafana/data';\nimport { ConfigEditor } from './components/ConfigEditor';\nimport { CloudWatchDatasource } from './datasource';\nimport { CloudWatchAnnotationsQueryCtrl } from './annotations_query_ctrl';\nimport { CloudWatchJsonData, CloudWatchQuery } from './types';\nimport { CloudWatchLogsQueryEditor } from './components/LogsQueryEditor';\nimport { PanelQueryEditor } from './components/PanelQueryEditor';\nimport { MetaInspector } from './components/MetaInspector';\nimport LogsCheatSheet from './components/LogsCheatSheet';\n\nexport const plugin = new DataSourcePlugin<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData>(\n CloudWatchDatasource\n)\n .setQueryEditorHelp(LogsCheatSheet)\n .setConfigEditor(ConfigEditor)\n .setQueryEditor(PanelQueryEditor)\n .setMetadataInspector(MetaInspector)\n .setExploreMetricsQueryField(PanelQueryEditor)\n .setExploreLogsQueryField(CloudWatchLogsQueryEditor)\n .setAnnotationQueryCtrl(CloudWatchAnnotationsQueryCtrl);\n","import React, { FC, useEffect, useState } from 'react';\nimport { useDebounce } from 'react-use';\nimport { Input, InlineField } from '@grafana/ui';\nimport {\n rangeUtil,\n DataSourcePluginOptionsEditorProps,\n onUpdateDatasourceJsonDataOption,\n updateDatasourcePluginJsonDataOption,\n} from '@grafana/data';\nimport { ConnectionConfig } from '@grafana/aws-sdk';\n\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { store } from 'app/store/store';\nimport { notifyApp } from 'app/core/actions';\nimport { createWarningNotification } from 'app/core/copy/appNotification';\n\nimport { CloudWatchJsonData, CloudWatchSecureJsonData } from '../types';\nimport { CloudWatchDatasource } from '../datasource';\nimport { XrayLinkConfig } from './XrayLinkConfig';\n\nexport type Props = DataSourcePluginOptionsEditorProps<CloudWatchJsonData, CloudWatchSecureJsonData>;\n\nexport const ConfigEditor: FC<Props> = (props: Props) => {\n const { options } = props;\n\n const datasource = useDatasource(options.name);\n useAuthenticationWarning(options.jsonData);\n const logsTimeoutError = useTimoutValidation(props.options.jsonData.logsTimeout);\n\n return (\n <>\n <ConnectionConfig\n {...props}\n loadRegions={\n datasource &&\n (() => datasource!.getRegions().then((r) => r.filter((r) => r.value !== 'default').map((v) => v.value)))\n }\n >\n <InlineField label=\"Namespaces of Custom Metrics\" labelWidth={28} tooltip=\"Namespaces of Custom Metrics.\">\n <Input\n width={60}\n placeholder=\"Namespace1,Namespace2\"\n value={options.jsonData.customMetricsNamespaces || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'customMetricsNamespaces')}\n />\n </InlineField>\n </ConnectionConfig>\n\n <h3 className=\"page-heading\">CloudWatch Logs</h3>\n <div className=\"gf-form-group\">\n <InlineField\n label=\"Timeout\"\n labelWidth={28}\n tooltip='Custom timout for CloudWatch Logs insights queries which have max concurrency limits. Default is 15 minutes. Must be a valid duration string, such as \"15m\" \"30s\" \"2000ms\" etc.'\n invalid={Boolean(logsTimeoutError)}\n >\n <Input\n width={60}\n placeholder=\"15m\"\n value={options.jsonData.logsTimeout || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'logsTimeout')}\n title={'The timeout must be a valid duration string, such as \"15m\" \"30s\" \"2000ms\" etc.'}\n />\n </InlineField>\n </div>\n\n <XrayLinkConfig\n onChange={(uid) => updateDatasourcePluginJsonDataOption(props, 'tracingDatasourceUid', uid)}\n datasourceUid={options.jsonData.tracingDatasourceUid}\n />\n </>\n );\n};\n\nfunction useAuthenticationWarning(jsonData: CloudWatchJsonData) {\n const addWarning = (message: string) => {\n store.dispatch(notifyApp(createWarningNotification('CloudWatch Authentication', message)));\n };\n\n useEffect(() => {\n if (jsonData.authType === 'arn') {\n addWarning('Since grafana 7.3 authentication type \"arn\" is deprecated, falling back to default SDK provider');\n } else if (jsonData.authType === 'credentials' && !jsonData.profile && !jsonData.database) {\n addWarning(\n 'As of grafana 7.3 authentication type \"credentials\" should be used only for shared file credentials. \\\n If you don\\'t have a credentials file, switch to the default SDK provider for extracting credentials \\\n from environment variables or IAM roles'\n );\n }\n }, [jsonData.authType, jsonData.database, jsonData.profile]);\n}\n\nfunction useDatasource(datasourceName: string) {\n const [datasource, setDatasource] = useState<CloudWatchDatasource>();\n\n useEffect(() => {\n getDatasourceSrv()\n .loadDatasource(datasourceName)\n .then((datasource) => {\n // It's really difficult to type .loadDatasource() because it's inherently untyped as it involves two JSON.parse()'s\n // So a \"as\" type assertion here is a necessary evil.\n setDatasource(datasource as CloudWatchDatasource);\n });\n }, [datasourceName]);\n\n return datasource;\n}\n\nfunction useTimoutValidation(value: string | undefined) {\n const [err, setErr] = useState<undefined | string>(undefined);\n useDebounce(\n () => {\n if (value) {\n try {\n rangeUtil.describeInterval(value);\n setErr(undefined);\n } catch (e) {\n setErr(e.toString());\n }\n } else {\n setErr(undefined);\n }\n },\n 350,\n [value]\n );\n return err;\n}\n","import React, { useMemo } from 'react';\nimport { MetadataInspectorProps } from '@grafana/data';\nimport { CloudWatchDatasource } from '../datasource';\nimport { CloudWatchQuery, CloudWatchJsonData } from '../types';\nimport { groupBy } from 'lodash';\n\nexport type Props = MetadataInspectorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData>;\n\nexport function MetaInspector({ data = [] }: Props) {\n const rows = useMemo(() => groupBy(data, 'refId'), [data]);\n\n return (\n <>\n <table className=\"filter-table form-inline\">\n <thead>\n <tr>\n <th>RefId</th>\n <th>Metric Data Query ID</th>\n <th>Metric Data Query Expression</th>\n <th>Period</th>\n <th />\n </tr>\n </thead>\n {Object.entries(rows).map(([refId, frames], idx) => {\n if (!frames.length) {\n return null;\n }\n\n const frame = frames[0];\n const custom = frame.meta?.custom;\n if (!custom) {\n return null;\n }\n\n return (\n <tbody key={idx}>\n <tr>\n <td>{refId}</td>\n <td>{custom.id}</td>\n <td>{frame.meta?.executedQueryString}</td>\n <td>{custom.period}</td>\n </tr>\n </tbody>\n );\n })}\n </table>\n </>\n );\n}\n"],"names":["getStyles","theme","infoText","css","spacing","colors","text","secondary","xRayDsId","XrayLinkConfig","datasourceUid","onChange","hasXrayDatasource","Boolean","getDatasourceSrv","getList","pluginId","length","styles","useStyles2","className","Alert","title","severity","InlineField","htmlFor","label","labelWidth","tooltip","DataSourcePicker","ds","uid","current","noDefault","ThrottlingErrorMessage","region","target","rel","href","func","wait","mem","memoize","args","debounce","leading","JSON","stringify","CloudWatchLanguageProvider","LanguageProvider","constructor","datasource","initialValues","super","s","replace","trim","url","params","lastValueFrom","this","awsRequest","startTask","Promise","resolve","then","started","async","logGroups","fetchedFieldsCache","Date","now","time","sortedUniq","join","fields","results","all","map","logGroup","getLogGroupFields","logGroupName","Set","reduce","acc","cur","concat","logGroupFields","f","name","values","suggs","getFieldCompletionItems","context","logGroupNames","functionSuggestions","searchFunctionType","SearchFunctionType","items","STRING_FUNCTIONS","DATETIME_FUNCTIONS","IP_FUNCTIONS","suggestions","push","commandToken","curToken","queryCommand","content","toLowerCase","prevToken","prevNonWhitespaceToken","currentTokenIsFirstArg","handleSortCommand","currentTokenIsAfterCommandAndEmpty","isTokenType","next","currentTokenIsAfterCommand","token","types","includes","nextNonWhitespaceToken","currentTokenIsComma","currentTokenIsCommaOrAfterComma","typeaheadOutput","getFieldAndFilterFunctionCompletionItems","getStatsAggCompletionItems","forEach","group","skipFilter","sugg","boolFuncs","getBoolFuncCompletionItems","fieldsSuggestions","comparisonSuggestions","getComparisonCompletionItems","QUERY_COMMANDS","FIELD_AND_FILTER_FUNCTIONS","AGGREGATION_FUNCTIONS_STATS","BOOLEAN_FUNCTIONS","NUMERIC_OPERATORS","fetchFields","field","insertText","match","undefined","Object","assign","getSyntax","syntax","isStatsQuery","query","grammar","Prism","find","toString","type","input","value","tokens","data","get","filter","offsets","start","selection","offset","end","isFirstToken","prev","getCommandCompletionItems","parenthesisToken","maybeFunctionToken","funcsWithFieldArgs","isInsideFunctionParenthesis","keyword","maybeKeyword","getPreviousTokenExcluding","isAfterKeyword","handleKeyword","handleComparison","startToken","thisToken","previousCommandToken","handleCommand","isFirstArgument","funcName","exclude","main","item","dispatch","state","subscriber","counter","period","step","endPeriod","newPeriod","Math","min","schedule","createInternalXrayLink","getDataSourceSrv","e","console","error","internal","queryType","datasourceName","createAwsConsoleLink","range","interpolatedExpression","expression","interpolatedGroups","urlProps","to","toISOString","from","timeType","tz","editorString","isLiveTail","source","encodeUrl","targetBlank","runWithRetry","queryFun","targets","options","startTime","timerID","subscription","retries","collected","timeoutFunction","timeoutFunc","retry","timeout","retryWaitFunction","retryWaitFunc","pow","random","Observable","observer","run","currentQueryParams","subscribe","frames","collectedPreviously","toDataQueryResponse","complete","errorData","keys","refId","startsWith","errorMessage","errors","config","queries","q","good","splitErrorData","valueOf","dataResponse","message","setTimeout","log","clearTimeout","unsubscribe","TokenType","StatementPosition","SuggestionKind","CompletionItemPriority","LinkedToken","previous","isKeyword","Keyword","isWhiteSpace","Whitespace","isParenthesis","Parenthesis","isIdentifier","Identifier","isString","String","isDoubleQuotedString","Type","isVariable","Variable","isFunction","Function","is","isType","getPreviousNonWhiteSpaceToken","curr","getPreviousOfType","getPreviousUntil","ignoreTypes","some","t","getNextUntil","getPreviousKeyword","getNextNonWhiteSpaceToken","getNextOfType","getSelectToken","currentToken","SELECT","getMetricNameToken","assumedMetricNameToken","assumedStatisticToken","getSelectStatisticToken","getNamespaceToken","fromToken","selectToken","FROM","getFromKeywordToken","nextNonWhiteSpace","toUpperCase","SCHEMA","assumedNamespaceToken","CompletionItemProvider","templateSrv","getTemplateSrv","templateVariables","getVariables","getActualRegion","setRegion","getCompletionProvider","monaco","triggerCharacters","provideCompletionItems","model","position","tokensPerLine","editor","tokenize","getValue","language","lineIndex","_tokenBrand","columnIndex","endColumn","getLineLength","startLineNumber","startColumn","endLineNumber","getValueInRange","sqlToken","Range","containsPosition","linkedTokenBuilder","statementPosition","previousNonWhiteSpace","previousKeyword","previousIsSlash","Operator","SelectKeyword","AfterSelectKeyword","AfterSelectFuncFirstArgument","FromKeyword","AfterFromKeyword","SchemaFuncFirstArgument","Delimiter","SchemaFuncExtraArgument","AfterFrom","WHERE","AND","WhereKey","WhereComparisonOperator","EQUALS","NOT_EQUALS","WhereValue","AfterWhereValue","BY","GROUP","AfterGroupByKeywords","AfterGroupBy","ORDER","AfterOrderByKeywords","AfterOrderByFunction","DESC","ASC","AfterOrderByDirection","Unknown","getStatementPosition","suggestionKinds","FunctionsWithArguments","Metrics","Namespaces","SchemaKeyword","LabelKeys","WhereKeyword","GroupByKeywords","OrderByKeywords","LimitKeyword","ComparisonOperators","LabelValues","LogicalOperators","FunctionsWithoutArguments","SortOrderDirectionKeyword","getSuggestionKinds","getSuggestions","fromPositions","toCompletionItem","rest","kind","languages","CompletionItemKind","Field","sortText","Medium","addSuggestion","suggestion","insertTextRules","CompletionItemInsertTextRule","InsertAsSnippet","command","TRIGGER_SUGGEST","STATISTICS","namespaceToken","getMetrics","m","metrics","getAllMetrics","uniq","metricName","High","metricNameToken","namespaces","namespace","getNamespaces","n","labelKeyTokens","dimensionFilter","getDimensionKeys","test","labelKey","getDimensionValues","o","LOGICAL_OPERATORS","MediumHigh","COMPARISON_OPERATORS","LIMIT","MediumLow","v","Low","DS_QUERY_ENDPOINT","displayAlert","store","notifyApp","createErrorNotification","React","displayCustomError","CloudWatchDatasource","DataSourceWithBackend","instanceSettings","timeSrv","getTimeSrv","memoizedDebounce","AppNotificationTimeout","logQueries","validLogQueries","of","isEmpty","LoadingState","makeLogActionRequest","makeReplacements","scopedVars","skipCache","queryString","rangeUtil","logsTimeout","pipe","mergeMap","logsQuery","dataFrame","queryId","meta","custom","statsGroups","response","dataQueryResponse","request","replaceFn","getRegion","tracingDatasourceUid","fieldName","curTarget","interpolatedRegion","xrayLink","links","addDataLinksToLogsResponse","timeRange","bind","tracingDataSourceUid","metricQueries","validMetricsQueries","filterMetricQuery","dimensions","convertDimensionFormat","statistic","getPeriod","id","sqlExpression","intervalMs","maxDataPoints","getRef","performTimeSeriesQuery","row","limit","direction","logStreamField","logField","requestParams","startFromHead","parseLogGroupName","rowIndex","logStreamName","endTime","timeEpochMs","metricsQueries","queryMode","proxyUrl","defaultRegion","jsonData","languageProvider","sqlCompletionItemProvider","angular","hide","getTargetsByQueryMode","dataQueryResponses","handleLogQueries","handleMetricQueries","merge","metricQueryType","metricEditorMode","MetricQueryType","MetricEditorMode","Error","queryParams","param","statsQuery","dataFrames","startPeriod","scheduler","asyncScheduler","add","increasingInterval","concatMap","_","repeat","share","consecutiveFailedAttempts","scan","failures","prevRecordsMatched","frame","recordsMatched","stats","stat","displayName","queryResponse","zip","tap","CloudWatchLogsQueryStatus","hasOwnProperty","failedAttempts","set","key","every","DataQueryErrorType","takeWhile","observable","onUnsubscribe","stopQueries","innerSub","val","err","logQuery","finalize","toArray","fieldNames","fieldPercentages","i","percent","parseInt","res","dataframes","lastError","findLast","catchError","throwError","firstErrorResult","r","failedRedIds","actualRegion","debouncedAlert","transformSuggestDataFromDataframes","suggestData","toLegacyResponseData","rows","doMetricQueryRequest","subtype","parameters","fieldsToReplace","anyQuery","Array","isArray","headers","resultsToDataFrames","status","getRegions","regions","dimensionFilters","dimensionKey","filterDimensions","getEbsVolumeIds","instanceId","getEc2InstanceAttribute","attributeName","filters","getResourceARNs","resourceType","tags","filterJson","metricNameQuery","dimensionKeysQuery","dimensionValuesQuery","parse","ebsVolumeIdsQuery","ec2InstanceAttributeQuery","targetAttributeName","resourceARNsQuery","tagsJSON","standardStatistics","annotationQuery","annotation","defaultPeriod","prefixMatching","actionPrefix","alarmNamePrefix","targetContainsTemplate","variableExists","k","toTestingStatus","method","getBackendSrv","fetch","result","getDefaultRegion","showContextToggle","convertToCloudWatchTime","date","roundUp","dateMath","round","entries","valueVar","getVariableName","multi","split","displayErrorIfIsMultiTemplateVariable","variable","debouncedCustomAlert","getQueryDisplayText","interpolateVariablesInQueries","isCloudWatchLogsQuery","interpolateMetricsQueryVariables","alias","logIdentifier","colonIndex","lastIndexOf","substr","CloudWatchAnnotationsQueryCtrl","$scope","ctrl","defaultsDeep","matchExact","strings","raw","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","Constructor","protoProps","staticProps","prototype","_templateObject","freeze","_classCallCheck","instance","TypeError","TemplateTag","_this","_len","arguments","transformers","_key","tag","_len2","expressions","_key2","interimTag","transformEndResult","transformString","processSubstitutions","transformer","previousTag","template","_len3","substitutions","_key3","apply","resultSoFar","remainingPart","substitution","transformSubstitution","shift","str","transform","onString","onSubstitution","endResult","onEndResult","defaults","separator","conjunction","serial","opts","arrayLength","indent","separatorIndex","slice","_toConsumableArray","arr","arr2","el","regexp","RegExp","side","splitBy","isValidValue","x","Number","isNaN","replaceWhat","replaceWith","CLIQ_EXAMPLES","category","examples","expr","stripIndents","stripIndent","renderHighlightedMarkup","code","keyPrefix","tokenizer","spans","flattenTokens","aliases","exampleCategory","LogsCheatSheet","PureComponent","onClickExample","renderExpression","onClick","renderLogsCheatSheet","cat","cx","j","render","plugin","DataSourcePlugin","setQueryEditorHelp","setConfigEditor","setDatasource","useState","useEffect","loadDatasource","useDatasource","addWarning","createWarningNotification","authType","profile","database","useAuthenticationWarning","logsTimeoutError","setErr","useDebounce","useTimoutValidation","ConnectionConfig","loadRegions","Input","width","placeholder","customMetricsNamespaces","onUpdateDatasourceJsonDataOption","invalid","updateDatasourcePluginJsonDataOption","setQueryEditor","PanelQueryEditor","setMetadataInspector","useMemo","groupBy","idx","executedQueryString","setExploreMetricsQueryField","setExploreLogsQueryField","CloudWatchLogsQueryEditor","setAnnotationQueryCtrl"],"sourceRoot":""}