@grafana/sql 13.0.0-23742865281 → 13.0.0-23743013136

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist/cjs/ResponseParser.cjs.map +1 -1
  2. package/dist/cjs/SQLVariableEditor.cjs.map +1 -1
  3. package/dist/cjs/SQLVariableSupport.cjs.map +1 -1
  4. package/dist/cjs/SQLVariableUtils.cjs.map +1 -1
  5. package/dist/cjs/components/ConfirmModal.cjs.map +1 -1
  6. package/dist/cjs/components/DatasetSelector.cjs.map +1 -1
  7. package/dist/cjs/components/QueryEditor.cjs.map +1 -1
  8. package/dist/cjs/components/QueryEditorLazy.cjs.map +1 -1
  9. package/dist/cjs/components/QueryHeader.cjs.map +1 -1
  10. package/dist/cjs/components/TableSelector.cjs.map +1 -1
  11. package/dist/cjs/components/configuration/ConnectionLimits.cjs.map +1 -1
  12. package/dist/cjs/components/configuration/Divider.cjs.map +1 -1
  13. package/dist/cjs/components/configuration/MaxLifetimeField.cjs.map +1 -1
  14. package/dist/cjs/components/configuration/MaxOpenConnectionsField.cjs.map +1 -1
  15. package/dist/cjs/components/configuration/TLSSecretsConfig.cjs.map +1 -1
  16. package/dist/cjs/components/configuration/useMigrateDatabaseFields.cjs.map +1 -1
  17. package/dist/cjs/components/query-editor-raw/QueryEditorRaw.cjs.map +1 -1
  18. package/dist/cjs/components/query-editor-raw/QueryToolbox.cjs.map +1 -1
  19. package/dist/cjs/components/query-editor-raw/QueryValidator.cjs.map +1 -1
  20. package/dist/cjs/components/query-editor-raw/RawEditor.cjs.map +1 -1
  21. package/dist/cjs/components/visual-query-builder/AwesomeQueryBuilder.cjs +2 -2
  22. package/dist/cjs/components/visual-query-builder/AwesomeQueryBuilder.cjs.map +1 -1
  23. package/dist/cjs/components/visual-query-builder/GroupByRow.cjs.map +1 -1
  24. package/dist/cjs/components/visual-query-builder/OrderByRow.cjs.map +1 -1
  25. package/dist/cjs/components/visual-query-builder/Preview.cjs.map +1 -1
  26. package/dist/cjs/components/visual-query-builder/SQLGroupByRow.cjs.map +1 -1
  27. package/dist/cjs/components/visual-query-builder/SQLOrderByRow.cjs.map +1 -1
  28. package/dist/cjs/components/visual-query-builder/SQLWhereRow.cjs.map +1 -1
  29. package/dist/cjs/components/visual-query-builder/SelectColumn.cjs.map +1 -1
  30. package/dist/cjs/components/visual-query-builder/SelectCustomFunctionParameters.cjs.map +1 -1
  31. package/dist/cjs/components/visual-query-builder/SelectFunctionParameters.cjs.map +1 -1
  32. package/dist/cjs/components/visual-query-builder/SelectRow.cjs.map +1 -1
  33. package/dist/cjs/components/visual-query-builder/VisualEditor.cjs.map +1 -1
  34. package/dist/cjs/components/visual-query-builder/WhereRow.cjs.map +1 -1
  35. package/dist/cjs/constants.cjs.map +1 -1
  36. package/dist/cjs/datasource/SqlDatasource.cjs.map +1 -1
  37. package/dist/cjs/defaults.cjs.map +1 -1
  38. package/dist/cjs/loadResources.cjs.map +1 -1
  39. package/dist/cjs/types.cjs.map +1 -1
  40. package/dist/cjs/utils/getColumnsWithIndices.cjs.map +1 -1
  41. package/dist/cjs/utils/logging.cjs.map +1 -1
  42. package/dist/cjs/utils/migration.cjs.map +1 -1
  43. package/dist/cjs/utils/sql.utils.cjs.map +1 -1
  44. package/dist/cjs/utils/testHelpers.cjs.map +1 -1
  45. package/dist/cjs/utils/useSqlChange.cjs.map +1 -1
  46. package/dist/esm/ResponseParser.mjs.map +1 -1
  47. package/dist/esm/SQLVariableEditor.mjs.map +1 -1
  48. package/dist/esm/SQLVariableSupport.mjs.map +1 -1
  49. package/dist/esm/SQLVariableUtils.mjs.map +1 -1
  50. package/dist/esm/components/ConfirmModal.mjs.map +1 -1
  51. package/dist/esm/components/DatasetSelector.mjs.map +1 -1
  52. package/dist/esm/components/QueryEditor.mjs.map +1 -1
  53. package/dist/esm/components/QueryEditorLazy.mjs.map +1 -1
  54. package/dist/esm/components/QueryHeader.mjs.map +1 -1
  55. package/dist/esm/components/TableSelector.mjs.map +1 -1
  56. package/dist/esm/components/configuration/ConnectionLimits.mjs.map +1 -1
  57. package/dist/esm/components/configuration/Divider.mjs.map +1 -1
  58. package/dist/esm/components/configuration/MaxLifetimeField.mjs.map +1 -1
  59. package/dist/esm/components/configuration/MaxOpenConnectionsField.mjs.map +1 -1
  60. package/dist/esm/components/configuration/TLSSecretsConfig.mjs.map +1 -1
  61. package/dist/esm/components/configuration/useMigrateDatabaseFields.mjs.map +1 -1
  62. package/dist/esm/components/query-editor-raw/QueryEditorRaw.mjs.map +1 -1
  63. package/dist/esm/components/query-editor-raw/QueryToolbox.mjs.map +1 -1
  64. package/dist/esm/components/query-editor-raw/QueryValidator.mjs.map +1 -1
  65. package/dist/esm/components/query-editor-raw/RawEditor.mjs.map +1 -1
  66. package/dist/esm/components/visual-query-builder/AwesomeQueryBuilder.mjs +2 -2
  67. package/dist/esm/components/visual-query-builder/AwesomeQueryBuilder.mjs.map +1 -1
  68. package/dist/esm/components/visual-query-builder/GroupByRow.mjs.map +1 -1
  69. package/dist/esm/components/visual-query-builder/OrderByRow.mjs.map +1 -1
  70. package/dist/esm/components/visual-query-builder/Preview.mjs.map +1 -1
  71. package/dist/esm/components/visual-query-builder/SQLGroupByRow.mjs.map +1 -1
  72. package/dist/esm/components/visual-query-builder/SQLOrderByRow.mjs.map +1 -1
  73. package/dist/esm/components/visual-query-builder/SQLWhereRow.mjs.map +1 -1
  74. package/dist/esm/components/visual-query-builder/SelectColumn.mjs.map +1 -1
  75. package/dist/esm/components/visual-query-builder/SelectCustomFunctionParameters.mjs.map +1 -1
  76. package/dist/esm/components/visual-query-builder/SelectFunctionParameters.mjs.map +1 -1
  77. package/dist/esm/components/visual-query-builder/SelectRow.mjs.map +1 -1
  78. package/dist/esm/components/visual-query-builder/VisualEditor.mjs.map +1 -1
  79. package/dist/esm/components/visual-query-builder/WhereRow.mjs.map +1 -1
  80. package/dist/esm/constants.mjs.map +1 -1
  81. package/dist/esm/datasource/SqlDatasource.mjs.map +1 -1
  82. package/dist/esm/defaults.mjs.map +1 -1
  83. package/dist/esm/loadResources.mjs.map +1 -1
  84. package/dist/esm/types.mjs.map +1 -1
  85. package/dist/esm/utils/getColumnsWithIndices.mjs.map +1 -1
  86. package/dist/esm/utils/logging.mjs.map +1 -1
  87. package/dist/esm/utils/migration.mjs.map +1 -1
  88. package/dist/esm/utils/sql.utils.mjs.map +1 -1
  89. package/dist/esm/utils/testHelpers.mjs.map +1 -1
  90. package/dist/esm/utils/useSqlChange.mjs.map +1 -1
  91. package/dist/types/ResponseParser.d.ts +1 -1
  92. package/dist/types/SQLVariableEditor.d.ts +2 -2
  93. package/dist/types/SQLVariableSupport.d.ts +3 -3
  94. package/dist/types/SQLVariableUtils.d.ts +1 -1
  95. package/dist/types/components/DatasetSelector.d.ts +2 -2
  96. package/dist/types/components/ErrorBoundary.d.ts +1 -1
  97. package/dist/types/components/QueryEditor.d.ts +4 -4
  98. package/dist/types/components/QueryHeader.d.ts +2 -2
  99. package/dist/types/components/SqlComponents.testHelpers.d.ts +3 -3
  100. package/dist/types/components/TableSelector.d.ts +2 -2
  101. package/dist/types/components/configuration/ConnectionLimits.d.ts +2 -2
  102. package/dist/types/components/configuration/MaxLifetimeField.d.ts +1 -1
  103. package/dist/types/components/configuration/MaxOpenConnectionsField.d.ts +1 -1
  104. package/dist/types/components/configuration/TLSSecretsConfig.d.ts +1 -1
  105. package/dist/types/components/configuration/useMigrateDatabaseFields.d.ts +2 -2
  106. package/dist/types/components/query-editor-raw/QueryEditorRaw.d.ts +2 -2
  107. package/dist/types/components/query-editor-raw/QueryToolbox.d.ts +1 -1
  108. package/dist/types/components/query-editor-raw/QueryValidator.d.ts +2 -2
  109. package/dist/types/components/query-editor-raw/RawEditor.d.ts +1 -1
  110. package/dist/types/components/visual-query-builder/AwesomeQueryBuilder.d.ts +1 -1
  111. package/dist/types/components/visual-query-builder/GroupByRow.d.ts +2 -2
  112. package/dist/types/components/visual-query-builder/OrderByRow.d.ts +2 -2
  113. package/dist/types/components/visual-query-builder/SQLGroupByRow.d.ts +3 -3
  114. package/dist/types/components/visual-query-builder/SQLOrderByRow.d.ts +3 -3
  115. package/dist/types/components/visual-query-builder/SQLWhereRow.d.ts +3 -3
  116. package/dist/types/components/visual-query-builder/SelectColumn.d.ts +1 -1
  117. package/dist/types/components/visual-query-builder/SelectCustomFunctionParameters.d.ts +2 -2
  118. package/dist/types/components/visual-query-builder/SelectFunctionParameters.d.ts +2 -2
  119. package/dist/types/components/visual-query-builder/SelectRow.d.ts +2 -2
  120. package/dist/types/components/visual-query-builder/VisualEditor.d.ts +1 -1
  121. package/dist/types/components/visual-query-builder/WhereRow.d.ts +2 -2
  122. package/dist/types/constants.d.ts +1 -1
  123. package/dist/types/datasource/SqlDatasource.d.ts +4 -4
  124. package/dist/types/defaults.d.ts +1 -1
  125. package/dist/types/loadResources.d.ts +1 -1
  126. package/dist/types/types.d.ts +4 -4
  127. package/dist/types/utils/getColumnsWithIndices.d.ts +2 -2
  128. package/dist/types/utils/logging.d.ts +1 -1
  129. package/dist/types/utils/migration.d.ts +2 -2
  130. package/dist/types/utils/sql.utils.d.ts +3 -3
  131. package/dist/types/utils/testHelpers.d.ts +1 -1
  132. package/dist/types/utils/useSqlChange.d.ts +1 -1
  133. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"SelectCustomFunctionParameters.mjs","sources":["../../../../src/components/visual-query-builder/SelectCustomFunctionParameters.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { useCallback } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\nimport { Button, InlineLabel, Input, Stack, useStyles2 } from '@grafana/ui';\n\nimport { QueryEditorExpressionType } from '../../expressions';\nimport { SQLExpression, SQLQuery } from '../../types';\nimport { getColumnValue } from '../../utils/sql.utils';\n\nimport { SelectColumn } from './SelectColumn';\n\ninterface Props {\n columns: Array<SelectableValue<string>>;\n query: SQLQuery;\n onSqlChange: (sql: SQLExpression) => void;\n onParameterChange: (index: number) => (value?: string) => void;\n currentColumnIndex: number;\n}\n\nexport function SelectCustomFunctionParameters({\n columns,\n query,\n onSqlChange,\n onParameterChange,\n currentColumnIndex,\n}: Props) {\n const styles = useStyles2(getStyles);\n const macroOrFunction = query.sql?.columns?.[currentColumnIndex];\n\n const addParameter = useCallback(\n (index: number) => {\n const item = query.sql?.columns?.[index];\n if (!item) {\n return;\n }\n\n item.parameters = item.parameters\n ? [...item.parameters, { type: QueryEditorExpressionType.FunctionParameter, name: '' }]\n : [];\n\n const newSql: SQLExpression = {\n ...query.sql,\n columns: query.sql?.columns?.map((c, i) => (i === index ? item : c)),\n };\n\n onSqlChange(newSql);\n },\n [onSqlChange, query.sql]\n );\n\n const removeParameter = useCallback(\n (columnIndex: number, index: number) => {\n const item = query.sql?.columns?.[columnIndex];\n if (!item?.parameters) {\n return;\n }\n item.parameters = item.parameters?.filter((_, i) => i !== index);\n\n const newSql: SQLExpression = {\n ...query.sql,\n columns: query.sql?.columns?.map((c, i) => (i === columnIndex ? item : c)),\n };\n\n onSqlChange(newSql);\n },\n [onSqlChange, query.sql]\n );\n\n function renderParameters(columnIndex: number) {\n if (!macroOrFunction?.parameters || macroOrFunction.parameters.length <= 1) {\n return null;\n }\n\n const paramComponents = macroOrFunction.parameters.map((param, index) => {\n // Skip the first parameter as it is the column name\n if (index === 0) {\n return null;\n }\n\n return (\n <Stack key={index} gap={2}>\n <InlineLabel className={styles.label}>,</InlineLabel>\n <Input\n onChange={(e) => onParameterChange(index)(e.currentTarget.value)}\n value={param.name}\n aria-label={t(\n 'grafana-sql.components.select-custom-function-parameters.aria-label-parameter',\n 'Parameter {{index}} for column {{columnIndex}}',\n { index, columnIndex }\n )}\n data-testid={selectors.components.SQLQueryEditor.selectInputParameter}\n addonAfter={\n <Button\n aria-label={t(\n 'grafana-sql.components.select-custom-function-parameters.render-parameters.params.title-remove-parameter',\n 'Remove parameter'\n )}\n type=\"button\"\n icon=\"times\"\n variant=\"secondary\"\n size=\"md\"\n onClick={() => removeParameter(columnIndex, index)}\n />\n }\n />\n </Stack>\n );\n });\n return paramComponents;\n }\n\n return (\n <>\n <InlineLabel className={styles.label}>(</InlineLabel>\n <SelectColumn\n columns={columns}\n onParameterChange={(s) => onParameterChange(0)(s)}\n value={getColumnValue(macroOrFunction?.parameters?.[0])}\n />\n {renderParameters(currentColumnIndex)}\n <Button\n type=\"button\"\n onClick={() => addParameter(currentColumnIndex)}\n variant=\"secondary\"\n size=\"md\"\n icon=\"plus\"\n aria-label={t('grafana-sql.components.select-custom-function-parameters.title-add-parameter', 'Add parameter')}\n />\n <InlineLabel className={styles.label}>)</InlineLabel>\n </>\n );\n}\n\nconst getStyles = () => {\n return {\n label: css({\n padding: 0,\n margin: 0,\n width: 'unset',\n }),\n };\n};\n"],"names":["_a","_b","_c"],"mappings":"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"}
1
+ {"version":3,"file":"SelectCustomFunctionParameters.mjs","sources":["../../../../src/components/visual-query-builder/SelectCustomFunctionParameters.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { useCallback } from 'react';\n\nimport { type SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\nimport { Button, InlineLabel, Input, Stack, useStyles2 } from '@grafana/ui';\n\nimport { QueryEditorExpressionType } from '../../expressions';\nimport { type SQLExpression, type SQLQuery } from '../../types';\nimport { getColumnValue } from '../../utils/sql.utils';\n\nimport { SelectColumn } from './SelectColumn';\n\ninterface Props {\n columns: Array<SelectableValue<string>>;\n query: SQLQuery;\n onSqlChange: (sql: SQLExpression) => void;\n onParameterChange: (index: number) => (value?: string) => void;\n currentColumnIndex: number;\n}\n\nexport function SelectCustomFunctionParameters({\n columns,\n query,\n onSqlChange,\n onParameterChange,\n currentColumnIndex,\n}: Props) {\n const styles = useStyles2(getStyles);\n const macroOrFunction = query.sql?.columns?.[currentColumnIndex];\n\n const addParameter = useCallback(\n (index: number) => {\n const item = query.sql?.columns?.[index];\n if (!item) {\n return;\n }\n\n item.parameters = item.parameters\n ? [...item.parameters, { type: QueryEditorExpressionType.FunctionParameter, name: '' }]\n : [];\n\n const newSql: SQLExpression = {\n ...query.sql,\n columns: query.sql?.columns?.map((c, i) => (i === index ? item : c)),\n };\n\n onSqlChange(newSql);\n },\n [onSqlChange, query.sql]\n );\n\n const removeParameter = useCallback(\n (columnIndex: number, index: number) => {\n const item = query.sql?.columns?.[columnIndex];\n if (!item?.parameters) {\n return;\n }\n item.parameters = item.parameters?.filter((_, i) => i !== index);\n\n const newSql: SQLExpression = {\n ...query.sql,\n columns: query.sql?.columns?.map((c, i) => (i === columnIndex ? item : c)),\n };\n\n onSqlChange(newSql);\n },\n [onSqlChange, query.sql]\n );\n\n function renderParameters(columnIndex: number) {\n if (!macroOrFunction?.parameters || macroOrFunction.parameters.length <= 1) {\n return null;\n }\n\n const paramComponents = macroOrFunction.parameters.map((param, index) => {\n // Skip the first parameter as it is the column name\n if (index === 0) {\n return null;\n }\n\n return (\n <Stack key={index} gap={2}>\n <InlineLabel className={styles.label}>,</InlineLabel>\n <Input\n onChange={(e) => onParameterChange(index)(e.currentTarget.value)}\n value={param.name}\n aria-label={t(\n 'grafana-sql.components.select-custom-function-parameters.aria-label-parameter',\n 'Parameter {{index}} for column {{columnIndex}}',\n { index, columnIndex }\n )}\n data-testid={selectors.components.SQLQueryEditor.selectInputParameter}\n addonAfter={\n <Button\n aria-label={t(\n 'grafana-sql.components.select-custom-function-parameters.render-parameters.params.title-remove-parameter',\n 'Remove parameter'\n )}\n type=\"button\"\n icon=\"times\"\n variant=\"secondary\"\n size=\"md\"\n onClick={() => removeParameter(columnIndex, index)}\n />\n }\n />\n </Stack>\n );\n });\n return paramComponents;\n }\n\n return (\n <>\n <InlineLabel className={styles.label}>(</InlineLabel>\n <SelectColumn\n columns={columns}\n onParameterChange={(s) => onParameterChange(0)(s)}\n value={getColumnValue(macroOrFunction?.parameters?.[0])}\n />\n {renderParameters(currentColumnIndex)}\n <Button\n type=\"button\"\n onClick={() => addParameter(currentColumnIndex)}\n variant=\"secondary\"\n size=\"md\"\n icon=\"plus\"\n aria-label={t('grafana-sql.components.select-custom-function-parameters.title-add-parameter', 'Add parameter')}\n />\n <InlineLabel className={styles.label}>)</InlineLabel>\n </>\n );\n}\n\nconst getStyles = () => {\n return {\n label: css({\n padding: 0,\n margin: 0,\n width: 'unset',\n }),\n };\n};\n"],"names":["_a","_b","_c"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SelectFunctionParameters.mjs","sources":["../../../../src/components/visual-query-builder/SelectFunctionParameters.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { useCallback, useEffect, useId, useState } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { EditorField } from '@grafana/plugin-ui';\nimport { InlineLabel, Input, Select, Stack, useStyles2 } from '@grafana/ui';\n\nimport { QueryEditorExpressionType } from '../../expressions';\nimport { DB, SQLExpression, SQLQuery } from '../../types';\nimport { getColumnValue } from '../../utils/sql.utils';\n\nimport { SelectColumn } from './SelectColumn';\nimport { SelectCustomFunctionParameters } from './SelectCustomFunctionParameters';\n\ninterface Props {\n query: SQLQuery;\n onSqlChange: (sql: SQLExpression) => void;\n currentColumnIndex: number;\n db: DB;\n columns: Array<SelectableValue<string>>;\n}\n\nexport function SelectFunctionParameters({ query, onSqlChange, currentColumnIndex, db, columns }: Props) {\n const selectInputId = useId();\n const macroOrFunction = query.sql?.columns?.[currentColumnIndex];\n const styles = useStyles2(getStyles);\n const func = db.functions().find((f) => f.name === macroOrFunction?.name);\n\n const [fieldsFromFunction, setFieldsFromFunction] = useState<Array<Array<SelectableValue<string>>>>([]);\n\n useEffect(() => {\n const getFieldsFromFunction = async () => {\n if (!func) {\n return;\n }\n const options: Array<Array<SelectableValue<string>>> = [];\n for (const param of func.parameters ?? []) {\n if (param.options) {\n options.push(await param.options(query));\n } else {\n options.push([]);\n }\n }\n setFieldsFromFunction(options);\n };\n getFieldsFromFunction();\n\n // It is fine to ignore the warning here and omit the query object\n // only table property is used in the query object and whenever table changes the component is re-rendered\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [macroOrFunction?.name]);\n\n const onParameterChange = useCallback(\n (index: number, keepIndex?: boolean) => (s: string | undefined) => {\n const item = query.sql?.columns?.[currentColumnIndex];\n if (!item) {\n return;\n }\n if (!item.parameters) {\n item.parameters = [];\n }\n if (item.parameters[index] === undefined) {\n item.parameters[index] = { type: QueryEditorExpressionType.FunctionParameter, name: s };\n } else if (s == null && keepIndex) {\n // Remove value from index\n item.parameters = item.parameters.map((p, i) => (i === index ? { ...p, name: '' } : p));\n // Remove the last empty parameter\n if (item.parameters[item.parameters.length - 1]?.name === '') {\n item.parameters = item.parameters.filter((p) => p.name !== '');\n }\n } else if (s == null) {\n item.parameters = item.parameters.filter((_, i) => i !== index);\n } else {\n item.parameters = item.parameters.map((p, i) => (i === index ? { ...p, name: s } : p));\n }\n\n const newSql: SQLExpression = {\n ...query.sql,\n columns: query.sql?.columns?.map((c, i) => (i === currentColumnIndex ? item : c)),\n };\n\n onSqlChange(newSql);\n },\n [currentColumnIndex, onSqlChange, query.sql]\n );\n\n function renderParametersWithFunctions() {\n if (!func?.parameters) {\n return null;\n }\n\n return func?.parameters.map((funcParam, index) => {\n return (\n <Stack key={index} alignItems=\"flex-end\" gap={2}>\n <EditorField label={funcParam.name} width={25} optional={!funcParam.required}>\n <>\n {funcParam.options ? (\n <Select\n value={getColumnValue(macroOrFunction?.parameters![index])}\n options={fieldsFromFunction?.[index]}\n data-testid={selectors.components.SQLQueryEditor.selectFunctionParameter(funcParam.name)}\n inputId={selectInputId}\n menuShouldPortal\n allowCustomValue\n isClearable\n onChange={(s) => onParameterChange(index, true)(s?.value)}\n />\n ) : (\n <Input\n onChange={(e) => onParameterChange(index, true)(e.currentTarget.value)}\n value={macroOrFunction?.parameters![index]?.name}\n data-testid={selectors.components.SQLQueryEditor.selectInputParameter}\n />\n )}\n </>\n </EditorField>\n {func.parameters!.length !== index + 1 && <InlineLabel className={styles.label}>,</InlineLabel>}\n </Stack>\n );\n });\n }\n\n // This means that no function is selected, we render a column selector\n if (macroOrFunction?.name === undefined) {\n return (\n <SelectColumn\n columns={columns}\n onParameterChange={(s) => onParameterChange(0)(s)}\n value={getColumnValue(macroOrFunction?.parameters?.[0])}\n />\n );\n }\n\n // If the function is not found, that means that it might be a custom value\n // we let the user add any number of parameters\n if (!func) {\n return (\n <SelectCustomFunctionParameters\n query={query}\n onSqlChange={onSqlChange}\n currentColumnIndex={currentColumnIndex}\n columns={columns}\n onParameterChange={onParameterChange}\n />\n );\n }\n\n // Else we render the function parameters based on the provided settings\n return (\n <>\n <InlineLabel className={styles.label}>(</InlineLabel>\n {renderParametersWithFunctions()}\n <InlineLabel className={styles.label}>)</InlineLabel>\n </>\n );\n}\n\nconst getStyles = () => {\n return {\n label: css({\n padding: 0,\n margin: 0,\n width: 'unset',\n }),\n };\n};\n"],"names":["_a","_b","_c"],"mappings":"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"}
1
+ {"version":3,"file":"SelectFunctionParameters.mjs","sources":["../../../../src/components/visual-query-builder/SelectFunctionParameters.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { useCallback, useEffect, useId, useState } from 'react';\n\nimport { type SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { EditorField } from '@grafana/plugin-ui';\nimport { InlineLabel, Input, Select, Stack, useStyles2 } from '@grafana/ui';\n\nimport { QueryEditorExpressionType } from '../../expressions';\nimport { type DB, type SQLExpression, type SQLQuery } from '../../types';\nimport { getColumnValue } from '../../utils/sql.utils';\n\nimport { SelectColumn } from './SelectColumn';\nimport { SelectCustomFunctionParameters } from './SelectCustomFunctionParameters';\n\ninterface Props {\n query: SQLQuery;\n onSqlChange: (sql: SQLExpression) => void;\n currentColumnIndex: number;\n db: DB;\n columns: Array<SelectableValue<string>>;\n}\n\nexport function SelectFunctionParameters({ query, onSqlChange, currentColumnIndex, db, columns }: Props) {\n const selectInputId = useId();\n const macroOrFunction = query.sql?.columns?.[currentColumnIndex];\n const styles = useStyles2(getStyles);\n const func = db.functions().find((f) => f.name === macroOrFunction?.name);\n\n const [fieldsFromFunction, setFieldsFromFunction] = useState<Array<Array<SelectableValue<string>>>>([]);\n\n useEffect(() => {\n const getFieldsFromFunction = async () => {\n if (!func) {\n return;\n }\n const options: Array<Array<SelectableValue<string>>> = [];\n for (const param of func.parameters ?? []) {\n if (param.options) {\n options.push(await param.options(query));\n } else {\n options.push([]);\n }\n }\n setFieldsFromFunction(options);\n };\n getFieldsFromFunction();\n\n // It is fine to ignore the warning here and omit the query object\n // only table property is used in the query object and whenever table changes the component is re-rendered\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [macroOrFunction?.name]);\n\n const onParameterChange = useCallback(\n (index: number, keepIndex?: boolean) => (s: string | undefined) => {\n const item = query.sql?.columns?.[currentColumnIndex];\n if (!item) {\n return;\n }\n if (!item.parameters) {\n item.parameters = [];\n }\n if (item.parameters[index] === undefined) {\n item.parameters[index] = { type: QueryEditorExpressionType.FunctionParameter, name: s };\n } else if (s == null && keepIndex) {\n // Remove value from index\n item.parameters = item.parameters.map((p, i) => (i === index ? { ...p, name: '' } : p));\n // Remove the last empty parameter\n if (item.parameters[item.parameters.length - 1]?.name === '') {\n item.parameters = item.parameters.filter((p) => p.name !== '');\n }\n } else if (s == null) {\n item.parameters = item.parameters.filter((_, i) => i !== index);\n } else {\n item.parameters = item.parameters.map((p, i) => (i === index ? { ...p, name: s } : p));\n }\n\n const newSql: SQLExpression = {\n ...query.sql,\n columns: query.sql?.columns?.map((c, i) => (i === currentColumnIndex ? item : c)),\n };\n\n onSqlChange(newSql);\n },\n [currentColumnIndex, onSqlChange, query.sql]\n );\n\n function renderParametersWithFunctions() {\n if (!func?.parameters) {\n return null;\n }\n\n return func?.parameters.map((funcParam, index) => {\n return (\n <Stack key={index} alignItems=\"flex-end\" gap={2}>\n <EditorField label={funcParam.name} width={25} optional={!funcParam.required}>\n <>\n {funcParam.options ? (\n <Select\n value={getColumnValue(macroOrFunction?.parameters![index])}\n options={fieldsFromFunction?.[index]}\n data-testid={selectors.components.SQLQueryEditor.selectFunctionParameter(funcParam.name)}\n inputId={selectInputId}\n menuShouldPortal\n allowCustomValue\n isClearable\n onChange={(s) => onParameterChange(index, true)(s?.value)}\n />\n ) : (\n <Input\n onChange={(e) => onParameterChange(index, true)(e.currentTarget.value)}\n value={macroOrFunction?.parameters![index]?.name}\n data-testid={selectors.components.SQLQueryEditor.selectInputParameter}\n />\n )}\n </>\n </EditorField>\n {func.parameters!.length !== index + 1 && <InlineLabel className={styles.label}>,</InlineLabel>}\n </Stack>\n );\n });\n }\n\n // This means that no function is selected, we render a column selector\n if (macroOrFunction?.name === undefined) {\n return (\n <SelectColumn\n columns={columns}\n onParameterChange={(s) => onParameterChange(0)(s)}\n value={getColumnValue(macroOrFunction?.parameters?.[0])}\n />\n );\n }\n\n // If the function is not found, that means that it might be a custom value\n // we let the user add any number of parameters\n if (!func) {\n return (\n <SelectCustomFunctionParameters\n query={query}\n onSqlChange={onSqlChange}\n currentColumnIndex={currentColumnIndex}\n columns={columns}\n onParameterChange={onParameterChange}\n />\n );\n }\n\n // Else we render the function parameters based on the provided settings\n return (\n <>\n <InlineLabel className={styles.label}>(</InlineLabel>\n {renderParametersWithFunctions()}\n <InlineLabel className={styles.label}>)</InlineLabel>\n </>\n );\n}\n\nconst getStyles = () => {\n return {\n label: css({\n padding: 0,\n margin: 0,\n width: 'unset',\n }),\n };\n};\n"],"names":["_a","_b","_c"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SelectRow.mjs","sources":["../../../../src/components/visual-query-builder/SelectRow.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport { useCallback } from 'react';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\nimport { EditorField } from '@grafana/plugin-ui';\nimport { Button, Select, Stack, useStyles2 } from '@grafana/ui';\n\nimport { QueryEditorExpressionType, QueryEditorFunctionExpression } from '../../expressions';\nimport { DB, QueryFormat, SQLExpression, SQLQuery } from '../../types';\nimport { createFunctionField } from '../../utils/sql.utils';\nimport { useSqlChange } from '../../utils/useSqlChange';\n\nimport { SelectFunctionParameters } from './SelectFunctionParameters';\n\ninterface SelectRowProps {\n query: SQLQuery;\n onQueryChange: (sql: SQLQuery) => void;\n db: DB;\n columns: Array<SelectableValue<string>>;\n}\n\nexport function SelectRow({ query, onQueryChange, db, columns }: SelectRowProps) {\n const styles = useStyles2(getStyles);\n const { onSqlChange } = useSqlChange({ query, onQueryChange, db });\n const timeSeriesAliasOpts: Array<SelectableValue<string>> = [];\n\n // Add necessary alias options for time series format\n // when that format has been selected\n if (query.format === QueryFormat.Timeseries) {\n timeSeriesAliasOpts.push({ label: t('grafana-sql.components.select-row.label.time', 'time'), value: 'time' });\n timeSeriesAliasOpts.push({ label: t('grafana-sql.components.select-row.label.value', 'value'), value: 'value' });\n }\n\n const onAggregationChange = useCallback(\n (item: QueryEditorFunctionExpression, index: number) => (aggregation: SelectableValue<string>) => {\n const newItem = {\n ...item,\n name: aggregation?.value,\n parameters: [\n { type: QueryEditorExpressionType.FunctionParameter as const, name: item.parameters?.[0]?.name || '' },\n ],\n };\n const newSql: SQLExpression = {\n ...query.sql,\n columns: query.sql?.columns?.map((c, i) => (i === index ? newItem : c)),\n };\n\n onSqlChange(newSql);\n },\n [onSqlChange, query.sql]\n );\n\n const onAliasChange = useCallback(\n (item: QueryEditorFunctionExpression, index: number) => (alias: SelectableValue<string>) => {\n let newItem = { ...item };\n\n if (alias !== null) {\n newItem = { ...item, alias: `\"${alias?.value?.trim()}\"` };\n } else {\n delete newItem.alias;\n }\n\n const newSql: SQLExpression = {\n ...query.sql,\n columns: query.sql?.columns?.map((c, i) => (i === index ? newItem : c)),\n };\n\n onSqlChange(newSql);\n },\n [onSqlChange, query.sql]\n );\n\n const removeColumn = useCallback(\n (index: number) => () => {\n const clone = [...(query.sql?.columns || [])];\n clone.splice(index, 1);\n const newSql: SQLExpression = {\n ...query.sql,\n columns: clone,\n };\n onSqlChange(newSql);\n },\n [onSqlChange, query.sql]\n );\n\n const addColumn = useCallback(() => {\n const newSql: SQLExpression = { ...query.sql, columns: [...(query.sql?.columns || []), createFunctionField()] };\n onSqlChange(newSql);\n }, [onSqlChange, query.sql]);\n\n const aggregateOptions = () => {\n const options: Array<SelectableValue<string>> = [\n {\n label: t('grafana-sql.components.select-row.aggregate-options.options.label.aggregations', 'Aggregations'),\n options: [],\n },\n { label: t('grafana-sql.components.select-row.aggregate-options.options.label.macros', 'Macros'), options: [] },\n ];\n for (const func of db.functions()) {\n // Create groups for macros\n if (func.name.startsWith('$__')) {\n options[1].options.push({ label: func.name, value: func.name });\n } else {\n options[0].options.push({ label: func.name, value: func.name });\n }\n }\n return options;\n };\n\n return (\n <Stack gap={2} wrap=\"wrap\" direction=\"column\">\n {query.sql?.columns?.map((item, index) => (\n <div key={index}>\n <Stack gap={2} alignItems=\"end\">\n <EditorField\n label={t('grafana-sql.components.select-row.label-data-operations', 'Data operations')}\n optional\n width={25}\n >\n <Select\n value={item.name ? toOption(item.name) : null}\n inputId={`select-aggregation-${index}-${uniqueId()}`}\n data-testid={selectors.components.SQLQueryEditor.selectAggregation}\n isClearable\n menuShouldPortal\n allowCustomValue\n options={aggregateOptions()}\n onChange={onAggregationChange(item, index)}\n />\n </EditorField>\n\n <SelectFunctionParameters\n currentColumnIndex={index}\n columns={columns}\n onSqlChange={onSqlChange}\n query={query}\n db={db}\n />\n\n <EditorField label={t('grafana-sql.components.select-row.label-alias', 'Alias')} optional width={15}>\n <Select\n value={item.alias ? toOption(item.alias) : null}\n inputId={`select-alias-${index}-${uniqueId()}`}\n data-testid={selectors.components.SQLQueryEditor.selectAlias}\n options={timeSeriesAliasOpts}\n onChange={onAliasChange(item, index)}\n isClearable\n menuShouldPortal\n allowCustomValue\n />\n </EditorField>\n <Button\n aria-label={t('grafana-sql.components.select-row.title-remove-column', 'Remove column')}\n type=\"button\"\n icon=\"trash-alt\"\n variant=\"secondary\"\n size=\"md\"\n onClick={removeColumn(index)}\n />\n </Stack>\n </div>\n ))}\n <Button\n type=\"button\"\n onClick={addColumn}\n variant=\"secondary\"\n aria-label={t('grafana-sql.components.select-row.title-add-column', 'Add column')}\n size=\"md\"\n icon=\"plus\"\n className={styles.addButton}\n />\n </Stack>\n );\n}\n\nconst getStyles = () => {\n return {\n addButton: css({ alignSelf: 'flex-start' }),\n label: css({\n padding: 0,\n margin: 0,\n width: 'unset',\n }),\n };\n};\n"],"names":["_a","_b"],"mappings":"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"}
1
+ {"version":3,"file":"SelectRow.mjs","sources":["../../../../src/components/visual-query-builder/SelectRow.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport { useCallback } from 'react';\n\nimport { type SelectableValue, toOption } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\nimport { EditorField } from '@grafana/plugin-ui';\nimport { Button, Select, Stack, useStyles2 } from '@grafana/ui';\n\nimport { QueryEditorExpressionType, type QueryEditorFunctionExpression } from '../../expressions';\nimport { type DB, QueryFormat, type SQLExpression, type SQLQuery } from '../../types';\nimport { createFunctionField } from '../../utils/sql.utils';\nimport { useSqlChange } from '../../utils/useSqlChange';\n\nimport { SelectFunctionParameters } from './SelectFunctionParameters';\n\ninterface SelectRowProps {\n query: SQLQuery;\n onQueryChange: (sql: SQLQuery) => void;\n db: DB;\n columns: Array<SelectableValue<string>>;\n}\n\nexport function SelectRow({ query, onQueryChange, db, columns }: SelectRowProps) {\n const styles = useStyles2(getStyles);\n const { onSqlChange } = useSqlChange({ query, onQueryChange, db });\n const timeSeriesAliasOpts: Array<SelectableValue<string>> = [];\n\n // Add necessary alias options for time series format\n // when that format has been selected\n if (query.format === QueryFormat.Timeseries) {\n timeSeriesAliasOpts.push({ label: t('grafana-sql.components.select-row.label.time', 'time'), value: 'time' });\n timeSeriesAliasOpts.push({ label: t('grafana-sql.components.select-row.label.value', 'value'), value: 'value' });\n }\n\n const onAggregationChange = useCallback(\n (item: QueryEditorFunctionExpression, index: number) => (aggregation: SelectableValue<string>) => {\n const newItem = {\n ...item,\n name: aggregation?.value,\n parameters: [\n { type: QueryEditorExpressionType.FunctionParameter as const, name: item.parameters?.[0]?.name || '' },\n ],\n };\n const newSql: SQLExpression = {\n ...query.sql,\n columns: query.sql?.columns?.map((c, i) => (i === index ? newItem : c)),\n };\n\n onSqlChange(newSql);\n },\n [onSqlChange, query.sql]\n );\n\n const onAliasChange = useCallback(\n (item: QueryEditorFunctionExpression, index: number) => (alias: SelectableValue<string>) => {\n let newItem = { ...item };\n\n if (alias !== null) {\n newItem = { ...item, alias: `\"${alias?.value?.trim()}\"` };\n } else {\n delete newItem.alias;\n }\n\n const newSql: SQLExpression = {\n ...query.sql,\n columns: query.sql?.columns?.map((c, i) => (i === index ? newItem : c)),\n };\n\n onSqlChange(newSql);\n },\n [onSqlChange, query.sql]\n );\n\n const removeColumn = useCallback(\n (index: number) => () => {\n const clone = [...(query.sql?.columns || [])];\n clone.splice(index, 1);\n const newSql: SQLExpression = {\n ...query.sql,\n columns: clone,\n };\n onSqlChange(newSql);\n },\n [onSqlChange, query.sql]\n );\n\n const addColumn = useCallback(() => {\n const newSql: SQLExpression = { ...query.sql, columns: [...(query.sql?.columns || []), createFunctionField()] };\n onSqlChange(newSql);\n }, [onSqlChange, query.sql]);\n\n const aggregateOptions = () => {\n const options: Array<SelectableValue<string>> = [\n {\n label: t('grafana-sql.components.select-row.aggregate-options.options.label.aggregations', 'Aggregations'),\n options: [],\n },\n { label: t('grafana-sql.components.select-row.aggregate-options.options.label.macros', 'Macros'), options: [] },\n ];\n for (const func of db.functions()) {\n // Create groups for macros\n if (func.name.startsWith('$__')) {\n options[1].options.push({ label: func.name, value: func.name });\n } else {\n options[0].options.push({ label: func.name, value: func.name });\n }\n }\n return options;\n };\n\n return (\n <Stack gap={2} wrap=\"wrap\" direction=\"column\">\n {query.sql?.columns?.map((item, index) => (\n <div key={index}>\n <Stack gap={2} alignItems=\"end\">\n <EditorField\n label={t('grafana-sql.components.select-row.label-data-operations', 'Data operations')}\n optional\n width={25}\n >\n <Select\n value={item.name ? toOption(item.name) : null}\n inputId={`select-aggregation-${index}-${uniqueId()}`}\n data-testid={selectors.components.SQLQueryEditor.selectAggregation}\n isClearable\n menuShouldPortal\n allowCustomValue\n options={aggregateOptions()}\n onChange={onAggregationChange(item, index)}\n />\n </EditorField>\n\n <SelectFunctionParameters\n currentColumnIndex={index}\n columns={columns}\n onSqlChange={onSqlChange}\n query={query}\n db={db}\n />\n\n <EditorField label={t('grafana-sql.components.select-row.label-alias', 'Alias')} optional width={15}>\n <Select\n value={item.alias ? toOption(item.alias) : null}\n inputId={`select-alias-${index}-${uniqueId()}`}\n data-testid={selectors.components.SQLQueryEditor.selectAlias}\n options={timeSeriesAliasOpts}\n onChange={onAliasChange(item, index)}\n isClearable\n menuShouldPortal\n allowCustomValue\n />\n </EditorField>\n <Button\n aria-label={t('grafana-sql.components.select-row.title-remove-column', 'Remove column')}\n type=\"button\"\n icon=\"trash-alt\"\n variant=\"secondary\"\n size=\"md\"\n onClick={removeColumn(index)}\n />\n </Stack>\n </div>\n ))}\n <Button\n type=\"button\"\n onClick={addColumn}\n variant=\"secondary\"\n aria-label={t('grafana-sql.components.select-row.title-add-column', 'Add column')}\n size=\"md\"\n icon=\"plus\"\n className={styles.addButton}\n />\n </Stack>\n );\n}\n\nconst getStyles = () => {\n return {\n addButton: css({ alignSelf: 'flex-start' }),\n label: css({\n padding: 0,\n margin: 0,\n width: 'unset',\n }),\n };\n};\n"],"names":["_a","_b"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"VisualEditor.mjs","sources":["../../../../src/components/visual-query-builder/VisualEditor.tsx"],"sourcesContent":["import { useAsync } from 'react-use';\n\nimport { t } from '@grafana/i18n';\nimport { EditorRows, EditorRow, EditorField } from '@grafana/plugin-ui';\n\nimport { DB, QueryEditorProps, QueryRowFilter } from '../../types';\nimport { QueryToolbox } from '../query-editor-raw/QueryToolbox';\n\nimport { Preview } from './Preview';\nimport { SQLGroupByRow } from './SQLGroupByRow';\nimport { SQLOrderByRow } from './SQLOrderByRow';\nimport { SQLWhereRow } from './SQLWhereRow';\nimport { SelectRow } from './SelectRow';\n\ninterface VisualEditorProps extends QueryEditorProps {\n db: DB;\n queryRowFilter: QueryRowFilter;\n onValidate: (isValid: boolean) => void;\n}\n\nexport const VisualEditor = ({ query, db, queryRowFilter, onChange, onValidate, range }: VisualEditorProps) => {\n const state = useAsync(async () => {\n const fields = await db.fields(query);\n return fields;\n }, [db, query.dataset, query.table]);\n\n return (\n <>\n <EditorRows>\n <EditorRow>\n <SelectRow columns={state.value || []} query={query} onQueryChange={onChange} db={db} />\n </EditorRow>\n {queryRowFilter.filter && (\n <EditorRow>\n <EditorField\n label={t('grafana-sql.components.visual-editor.label-filter-by-column-value', 'Filter by column value')}\n optional\n >\n <SQLWhereRow fields={state.value || []} query={query} onQueryChange={onChange} db={db} />\n </EditorField>\n </EditorRow>\n )}\n {queryRowFilter.group && (\n <EditorRow>\n <EditorField label={t('grafana-sql.components.visual-editor.label-group-by-column', 'Group by column')}>\n <SQLGroupByRow fields={state.value || []} query={query} onQueryChange={onChange} db={db} />\n </EditorField>\n </EditorRow>\n )}\n {queryRowFilter.order && (\n <EditorRow>\n <SQLOrderByRow fields={state.value || []} query={query} onQueryChange={onChange} db={db} />\n </EditorRow>\n )}\n {queryRowFilter.preview && query.rawSql && (\n <EditorRow>\n <Preview rawSql={query.rawSql} datasourceType={query.datasource?.type} />\n </EditorRow>\n )}\n </EditorRows>\n <QueryToolbox db={db} query={query} onValidate={onValidate} range={range} />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;AAoBO,MAAM,YAAA,GAAe,CAAC,EAAE,KAAA,EAAO,IAAI,cAAA,EAAgB,QAAA,EAAU,UAAA,EAAY,KAAA,EAAM,KAAyB;AApB/G,EAAA,IAAA,EAAA;AAqBE,EAAA,MAAM,KAAA,GAAQ,SAAS,YAAY;AACjC,IAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,MAAA,CAAO,KAAK,CAAA;AACpC,IAAA,OAAO,MAAA;AAAA,EACT,GAAG,CAAC,EAAA,EAAI,MAAM,OAAA,EAAS,KAAA,CAAM,KAAK,CAAC,CAAA;AAEnC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,UAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,SAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,OAAA,EAAS,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG,KAAA,EAAc,aAAA,EAAe,QAAA,EAAU,EAAA,EAAQ,CAAA,EACxF,CAAA;AAAA,MACC,cAAA,CAAe,MAAA,oBACd,GAAA,CAAC,SAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,CAAA,CAAE,mEAAA,EAAqE,wBAAwB,CAAA;AAAA,UACtG,QAAA,EAAQ,IAAA;AAAA,UAER,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG,KAAA,EAAc,aAAA,EAAe,QAAA,EAAU,EAAA,EAAQ;AAAA;AAAA,OACzF,EACF,CAAA;AAAA,MAED,cAAA,CAAe,yBACd,GAAA,CAAC,SAAA,EAAA,EACC,8BAAC,WAAA,EAAA,EAAY,KAAA,EAAO,CAAA,CAAE,4DAAA,EAA8D,iBAAiB,CAAA,EACnG,8BAAC,aAAA,EAAA,EAAc,MAAA,EAAQ,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG,OAAc,aAAA,EAAe,QAAA,EAAU,EAAA,EAAQ,CAAA,EAC3F,CAAA,EACF,CAAA;AAAA,MAED,cAAA,CAAe,KAAA,oBACd,GAAA,CAAC,SAAA,EAAA,EACC,8BAAC,aAAA,EAAA,EAAc,MAAA,EAAQ,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG,KAAA,EAAc,aAAA,EAAe,QAAA,EAAU,IAAQ,CAAA,EAC3F,CAAA;AAAA,MAED,eAAe,OAAA,IAAW,KAAA,CAAM,MAAA,oBAC/B,GAAA,CAAC,aACC,QAAA,kBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,KAAA,CAAM,QAAQ,cAAA,EAAA,CAAgB,EAAA,GAAA,KAAA,CAAM,UAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,MAAM,CAAA,EACzE;AAAA,KAAA,EAEJ,CAAA;AAAA,oBACA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAQ,KAAA,EAAc,YAAwB,KAAA,EAAc;AAAA,GAAA,EAC5E,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"VisualEditor.mjs","sources":["../../../../src/components/visual-query-builder/VisualEditor.tsx"],"sourcesContent":["import { useAsync } from 'react-use';\n\nimport { t } from '@grafana/i18n';\nimport { EditorRows, EditorRow, EditorField } from '@grafana/plugin-ui';\n\nimport { type DB, type QueryEditorProps, type QueryRowFilter } from '../../types';\nimport { QueryToolbox } from '../query-editor-raw/QueryToolbox';\n\nimport { Preview } from './Preview';\nimport { SQLGroupByRow } from './SQLGroupByRow';\nimport { SQLOrderByRow } from './SQLOrderByRow';\nimport { SQLWhereRow } from './SQLWhereRow';\nimport { SelectRow } from './SelectRow';\n\ninterface VisualEditorProps extends QueryEditorProps {\n db: DB;\n queryRowFilter: QueryRowFilter;\n onValidate: (isValid: boolean) => void;\n}\n\nexport const VisualEditor = ({ query, db, queryRowFilter, onChange, onValidate, range }: VisualEditorProps) => {\n const state = useAsync(async () => {\n const fields = await db.fields(query);\n return fields;\n }, [db, query.dataset, query.table]);\n\n return (\n <>\n <EditorRows>\n <EditorRow>\n <SelectRow columns={state.value || []} query={query} onQueryChange={onChange} db={db} />\n </EditorRow>\n {queryRowFilter.filter && (\n <EditorRow>\n <EditorField\n label={t('grafana-sql.components.visual-editor.label-filter-by-column-value', 'Filter by column value')}\n optional\n >\n <SQLWhereRow fields={state.value || []} query={query} onQueryChange={onChange} db={db} />\n </EditorField>\n </EditorRow>\n )}\n {queryRowFilter.group && (\n <EditorRow>\n <EditorField label={t('grafana-sql.components.visual-editor.label-group-by-column', 'Group by column')}>\n <SQLGroupByRow fields={state.value || []} query={query} onQueryChange={onChange} db={db} />\n </EditorField>\n </EditorRow>\n )}\n {queryRowFilter.order && (\n <EditorRow>\n <SQLOrderByRow fields={state.value || []} query={query} onQueryChange={onChange} db={db} />\n </EditorRow>\n )}\n {queryRowFilter.preview && query.rawSql && (\n <EditorRow>\n <Preview rawSql={query.rawSql} datasourceType={query.datasource?.type} />\n </EditorRow>\n )}\n </EditorRows>\n <QueryToolbox db={db} query={query} onValidate={onValidate} range={range} />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;AAoBO,MAAM,YAAA,GAAe,CAAC,EAAE,KAAA,EAAO,IAAI,cAAA,EAAgB,QAAA,EAAU,UAAA,EAAY,KAAA,EAAM,KAAyB;AApB/G,EAAA,IAAA,EAAA;AAqBE,EAAA,MAAM,KAAA,GAAQ,SAAS,YAAY;AACjC,IAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,MAAA,CAAO,KAAK,CAAA;AACpC,IAAA,OAAO,MAAA;AAAA,EACT,GAAG,CAAC,EAAA,EAAI,MAAM,OAAA,EAAS,KAAA,CAAM,KAAK,CAAC,CAAA;AAEnC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,UAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,SAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,OAAA,EAAS,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG,KAAA,EAAc,aAAA,EAAe,QAAA,EAAU,EAAA,EAAQ,CAAA,EACxF,CAAA;AAAA,MACC,cAAA,CAAe,MAAA,oBACd,GAAA,CAAC,SAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,CAAA,CAAE,mEAAA,EAAqE,wBAAwB,CAAA;AAAA,UACtG,QAAA,EAAQ,IAAA;AAAA,UAER,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG,KAAA,EAAc,aAAA,EAAe,QAAA,EAAU,EAAA,EAAQ;AAAA;AAAA,OACzF,EACF,CAAA;AAAA,MAED,cAAA,CAAe,yBACd,GAAA,CAAC,SAAA,EAAA,EACC,8BAAC,WAAA,EAAA,EAAY,KAAA,EAAO,CAAA,CAAE,4DAAA,EAA8D,iBAAiB,CAAA,EACnG,8BAAC,aAAA,EAAA,EAAc,MAAA,EAAQ,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG,OAAc,aAAA,EAAe,QAAA,EAAU,EAAA,EAAQ,CAAA,EAC3F,CAAA,EACF,CAAA;AAAA,MAED,cAAA,CAAe,KAAA,oBACd,GAAA,CAAC,SAAA,EAAA,EACC,8BAAC,aAAA,EAAA,EAAc,MAAA,EAAQ,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG,KAAA,EAAc,aAAA,EAAe,QAAA,EAAU,IAAQ,CAAA,EAC3F,CAAA;AAAA,MAED,eAAe,OAAA,IAAW,KAAA,CAAM,MAAA,oBAC/B,GAAA,CAAC,aACC,QAAA,kBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,KAAA,CAAM,QAAQ,cAAA,EAAA,CAAgB,EAAA,GAAA,KAAA,CAAM,UAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,MAAM,CAAA,EACzE;AAAA,KAAA,EAEJ,CAAA;AAAA,oBACA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAQ,KAAA,EAAc,YAAwB,KAAA,EAAc;AAAA,GAAA,EAC5E,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"WhereRow.mjs","sources":["../../../../src/components/visual-query-builder/WhereRow.tsx"],"sourcesContent":["import { injectGlobal } from '@emotion/css';\nimport { Builder, Config, ImmutableTree, Query, Utils } from '@react-awesome-query-builder/ui';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { SQLExpression } from '../../types';\n\nimport { emptyInitTree, raqbConfig } from './AwesomeQueryBuilder';\n\ninterface SQLBuilderWhereRowProps {\n sql: SQLExpression;\n onSqlChange: (sql: SQLExpression) => void;\n config?: Partial<Config>;\n}\n\nexport function WhereRow({ sql, config, onSqlChange }: SQLBuilderWhereRowProps) {\n const [tree, setTree] = useState<ImmutableTree>();\n const configWithDefaults = useMemo(() => ({ ...raqbConfig, ...config }), [config]);\n\n useEffect(() => {\n // Set the initial tree\n if (!tree) {\n const initTree = Utils.checkTree(Utils.loadTree(sql.whereJsonTree ?? emptyInitTree), configWithDefaults);\n setTree(initTree);\n }\n }, [configWithDefaults, sql.whereJsonTree, tree]);\n\n useEffect(() => {\n if (!sql.whereJsonTree) {\n setTree(Utils.checkTree(Utils.loadTree(emptyInitTree), configWithDefaults));\n }\n }, [configWithDefaults, sql.whereJsonTree]);\n\n const onTreeChange = useCallback(\n (changedTree: ImmutableTree, config: Config) => {\n setTree(changedTree);\n const newSql = {\n ...sql,\n whereJsonTree: Utils.getTree(changedTree),\n whereString: Utils.sqlFormat(changedTree, config),\n };\n\n onSqlChange(newSql);\n },\n [onSqlChange, sql]\n );\n\n if (!tree) {\n return null;\n }\n\n return (\n <Query\n {...configWithDefaults}\n value={tree}\n onChange={onTreeChange}\n renderBuilder={(props) => <Builder {...props} />}\n />\n );\n}\n\nfunction flex(direction: string) {\n return `\n display: flex;\n gap: 8px;\n flex-direction: ${direction};`;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-expressions\ninjectGlobal`\n .group--header {\n ${flex('row')}\n }\n\n .group-or-rule {\n ${flex('column')}\n .rule {\n flex-direction: row;\n }\n }\n\n .rule--body {\n ${flex('row')}\n }\n\n .group--children {\n ${flex('column')}\n }\n\n .group--conjunctions:empty {\n display: none;\n }\n`;\n"],"names":["config"],"mappings":";;;;;;;AAcO,SAAS,QAAA,CAAS,EAAE,GAAA,EAAK,MAAA,EAAQ,aAAY,EAA4B;AAC9E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA,EAAwB;AAChD,EAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,OAAO,EAAE,GAAG,UAAA,EAAY,GAAG,MAAA,EAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AAEjF,EAAA,SAAA,CAAU,MAAM;AAlBlB,IAAA,IAAA,EAAA;AAoBI,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,QAAA,CAAA,CAAS,SAAI,aAAA,KAAJ,IAAA,GAAA,EAAA,GAAqB,aAAa,CAAA,EAAG,kBAAkB,CAAA;AACvG,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,kBAAA,EAAoB,GAAA,CAAI,aAAA,EAAe,IAAI,CAAC,CAAA;AAEhD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAI,aAAA,EAAe;AACtB,MAAA,OAAA,CAAQ,MAAM,SAAA,CAAU,KAAA,CAAM,SAAS,aAAa,CAAA,EAAG,kBAAkB,CAAC,CAAA;AAAA,IAC5E;AAAA,EACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,GAAA,CAAI,aAAa,CAAC,CAAA;AAE1C,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,aAA4BA,OAAAA,KAAmB;AAC9C,MAAA,OAAA,CAAQ,WAAW,CAAA;AACnB,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,GAAG,GAAA;AAAA,QACH,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAAA,QACxC,WAAA,EAAa,KAAA,CAAM,SAAA,CAAU,WAAA,EAAaA,OAAM;AAAA,OAClD;AAEA,MAAA,WAAA,CAAY,MAAM,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,aAAa,GAAG;AAAA,GACnB;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,kBAAA;AAAA,MACJ,KAAA,EAAO,IAAA;AAAA,MACP,QAAA,EAAU,YAAA;AAAA,MACV,eAAe,CAAC,KAAA,qBAAU,GAAA,CAAC,OAAA,EAAA,EAAS,GAAG,KAAA,EAAO;AAAA;AAAA,GAChD;AAEJ;AAEA,SAAS,KAAK,SAAA,EAAmB;AAC/B,EAAA,OAAO;AAAA;AAAA;AAAA,oBAAA,EAGa,SAAS,CAAA,CAAA,CAAA;AAC/B;AAGA,YAAA;AAAA;AAAA,IAAA,EAEM,IAAA,CAAK,KAAK,CAAC;AAAA;;AAAA;AAAA,IAAA,EAIX,IAAA,CAAK,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,IAAA,EAOd,IAAA,CAAK,KAAK,CAAC;AAAA;;AAAA;AAAA,IAAA,EAIX,IAAA,CAAK,QAAQ,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;;;;"}
1
+ {"version":3,"file":"WhereRow.mjs","sources":["../../../../src/components/visual-query-builder/WhereRow.tsx"],"sourcesContent":["import { injectGlobal } from '@emotion/css';\nimport { Builder, type Config, type ImmutableTree, Query, Utils } from '@react-awesome-query-builder/ui';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { type SQLExpression } from '../../types';\n\nimport { emptyInitTree, raqbConfig } from './AwesomeQueryBuilder';\n\ninterface SQLBuilderWhereRowProps {\n sql: SQLExpression;\n onSqlChange: (sql: SQLExpression) => void;\n config?: Partial<Config>;\n}\n\nexport function WhereRow({ sql, config, onSqlChange }: SQLBuilderWhereRowProps) {\n const [tree, setTree] = useState<ImmutableTree>();\n const configWithDefaults = useMemo(() => ({ ...raqbConfig, ...config }), [config]);\n\n useEffect(() => {\n // Set the initial tree\n if (!tree) {\n const initTree = Utils.checkTree(Utils.loadTree(sql.whereJsonTree ?? emptyInitTree), configWithDefaults);\n setTree(initTree);\n }\n }, [configWithDefaults, sql.whereJsonTree, tree]);\n\n useEffect(() => {\n if (!sql.whereJsonTree) {\n setTree(Utils.checkTree(Utils.loadTree(emptyInitTree), configWithDefaults));\n }\n }, [configWithDefaults, sql.whereJsonTree]);\n\n const onTreeChange = useCallback(\n (changedTree: ImmutableTree, config: Config) => {\n setTree(changedTree);\n const newSql = {\n ...sql,\n whereJsonTree: Utils.getTree(changedTree),\n whereString: Utils.sqlFormat(changedTree, config),\n };\n\n onSqlChange(newSql);\n },\n [onSqlChange, sql]\n );\n\n if (!tree) {\n return null;\n }\n\n return (\n <Query\n {...configWithDefaults}\n value={tree}\n onChange={onTreeChange}\n renderBuilder={(props) => <Builder {...props} />}\n />\n );\n}\n\nfunction flex(direction: string) {\n return `\n display: flex;\n gap: 8px;\n flex-direction: ${direction};`;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-expressions\ninjectGlobal`\n .group--header {\n ${flex('row')}\n }\n\n .group-or-rule {\n ${flex('column')}\n .rule {\n flex-direction: row;\n }\n }\n\n .rule--body {\n ${flex('row')}\n }\n\n .group--children {\n ${flex('column')}\n }\n\n .group--conjunctions:empty {\n display: none;\n }\n`;\n"],"names":["config"],"mappings":";;;;;;;AAcO,SAAS,QAAA,CAAS,EAAE,GAAA,EAAK,MAAA,EAAQ,aAAY,EAA4B;AAC9E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA,EAAwB;AAChD,EAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,OAAO,EAAE,GAAG,UAAA,EAAY,GAAG,MAAA,EAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AAEjF,EAAA,SAAA,CAAU,MAAM;AAlBlB,IAAA,IAAA,EAAA;AAoBI,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,QAAA,CAAA,CAAS,SAAI,aAAA,KAAJ,IAAA,GAAA,EAAA,GAAqB,aAAa,CAAA,EAAG,kBAAkB,CAAA;AACvG,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,kBAAA,EAAoB,GAAA,CAAI,aAAA,EAAe,IAAI,CAAC,CAAA;AAEhD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAI,aAAA,EAAe;AACtB,MAAA,OAAA,CAAQ,MAAM,SAAA,CAAU,KAAA,CAAM,SAAS,aAAa,CAAA,EAAG,kBAAkB,CAAC,CAAA;AAAA,IAC5E;AAAA,EACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,GAAA,CAAI,aAAa,CAAC,CAAA;AAE1C,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,aAA4BA,OAAAA,KAAmB;AAC9C,MAAA,OAAA,CAAQ,WAAW,CAAA;AACnB,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,GAAG,GAAA;AAAA,QACH,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAAA,QACxC,WAAA,EAAa,KAAA,CAAM,SAAA,CAAU,WAAA,EAAaA,OAAM;AAAA,OAClD;AAEA,MAAA,WAAA,CAAY,MAAM,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,aAAa,GAAG;AAAA,GACnB;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,kBAAA;AAAA,MACJ,KAAA,EAAO,IAAA;AAAA,MACP,QAAA,EAAU,YAAA;AAAA,MACV,eAAe,CAAC,KAAA,qBAAU,GAAA,CAAC,OAAA,EAAA,EAAS,GAAG,KAAA,EAAO;AAAA;AAAA,GAChD;AAEJ;AAEA,SAAS,KAAK,SAAA,EAAmB;AAC/B,EAAA,OAAO;AAAA;AAAA;AAAA,oBAAA,EAGa,SAAS,CAAA,CAAA,CAAA;AAC/B;AAGA,YAAA;AAAA;AAAA,IAAA,EAEM,IAAA,CAAK,KAAK,CAAC;AAAA;;AAAA;AAAA,IAAA,EAIX,IAAA,CAAK,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,IAAA,EAOd,IAAA,CAAK,KAAK,CAAC;AAAA;;AAAA;AAAA,IAAA,EAIX,IAAA,CAAK,QAAQ,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"constants.mjs","sources":["../../src/constants.ts"],"sourcesContent":["import { Func, FuncParameter } from './types';\n\nexport const COMMON_FNS: Func[] = [\n { name: 'AVG' },\n { name: 'COUNT' },\n { name: 'MAX' },\n { name: 'MIN' },\n { name: 'SUM' },\n];\n\nconst intervalParam: FuncParameter = {\n name: 'Interval',\n required: true,\n options: () => {\n return Promise.resolve([{ label: '$__interval', value: '$__interval' }]);\n },\n};\nconst fillParam: FuncParameter = {\n name: 'Fill',\n required: false,\n options: () =>\n Promise.resolve([\n { label: '0', value: '0' },\n { label: 'NULL', value: 'NULL' },\n { label: 'previous', value: 'previous' },\n ]),\n};\n\nexport const MACRO_FUNCTIONS = (columnParam: FuncParameter) => [\n {\n name: '$__timeGroup',\n description: 'Time grouping function',\n parameters: [columnParam, intervalParam, fillParam],\n },\n {\n name: '$__timeGroupAlias',\n description: 'Time grouping function with time as alias',\n parameters: [columnParam, intervalParam, fillParam],\n },\n {\n name: '$__time',\n description: 'An expression to rename the column to time',\n parameters: [columnParam],\n },\n {\n name: '$__timeEpoch',\n parameters: [columnParam],\n },\n {\n name: '$__unixEpochGroup',\n parameters: [columnParam, intervalParam, fillParam],\n },\n {\n name: '$__unixEpochGroupAlias',\n parameters: [columnParam, intervalParam, fillParam],\n },\n];\n\nexport const MACRO_NAMES = [\n '$__time',\n '$__timeEpoch',\n '$__timeFilter',\n '$__timeFrom',\n '$__timeTo',\n '$__timeGroup',\n '$__timeGroupAlias',\n '$__unixEpochFilter',\n '$__unixEpochNanoFilter',\n '$__unixEpochNanoFrom',\n '$__unixEpochNanoTo',\n '$__unixEpochGroup',\n '$__unixEpochGroupAlias',\n];\n"],"names":[],"mappings":";AAEO,MAAM,UAAA,GAAqB;AAAA,EAChC,EAAE,MAAM,KAAA,EAAM;AAAA,EACd,EAAE,MAAM,OAAA,EAAQ;AAAA,EAChB,EAAE,MAAM,KAAA,EAAM;AAAA,EACd,EAAE,MAAM,KAAA,EAAM;AAAA,EACd,EAAE,MAAM,KAAA;AACV;AAEA,MAAM,aAAA,GAA+B;AAAA,EACnC,IAAA,EAAM,UAAA;AAAA,EACN,QAAA,EAAU,IAAA;AAAA,EACV,SAAS,MAAM;AACb,IAAA,OAAO,OAAA,CAAQ,QAAQ,CAAC,EAAE,OAAO,aAAA,EAAe,KAAA,EAAO,aAAA,EAAe,CAAC,CAAA;AAAA,EACzE;AACF,CAAA;AACA,MAAM,SAAA,GAA2B;AAAA,EAC/B,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,KAAA;AAAA,EACV,OAAA,EAAS,MACP,OAAA,CAAQ,OAAA,CAAQ;AAAA,IACd,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI;AAAA,IACzB,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,IAC/B,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA;AAAW,GACxC;AACL,CAAA;AAEO,MAAM,eAAA,GAAkB,CAAC,WAAA,KAA+B;AAAA,EAC7D;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,wBAAA;AAAA,IACb,UAAA,EAAY,CAAC,WAAA,EAAa,aAAA,EAAe,SAAS;AAAA,GACpD;AAAA,EACA;AAAA,IACE,IAAA,EAAM,mBAAA;AAAA,IACN,WAAA,EAAa,2CAAA;AAAA,IACb,UAAA,EAAY,CAAC,WAAA,EAAa,aAAA,EAAe,SAAS;AAAA,GACpD;AAAA,EACA;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,4CAAA;AAAA,IACb,UAAA,EAAY,CAAC,WAAW;AAAA,GAC1B;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,UAAA,EAAY,CAAC,WAAW;AAAA,GAC1B;AAAA,EACA;AAAA,IACE,IAAA,EAAM,mBAAA;AAAA,IACN,UAAA,EAAY,CAAC,WAAA,EAAa,aAAA,EAAe,SAAS;AAAA,GACpD;AAAA,EACA;AAAA,IACE,IAAA,EAAM,wBAAA;AAAA,IACN,UAAA,EAAY,CAAC,WAAA,EAAa,aAAA,EAAe,SAAS;AAAA;AAEtD;AAEO,MAAM,WAAA,GAAc;AAAA,EACzB,SAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,wBAAA;AAAA,EACA,sBAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF;;;;"}
1
+ {"version":3,"file":"constants.mjs","sources":["../../src/constants.ts"],"sourcesContent":["import { type Func, type FuncParameter } from './types';\n\nexport const COMMON_FNS: Func[] = [\n { name: 'AVG' },\n { name: 'COUNT' },\n { name: 'MAX' },\n { name: 'MIN' },\n { name: 'SUM' },\n];\n\nconst intervalParam: FuncParameter = {\n name: 'Interval',\n required: true,\n options: () => {\n return Promise.resolve([{ label: '$__interval', value: '$__interval' }]);\n },\n};\nconst fillParam: FuncParameter = {\n name: 'Fill',\n required: false,\n options: () =>\n Promise.resolve([\n { label: '0', value: '0' },\n { label: 'NULL', value: 'NULL' },\n { label: 'previous', value: 'previous' },\n ]),\n};\n\nexport const MACRO_FUNCTIONS = (columnParam: FuncParameter) => [\n {\n name: '$__timeGroup',\n description: 'Time grouping function',\n parameters: [columnParam, intervalParam, fillParam],\n },\n {\n name: '$__timeGroupAlias',\n description: 'Time grouping function with time as alias',\n parameters: [columnParam, intervalParam, fillParam],\n },\n {\n name: '$__time',\n description: 'An expression to rename the column to time',\n parameters: [columnParam],\n },\n {\n name: '$__timeEpoch',\n parameters: [columnParam],\n },\n {\n name: '$__unixEpochGroup',\n parameters: [columnParam, intervalParam, fillParam],\n },\n {\n name: '$__unixEpochGroupAlias',\n parameters: [columnParam, intervalParam, fillParam],\n },\n];\n\nexport const MACRO_NAMES = [\n '$__time',\n '$__timeEpoch',\n '$__timeFilter',\n '$__timeFrom',\n '$__timeTo',\n '$__timeGroup',\n '$__timeGroupAlias',\n '$__unixEpochFilter',\n '$__unixEpochNanoFilter',\n '$__unixEpochNanoFrom',\n '$__unixEpochNanoTo',\n '$__unixEpochGroup',\n '$__unixEpochGroupAlias',\n];\n"],"names":[],"mappings":";AAEO,MAAM,UAAA,GAAqB;AAAA,EAChC,EAAE,MAAM,KAAA,EAAM;AAAA,EACd,EAAE,MAAM,OAAA,EAAQ;AAAA,EAChB,EAAE,MAAM,KAAA,EAAM;AAAA,EACd,EAAE,MAAM,KAAA,EAAM;AAAA,EACd,EAAE,MAAM,KAAA;AACV;AAEA,MAAM,aAAA,GAA+B;AAAA,EACnC,IAAA,EAAM,UAAA;AAAA,EACN,QAAA,EAAU,IAAA;AAAA,EACV,SAAS,MAAM;AACb,IAAA,OAAO,OAAA,CAAQ,QAAQ,CAAC,EAAE,OAAO,aAAA,EAAe,KAAA,EAAO,aAAA,EAAe,CAAC,CAAA;AAAA,EACzE;AACF,CAAA;AACA,MAAM,SAAA,GAA2B;AAAA,EAC/B,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,KAAA;AAAA,EACV,OAAA,EAAS,MACP,OAAA,CAAQ,OAAA,CAAQ;AAAA,IACd,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI;AAAA,IACzB,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,IAC/B,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA;AAAW,GACxC;AACL,CAAA;AAEO,MAAM,eAAA,GAAkB,CAAC,WAAA,KAA+B;AAAA,EAC7D;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,wBAAA;AAAA,IACb,UAAA,EAAY,CAAC,WAAA,EAAa,aAAA,EAAe,SAAS;AAAA,GACpD;AAAA,EACA;AAAA,IACE,IAAA,EAAM,mBAAA;AAAA,IACN,WAAA,EAAa,2CAAA;AAAA,IACb,UAAA,EAAY,CAAC,WAAA,EAAa,aAAA,EAAe,SAAS;AAAA,GACpD;AAAA,EACA;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,4CAAA;AAAA,IACb,UAAA,EAAY,CAAC,WAAW;AAAA,GAC1B;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,UAAA,EAAY,CAAC,WAAW;AAAA,GAC1B;AAAA,EACA;AAAA,IACE,IAAA,EAAM,mBAAA;AAAA,IACN,UAAA,EAAY,CAAC,WAAA,EAAa,aAAA,EAAe,SAAS;AAAA,GACpD;AAAA,EACA;AAAA,IACE,IAAA,EAAM,wBAAA;AAAA,IACN,UAAA,EAAY,CAAC,WAAA,EAAa,aAAA,EAAe,SAAS;AAAA;AAEtD;AAEO,MAAM,WAAA,GAAc;AAAA,EACzB,SAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,wBAAA;AAAA,EACA,sBAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"SqlDatasource.mjs","sources":["../../../src/datasource/SqlDatasource.ts"],"sourcesContent":["import { lastValueFrom, Observable, throwError } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport {\n getDefaultTimeRange,\n DataFrame,\n DataFrameView,\n DataQuery,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n MetricFindValue,\n ScopedVars,\n CoreApp,\n getSearchFilterScopedVar,\n LegacyMetricFindQueryOptions,\n VariableWithMultiSupport,\n TimeRange,\n} from '@grafana/data';\nimport { EditorMode } from '@grafana/plugin-ui';\nimport {\n BackendDataSourceResponse,\n DataSourceWithBackend,\n FetchResponse,\n getBackendSrv,\n getTemplateSrv,\n toDataQueryResponse,\n TemplateSrv,\n reportInteraction,\n} from '@grafana/runtime';\n\nimport { ResponseParser } from '../ResponseParser';\nimport { SqlQueryEditorLazy } from '../components/QueryEditorLazy';\nimport { MACRO_NAMES } from '../constants';\nimport { DB, SQLQuery, SQLOptions, SqlQueryModel, QueryFormat, SQLDialect } from '../types';\nimport migrateAnnotation from '../utils/migration';\n\nexport abstract class SqlDatasource extends DataSourceWithBackend<SQLQuery, SQLOptions> {\n uid: string;\n responseParser: ResponseParser;\n name: string;\n interval: string;\n db: DB;\n preconfiguredDatabase: string;\n dialect: SQLDialect = 'other';\n\n constructor(\n instanceSettings: DataSourceInstanceSettings<SQLOptions>,\n protected readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n this.name = instanceSettings.name;\n this.responseParser = new ResponseParser();\n this.uid = instanceSettings.uid;\n const settingsData = instanceSettings.jsonData || {};\n this.interval = settingsData.timeInterval || '1m';\n this.db = this.getDB();\n /*\n The `settingsData.database` will be defined if a default database has been defined in either\n 1) the ConfigurationEditor.tsx, OR 2) the provisioning config file, either under `jsondata.database`, or simply `database`.\n */\n this.preconfiguredDatabase = settingsData.database ?? '';\n this.annotations = {\n prepareAnnotation: migrateAnnotation,\n QueryEditor: SqlQueryEditorLazy,\n };\n }\n\n abstract getDB(): DB;\n\n abstract getQueryModel(target?: SQLQuery, templateSrv?: TemplateSrv, scopedVars?: ScopedVars): SqlQueryModel;\n\n getResponseParser() {\n return this.responseParser;\n }\n\n interpolateVariable = (value: string | string[] | number, variable: VariableWithMultiSupport) => {\n if (typeof value === 'string') {\n if (variable.multi || variable.includeAll) {\n return this.getQueryModel().quoteLiteral(value);\n } else {\n return String(value).replace(/'/g, \"''\");\n }\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (Array.isArray(value)) {\n const quotedValues = value.map((v) => this.getQueryModel().quoteLiteral(v));\n return quotedValues.join(',');\n }\n\n return value;\n };\n\n interpolateVariablesInQueries(queries: SQLQuery[], scopedVars: ScopedVars): SQLQuery[] {\n let expandedQueries = queries;\n if (queries && queries.length > 0) {\n expandedQueries = queries.map((query) => {\n const expandedQuery = {\n ...query,\n datasource: this.getRef(),\n rawSql: this.templateSrv.replace(query.rawSql, scopedVars, this.interpolateVariable),\n rawQuery: true,\n };\n return expandedQuery;\n });\n }\n return expandedQueries;\n }\n\n filterQuery(query: SQLQuery): boolean {\n return !query.hide;\n }\n\n applyTemplateVariables(target: SQLQuery, scopedVars: ScopedVars) {\n return {\n refId: target.refId,\n datasource: this.getRef(),\n rawSql: this.templateSrv.replace(target.rawSql, scopedVars, this.interpolateVariable),\n format: target.format,\n };\n }\n\n query(request: DataQueryRequest<SQLQuery>): Observable<DataQueryResponse> {\n // This logic reenables the previous SQL behavior regarding what databases are available for the user to query.\n const databaseIssue = this.checkForDatabaseIssue(request);\n\n if (!!databaseIssue) {\n const error = new Error(databaseIssue);\n return throwError(() => error);\n }\n\n request.targets.forEach((target) => {\n if (request.app === CoreApp.Dashboard || request.app === CoreApp.PanelViewer) {\n return;\n }\n\n reportInteraction('grafana_sql_query_executed', {\n datasource: target.datasource?.type,\n editorMode: target.editorMode,\n format: target.format,\n app: request.app,\n });\n });\n\n return super.query(request);\n }\n\n private checkForDatabaseIssue(request: DataQueryRequest<SQLQuery>) {\n // If the datasource is Postgres and there is no default database configured - either never configured or removed - return a database issue.\n if (this.type === 'grafana-postgresql-datasource' && !this.preconfiguredDatabase) {\n return `You do not currently have a default database configured for this data source. Postgres requires a default\n database with which to connect. Please configure one through the Data Sources Configuration page, or if you\n are using a provisioning file, update that configuration file with a default database.`;\n }\n\n // No need to check for database change/update issues if the datasource is being used in Explore.\n if (request.app !== CoreApp.Explore) {\n /*\n If a preconfigured datasource database has been added/updated - and the user has built ANY number of queries using a\n database OTHER than the preconfigured one, return a database issue - since those databases are no longer available.\n The user will need to update their queries to use the preconfigured database.\n */\n if (!!this.preconfiguredDatabase) {\n for (const target of request.targets) {\n // Test for database configuration change only if query was made in `builder` mode.\n if (\n target.editorMode === EditorMode.Builder &&\n target.dataset &&\n target.dataset !== this.preconfiguredDatabase\n ) {\n return `The configuration for this panel's data source has been modified. The previous database used in this panel's\n saved query is no longer available. Please update the query to use the new database option.\n Previous query parameters will be preserved until the query is updated.`;\n }\n }\n }\n }\n\n return;\n }\n\n async metricFindQuery(query: string, options?: LegacyMetricFindQueryOptions): Promise<MetricFindValue[]> {\n const range = options?.range;\n if (range == null) {\n // i cannot create a scenario where this happens, we handle it just to be sure.\n return [];\n }\n\n let refId = 'tempvar';\n if (options && options.variable && options.variable.name) {\n refId = options.variable.name;\n }\n\n const scopedVars = {\n ...options?.scopedVars,\n ...getSearchFilterScopedVar({ query, wildcardChar: '%', options }),\n };\n\n const rawSql = this.templateSrv.replace(query, scopedVars, this.interpolateVariable);\n\n const interpolatedQuery: SQLQuery = {\n refId: refId,\n datasource: this.getRef(),\n rawSql,\n format: QueryFormat.Table,\n };\n\n // NOTE: we can remove this try-catch when https://github.com/grafana/grafana/issues/82250\n // is fixed.\n let response;\n try {\n response = await this.runMetaQuery(interpolatedQuery, range);\n } catch (error) {\n console.error(error);\n throw new Error('error when executing the sql query');\n }\n return this.getResponseParser().transformMetricFindResponse(response);\n }\n\n // NOTE: this always runs with the `@grafana/data/getDefaultTimeRange` time range\n async runSql<T extends object>(query: string, options?: RunSQLOptions) {\n const range = getDefaultTimeRange();\n const frame = await this.runMetaQuery({ rawSql: query, format: QueryFormat.Table, refId: options?.refId }, range);\n return new DataFrameView<T>(frame);\n }\n\n private runMetaQuery(request: Partial<SQLQuery>, range: TimeRange): Promise<DataFrame> {\n const refId = request.refId || 'meta';\n const queries: DataQuery[] = [{ ...request, datasource: request.datasource || this.getRef(), refId }];\n\n return lastValueFrom(\n getBackendSrv()\n .fetch<BackendDataSourceResponse>({\n url: '/api/ds/query',\n method: 'POST',\n headers: this.getRequestHeaders(),\n data: {\n from: range.from.valueOf().toString(),\n to: range.to.valueOf().toString(),\n queries,\n },\n requestId: refId,\n })\n .pipe(\n map((res: FetchResponse<BackendDataSourceResponse>) => {\n const rsp = toDataQueryResponse(res, queries);\n return rsp.data[0] ?? { fields: [] };\n })\n )\n );\n }\n\n targetContainsTemplate(target: SQLQuery) {\n let queryWithoutMacros = target.rawSql;\n MACRO_NAMES.forEach((value) => {\n queryWithoutMacros = queryWithoutMacros?.replace(value, '') || '';\n });\n return this.templateSrv.containsTemplate(queryWithoutMacros);\n }\n}\n\ninterface RunSQLOptions extends LegacyMetricFindQueryOptions {\n refId?: string;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SqlDatasource.mjs","sources":["../../../src/datasource/SqlDatasource.ts"],"sourcesContent":["import { lastValueFrom, type Observable, throwError } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport {\n getDefaultTimeRange,\n type DataFrame,\n DataFrameView,\n type DataQuery,\n type DataQueryRequest,\n type DataQueryResponse,\n type DataSourceInstanceSettings,\n type MetricFindValue,\n type ScopedVars,\n CoreApp,\n getSearchFilterScopedVar,\n type LegacyMetricFindQueryOptions,\n type VariableWithMultiSupport,\n type TimeRange,\n} from '@grafana/data';\nimport { EditorMode } from '@grafana/plugin-ui';\nimport {\n type BackendDataSourceResponse,\n DataSourceWithBackend,\n type FetchResponse,\n getBackendSrv,\n getTemplateSrv,\n toDataQueryResponse,\n type TemplateSrv,\n reportInteraction,\n} from '@grafana/runtime';\n\nimport { ResponseParser } from '../ResponseParser';\nimport { SqlQueryEditorLazy } from '../components/QueryEditorLazy';\nimport { MACRO_NAMES } from '../constants';\nimport { type DB, type SQLQuery, type SQLOptions, type SqlQueryModel, QueryFormat, type SQLDialect } from '../types';\nimport migrateAnnotation from '../utils/migration';\n\nexport abstract class SqlDatasource extends DataSourceWithBackend<SQLQuery, SQLOptions> {\n uid: string;\n responseParser: ResponseParser;\n name: string;\n interval: string;\n db: DB;\n preconfiguredDatabase: string;\n dialect: SQLDialect = 'other';\n\n constructor(\n instanceSettings: DataSourceInstanceSettings<SQLOptions>,\n protected readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n this.name = instanceSettings.name;\n this.responseParser = new ResponseParser();\n this.uid = instanceSettings.uid;\n const settingsData = instanceSettings.jsonData || {};\n this.interval = settingsData.timeInterval || '1m';\n this.db = this.getDB();\n /*\n The `settingsData.database` will be defined if a default database has been defined in either\n 1) the ConfigurationEditor.tsx, OR 2) the provisioning config file, either under `jsondata.database`, or simply `database`.\n */\n this.preconfiguredDatabase = settingsData.database ?? '';\n this.annotations = {\n prepareAnnotation: migrateAnnotation,\n QueryEditor: SqlQueryEditorLazy,\n };\n }\n\n abstract getDB(): DB;\n\n abstract getQueryModel(target?: SQLQuery, templateSrv?: TemplateSrv, scopedVars?: ScopedVars): SqlQueryModel;\n\n getResponseParser() {\n return this.responseParser;\n }\n\n interpolateVariable = (value: string | string[] | number, variable: VariableWithMultiSupport) => {\n if (typeof value === 'string') {\n if (variable.multi || variable.includeAll) {\n return this.getQueryModel().quoteLiteral(value);\n } else {\n return String(value).replace(/'/g, \"''\");\n }\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (Array.isArray(value)) {\n const quotedValues = value.map((v) => this.getQueryModel().quoteLiteral(v));\n return quotedValues.join(',');\n }\n\n return value;\n };\n\n interpolateVariablesInQueries(queries: SQLQuery[], scopedVars: ScopedVars): SQLQuery[] {\n let expandedQueries = queries;\n if (queries && queries.length > 0) {\n expandedQueries = queries.map((query) => {\n const expandedQuery = {\n ...query,\n datasource: this.getRef(),\n rawSql: this.templateSrv.replace(query.rawSql, scopedVars, this.interpolateVariable),\n rawQuery: true,\n };\n return expandedQuery;\n });\n }\n return expandedQueries;\n }\n\n filterQuery(query: SQLQuery): boolean {\n return !query.hide;\n }\n\n applyTemplateVariables(target: SQLQuery, scopedVars: ScopedVars) {\n return {\n refId: target.refId,\n datasource: this.getRef(),\n rawSql: this.templateSrv.replace(target.rawSql, scopedVars, this.interpolateVariable),\n format: target.format,\n };\n }\n\n query(request: DataQueryRequest<SQLQuery>): Observable<DataQueryResponse> {\n // This logic reenables the previous SQL behavior regarding what databases are available for the user to query.\n const databaseIssue = this.checkForDatabaseIssue(request);\n\n if (!!databaseIssue) {\n const error = new Error(databaseIssue);\n return throwError(() => error);\n }\n\n request.targets.forEach((target) => {\n if (request.app === CoreApp.Dashboard || request.app === CoreApp.PanelViewer) {\n return;\n }\n\n reportInteraction('grafana_sql_query_executed', {\n datasource: target.datasource?.type,\n editorMode: target.editorMode,\n format: target.format,\n app: request.app,\n });\n });\n\n return super.query(request);\n }\n\n private checkForDatabaseIssue(request: DataQueryRequest<SQLQuery>) {\n // If the datasource is Postgres and there is no default database configured - either never configured or removed - return a database issue.\n if (this.type === 'grafana-postgresql-datasource' && !this.preconfiguredDatabase) {\n return `You do not currently have a default database configured for this data source. Postgres requires a default\n database with which to connect. Please configure one through the Data Sources Configuration page, or if you\n are using a provisioning file, update that configuration file with a default database.`;\n }\n\n // No need to check for database change/update issues if the datasource is being used in Explore.\n if (request.app !== CoreApp.Explore) {\n /*\n If a preconfigured datasource database has been added/updated - and the user has built ANY number of queries using a\n database OTHER than the preconfigured one, return a database issue - since those databases are no longer available.\n The user will need to update their queries to use the preconfigured database.\n */\n if (!!this.preconfiguredDatabase) {\n for (const target of request.targets) {\n // Test for database configuration change only if query was made in `builder` mode.\n if (\n target.editorMode === EditorMode.Builder &&\n target.dataset &&\n target.dataset !== this.preconfiguredDatabase\n ) {\n return `The configuration for this panel's data source has been modified. The previous database used in this panel's\n saved query is no longer available. Please update the query to use the new database option.\n Previous query parameters will be preserved until the query is updated.`;\n }\n }\n }\n }\n\n return;\n }\n\n async metricFindQuery(query: string, options?: LegacyMetricFindQueryOptions): Promise<MetricFindValue[]> {\n const range = options?.range;\n if (range == null) {\n // i cannot create a scenario where this happens, we handle it just to be sure.\n return [];\n }\n\n let refId = 'tempvar';\n if (options && options.variable && options.variable.name) {\n refId = options.variable.name;\n }\n\n const scopedVars = {\n ...options?.scopedVars,\n ...getSearchFilterScopedVar({ query, wildcardChar: '%', options }),\n };\n\n const rawSql = this.templateSrv.replace(query, scopedVars, this.interpolateVariable);\n\n const interpolatedQuery: SQLQuery = {\n refId: refId,\n datasource: this.getRef(),\n rawSql,\n format: QueryFormat.Table,\n };\n\n // NOTE: we can remove this try-catch when https://github.com/grafana/grafana/issues/82250\n // is fixed.\n let response;\n try {\n response = await this.runMetaQuery(interpolatedQuery, range);\n } catch (error) {\n console.error(error);\n throw new Error('error when executing the sql query');\n }\n return this.getResponseParser().transformMetricFindResponse(response);\n }\n\n // NOTE: this always runs with the `@grafana/data/getDefaultTimeRange` time range\n async runSql<T extends object>(query: string, options?: RunSQLOptions) {\n const range = getDefaultTimeRange();\n const frame = await this.runMetaQuery({ rawSql: query, format: QueryFormat.Table, refId: options?.refId }, range);\n return new DataFrameView<T>(frame);\n }\n\n private runMetaQuery(request: Partial<SQLQuery>, range: TimeRange): Promise<DataFrame> {\n const refId = request.refId || 'meta';\n const queries: DataQuery[] = [{ ...request, datasource: request.datasource || this.getRef(), refId }];\n\n return lastValueFrom(\n getBackendSrv()\n .fetch<BackendDataSourceResponse>({\n url: '/api/ds/query',\n method: 'POST',\n headers: this.getRequestHeaders(),\n data: {\n from: range.from.valueOf().toString(),\n to: range.to.valueOf().toString(),\n queries,\n },\n requestId: refId,\n })\n .pipe(\n map((res: FetchResponse<BackendDataSourceResponse>) => {\n const rsp = toDataQueryResponse(res, queries);\n return rsp.data[0] ?? { fields: [] };\n })\n )\n );\n }\n\n targetContainsTemplate(target: SQLQuery) {\n let queryWithoutMacros = target.rawSql;\n MACRO_NAMES.forEach((value) => {\n queryWithoutMacros = queryWithoutMacros?.replace(value, '') || '';\n });\n return this.templateSrv.containsTemplate(queryWithoutMacros);\n }\n}\n\ninterface RunSQLOptions extends LegacyMetricFindQueryOptions {\n refId?: string;\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.mjs","sources":["../../src/defaults.ts"],"sourcesContent":["import { EditorMode } from '@grafana/plugin-ui';\n\nimport { QueryFormat, SQLQuery } from './types';\nimport { createFunctionField, setGroupByField } from './utils/sql.utils';\n\nexport function applyQueryDefaults(q?: SQLQuery): SQLQuery {\n let editorMode = q?.editorMode || EditorMode.Builder;\n\n // Switching to code editor if the query was created before visual query builder was introduced.\n if (q?.editorMode === undefined && q?.rawSql !== undefined) {\n editorMode = EditorMode.Code;\n }\n\n const result: SQLQuery = {\n ...q,\n refId: q?.refId || 'A',\n format: q?.format !== undefined ? q.format : QueryFormat.Table,\n rawSql: q?.rawSql || '',\n editorMode,\n sql: q?.sql ?? {\n columns: [createFunctionField()],\n groupBy: [setGroupByField()],\n limit: 50,\n },\n };\n\n return result;\n}\n\nexport type QueryWithDefaults = ReturnType<typeof applyQueryDefaults>;\n"],"names":[],"mappings":";;;;;AAKO,SAAS,mBAAmB,CAAA,EAAwB;AAL3D,EAAA,IAAA,EAAA;AAME,EAAA,IAAI,UAAA,GAAA,CAAa,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,UAAA,KAAc,UAAA,CAAW,OAAA;AAG7C,EAAA,IAAA,CAAI,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,UAAA,MAAe,KAAA,CAAA,IAAA,CAAa,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,YAAW,KAAA,CAAA,EAAW;AAC1D,IAAA,UAAA,GAAa,UAAA,CAAW,IAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,MAAA,GAAmB;AAAA,IACvB,GAAG,CAAA;AAAA,IACH,KAAA,EAAA,CAAO,uBAAG,KAAA,KAAS,GAAA;AAAA,IACnB,SAAQ,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,MAAA,MAAW,KAAA,CAAA,GAAY,CAAA,CAAE,SAAS,WAAA,CAAY,KAAA;AAAA,IACzD,MAAA,EAAA,CAAQ,uBAAG,MAAA,KAAU,EAAA;AAAA,IACrB,UAAA;AAAA,IACA,GAAA,EAAA,CAAK,EAAA,GAAA,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,GAAA,KAAH,IAAA,GAAA,EAAA,GAAU;AAAA,MACb,OAAA,EAAS,CAAC,mBAAA,EAAqB,CAAA;AAAA,MAC/B,OAAA,EAAS,CAAC,eAAA,EAAiB,CAAA;AAAA,MAC3B,KAAA,EAAO;AAAA;AACT,GACF;AAEA,EAAA,OAAO,MAAA;AACT;;;;"}
1
+ {"version":3,"file":"defaults.mjs","sources":["../../src/defaults.ts"],"sourcesContent":["import { EditorMode } from '@grafana/plugin-ui';\n\nimport { QueryFormat, type SQLQuery } from './types';\nimport { createFunctionField, setGroupByField } from './utils/sql.utils';\n\nexport function applyQueryDefaults(q?: SQLQuery): SQLQuery {\n let editorMode = q?.editorMode || EditorMode.Builder;\n\n // Switching to code editor if the query was created before visual query builder was introduced.\n if (q?.editorMode === undefined && q?.rawSql !== undefined) {\n editorMode = EditorMode.Code;\n }\n\n const result: SQLQuery = {\n ...q,\n refId: q?.refId || 'A',\n format: q?.format !== undefined ? q.format : QueryFormat.Table,\n rawSql: q?.rawSql || '',\n editorMode,\n sql: q?.sql ?? {\n columns: [createFunctionField()],\n groupBy: [setGroupByField()],\n limit: 50,\n },\n };\n\n return result;\n}\n\nexport type QueryWithDefaults = ReturnType<typeof applyQueryDefaults>;\n"],"names":[],"mappings":";;;;;AAKO,SAAS,mBAAmB,CAAA,EAAwB;AAL3D,EAAA,IAAA,EAAA;AAME,EAAA,IAAI,UAAA,GAAA,CAAa,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,UAAA,KAAc,UAAA,CAAW,OAAA;AAG7C,EAAA,IAAA,CAAI,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,UAAA,MAAe,KAAA,CAAA,IAAA,CAAa,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,YAAW,KAAA,CAAA,EAAW;AAC1D,IAAA,UAAA,GAAa,UAAA,CAAW,IAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,MAAA,GAAmB;AAAA,IACvB,GAAG,CAAA;AAAA,IACH,KAAA,EAAA,CAAO,uBAAG,KAAA,KAAS,GAAA;AAAA,IACnB,SAAQ,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,MAAA,MAAW,KAAA,CAAA,GAAY,CAAA,CAAE,SAAS,WAAA,CAAY,KAAA;AAAA,IACzD,MAAA,EAAA,CAAQ,uBAAG,MAAA,KAAU,EAAA;AAAA,IACrB,UAAA;AAAA,IACA,GAAA,EAAA,CAAK,EAAA,GAAA,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,GAAA,KAAH,IAAA,GAAA,EAAA,GAAU;AAAA,MACb,OAAA,EAAS,CAAC,mBAAA,EAAqB,CAAA;AAAA,MAC/B,OAAA,EAAS,CAAC,eAAA,EAAiB,CAAA;AAAA,MAC3B,KAAA,EAAO;AAAA;AACT,GACF;AAEA,EAAA,OAAO,MAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"loadResources.mjs","sources":["../../src/loadResources.ts"],"sourcesContent":["import { LANGUAGES, ResourceLoader, Resources } from '@grafana/i18n';\n\nconst resources = LANGUAGES.reduce<Record<string, () => Promise<{ default: Resources }>>>((acc, lang) => {\n acc[lang.code] = async () => await import(`./locales/${lang.code}/grafana-sql.json`);\n return acc;\n}, {});\n\nexport const loadResources: ResourceLoader = async (resolvedLanguage: string) => {\n const translation = await resources[resolvedLanguage]();\n return translation.default;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAM,SAAA,GAAY,SAAA,CAAU,MAAA,CAA8D,CAAC,KAAK,IAAA,KAAS;AACvG,EAAA,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,YAAY,MAAM,iCAAA,CAAO,CAAA,UAAA,EAAa,KAAK,IAAI,CAAA,iBAAA,CAAA,CAAA;AAChE,EAAA,OAAO,GAAA;AACT,CAAA,EAAG,EAAE,CAAA;AAEE,MAAM,aAAA,GAAgC,OAAO,gBAAA,KAA6B;AAC/E,EAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,gBAAgB,CAAA,EAAE;AACtD,EAAA,OAAO,WAAA,CAAY,OAAA;AACrB;;;;"}
1
+ {"version":3,"file":"loadResources.mjs","sources":["../../src/loadResources.ts"],"sourcesContent":["import { LANGUAGES, type ResourceLoader, type Resources } from '@grafana/i18n';\n\nconst resources = LANGUAGES.reduce<Record<string, () => Promise<{ default: Resources }>>>((acc, lang) => {\n acc[lang.code] = async () => await import(`./locales/${lang.code}/grafana-sql.json`);\n return acc;\n}, {});\n\nexport const loadResources: ResourceLoader = async (resolvedLanguage: string) => {\n const translation = await resources[resolvedLanguage]();\n return translation.default;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAM,SAAA,GAAY,SAAA,CAAU,MAAA,CAA8D,CAAC,KAAK,IAAA,KAAS;AACvG,EAAA,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,YAAY,MAAM,iCAAA,CAAO,CAAA,UAAA,EAAa,KAAK,IAAI,CAAA,iBAAA,CAAA,CAAA;AAChE,EAAA,OAAO,GAAA;AACT,CAAA,EAAG,EAAE,CAAA;AAEE,MAAM,aAAA,GAAgC,OAAO,gBAAA,KAA6B;AAC/E,EAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,gBAAgB,CAAA,EAAE;AACtD,EAAA,OAAO,WAAA,CAAY,OAAA;AACrB;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.mjs","sources":["../../src/types.ts"],"sourcesContent":["import type { JsonTree } from '@react-awesome-query-builder/ui';\n\nimport {\n DataFrame,\n DataQuery,\n DataSourceJsonData,\n MetricFindValue,\n SelectableValue,\n TimeRange,\n toOption as toOptionFromData,\n} from '@grafana/data';\nimport { CompletionItemKind, EditorMode, LanguageDefinition } from '@grafana/plugin-ui';\n\nimport { QueryWithDefaults } from './defaults';\nimport {\n QueryEditorFunctionExpression,\n QueryEditorGroupByExpression,\n QueryEditorPropertyExpression,\n} from './expressions';\n\nexport interface SqlQueryForInterpolation {\n dataset?: string;\n alias?: string;\n format?: QueryFormat;\n rawSql?: string;\n refId: string;\n hide?: boolean;\n}\n\nexport interface SQLConnectionLimits {\n maxOpenConns: number;\n maxIdleConns: number;\n maxIdleConnsAuto: boolean;\n connMaxLifetime: number;\n}\n\nexport interface SQLOptions extends SQLConnectionLimits, DataSourceJsonData {\n tlsAuth: boolean;\n tlsAuthWithCACert: boolean;\n timezone: string;\n tlsSkipVerify: boolean;\n user: string;\n database: string;\n url: string;\n timeInterval: string;\n}\n\nexport enum QueryFormat {\n Timeseries = 'time_series',\n Table = 'table',\n}\n\nexport type SQLQueryMeta = { valueField?: string; textField?: string };\n\nexport interface SQLQuery extends DataQuery {\n alias?: string;\n format?: QueryFormat;\n rawSql?: string;\n dataset?: string;\n table?: string;\n sql?: SQLExpression;\n editorMode?: EditorMode;\n rawQuery?: boolean;\n meta?: SQLQueryMeta;\n}\n\nexport type SQLVariableQuery = { query: string } & SQLQuery;\n\nexport interface NameValue {\n name: string;\n value: string;\n}\n\nexport type SQLFilters = NameValue[];\n\nexport interface SQLExpression {\n columns?: QueryEditorFunctionExpression[];\n whereJsonTree?: JsonTree;\n whereString?: string;\n filters?: SQLFilters;\n groupBy?: QueryEditorGroupByExpression[];\n orderBy?: QueryEditorPropertyExpression;\n orderByDirection?: 'ASC' | 'DESC';\n limit?: number;\n offset?: number;\n}\n\nexport interface TableSchema {\n name?: string;\n schema?: TableFieldSchema[];\n}\n\nexport interface TableFieldSchema {\n name: string;\n description?: string;\n type: string;\n repeated: boolean;\n schema: TableFieldSchema[];\n}\n\nexport interface QueryRowFilter {\n filter: boolean;\n group: boolean;\n order: boolean;\n preview: boolean;\n}\n\nexport const QUERY_FORMAT_OPTIONS = [\n { label: 'Time series', value: QueryFormat.Timeseries },\n { label: 'Table', value: QueryFormat.Table },\n];\n\nconst backWardToOption = (value: string) => ({ label: value, value });\n\nexport const toOption = toOptionFromData ?? backWardToOption;\n\nexport interface ResourceSelectorProps {\n disabled?: boolean;\n className?: string;\n applyDefault?: boolean;\n}\n// React Awesome Query builder field types.\n// These are responsible for rendering the correct UI for the field.\nexport type RAQBFieldTypes = 'text' | 'number' | 'boolean' | 'datetime' | 'date' | 'time';\n\nexport interface SQLSelectableValue extends SelectableValue {\n type?: string;\n raqbFieldType?: RAQBFieldTypes;\n}\n\nexport interface DB {\n init?: (datasourceId?: string) => Promise<boolean>;\n datasets: () => Promise<string[]>;\n tables: (dataset?: string) => Promise<string[]>;\n fields: (query: SQLQuery, order?: boolean) => Promise<SQLSelectableValue[]>;\n validateQuery: (query: SQLQuery, range?: TimeRange) => Promise<ValidationResults>;\n dispose?: (dsID?: string) => void;\n lookup?: (path?: string) => Promise<Array<{ name: string; completion: string }>>;\n getEditorLanguageDefinition: () => LanguageDefinition;\n toRawSql: (query: SQLQuery) => string;\n functions: () => Func[];\n}\n\nexport interface FuncParameter {\n name: string;\n required?: boolean;\n options?: (query: SQLQuery) => Promise<SelectableValue[]>;\n}\nexport interface Func {\n name: string;\n parameters?: FuncParameter[];\n description?: string;\n}\n\nexport interface QueryEditorProps {\n db: DB;\n query: QueryWithDefaults;\n onChange: (query: SQLQuery) => void;\n range?: TimeRange;\n}\n\nexport interface ValidationResults {\n query: SQLQuery;\n rawSql?: string;\n error: string;\n isError: boolean;\n isValid: boolean;\n statistics?: {\n TotalBytesProcessed: number;\n } | null;\n}\n\nexport interface SqlQueryModel {\n quoteLiteral: (v: string) => string;\n}\n\nexport interface ResponseParser {\n transformMetricFindResponse: (frame: DataFrame) => MetricFindValue[];\n}\n\nexport interface MetaDefinition {\n name: string;\n completion?: string;\n kind: CompletionItemKind;\n}\n\nexport type SQLDialect = 'postgres' | 'influx' | 'other';\n"],"names":["QueryFormat","toOptionFromData"],"mappings":";;;AAAA,IAAA,EAAA;AA+CO,IAAK,WAAA,qBAAAA,YAAAA,KAAL;AACL,EAAAA,aAAA,YAAA,CAAA,GAAa,aAAA;AACb,EAAAA,aAAA,OAAA,CAAA,GAAQ,OAAA;AAFE,EAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;AA4DL,MAAM,oBAAA,GAAuB;AAAA,EAClC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,aAAA,mBAAuB;AAAA,EACtD,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAC3B;AAEA,MAAM,mBAAmB,CAAC,KAAA,MAAmB,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,CAAA;AAE5D,MAAM,YAAW,EAAA,GAAAC,UAAA,KAAA,IAAA,GAAA,EAAA,GAAoB;;;;"}
1
+ {"version":3,"file":"types.mjs","sources":["../../src/types.ts"],"sourcesContent":["import type { JsonTree } from '@react-awesome-query-builder/ui';\n\nimport {\n type DataFrame,\n type DataQuery,\n type DataSourceJsonData,\n type MetricFindValue,\n type SelectableValue,\n type TimeRange,\n toOption as toOptionFromData,\n} from '@grafana/data';\nimport { type CompletionItemKind, type EditorMode, type LanguageDefinition } from '@grafana/plugin-ui';\n\nimport { type QueryWithDefaults } from './defaults';\nimport {\n type QueryEditorFunctionExpression,\n type QueryEditorGroupByExpression,\n type QueryEditorPropertyExpression,\n} from './expressions';\n\nexport interface SqlQueryForInterpolation {\n dataset?: string;\n alias?: string;\n format?: QueryFormat;\n rawSql?: string;\n refId: string;\n hide?: boolean;\n}\n\nexport interface SQLConnectionLimits {\n maxOpenConns: number;\n maxIdleConns: number;\n maxIdleConnsAuto: boolean;\n connMaxLifetime: number;\n}\n\nexport interface SQLOptions extends SQLConnectionLimits, DataSourceJsonData {\n tlsAuth: boolean;\n tlsAuthWithCACert: boolean;\n timezone: string;\n tlsSkipVerify: boolean;\n user: string;\n database: string;\n url: string;\n timeInterval: string;\n}\n\nexport enum QueryFormat {\n Timeseries = 'time_series',\n Table = 'table',\n}\n\nexport type SQLQueryMeta = { valueField?: string; textField?: string };\n\nexport interface SQLQuery extends DataQuery {\n alias?: string;\n format?: QueryFormat;\n rawSql?: string;\n dataset?: string;\n table?: string;\n sql?: SQLExpression;\n editorMode?: EditorMode;\n rawQuery?: boolean;\n meta?: SQLQueryMeta;\n}\n\nexport type SQLVariableQuery = { query: string } & SQLQuery;\n\nexport interface NameValue {\n name: string;\n value: string;\n}\n\nexport type SQLFilters = NameValue[];\n\nexport interface SQLExpression {\n columns?: QueryEditorFunctionExpression[];\n whereJsonTree?: JsonTree;\n whereString?: string;\n filters?: SQLFilters;\n groupBy?: QueryEditorGroupByExpression[];\n orderBy?: QueryEditorPropertyExpression;\n orderByDirection?: 'ASC' | 'DESC';\n limit?: number;\n offset?: number;\n}\n\nexport interface TableSchema {\n name?: string;\n schema?: TableFieldSchema[];\n}\n\nexport interface TableFieldSchema {\n name: string;\n description?: string;\n type: string;\n repeated: boolean;\n schema: TableFieldSchema[];\n}\n\nexport interface QueryRowFilter {\n filter: boolean;\n group: boolean;\n order: boolean;\n preview: boolean;\n}\n\nexport const QUERY_FORMAT_OPTIONS = [\n { label: 'Time series', value: QueryFormat.Timeseries },\n { label: 'Table', value: QueryFormat.Table },\n];\n\nconst backWardToOption = (value: string) => ({ label: value, value });\n\nexport const toOption = toOptionFromData ?? backWardToOption;\n\nexport interface ResourceSelectorProps {\n disabled?: boolean;\n className?: string;\n applyDefault?: boolean;\n}\n// React Awesome Query builder field types.\n// These are responsible for rendering the correct UI for the field.\nexport type RAQBFieldTypes = 'text' | 'number' | 'boolean' | 'datetime' | 'date' | 'time';\n\nexport interface SQLSelectableValue extends SelectableValue {\n type?: string;\n raqbFieldType?: RAQBFieldTypes;\n}\n\nexport interface DB {\n init?: (datasourceId?: string) => Promise<boolean>;\n datasets: () => Promise<string[]>;\n tables: (dataset?: string) => Promise<string[]>;\n fields: (query: SQLQuery, order?: boolean) => Promise<SQLSelectableValue[]>;\n validateQuery: (query: SQLQuery, range?: TimeRange) => Promise<ValidationResults>;\n dispose?: (dsID?: string) => void;\n lookup?: (path?: string) => Promise<Array<{ name: string; completion: string }>>;\n getEditorLanguageDefinition: () => LanguageDefinition;\n toRawSql: (query: SQLQuery) => string;\n functions: () => Func[];\n}\n\nexport interface FuncParameter {\n name: string;\n required?: boolean;\n options?: (query: SQLQuery) => Promise<SelectableValue[]>;\n}\nexport interface Func {\n name: string;\n parameters?: FuncParameter[];\n description?: string;\n}\n\nexport interface QueryEditorProps {\n db: DB;\n query: QueryWithDefaults;\n onChange: (query: SQLQuery) => void;\n range?: TimeRange;\n}\n\nexport interface ValidationResults {\n query: SQLQuery;\n rawSql?: string;\n error: string;\n isError: boolean;\n isValid: boolean;\n statistics?: {\n TotalBytesProcessed: number;\n } | null;\n}\n\nexport interface SqlQueryModel {\n quoteLiteral: (v: string) => string;\n}\n\nexport interface ResponseParser {\n transformMetricFindResponse: (frame: DataFrame) => MetricFindValue[];\n}\n\nexport interface MetaDefinition {\n name: string;\n completion?: string;\n kind: CompletionItemKind;\n}\n\nexport type SQLDialect = 'postgres' | 'influx' | 'other';\n"],"names":["QueryFormat","toOptionFromData"],"mappings":";;;AAAA,IAAA,EAAA;AA+CO,IAAK,WAAA,qBAAAA,YAAAA,KAAL;AACL,EAAAA,aAAA,YAAA,CAAA,GAAa,aAAA;AACb,EAAAA,aAAA,OAAA,CAAA,GAAQ,OAAA;AAFE,EAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;AA4DL,MAAM,oBAAA,GAAuB;AAAA,EAClC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,aAAA,mBAAuB;AAAA,EACtD,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAC3B;AAEA,MAAM,mBAAmB,CAAC,KAAA,MAAmB,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,CAAA;AAE5D,MAAM,YAAW,EAAA,GAAAC,UAAA,KAAA,IAAA,GAAA,EAAA,GAAoB;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"getColumnsWithIndices.mjs","sources":["../../../src/utils/getColumnsWithIndices.ts"],"sourcesContent":["import { SelectableValue } from '@grafana/data';\nimport { t } from '@grafana/i18n';\n\nimport { SQLQuery } from '../types';\n\nexport function getColumnsWithIndices(query: SQLQuery, fields: SelectableValue[]): SelectableValue[] {\n if (!fields || !query.sql?.columns) {\n return fields;\n }\n\n const options = query.sql.columns.map((c, i) => {\n const value = c.name\n ? `${c.name}(${c.parameters?.map((p) => p.name).join(', ')})`\n : c.parameters?.map((p) => p.name).join(', ');\n return {\n value,\n label: `${i + 1} - ${value}`,\n };\n });\n\n return [\n {\n value: '',\n label: t('grafana-sql.utils.get-columns-width-indices.label-selected-columns', 'Selected columns'),\n options,\n expanded: true,\n },\n ...fields,\n ];\n}\n"],"names":["_a"],"mappings":";;;AAKO,SAAS,qBAAA,CAAsB,OAAiB,MAAA,EAA8C;AALrG,EAAA,IAAA,EAAA;AAME,EAAA,IAAI,CAAC,MAAA,IAAU,EAAA,CAAC,EAAA,GAAA,KAAA,CAAM,GAAA,KAAN,mBAAW,OAAA,CAAA,EAAS;AAClC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAVlD,IAAA,IAAAA,GAAAA,EAAA,EAAA;AAWI,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,GACZ,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAA,CAAIA,GAAAA,GAAA,CAAA,CAAE,UAAA,KAAF,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAA,CAAM,IAAA,CAAK,IAAA,CAAK,CAAA,CAAA,CAAA,GAAA,CACxD,EAAA,GAAA,CAAA,CAAE,UAAA,KAAF,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAA,CAAM,IAAA,CAAK,IAAA,CAAA;AAC1C,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,KAAA,EAAO,CAAA,EAAG,CAAA,GAAI,CAAC,MAAM,KAAK,CAAA;AAAA,KAC5B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,EAAA;AAAA,MACP,KAAA,EAAO,CAAA,CAAE,oEAAA,EAAsE,kBAAkB,CAAA;AAAA,MACjG,OAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,GAAG;AAAA,GACL;AACF;;;;"}
1
+ {"version":3,"file":"getColumnsWithIndices.mjs","sources":["../../../src/utils/getColumnsWithIndices.ts"],"sourcesContent":["import { type SelectableValue } from '@grafana/data';\nimport { t } from '@grafana/i18n';\n\nimport { type SQLQuery } from '../types';\n\nexport function getColumnsWithIndices(query: SQLQuery, fields: SelectableValue[]): SelectableValue[] {\n if (!fields || !query.sql?.columns) {\n return fields;\n }\n\n const options = query.sql.columns.map((c, i) => {\n const value = c.name\n ? `${c.name}(${c.parameters?.map((p) => p.name).join(', ')})`\n : c.parameters?.map((p) => p.name).join(', ');\n return {\n value,\n label: `${i + 1} - ${value}`,\n };\n });\n\n return [\n {\n value: '',\n label: t('grafana-sql.utils.get-columns-width-indices.label-selected-columns', 'Selected columns'),\n options,\n expanded: true,\n },\n ...fields,\n ];\n}\n"],"names":["_a"],"mappings":";;;AAKO,SAAS,qBAAA,CAAsB,OAAiB,MAAA,EAA8C;AALrG,EAAA,IAAA,EAAA;AAME,EAAA,IAAI,CAAC,MAAA,IAAU,EAAA,CAAC,EAAA,GAAA,KAAA,CAAM,GAAA,KAAN,mBAAW,OAAA,CAAA,EAAS;AAClC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAVlD,IAAA,IAAAA,GAAAA,EAAA,EAAA;AAWI,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,GACZ,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAA,CAAIA,GAAAA,GAAA,CAAA,CAAE,UAAA,KAAF,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAA,CAAM,IAAA,CAAK,IAAA,CAAK,CAAA,CAAA,CAAA,GAAA,CACxD,EAAA,GAAA,CAAA,CAAE,UAAA,KAAF,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAA,CAAM,IAAA,CAAK,IAAA,CAAA;AAC1C,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,KAAA,EAAO,CAAA,EAAG,CAAA,GAAI,CAAC,MAAM,KAAK,CAAA;AAAA,KAC5B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,EAAA;AAAA,MACP,KAAA,EAAO,CAAA,CAAE,oEAAA,EAAsE,kBAAkB,CAAA;AAAA,MACjG,OAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,GAAG;AAAA,GACL;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"logging.mjs","sources":["../../../src/utils/logging.ts"],"sourcesContent":["import { createMonitoringLogger, MonitoringLogger } from '@grafana/runtime';\n\nexport const sqlPluginLogger: MonitoringLogger = createMonitoringLogger('features.plugins.sql');\n"],"names":[],"mappings":";;;AAEO,MAAM,eAAA,GAAoC,uBAAuB,sBAAsB;;;;"}
1
+ {"version":3,"file":"logging.mjs","sources":["../../../src/utils/logging.ts"],"sourcesContent":["import { createMonitoringLogger, type MonitoringLogger } from '@grafana/runtime';\n\nexport const sqlPluginLogger: MonitoringLogger = createMonitoringLogger('features.plugins.sql');\n"],"names":[],"mappings":";;;AAEO,MAAM,eAAA,GAAoC,uBAAuB,sBAAsB;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"migration.mjs","sources":["../../../src/utils/migration.ts"],"sourcesContent":["import { AnnotationQuery } from '@grafana/data';\n\nimport { applyQueryDefaults } from '../defaults';\nimport { SQLQuery } from '../types';\n\nexport default function migrateAnnotation(annotation: AnnotationQuery<SQLQuery>) {\n const oldQuery = typeof annotation.rawQuery === 'string' ? annotation.rawQuery : null;\n\n if (!oldQuery) {\n return annotation;\n }\n\n const newQuery = applyQueryDefaults({ refId: 'Annotation', ...(annotation.target ?? {}), rawSql: oldQuery });\n\n return {\n ...annotation,\n rawQuery: undefined,\n workspace: undefined,\n subscription: undefined,\n queryType: undefined,\n target: newQuery,\n };\n}\n"],"names":[],"mappings":";;;AAKA,SAAwB,kBAAkB,UAAA,EAAuC;AALjF,EAAA,IAAA,EAAA;AAME,EAAA,MAAM,WAAW,OAAO,UAAA,CAAW,QAAA,KAAa,QAAA,GAAW,WAAW,QAAA,GAAW,IAAA;AAEjF,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,EAAE,KAAA,EAAO,YAAA,EAAc,GAAA,CAAI,EAAA,GAAA,UAAA,CAAW,MAAA,KAAX,IAAA,GAAA,EAAA,GAAqB,EAAC,EAAI,MAAA,EAAQ,UAAU,CAAA;AAE3G,EAAA,OAAO;AAAA,IACL,GAAG,UAAA;AAAA,IACH,QAAA,EAAU,KAAA,CAAA;AAAA,IACV,SAAA,EAAW,KAAA,CAAA;AAAA,IACX,YAAA,EAAc,KAAA,CAAA;AAAA,IACd,SAAA,EAAW,KAAA,CAAA;AAAA,IACX,MAAA,EAAQ;AAAA,GACV;AACF;;;;"}
1
+ {"version":3,"file":"migration.mjs","sources":["../../../src/utils/migration.ts"],"sourcesContent":["import { type AnnotationQuery } from '@grafana/data';\n\nimport { applyQueryDefaults } from '../defaults';\nimport { type SQLQuery } from '../types';\n\nexport default function migrateAnnotation(annotation: AnnotationQuery<SQLQuery>) {\n const oldQuery = typeof annotation.rawQuery === 'string' ? annotation.rawQuery : null;\n\n if (!oldQuery) {\n return annotation;\n }\n\n const newQuery = applyQueryDefaults({ refId: 'Annotation', ...(annotation.target ?? {}), rawSql: oldQuery });\n\n return {\n ...annotation,\n rawQuery: undefined,\n workspace: undefined,\n subscription: undefined,\n queryType: undefined,\n target: newQuery,\n };\n}\n"],"names":[],"mappings":";;;AAKA,SAAwB,kBAAkB,UAAA,EAAuC;AALjF,EAAA,IAAA,EAAA;AAME,EAAA,MAAM,WAAW,OAAO,UAAA,CAAW,QAAA,KAAa,QAAA,GAAW,WAAW,QAAA,GAAW,IAAA;AAEjF,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,EAAE,KAAA,EAAO,YAAA,EAAc,GAAA,CAAI,EAAA,GAAA,UAAA,CAAW,MAAA,KAAX,IAAA,GAAA,EAAA,GAAqB,EAAC,EAAI,MAAA,EAAQ,UAAU,CAAA;AAE3G,EAAA,OAAO;AAAA,IACL,GAAG,UAAA;AAAA,IACH,QAAA,EAAU,KAAA,CAAA;AAAA,IACV,SAAA,EAAW,KAAA,CAAA;AAAA,IACX,YAAA,EAAc,KAAA,CAAA;AAAA,IACd,SAAA,EAAW,KAAA,CAAA;AAAA,IACX,MAAA,EAAQ;AAAA,GACV;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"sql.utils.mjs","sources":["../../../src/utils/sql.utils.ts"],"sourcesContent":["import { SelectableValue, toOption } from '@grafana/data';\n\nimport {\n QueryEditorExpressionType,\n QueryEditorFunctionExpression,\n QueryEditorFunctionParameterExpression,\n QueryEditorGroupByExpression,\n QueryEditorPropertyExpression,\n QueryEditorPropertyType,\n} from '../expressions';\nimport { SQLExpression } from '../types';\n\nexport function createSelectClause(sqlColumns: NonNullable<SQLExpression['columns']>): string {\n const columns = sqlColumns.map((c) => {\n let rawColumn = '';\n if (c.name && c.alias) {\n rawColumn += `${c.name}(${c.parameters?.map((p) => `${p.name}`)}) AS ${c.alias}`;\n } else if (c.name) {\n rawColumn += `${c.name}(${c.parameters?.map((p) => `${p.name}`)})`;\n } else if (c.alias) {\n rawColumn += `${c.parameters?.map((p) => `${p.name}`)} AS ${c.alias}`;\n } else {\n rawColumn += `${c.parameters?.map((p) => `${p.name}`)}`;\n }\n return rawColumn;\n });\n return `SELECT ${columns.join(', ')} `;\n}\n\nexport const haveColumns = (columns: SQLExpression['columns']): columns is NonNullable<SQLExpression['columns']> => {\n if (!columns) {\n return false;\n }\n\n const haveColumn = columns.some((c) => c.parameters?.length || c.parameters?.some((p) => p.name));\n const haveFunction = columns.some((c) => c.name);\n return haveColumn || haveFunction;\n};\n\n/**\n * Creates a GroupByExpression for a specified field\n */\nexport function setGroupByField(field?: string): QueryEditorGroupByExpression {\n return {\n type: QueryEditorExpressionType.GroupBy,\n property: {\n type: QueryEditorPropertyType.String,\n name: field,\n },\n };\n}\n\n/**\n * Creates a PropertyExpression for a specified field\n */\nexport function setPropertyField(field?: string): QueryEditorPropertyExpression {\n return {\n type: QueryEditorExpressionType.Property,\n property: {\n type: QueryEditorPropertyType.String,\n name: field,\n },\n };\n}\n\nexport function createFunctionField(functionName?: string): QueryEditorFunctionExpression {\n return {\n type: QueryEditorExpressionType.Function,\n name: functionName,\n parameters: [],\n };\n}\n\n/**\n * Retrieves the column value from a QueryEditorFunctionParameterExpression object.\n *\n * @param column - The QueryEditorFunctionParameterExpression object representing the column.\n * @returns The column value as a SelectableValue<string> or null if the column is undefined or null.\n */\nexport function getColumnValue(\n column?: QueryEditorFunctionParameterExpression | QueryEditorFunctionExpression\n): SelectableValue<string> | null {\n if (column?.name) {\n return toOption(column.name);\n }\n return null;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sql.utils.mjs","sources":["../../../src/utils/sql.utils.ts"],"sourcesContent":["import { type SelectableValue, toOption } from '@grafana/data';\n\nimport {\n QueryEditorExpressionType,\n type QueryEditorFunctionExpression,\n type QueryEditorFunctionParameterExpression,\n type QueryEditorGroupByExpression,\n type QueryEditorPropertyExpression,\n QueryEditorPropertyType,\n} from '../expressions';\nimport { type SQLExpression } from '../types';\n\nexport function createSelectClause(sqlColumns: NonNullable<SQLExpression['columns']>): string {\n const columns = sqlColumns.map((c) => {\n let rawColumn = '';\n if (c.name && c.alias) {\n rawColumn += `${c.name}(${c.parameters?.map((p) => `${p.name}`)}) AS ${c.alias}`;\n } else if (c.name) {\n rawColumn += `${c.name}(${c.parameters?.map((p) => `${p.name}`)})`;\n } else if (c.alias) {\n rawColumn += `${c.parameters?.map((p) => `${p.name}`)} AS ${c.alias}`;\n } else {\n rawColumn += `${c.parameters?.map((p) => `${p.name}`)}`;\n }\n return rawColumn;\n });\n return `SELECT ${columns.join(', ')} `;\n}\n\nexport const haveColumns = (columns: SQLExpression['columns']): columns is NonNullable<SQLExpression['columns']> => {\n if (!columns) {\n return false;\n }\n\n const haveColumn = columns.some((c) => c.parameters?.length || c.parameters?.some((p) => p.name));\n const haveFunction = columns.some((c) => c.name);\n return haveColumn || haveFunction;\n};\n\n/**\n * Creates a GroupByExpression for a specified field\n */\nexport function setGroupByField(field?: string): QueryEditorGroupByExpression {\n return {\n type: QueryEditorExpressionType.GroupBy,\n property: {\n type: QueryEditorPropertyType.String,\n name: field,\n },\n };\n}\n\n/**\n * Creates a PropertyExpression for a specified field\n */\nexport function setPropertyField(field?: string): QueryEditorPropertyExpression {\n return {\n type: QueryEditorExpressionType.Property,\n property: {\n type: QueryEditorPropertyType.String,\n name: field,\n },\n };\n}\n\nexport function createFunctionField(functionName?: string): QueryEditorFunctionExpression {\n return {\n type: QueryEditorExpressionType.Function,\n name: functionName,\n parameters: [],\n };\n}\n\n/**\n * Retrieves the column value from a QueryEditorFunctionParameterExpression object.\n *\n * @param column - The QueryEditorFunctionParameterExpression object representing the column.\n * @returns The column value as a SelectableValue<string> or null if the column is undefined or null.\n */\nexport function getColumnValue(\n column?: QueryEditorFunctionParameterExpression | QueryEditorFunctionExpression\n): SelectableValue<string> | null {\n if (column?.name) {\n return toOption(column.name);\n }\n return null;\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"testHelpers.mjs","sources":["../../../src/utils/testHelpers.ts"],"sourcesContent":["import { CustomVariableModel, LoadingState, VariableHide } from '@grafana/data';\n\nexport function makeVariable(id: string, name: string, attributes?: Partial<CustomVariableModel>): CustomVariableModel {\n return {\n multi: false,\n type: 'custom',\n includeAll: false,\n current: {},\n options: [],\n query: '',\n rootStateKey: null,\n global: false,\n hide: VariableHide.dontHide,\n skipUrlSync: false,\n index: -1,\n state: LoadingState.NotStarted,\n error: null,\n description: null,\n ...attributes,\n id,\n name,\n };\n}\n"],"names":[],"mappings":";;;AAEO,SAAS,YAAA,CAAa,EAAA,EAAY,IAAA,EAAc,UAAA,EAAgE;AACrH,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY,KAAA;AAAA,IACZ,SAAS,EAAC;AAAA,IACV,SAAS,EAAC;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,YAAA,EAAc,IAAA;AAAA,IACd,MAAA,EAAQ,KAAA;AAAA,IACR,MAAM,YAAA,CAAa,QAAA;AAAA,IACnB,WAAA,EAAa,KAAA;AAAA,IACb,KAAA,EAAO,CAAA,CAAA;AAAA,IACP,OAAO,YAAA,CAAa,UAAA;AAAA,IACpB,KAAA,EAAO,IAAA;AAAA,IACP,WAAA,EAAa,IAAA;AAAA,IACb,GAAG,UAAA;AAAA,IACH,EAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"testHelpers.mjs","sources":["../../../src/utils/testHelpers.ts"],"sourcesContent":["import { type CustomVariableModel, LoadingState, VariableHide } from '@grafana/data';\n\nexport function makeVariable(id: string, name: string, attributes?: Partial<CustomVariableModel>): CustomVariableModel {\n return {\n multi: false,\n type: 'custom',\n includeAll: false,\n current: {},\n options: [],\n query: '',\n rootStateKey: null,\n global: false,\n hide: VariableHide.dontHide,\n skipUrlSync: false,\n index: -1,\n state: LoadingState.NotStarted,\n error: null,\n description: null,\n ...attributes,\n id,\n name,\n };\n}\n"],"names":[],"mappings":";;;AAEO,SAAS,YAAA,CAAa,EAAA,EAAY,IAAA,EAAc,UAAA,EAAgE;AACrH,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY,KAAA;AAAA,IACZ,SAAS,EAAC;AAAA,IACV,SAAS,EAAC;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,YAAA,EAAc,IAAA;AAAA,IACd,MAAA,EAAQ,KAAA;AAAA,IACR,MAAM,YAAA,CAAa,QAAA;AAAA,IACnB,WAAA,EAAa,KAAA;AAAA,IACb,KAAA,EAAO,CAAA,CAAA;AAAA,IACP,OAAO,YAAA,CAAa,UAAA;AAAA,IACpB,KAAA,EAAO,IAAA;AAAA,IACP,WAAA,EAAa,IAAA;AAAA,IACb,GAAG,UAAA;AAAA,IACH,EAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSqlChange.mjs","sources":["../../../src/utils/useSqlChange.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { DB, SQLExpression, SQLQuery } from '../types';\n\ninterface UseSqlChange {\n db: DB;\n query: SQLQuery;\n onQueryChange: (query: SQLQuery) => void;\n}\n\nexport function useSqlChange({ query, onQueryChange, db }: UseSqlChange) {\n const onSqlChange = useCallback(\n (sql: SQLExpression) => {\n const toRawSql = db.toRawSql;\n const rawSql = toRawSql({ sql, dataset: query.dataset, table: query.table, refId: query.refId });\n const newQuery: SQLQuery = { ...query, sql, rawSql };\n onQueryChange(newQuery);\n },\n [db, onQueryChange, query]\n );\n\n return { onSqlChange };\n}\n"],"names":[],"mappings":";;;AAUO,SAAS,YAAA,CAAa,EAAE,KAAA,EAAO,aAAA,EAAe,IAAG,EAAiB;AACvE,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,GAAA,KAAuB;AACtB,MAAA,MAAM,WAAW,EAAA,CAAG,QAAA;AACpB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA;AAC/F,MAAA,MAAM,QAAA,GAAqB,EAAE,GAAG,KAAA,EAAO,KAAK,MAAA,EAAO;AACnD,MAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,IACxB,CAAA;AAAA,IACA,CAAC,EAAA,EAAI,aAAA,EAAe,KAAK;AAAA,GAC3B;AAEA,EAAA,OAAO,EAAE,WAAA,EAAY;AACvB;;;;"}
1
+ {"version":3,"file":"useSqlChange.mjs","sources":["../../../src/utils/useSqlChange.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { type DB, type SQLExpression, type SQLQuery } from '../types';\n\ninterface UseSqlChange {\n db: DB;\n query: SQLQuery;\n onQueryChange: (query: SQLQuery) => void;\n}\n\nexport function useSqlChange({ query, onQueryChange, db }: UseSqlChange) {\n const onSqlChange = useCallback(\n (sql: SQLExpression) => {\n const toRawSql = db.toRawSql;\n const rawSql = toRawSql({ sql, dataset: query.dataset, table: query.table, refId: query.refId });\n const newQuery: SQLQuery = { ...query, sql, rawSql };\n onQueryChange(newQuery);\n },\n [db, onQueryChange, query]\n );\n\n return { onSqlChange };\n}\n"],"names":[],"mappings":";;;AAUO,SAAS,YAAA,CAAa,EAAE,KAAA,EAAO,aAAA,EAAe,IAAG,EAAiB;AACvE,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,GAAA,KAAuB;AACtB,MAAA,MAAM,WAAW,EAAA,CAAG,QAAA;AACpB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA;AAC/F,MAAA,MAAM,QAAA,GAAqB,EAAE,GAAG,KAAA,EAAO,KAAK,MAAA,EAAO;AACnD,MAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,IACxB,CAAA;AAAA,IACA,CAAC,EAAA,EAAI,aAAA,EAAe,KAAK;AAAA,GAC3B;AAEA,EAAA,OAAO,EAAE,WAAA,EAAY;AACvB;;;;"}
@@ -1,4 +1,4 @@
1
- import { DataFrame, MetricFindValue } from '@grafana/data';
1
+ import { type DataFrame, type MetricFindValue } from '@grafana/data';
2
2
  import type { ResponseParser as ResponseParserType } from './types';
3
3
  export declare class ResponseParser implements ResponseParserType {
4
4
  transformMetricFindResponse(frame: DataFrame): MetricFindValue[];
@@ -1,5 +1,5 @@
1
- import { SqlQueryEditorProps } from './components/QueryEditor';
2
- import { SQLDialect } from './types';
1
+ import { type SqlQueryEditorProps } from './components/QueryEditor';
2
+ import { type SQLDialect } from './types';
3
3
  type SQLVariableQueryEditorProps = SqlQueryEditorProps;
4
4
  export declare const SQLVariablesQueryEditor: <T extends SQLDialect>(props: SQLVariableQueryEditorProps) => import("react/jsx-runtime").JSX.Element;
5
5
  export {};
@@ -1,6 +1,6 @@
1
- import { Observable } from 'rxjs';
2
- import { CustomVariableSupport, DataQueryRequest, DataQueryResponse } from '@grafana/data';
3
- import { SqlDatasource } from './datasource/SqlDatasource';
1
+ import { type Observable } from 'rxjs';
2
+ import { CustomVariableSupport, type DataQueryRequest, type DataQueryResponse } from '@grafana/data';
3
+ import { type SqlDatasource } from './datasource/SqlDatasource';
4
4
  import { type SQLQuery } from './types';
5
5
  export declare class SQLVariableSupport extends CustomVariableSupport<SqlDatasource, SQLQuery> {
6
6
  readonly datasource: SqlDatasource;
@@ -1,4 +1,4 @@
1
- import { DataFrame, Field } from '@grafana/data';
1
+ import { type DataFrame, type Field } from '@grafana/data';
2
2
  import { type SQLQuery, type SQLVariableQuery, type SQLQueryMeta } from './types';
3
3
  export declare const refId = "SQLVariableQueryEditor-VariableQuery";
4
4
  export declare const migrateVariableQuery: (rawQuery: string | SQLQuery) => SQLVariableQuery;
@@ -1,5 +1,5 @@
1
- import { SelectableValue } from '@grafana/data';
2
- import { DB, ResourceSelectorProps, SQLDialect } from '../types';
1
+ import { type SelectableValue } from '@grafana/data';
2
+ import { type DB, type ResourceSelectorProps, type SQLDialect } from '../types';
3
3
  export interface DatasetSelectorProps extends ResourceSelectorProps {
4
4
  db: DB;
5
5
  dataset: string | undefined;
@@ -1,4 +1,4 @@
1
- import { Component, ErrorInfo, PropsWithChildren } from 'react';
1
+ import { Component, type ErrorInfo, type PropsWithChildren } from 'react';
2
2
  type Props = {
3
3
  fallBackComponent?: React.ReactNode;
4
4
  };
@@ -1,7 +1,7 @@
1
- import { QueryEditorProps } from '@grafana/data';
2
- import { SqlDatasource } from '../datasource/SqlDatasource';
3
- import { SQLQuery, SQLOptions } from '../types';
4
- import { QueryHeaderProps } from './QueryHeader';
1
+ import { type QueryEditorProps } from '@grafana/data';
2
+ import { type SqlDatasource } from '../datasource/SqlDatasource';
3
+ import { type SQLQuery, type SQLOptions } from '../types';
4
+ import { type QueryHeaderProps } from './QueryHeader';
5
5
  export interface SqlQueryEditorProps extends QueryEditorProps<SqlDatasource, SQLQuery, SQLOptions> {
6
6
  queryHeaderProps?: Pick<QueryHeaderProps, 'dialect' | 'hideRunButton' | 'hideFormatSelector'>;
7
7
  }
@@ -1,5 +1,5 @@
1
- import { QueryWithDefaults } from '../defaults';
2
- import { SQLQuery, QueryRowFilter, DB, SQLDialect } from '../types';
1
+ import { type QueryWithDefaults } from '../defaults';
2
+ import { type SQLQuery, type QueryRowFilter, type DB, type SQLDialect } from '../types';
3
3
  export interface QueryHeaderProps {
4
4
  db: DB;
5
5
  dialect: SQLDialect;
@@ -1,7 +1,7 @@
1
1
  import { PluginType } from '@grafana/data';
2
- import { DB } from '../types';
3
- import { DatasetSelectorProps } from './DatasetSelector';
4
- import { TableSelectorProps } from './TableSelector';
2
+ import { type DB } from '../types';
3
+ import { type DatasetSelectorProps } from './DatasetSelector';
4
+ import { type TableSelectorProps } from './TableSelector';
5
5
  export declare const buildMockDB: () => DB;
6
6
  export declare const buildMockDatasource: (hasDefaultDatabaseConfigured?: boolean) => {
7
7
  id: number;
@@ -1,5 +1,5 @@
1
- import { SelectableValue } from '@grafana/data';
2
- import { DB, ResourceSelectorProps } from '../types';
1
+ import { type SelectableValue } from '@grafana/data';
2
+ import { type DB, type ResourceSelectorProps } from '../types';
3
3
  export interface TableSelectorProps extends ResourceSelectorProps {
4
4
  db: DB;
5
5
  table: string | undefined;
@@ -1,5 +1,5 @@
1
- import { DataSourceSettings } from '@grafana/data';
2
- import { SQLConnectionLimits, SQLOptions } from '../../types';
1
+ import { type DataSourceSettings } from '@grafana/data';
2
+ import { type SQLConnectionLimits, type SQLOptions } from '../../types';
3
3
  interface Props<T> {
4
4
  onOptionsChange: Function;
5
5
  options: DataSourceSettings<SQLOptions>;
@@ -1,4 +1,4 @@
1
- import { SQLOptions } from '../../types';
1
+ import { type SQLOptions } from '../../types';
2
2
  interface Props {
3
3
  labelWidth: number;
4
4
  onMaxLifetimeChanged: (number?: number) => void;
@@ -1,4 +1,4 @@
1
- import { SQLOptions } from '../../types';
1
+ import { type SQLOptions } from '../../types';
2
2
  interface Props {
3
3
  labelWidth: number;
4
4
  onMaxConnectionsChanged: (number?: number) => void;
@@ -1,4 +1,4 @@
1
- import { DataSourceJsonData, DataSourcePluginOptionsEditorProps, KeyValue } from '@grafana/data';
1
+ import { type DataSourceJsonData, type DataSourcePluginOptionsEditorProps, type KeyValue } from '@grafana/data';
2
2
  export interface Props<T extends DataSourceJsonData, S> {
3
3
  editorProps: DataSourcePluginOptionsEditorProps<T, S>;
4
4
  showCACert?: boolean;