@grafana/plugin-ui 0.17.9 → 0.18.0

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 (113) hide show
  1. package/dist/cjs/index.cjs +97 -2934
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +19 -23
  4. package/dist/esm/async-query-data/DatasourceWithAsyncBackend.js +2 -2
  5. package/dist/esm/async-query-data/DatasourceWithAsyncBackend.js.map +1 -1
  6. package/dist/esm/components/DataSourcePicker/DataSourcePicker.js +88 -87
  7. package/dist/esm/components/DataSourcePicker/DataSourcePicker.js.map +1 -1
  8. package/dist/esm/datasource/SqlDatasource.js +5 -3
  9. package/dist/esm/datasource/SqlDatasource.js.map +1 -1
  10. package/dist/esm/index.d.ts +19 -23
  11. package/dist/esm/index.js +0 -1
  12. package/dist/esm/index.js.map +1 -1
  13. package/dist/esm/node_modules/rxjs/dist/esm5/internal/observable/innerFrom.js +2 -2
  14. package/dist/esm/node_modules/rxjs/dist/esm5/internal/observable/innerFrom.js.map +1 -1
  15. package/package.json +5 -2
  16. package/dist/esm/_virtual/index.js +0 -6
  17. package/dist/esm/_virtual/index.js.map +0 -1
  18. package/dist/esm/_virtual/re.js +0 -4
  19. package/dist/esm/_virtual/re.js.map +0 -1
  20. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js +0 -30
  21. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js.map +0 -1
  22. package/dist/esm/node_modules/semver/classes/comparator.js +0 -160
  23. package/dist/esm/node_modules/semver/classes/comparator.js.map +0 -1
  24. package/dist/esm/node_modules/semver/classes/range.js +0 -595
  25. package/dist/esm/node_modules/semver/classes/range.js.map +0 -1
  26. package/dist/esm/node_modules/semver/classes/semver.js +0 -366
  27. package/dist/esm/node_modules/semver/classes/semver.js.map +0 -1
  28. package/dist/esm/node_modules/semver/functions/clean.js +0 -20
  29. package/dist/esm/node_modules/semver/functions/clean.js.map +0 -1
  30. package/dist/esm/node_modules/semver/functions/cmp.js +0 -71
  31. package/dist/esm/node_modules/semver/functions/cmp.js.map +0 -1
  32. package/dist/esm/node_modules/semver/functions/coerce.js +0 -76
  33. package/dist/esm/node_modules/semver/functions/coerce.js.map +0 -1
  34. package/dist/esm/node_modules/semver/functions/compare-build.js +0 -21
  35. package/dist/esm/node_modules/semver/functions/compare-build.js.map +0 -1
  36. package/dist/esm/node_modules/semver/functions/compare-loose.js +0 -17
  37. package/dist/esm/node_modules/semver/functions/compare-loose.js.map +0 -1
  38. package/dist/esm/node_modules/semver/functions/compare.js +0 -19
  39. package/dist/esm/node_modules/semver/functions/compare.js.map +0 -1
  40. package/dist/esm/node_modules/semver/functions/diff.js +0 -72
  41. package/dist/esm/node_modules/semver/functions/diff.js.map +0 -1
  42. package/dist/esm/node_modules/semver/functions/eq.js +0 -17
  43. package/dist/esm/node_modules/semver/functions/eq.js.map +0 -1
  44. package/dist/esm/node_modules/semver/functions/gt.js +0 -17
  45. package/dist/esm/node_modules/semver/functions/gt.js.map +0 -1
  46. package/dist/esm/node_modules/semver/functions/gte.js +0 -17
  47. package/dist/esm/node_modules/semver/functions/gte.js.map +0 -1
  48. package/dist/esm/node_modules/semver/functions/inc.js +0 -33
  49. package/dist/esm/node_modules/semver/functions/inc.js.map +0 -1
  50. package/dist/esm/node_modules/semver/functions/lt.js +0 -17
  51. package/dist/esm/node_modules/semver/functions/lt.js.map +0 -1
  52. package/dist/esm/node_modules/semver/functions/lte.js +0 -17
  53. package/dist/esm/node_modules/semver/functions/lte.js.map +0 -1
  54. package/dist/esm/node_modules/semver/functions/major.js +0 -17
  55. package/dist/esm/node_modules/semver/functions/major.js.map +0 -1
  56. package/dist/esm/node_modules/semver/functions/minor.js +0 -17
  57. package/dist/esm/node_modules/semver/functions/minor.js.map +0 -1
  58. package/dist/esm/node_modules/semver/functions/neq.js +0 -17
  59. package/dist/esm/node_modules/semver/functions/neq.js.map +0 -1
  60. package/dist/esm/node_modules/semver/functions/parse.js +0 -30
  61. package/dist/esm/node_modules/semver/functions/parse.js.map +0 -1
  62. package/dist/esm/node_modules/semver/functions/patch.js +0 -17
  63. package/dist/esm/node_modules/semver/functions/patch.js.map +0 -1
  64. package/dist/esm/node_modules/semver/functions/prerelease.js +0 -20
  65. package/dist/esm/node_modules/semver/functions/prerelease.js.map +0 -1
  66. package/dist/esm/node_modules/semver/functions/rcompare.js +0 -17
  67. package/dist/esm/node_modules/semver/functions/rcompare.js.map +0 -1
  68. package/dist/esm/node_modules/semver/functions/rsort.js +0 -17
  69. package/dist/esm/node_modules/semver/functions/rsort.js.map +0 -1
  70. package/dist/esm/node_modules/semver/functions/satisfies.js +0 -24
  71. package/dist/esm/node_modules/semver/functions/satisfies.js.map +0 -1
  72. package/dist/esm/node_modules/semver/functions/sort.js +0 -17
  73. package/dist/esm/node_modules/semver/functions/sort.js.map +0 -1
  74. package/dist/esm/node_modules/semver/functions/truncate.js +0 -62
  75. package/dist/esm/node_modules/semver/functions/truncate.js.map +0 -1
  76. package/dist/esm/node_modules/semver/functions/valid.js +0 -20
  77. package/dist/esm/node_modules/semver/functions/valid.js.map +0 -1
  78. package/dist/esm/node_modules/semver/index.js +0 -146
  79. package/dist/esm/node_modules/semver/index.js.map +0 -1
  80. package/dist/esm/node_modules/semver/internal/constants.js +0 -47
  81. package/dist/esm/node_modules/semver/internal/constants.js.map +0 -1
  82. package/dist/esm/node_modules/semver/internal/debug.js +0 -21
  83. package/dist/esm/node_modules/semver/internal/debug.js.map +0 -1
  84. package/dist/esm/node_modules/semver/internal/identifiers.js +0 -39
  85. package/dist/esm/node_modules/semver/internal/identifiers.js.map +0 -1
  86. package/dist/esm/node_modules/semver/internal/lrucache.js +0 -52
  87. package/dist/esm/node_modules/semver/internal/lrucache.js.map +0 -1
  88. package/dist/esm/node_modules/semver/internal/parse-options.js +0 -27
  89. package/dist/esm/node_modules/semver/internal/parse-options.js.map +0 -1
  90. package/dist/esm/node_modules/semver/internal/re.js +0 -238
  91. package/dist/esm/node_modules/semver/internal/re.js.map +0 -1
  92. package/dist/esm/node_modules/semver/ranges/gtr.js +0 -18
  93. package/dist/esm/node_modules/semver/ranges/gtr.js.map +0 -1
  94. package/dist/esm/node_modules/semver/ranges/intersects.js +0 -21
  95. package/dist/esm/node_modules/semver/ranges/intersects.js.map +0 -1
  96. package/dist/esm/node_modules/semver/ranges/ltr.js +0 -18
  97. package/dist/esm/node_modules/semver/ranges/ltr.js.map +0 -1
  98. package/dist/esm/node_modules/semver/ranges/max-satisfying.js +0 -40
  99. package/dist/esm/node_modules/semver/ranges/max-satisfying.js.map +0 -1
  100. package/dist/esm/node_modules/semver/ranges/min-satisfying.js +0 -39
  101. package/dist/esm/node_modules/semver/ranges/min-satisfying.js.map +0 -1
  102. package/dist/esm/node_modules/semver/ranges/min-version.js +0 -77
  103. package/dist/esm/node_modules/semver/ranges/min-version.js.map +0 -1
  104. package/dist/esm/node_modules/semver/ranges/outside.js +0 -101
  105. package/dist/esm/node_modules/semver/ranges/outside.js.map +0 -1
  106. package/dist/esm/node_modules/semver/ranges/simplify.js +0 -62
  107. package/dist/esm/node_modules/semver/ranges/simplify.js.map +0 -1
  108. package/dist/esm/node_modules/semver/ranges/subset.js +0 -264
  109. package/dist/esm/node_modules/semver/ranges/subset.js.map +0 -1
  110. package/dist/esm/node_modules/semver/ranges/to-comparators.js +0 -22
  111. package/dist/esm/node_modules/semver/ranges/to-comparators.js.map +0 -1
  112. package/dist/esm/node_modules/semver/ranges/valid.js +0 -25
  113. package/dist/esm/node_modules/semver/ranges/valid.js.map +0 -1
@@ -1,9 +1,9 @@
1
- import React, { ComponentProps, PureComponent, ReactElement, ReactNode, Component, ErrorInfo, FunctionComponent, HTMLProps } from 'react';
1
+ import React, { ComponentProps, ReactElement, ReactNode, Component, ErrorInfo, PureComponent, FunctionComponent, HTMLProps } from 'react';
2
2
  import { Input, Segment as Segment$1, monacoTypes, Monaco, ButtonProps, Field, PopoverContent, Switch, SelectCommonProps, InlineLabel } from '@grafana/ui';
3
- import { DataSourceInstanceSettings, SelectableValue, DataSourceJsonData, VariableSuggestion, TimeRange, DataFrame, MetricFindValue, ThemeSpacingTokens, ScopedVars, VariableModel, DataFrameView, QueryEditorProps as QueryEditorProps$1, DataSourceSettings, RegistryItem, DataSourceApi, Registry, DataQuery as DataQuery$1, PanelData, DataQueryRequest, DataQueryResponse, LoadingState } from '@grafana/data';
4
- import { DataSourceSrv, DataSourceWithBackend, TemplateSrv } from '@grafana/runtime';
3
+ import { DataSourceInstanceSettings, DataSourceJsonData, VariableSuggestion, SelectableValue, TimeRange, DataFrame, MetricFindValue, ThemeSpacingTokens, ScopedVars, VariableModel, DataFrameView, QueryEditorProps as QueryEditorProps$1, DataSourceSettings, RegistryItem, DataSourceApi, Registry, DataQuery as DataQuery$1, PanelData, DataQueryRequest, DataQueryResponse, LoadingState } from '@grafana/data';
5
4
  import { JsonTree } from '@react-awesome-query-builder/ui';
6
5
  import { DataQuery } from '@grafana/schema';
6
+ import { DataSourceWithBackend, TemplateSrv } from '@grafana/runtime';
7
7
  import { SqlLanguage } from 'sql-formatter';
8
8
  import { Grammar } from 'prismjs';
9
9
  import { Observable } from 'rxjs';
@@ -46,8 +46,16 @@ interface DatePickerWithInputProps extends Omit<ComponentProps<typeof Input>, 'r
46
46
  declare const DatePickerWithInput: (props: DatePickerWithInputProps) => React.JSX.Element;
47
47
 
48
48
  interface Props$s {
49
- onChange: (ds: DataSourceInstanceSettings) => void;
50
- current: string | null;
49
+ /**
50
+ * Receives the selected data source's list item (`uid`, `type`, `name`, `meta`). Call
51
+ * `getDataSourceInstanceSettings(ds.uid)` from `@grafana/plugin-compat` if you need the full settings.
52
+ */
53
+ onChange: (ds: Pick<DataSourceInstanceSettings, 'uid' | 'type' | 'name' | 'meta'>) => void;
54
+ /**
55
+ * Reference to the selected data source, resolved the way Grafana does: uid, name, template variable or
56
+ * built-in. `null`/`undefined` resolves to the default data source.
57
+ */
58
+ current?: string | null;
51
59
  hideTextValue?: boolean;
52
60
  onBlur?: () => void;
53
61
  autoFocus?: boolean;
@@ -62,20 +70,7 @@ interface Props$s {
62
70
  pluginId?: string;
63
71
  noDefault?: boolean;
64
72
  }
65
- interface State$1 {
66
- error?: string;
67
- }
68
- declare class DataSourcePicker extends PureComponent<Props$s, State$1> {
69
- dataSourceSrv: DataSourceSrv;
70
- static defaultProps: Partial<Props$s>;
71
- state: State$1;
72
- constructor(props: Props$s);
73
- componentDidMount(): void;
74
- onChange: (item: SelectableValue<string>) => void;
75
- private getCurrentValue;
76
- getDataSourceOptions(): Array<SelectableValue<string>>;
77
- render(): React.JSX.Element;
78
- }
73
+ declare function DataSourcePicker({ onChange, current: currentProp, hideTextValue, onBlur, autoFocus, openMenuOnFocus, placeholder, noDefault, }: Props$s): React.JSX.Element;
79
74
 
80
75
  type DataLinkConfig = {
81
76
  field: string;
@@ -778,6 +773,9 @@ declare abstract class SqlDatasource extends DataSourceWithBackend<SQLQuery, SQL
778
773
  interpolateVariablesInQueries(queries: SQLQuery[], scopedVars: ScopedVars): SQLQuery[];
779
774
  filterQuery(query: SQLQuery): boolean;
780
775
  applyTemplateVariables(target: SQLQuery, scopedVars: ScopedVars): SQLQuery;
776
+ /**
777
+ * @deprecated `applyTemplateVariables` no longer calls this. Collapsing `''` to `'` breaks valid SQL string literals.
778
+ */
781
779
  clean(value: string): string;
782
780
  metricFindQuery(query: string, optionalOptions?: MetricFindQueryOptions): Promise<MetricFindValue[]>;
783
781
  runSql<T extends object>(query: string, options?: RunSQLOptions): Promise<DataFrameView<T>>;
@@ -1519,8 +1517,6 @@ declare function useHealthChecks(): {
1519
1517
  retry: (uid: string) => void;
1520
1518
  };
1521
1519
 
1522
- declare function resolvePluginName(pluginType: string): string;
1523
-
1524
1520
  type UseDatasourceSchemaResult = {
1525
1521
  schema: DatasourceConfigSchema | null;
1526
1522
  loading: boolean;
@@ -2016,5 +2012,5 @@ interface RequestLoopOptions<TQuery extends DataQuery$1 = DataQuery$1> {
2016
2012
  */
2017
2013
  declare function getRequestLooper<T extends DataQuery$1 = DataQuery$1>(req: DataQueryRequest<T>, options: RequestLoopOptions<T>): Observable<DataQueryResponse>;
2018
2014
 
2019
- export { AUTH_GROUP_IDS, AccessoryButton, AdvancedHttpSettings, Auth, AuthMethod, BINARY_OPERATIONS_KEY, CatalogSelector, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemPriority, ConfigDescriptionLink, ConfigSection, ConfigSubSection, ConnectionSettings, CustomHeadersSettings, DataLink, DataLinks, DataSourceDescription, DataSourcePicker, DatasetSelector, DatasourceConfigWizard, DatasourceErrorBoundary, DatasourceWithAsyncBackend, DatePicker, DatePickerWithInput, DebounceInput, EditorField, EditorFieldGroup, EditorHeader, EditorList, EditorMode, EditorRow, EditorRows, EditorStack, EditorSwitch, FlexItem, GroupByRow, InlineSelect, InputGroup, LabelFilters, LinkedToken, MacroType, OperationExplainedBox, OperationList, OperationListExplained, OperationsEditorRow, OperatorType, QUERY_FORMAT_OPTIONS, QueryBuilderHints, QueryEditorMode, QueryEditorModeToggle, QueryEditorRow, QueryFormat, QueryHeaderSwitch, QueryModellerBase, QueryOptionGroup, ROOT_CONFIG_FIELDS, RawQuery, RunQueryButton, RunQueryButtons, SQLEditor, SQLEditorMode, SQLEditorTestUtils, SecureSocksProxyToggle, Segment, Space, SqlDatasource, SqlQueryEditor, StatementPosition, SuggestionKind, TLSSettings, TableSelector, TokenType, buildCelContext, buildCloneDatasourcePayload, buildCreateDatasourcePayload, buildUpdateDatasourcePayload, clearExpressionCache, computeVirtualFieldValues, convertLegacyAuthProps, datasourceToProvisioningYaml, evaluateCelDirect, evaluateCelExpression, evaluateComputedRead, evaluateDependsOn, extractFieldRefs, fetchConfigSchema, formKey, formatDate, formatYamlDiff, generateLLMHint, generateProvisioningTemplate, generateTroubleshootingFields, getConfigSchema, getRequestLooper, getStandardSQLCompletionProvider, getWatchedValue, language as grafanaStandardSQLLanguage, conf as grafanaStandardSQLLanguageConf, isAuthGroupId, isValidCelExpression, parseDependsOn, resolveActiveOverride, resolveGroups, resolvePluginName, resolveRequiredFieldsGroup, toOption, useDatasourceSchema, useHealthChecks };
2020
- export type { Aggregate, AllowedValuesValidationRule, Props$c as AuthProps, BaseFieldRef, BaseValidationRule, ColumnDefinition, ComputedMapping, ConfigField, ConfigGroup, CustomMeta, CustomValidationRule, DB, DataLinkConfig, DatasourceConfigSchema, DatasourceConfigWizardProps, DatasourceHealth, DatePickerProps, DatePickerWithInputProps, DebounceInputProps, DirectMapping, Expression, FieldEffect, FieldItemSchema, FieldKind, FieldOption, FieldOverride, FieldPack, FieldPackID, FieldPatch, FieldRelationship, FieldUI, FieldValidationRule, FormState, HealthState, IndexedPairMapping, Instruction, ItemCountValidationRule, LanguageCompletionProvider, LanguageDefinition, LengthValidationRule, MappingField, MetaDefinition, NameValue, PatternValidationRule, PositionContext, Props$s as Props, QueryBuilderLabelFilter, QueryBuilderOperation, QueryBuilderOperationDefinition, QueryBuilderOperationParamDef, QueryBuilderOperationParamEditorProps, QueryBuilderOperationParamValue, QueryEditorProps, QueryRowFilter, QueryStats, QueryWithDefaults, RAQBFieldTypes, RangeValidationRule, RelationshipType, RequestLoopOptions, ResolvedGroup, ResourceSelectorProps, ResponseParser, Role, RunQueryButtonsProps, RunningQueryInfo, SQLConnectionLimits, SQLExpression, SQLFilters, SQLMonarchLanguage, SQLOptions, SQLQuery, SQLSelectableValue, SchemaDefinition, SecureFieldState, SegmentProps, SqlQueryForInterpolation, SqlQueryModel, State$1 as State, StatementPlacementProvider, StorageMapping, SuggestionKindProvider, Props$f as TLSSettingsProps, TableDefinition, TableFieldSchema, TableIdentifier, TableSchema, TargetLocation, TestQueryModel, UIComponent, UIWidth, ValidationResults, ValueType, VisualQuery, VisualQueryBinary, VisualQueryModeller };
2015
+ export { AUTH_GROUP_IDS, AccessoryButton, AdvancedHttpSettings, Auth, AuthMethod, BINARY_OPERATIONS_KEY, CatalogSelector, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemPriority, ConfigDescriptionLink, ConfigSection, ConfigSubSection, ConnectionSettings, CustomHeadersSettings, DataLink, DataLinks, DataSourceDescription, DataSourcePicker, DatasetSelector, DatasourceConfigWizard, DatasourceErrorBoundary, DatasourceWithAsyncBackend, DatePicker, DatePickerWithInput, DebounceInput, EditorField, EditorFieldGroup, EditorHeader, EditorList, EditorMode, EditorRow, EditorRows, EditorStack, EditorSwitch, FlexItem, GroupByRow, InlineSelect, InputGroup, LabelFilters, LinkedToken, MacroType, OperationExplainedBox, OperationList, OperationListExplained, OperationsEditorRow, OperatorType, QUERY_FORMAT_OPTIONS, QueryBuilderHints, QueryEditorMode, QueryEditorModeToggle, QueryEditorRow, QueryFormat, QueryHeaderSwitch, QueryModellerBase, QueryOptionGroup, ROOT_CONFIG_FIELDS, RawQuery, RunQueryButton, RunQueryButtons, SQLEditor, SQLEditorMode, SQLEditorTestUtils, SecureSocksProxyToggle, Segment, Space, SqlDatasource, SqlQueryEditor, StatementPosition, SuggestionKind, TLSSettings, TableSelector, TokenType, buildCelContext, buildCloneDatasourcePayload, buildCreateDatasourcePayload, buildUpdateDatasourcePayload, clearExpressionCache, computeVirtualFieldValues, convertLegacyAuthProps, datasourceToProvisioningYaml, evaluateCelDirect, evaluateCelExpression, evaluateComputedRead, evaluateDependsOn, extractFieldRefs, fetchConfigSchema, formKey, formatDate, formatYamlDiff, generateLLMHint, generateProvisioningTemplate, generateTroubleshootingFields, getConfigSchema, getRequestLooper, getStandardSQLCompletionProvider, getWatchedValue, language as grafanaStandardSQLLanguage, conf as grafanaStandardSQLLanguageConf, isAuthGroupId, isValidCelExpression, parseDependsOn, resolveActiveOverride, resolveGroups, resolveRequiredFieldsGroup, toOption, useDatasourceSchema, useHealthChecks };
2016
+ export type { Aggregate, AllowedValuesValidationRule, Props$c as AuthProps, BaseFieldRef, BaseValidationRule, ColumnDefinition, ComputedMapping, ConfigField, ConfigGroup, CustomMeta, CustomValidationRule, DB, DataLinkConfig, DatasourceConfigSchema, DatasourceConfigWizardProps, DatasourceHealth, DatePickerProps, DatePickerWithInputProps, DebounceInputProps, DirectMapping, Expression, FieldEffect, FieldItemSchema, FieldKind, FieldOption, FieldOverride, FieldPack, FieldPackID, FieldPatch, FieldRelationship, FieldUI, FieldValidationRule, FormState, HealthState, IndexedPairMapping, Instruction, ItemCountValidationRule, LanguageCompletionProvider, LanguageDefinition, LengthValidationRule, MappingField, MetaDefinition, NameValue, PatternValidationRule, PositionContext, Props$s as Props, QueryBuilderLabelFilter, QueryBuilderOperation, QueryBuilderOperationDefinition, QueryBuilderOperationParamDef, QueryBuilderOperationParamEditorProps, QueryBuilderOperationParamValue, QueryEditorProps, QueryRowFilter, QueryStats, QueryWithDefaults, RAQBFieldTypes, RangeValidationRule, RelationshipType, RequestLoopOptions, ResolvedGroup, ResourceSelectorProps, ResponseParser, Role, RunQueryButtonsProps, RunningQueryInfo, SQLConnectionLimits, SQLExpression, SQLFilters, SQLMonarchLanguage, SQLOptions, SQLQuery, SQLSelectableValue, SchemaDefinition, SecureFieldState, SegmentProps, SqlQueryForInterpolation, SqlQueryModel, StatementPlacementProvider, StorageMapping, SuggestionKindProvider, Props$f as TLSSettingsProps, TableDefinition, TableFieldSchema, TableIdentifier, TableSchema, TargetLocation, TestQueryModel, UIComponent, UIWidth, ValidationResults, ValueType, VisualQuery, VisualQueryBinary, VisualQueryModeller };
@@ -1,5 +1,5 @@
1
1
  import { DataSourceWithBackend, config, getBackendSrv, toDataQueryResponse } from '@grafana/runtime';
2
- import { s as semverExports } from '../_virtual/index.js';
2
+ import { lt } from 'semver';
3
3
  import { getRequestLooper } from './requestLooper.js';
4
4
  import { of } from '../node_modules/rxjs/dist/esm5/internal/observable/of.js';
5
5
  import { merge } from '../node_modules/rxjs/dist/esm5/internal/observable/merge.js';
@@ -97,7 +97,7 @@ class DatasourceWithAsyncBackend extends DataSourceWithBackend {
97
97
  };
98
98
  const cachingDisabled = !config.featureToggles.awsAsyncQueryCaching;
99
99
  if (cachingDisabled && isRunning(status)) {
100
- const requestSkipQueryCacheUnsupported = semverExports.lt(config.buildInfo.version, "10.2.3");
100
+ const requestSkipQueryCacheUnsupported = lt(config.buildInfo.version, "10.2.3");
101
101
  if (requestSkipQueryCacheUnsupported) {
102
102
  return getBackendSrv().fetch({
103
103
  method: "POST",
@@ -1 +1 @@
1
- {"version":3,"file":"DatasourceWithAsyncBackend.js","sources":["../../../src/async-query-data/DatasourceWithAsyncBackend.ts"],"sourcesContent":["import type {\n DataFrame,\n DataQuery,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n DataSourceJsonData,\n} from '@grafana/data';\nimport {\n DataSourceWithBackend,\n config,\n getBackendSrv,\n toDataQueryResponse,\n type BackendDataSourceResponse,\n} from '@grafana/runtime';\nimport { merge, of, type Observable } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { lt } from 'semver';\nimport { getRequestLooper } from './requestLooper';\n\nexport interface CustomMeta {\n queryID: string;\n status: string;\n}\n\nexport interface RunningQueryInfo {\n queryID?: string;\n shouldCancel?: boolean;\n}\n\ninterface DataQueryMeta {\n meta?: { queryFlow?: 'async' | 'sync' };\n}\n\nconst RUNNING_STATUSES = ['started', 'submitted', 'running'];\nconst isRunning = (status = '') => RUNNING_STATUSES.includes(status);\nconst isCustomMeta = (meta: unknown): meta is CustomMeta => {\n return !!(typeof meta === 'object' && meta?.hasOwnProperty('queryID') && meta?.hasOwnProperty('status'));\n};\n\nexport class DatasourceWithAsyncBackend<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData,\n> extends DataSourceWithBackend<TQuery, TOptions> {\n private runningQueries: { [hash: string]: RunningQueryInfo } = {};\n private requestCounter = 100;\n private requestIdPrefix: number | string;\n\n constructor(instanceSettings: DataSourceInstanceSettings<TOptions>) {\n super(instanceSettings);\n this.requestIdPrefix = instanceSettings.uid ?? instanceSettings.id;\n }\n\n query(request: DataQueryRequest<TQuery>): Observable<DataQueryResponse> {\n const targets = this.filterQuery ? request.targets.filter(this.filterQuery) : request.targets;\n if (!targets.length) {\n return of({ data: [] });\n }\n const all: Array<Observable<DataQueryResponse>> = [];\n for (let target of targets) {\n if (target.hide) {\n continue;\n }\n all.push(this.doSingle(target, request));\n }\n return merge(...all);\n }\n\n storeQuery(target: TQuery, queryInfo: RunningQueryInfo) {\n const key = JSON.stringify(target);\n const existingQueryInfo = this.runningQueries[key] || {};\n this.runningQueries[key] = { ...existingQueryInfo, ...queryInfo };\n }\n\n getQuery(target: TQuery) {\n const key = JSON.stringify(target);\n return this.runningQueries[key] || {};\n }\n\n removeQuery(target: TQuery) {\n const key = JSON.stringify(target);\n delete this.runningQueries[key];\n }\n\n doSingle(target: TQuery, request: DataQueryRequest<TQuery>): Observable<DataQueryResponse> {\n let queryID: string | undefined = undefined;\n let status: string | undefined = undefined;\n let allData: DataFrame[] = [];\n\n return getRequestLooper(\n { ...request, targets: [target], requestId: `${this.requestIdPrefix}_${this.requestCounter++}` },\n {\n /**\n * Additional query to execute if the current query is still in a running state\n */\n getNextQuery: (rsp: DataQueryResponse) => {\n if (rsp.data?.length) {\n const first: DataFrame = rsp.data[0];\n const meta = first.meta?.custom;\n\n if (isCustomMeta(meta) && isRunning(meta.status)) {\n queryID = meta.queryID;\n status = meta.status;\n this.storeQuery(target, { queryID });\n return { ...target, queryID };\n }\n }\n\n this.removeQuery(target);\n return undefined;\n },\n\n /**\n * The original request\n */\n query: (request: DataQueryRequest<TQuery>) => {\n const { range, targets, requestId, intervalMs, maxDataPoints } = request;\n const [_query] = targets;\n const query: TQuery & DataQueryMeta = {\n ..._query,\n meta: { queryFlow: 'async' },\n intervalMs,\n maxDataPoints,\n // getRef optionally chained to support < v8.3.x of Grafana\n datasource: this?.getRef(),\n datasourceId: this.id,\n ...this.applyTemplateVariables(_query, request.scopedVars),\n };\n\n // Manually bypass the query cache for running queries if the caching service is not enabled.\n // The caching service handles bypassing the query cache automatically when it is enabled.\n const cachingDisabled = !config.featureToggles.awsAsyncQueryCaching;\n if (cachingDisabled && isRunning(status)) {\n const requestSkipQueryCacheUnsupported = lt(config.buildInfo.version, '10.2.3');\n if (requestSkipQueryCacheUnsupported) {\n return getBackendSrv()\n .fetch<BackendDataSourceResponse>({\n method: 'POST',\n url: '/api/ds/query',\n headers: { 'X-Cache-Skip': true },\n requestId,\n data: {\n queries: [query],\n range: range,\n from: range.from.valueOf().toString(),\n to: range.to.valueOf().toString(),\n },\n })\n .pipe(\n map((result) => ({ data: toDataQueryResponse(result).data })),\n catchError((err) => of(toDataQueryResponse(err)))\n );\n }\n\n return super.query({ ...request, targets: [query], skipQueryCache: true });\n }\n\n return super.query({ ...request, targets: [query] });\n },\n\n /**\n * Process the results\n */\n process: (data: DataFrame[]) => {\n for (const frame of data) {\n if (frame.fields.length > 0) {\n allData.push(frame);\n }\n }\n\n return allData;\n },\n\n shouldCancel: () => {\n const { shouldCancel } = this.getQuery(target);\n return !!shouldCancel;\n },\n\n /**\n * Callback that gets executed when unsubscribed\n */\n onCancel: () => {\n if (queryID) {\n this.removeQuery(target);\n this.postResource('cancel', {\n queryId: queryID,\n }).catch((err) => {\n err.isHandled = true; // avoid the popup\n console.error(`error cancelling query ID: ${queryID}`, err);\n });\n }\n },\n }\n );\n }\n\n // cancel sets shouldCancel to tell requestLooper to cancel the query\n cancel = (target: TQuery) => {\n this.storeQuery(target, { shouldCancel: true });\n };\n}\n"],"names":["request","lt"],"mappings":"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"}
1
+ {"version":3,"file":"DatasourceWithAsyncBackend.js","sources":["../../../src/async-query-data/DatasourceWithAsyncBackend.ts"],"sourcesContent":["import type {\n DataFrame,\n DataQuery,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n DataSourceJsonData,\n} from '@grafana/data';\nimport {\n DataSourceWithBackend,\n config,\n getBackendSrv,\n toDataQueryResponse,\n type BackendDataSourceResponse,\n} from '@grafana/runtime';\nimport { merge, of, type Observable } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { lt } from 'semver';\nimport { getRequestLooper } from './requestLooper';\n\nexport interface CustomMeta {\n queryID: string;\n status: string;\n}\n\nexport interface RunningQueryInfo {\n queryID?: string;\n shouldCancel?: boolean;\n}\n\ninterface DataQueryMeta {\n meta?: { queryFlow?: 'async' | 'sync' };\n}\n\nconst RUNNING_STATUSES = ['started', 'submitted', 'running'];\nconst isRunning = (status = '') => RUNNING_STATUSES.includes(status);\nconst isCustomMeta = (meta: unknown): meta is CustomMeta => {\n return !!(typeof meta === 'object' && meta?.hasOwnProperty('queryID') && meta?.hasOwnProperty('status'));\n};\n\nexport class DatasourceWithAsyncBackend<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData,\n> extends DataSourceWithBackend<TQuery, TOptions> {\n private runningQueries: { [hash: string]: RunningQueryInfo } = {};\n private requestCounter = 100;\n private requestIdPrefix: number | string;\n\n constructor(instanceSettings: DataSourceInstanceSettings<TOptions>) {\n super(instanceSettings);\n this.requestIdPrefix = instanceSettings.uid ?? instanceSettings.id;\n }\n\n query(request: DataQueryRequest<TQuery>): Observable<DataQueryResponse> {\n const targets = this.filterQuery ? request.targets.filter(this.filterQuery) : request.targets;\n if (!targets.length) {\n return of({ data: [] });\n }\n const all: Array<Observable<DataQueryResponse>> = [];\n for (let target of targets) {\n if (target.hide) {\n continue;\n }\n all.push(this.doSingle(target, request));\n }\n return merge(...all);\n }\n\n storeQuery(target: TQuery, queryInfo: RunningQueryInfo) {\n const key = JSON.stringify(target);\n const existingQueryInfo = this.runningQueries[key] || {};\n this.runningQueries[key] = { ...existingQueryInfo, ...queryInfo };\n }\n\n getQuery(target: TQuery) {\n const key = JSON.stringify(target);\n return this.runningQueries[key] || {};\n }\n\n removeQuery(target: TQuery) {\n const key = JSON.stringify(target);\n delete this.runningQueries[key];\n }\n\n doSingle(target: TQuery, request: DataQueryRequest<TQuery>): Observable<DataQueryResponse> {\n let queryID: string | undefined = undefined;\n let status: string | undefined = undefined;\n let allData: DataFrame[] = [];\n\n return getRequestLooper(\n { ...request, targets: [target], requestId: `${this.requestIdPrefix}_${this.requestCounter++}` },\n {\n /**\n * Additional query to execute if the current query is still in a running state\n */\n getNextQuery: (rsp: DataQueryResponse) => {\n if (rsp.data?.length) {\n const first: DataFrame = rsp.data[0];\n const meta = first.meta?.custom;\n\n if (isCustomMeta(meta) && isRunning(meta.status)) {\n queryID = meta.queryID;\n status = meta.status;\n this.storeQuery(target, { queryID });\n return { ...target, queryID };\n }\n }\n\n this.removeQuery(target);\n return undefined;\n },\n\n /**\n * The original request\n */\n query: (request: DataQueryRequest<TQuery>) => {\n const { range, targets, requestId, intervalMs, maxDataPoints } = request;\n const [_query] = targets;\n const query: TQuery & DataQueryMeta = {\n ..._query,\n meta: { queryFlow: 'async' },\n intervalMs,\n maxDataPoints,\n // getRef optionally chained to support < v8.3.x of Grafana\n datasource: this?.getRef(),\n datasourceId: this.id,\n ...this.applyTemplateVariables(_query, request.scopedVars),\n };\n\n // Manually bypass the query cache for running queries if the caching service is not enabled.\n // The caching service handles bypassing the query cache automatically when it is enabled.\n const cachingDisabled = !config.featureToggles.awsAsyncQueryCaching;\n if (cachingDisabled && isRunning(status)) {\n const requestSkipQueryCacheUnsupported = lt(config.buildInfo.version, '10.2.3');\n if (requestSkipQueryCacheUnsupported) {\n return getBackendSrv()\n .fetch<BackendDataSourceResponse>({\n method: 'POST',\n url: '/api/ds/query',\n headers: { 'X-Cache-Skip': true },\n requestId,\n data: {\n queries: [query],\n range: range,\n from: range.from.valueOf().toString(),\n to: range.to.valueOf().toString(),\n },\n })\n .pipe(\n map((result) => ({ data: toDataQueryResponse(result).data })),\n catchError((err) => of(toDataQueryResponse(err)))\n );\n }\n\n return super.query({ ...request, targets: [query], skipQueryCache: true });\n }\n\n return super.query({ ...request, targets: [query] });\n },\n\n /**\n * Process the results\n */\n process: (data: DataFrame[]) => {\n for (const frame of data) {\n if (frame.fields.length > 0) {\n allData.push(frame);\n }\n }\n\n return allData;\n },\n\n shouldCancel: () => {\n const { shouldCancel } = this.getQuery(target);\n return !!shouldCancel;\n },\n\n /**\n * Callback that gets executed when unsubscribed\n */\n onCancel: () => {\n if (queryID) {\n this.removeQuery(target);\n this.postResource('cancel', {\n queryId: queryID,\n }).catch((err) => {\n err.isHandled = true; // avoid the popup\n console.error(`error cancelling query ID: ${queryID}`, err);\n });\n }\n },\n }\n );\n }\n\n // cancel sets shouldCancel to tell requestLooper to cancel the query\n cancel = (target: TQuery) => {\n this.storeQuery(target, { shouldCancel: true });\n };\n}\n"],"names":["request"],"mappings":";;;;;;;;;;;AAkCA,MAAM,gBAAA,GAAmB,CAAC,SAAA,EAAW,WAAA,EAAa,SAAS,CAAA;AAC3D,MAAM,YAAY,CAAC,MAAA,GAAS,EAAA,KAAO,gBAAA,CAAiB,SAAS,MAAM,CAAA;AACnE,MAAM,YAAA,GAAe,CAAC,IAAA,KAAsC;AAC1D,EAAA,OAAO,CAAC,EAAE,OAAO,IAAA,KAAS,aAAY,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,cAAA,CAAe,SAAA,CAAA,CAAA,KAAc,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,cAAA,CAAe,QAAA,CAAA,CAAA,CAAA;AAChG,CAAA;AAEO,MAAM,mCAGH,qBAAA,CAAwC;AAAA,EAKhD,YAAY,gBAAA,EAAwD;AAhDtE,IAAA,IAAA,EAAA;AAiDI,IAAA,KAAA,CAAM,gBAAgB,CAAA;AALxB,IAAA,aAAA,CAAA,IAAA,EAAQ,kBAAuD,EAAC,CAAA;AAChE,IAAA,aAAA,CAAA,IAAA,EAAQ,gBAAA,EAAiB,GAAA,CAAA;AACzB,IAAA,aAAA,CAAA,IAAA,EAAQ,iBAAA,CAAA;AAuJR;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,EAAS,CAAC,MAAA,KAAmB;AAC3B,MAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,EAAE,YAAA,EAAc,MAAM,CAAA;AAAA,IAChD,CAAA,CAAA;AArJE,IAAA,IAAA,CAAK,eAAA,GAAA,CAAkB,EAAA,GAAA,gBAAA,CAAiB,GAAA,KAAjB,IAAA,GAAA,EAAA,GAAwB,gBAAA,CAAiB,EAAA;AAAA,EAClE;AAAA,EAEA,MAAM,OAAA,EAAkE;AACtE,IAAA,MAAM,OAAA,GAAU,KAAK,WAAA,GAAc,OAAA,CAAQ,QAAQ,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,GAAI,OAAA,CAAQ,OAAA;AACtF,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,MAAA,OAAO,EAAA,CAAG,EAAE,IAAA,EAAM,IAAI,CAAA;AAAA,IACxB;AACA,IAAA,MAAM,MAA4C,EAAC;AACnD,IAAA,KAAA,IAAS,UAAU,OAAA,EAAS;AAC1B,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA;AAAA,MACF;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,EACrB;AAAA,EAEA,UAAA,CAAW,QAAgB,SAAA,EAA6B;AACtD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACjC,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,cAAA,CAAe,GAAG,KAAK,EAAC;AACvD,IAAA,IAAA,CAAK,eAAe,GAAG,CAAA,GAAI,EAAE,GAAG,iBAAA,EAAmB,GAAG,SAAA,EAAU;AAAA,EAClE;AAAA,EAEA,SAAS,MAAA,EAAgB;AACvB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACjC,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,IAAK,EAAC;AAAA,EACtC;AAAA,EAEA,YAAY,MAAA,EAAgB;AAC1B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACjC,IAAA,OAAO,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA,EAChC;AAAA,EAEA,QAAA,CAAS,QAAgB,OAAA,EAAkE;AACzF,IAAA,IAAI,OAAA,GAA8B,MAAA;AAClC,IAAA,IAAI,MAAA,GAA6B,MAAA;AACjC,IAAA,IAAI,UAAuB,EAAC;AAE5B,IAAA,OAAO,gBAAA;AAAA,MACL,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,CAAC,MAAM,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,eAAe,CAAA,CAAA,EAAI,IAAA,CAAK,gBAAgB,CAAA,CAAA,EAAG;AAAA,MAC/F;AAAA;AAAA;AAAA;AAAA,QAIE,YAAA,EAAc,CAAC,GAAA,KAA2B;AA/FlD,UAAA,IAAA,EAAA,EAAA,EAAA;AAgGU,UAAA,IAAA,CAAI,EAAA,GAAA,GAAA,CAAI,IAAA,KAAJ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAU,MAAA,EAAQ;AACpB,YAAA,MAAM,KAAA,GAAmB,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACnC,YAAA,MAAM,IAAA,GAAA,CAAO,EAAA,GAAA,KAAA,CAAM,IAAA,KAAN,IAAA,GAAA,MAAA,GAAA,EAAA,CAAY,MAAA;AAEzB,YAAA,IAAI,aAAa,IAAI,CAAA,IAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA,EAAG;AAChD,cAAA,OAAA,GAAU,IAAA,CAAK,OAAA;AACf,cAAA,MAAA,GAAS,IAAA,CAAK,MAAA;AACd,cAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA;AACnC,cAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAQ;AAAA,YAC9B;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AACvB,UAAA,OAAO,MAAA;AAAA,QACT,CAAA;AAAA;AAAA;AAAA;AAAA,QAKA,KAAA,EAAO,CAACA,QAAAA,KAAsC;AAC5C,UAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,UAAA,EAAY,eAAc,GAAIA,QAAAA;AACjE,UAAA,MAAM,CAAC,MAAM,CAAA,GAAI,OAAA;AACjB,UAAA,MAAM,KAAA,GAAgC;AAAA,YACpC,GAAG,MAAA;AAAA,YACH,IAAA,EAAM,EAAE,SAAA,EAAW,OAAA,EAAQ;AAAA,YAC3B,UAAA;AAAA,YACA,aAAA;AAAA;AAAA,YAEA,YAAY,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,MAAA,EAAA;AAAA,YAClB,cAAc,IAAA,CAAK,EAAA;AAAA,YACnB,GAAG,IAAA,CAAK,sBAAA,CAAuB,MAAA,EAAQA,SAAQ,UAAU;AAAA,WAC3D;AAIA,UAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,CAAO,cAAA,CAAe,oBAAA;AAC/C,UAAA,IAAI,eAAA,IAAmB,SAAA,CAAU,MAAM,CAAA,EAAG;AACxC,YAAA,MAAM,gCAAA,GAAmC,EAAA,CAAG,MAAA,CAAO,SAAA,CAAU,SAAS,QAAQ,CAAA;AAC9E,YAAA,IAAI,gCAAA,EAAkC;AACpC,cAAA,OAAO,aAAA,GACJ,KAAA,CAAiC;AAAA,gBAChC,MAAA,EAAQ,MAAA;AAAA,gBACR,GAAA,EAAK,eAAA;AAAA,gBACL,OAAA,EAAS,EAAE,cAAA,EAAgB,IAAA,EAAK;AAAA,gBAChC,SAAA;AAAA,gBACA,IAAA,EAAM;AAAA,kBACJ,OAAA,EAAS,CAAC,KAAK,CAAA;AAAA,kBACf,KAAA;AAAA,kBACA,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,OAAA,GAAU,QAAA,EAAS;AAAA,kBACpC,EAAA,EAAI,KAAA,CAAM,EAAA,CAAG,OAAA,GAAU,QAAA;AAAS;AAClC,eACD,CAAA,CACA,IAAA;AAAA,gBACC,GAAA,CAAI,CAAC,MAAA,MAAY,EAAE,MAAM,mBAAA,CAAoB,MAAM,CAAA,CAAE,IAAA,EAAK,CAAE,CAAA;AAAA,gBAC5D,WAAW,CAAC,GAAA,KAAQ,GAAG,mBAAA,CAAoB,GAAG,CAAC,CAAC;AAAA,eAClD;AAAA,YACJ;AAEA,YAAA,OAAO,KAAA,CAAM,KAAA,CAAM,EAAE,GAAGA,QAAAA,EAAS,OAAA,EAAS,CAAC,KAAK,CAAA,EAAG,cAAA,EAAgB,IAAA,EAAM,CAAA;AAAA,UAC3E;AAEA,UAAA,OAAO,KAAA,CAAM,MAAM,EAAE,GAAGA,UAAS,OAAA,EAAS,CAAC,KAAK,CAAA,EAAG,CAAA;AAAA,QACrD,CAAA;AAAA;AAAA;AAAA;AAAA,QAKA,OAAA,EAAS,CAAC,IAAA,KAAsB;AAC9B,UAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,YAAA,IAAI,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC3B,cAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,YACpB;AAAA,UACF;AAEA,UAAA,OAAO,OAAA;AAAA,QACT,CAAA;AAAA,QAEA,cAAc,MAAM;AAClB,UAAA,MAAM,EAAE,YAAA,EAAa,GAAI,IAAA,CAAK,SAAS,MAAM,CAAA;AAC7C,UAAA,OAAO,CAAC,CAAC,YAAA;AAAA,QACX,CAAA;AAAA;AAAA;AAAA;AAAA,QAKA,UAAU,MAAM;AACd,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AACvB,YAAA,IAAA,CAAK,aAAa,QAAA,EAAU;AAAA,cAC1B,OAAA,EAAS;AAAA,aACV,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAChB,cAAA,GAAA,CAAI,SAAA,GAAY,IAAA;AAChB,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA;AAAA,YAC5D,CAAC,CAAA;AAAA,UACH;AAAA,QACF;AAAA;AACF,KACF;AAAA,EACF;AAMF;;;;"}
@@ -1,103 +1,104 @@
1
- import React, { PureComponent } from 'react';
1
+ import React from 'react';
2
2
  import { Select, Stack } from '@grafana/ui';
3
3
  import '@grafana/data';
4
4
  import { selectors } from '@grafana/e2e-selectors';
5
+ import { useDataSourceInstanceList, useDataSourceInstanceListItem } from '@grafana/plugin-compat/datasources';
5
6
  import { isUnsignedPluginSignature, PluginSignatureBadge } from '../Plugins/PluginSignatureBadge.js';
6
- import { getDataSourceSrv } from '@grafana/runtime';
7
7
 
8
- var __defProp$6 = Object.defineProperty;
9
- var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
- var __publicField$6 = (obj, key, value) => __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
11
- class DataSourcePicker extends PureComponent {
12
- constructor(props) {
13
- super(props);
14
- __publicField$6(this, "dataSourceSrv", getDataSourceSrv());
15
- __publicField$6(this, "state", {});
16
- __publicField$6(this, "onChange", (item) => {
17
- const dsSettings = this.dataSourceSrv.getInstanceSettings(item.value);
18
- if (dsSettings) {
19
- this.props.onChange(dsSettings);
20
- this.setState({ error: void 0 });
21
- }
22
- });
23
- }
24
- componentDidMount() {
25
- const { current } = this.props;
26
- const dsSettings = this.dataSourceSrv.getInstanceSettings(current);
27
- if (!dsSettings) {
28
- this.setState({ error: "Could not find data source " + current });
8
+ function DataSourcePicker({
9
+ onChange,
10
+ current: currentProp,
11
+ hideTextValue,
12
+ onBlur,
13
+ autoFocus = false,
14
+ openMenuOnFocus = false,
15
+ placeholder = "Select datasource",
16
+ noDefault
17
+ }) {
18
+ const current = currentProp != null ? currentProp : null;
19
+ const showNoDatasources = !current && !!noDefault;
20
+ const { items, isLoading: isListLoading, error: listError } = useDataSourceInstanceList();
21
+ const currentResult = useDataSourceInstanceListItem(current);
22
+ const selected = currentResult.item;
23
+ const isCurrentLoading = !showNoDatasources && currentResult.isLoading;
24
+ const isLoading = isListLoading || isCurrentLoading;
25
+ const notFound = !selected && !isCurrentLoading && !showNoDatasources;
26
+ const handleChange = (option) => {
27
+ const item = items.find((ds) => ds.uid === option.value);
28
+ if (item) {
29
+ onChange(item);
29
30
  }
30
- }
31
- getCurrentValue() {
32
- const { current, hideTextValue, noDefault } = this.props;
33
- if (!current && noDefault) {
34
- return {
35
- label: "No datasources found"
36
- };
37
- }
38
- const ds = this.dataSourceSrv.getInstanceSettings(current);
39
- if (ds) {
40
- return {
41
- label: ds.name.substr(0, 37),
42
- value: ds.name,
43
- imgUrl: ds.meta.info.logos.small,
44
- hideText: hideTextValue,
45
- meta: ds.meta
46
- };
31
+ };
32
+ const options = items.map((ds) => ({
33
+ value: ds.uid,
34
+ label: ds.name,
35
+ imgUrl: ds.meta.info.logos.small,
36
+ meta: ds.meta
37
+ }));
38
+ const value = getCurrentValue({ current, selected, notFound, showNoDatasources, hideTextValue });
39
+ const invalid = !!listError || notFound;
40
+ return /* @__PURE__ */ React.createElement("div", { "aria-label": selectors.components.DataSourcePicker.container }, /* @__PURE__ */ React.createElement(
41
+ Select,
42
+ {
43
+ className: "ds-picker select-container",
44
+ isMulti: false,
45
+ isClearable: false,
46
+ backspaceRemovesValue: false,
47
+ onChange: handleChange,
48
+ options,
49
+ isLoading,
50
+ autoFocus,
51
+ onBlur,
52
+ openMenuOnFocus,
53
+ maxMenuHeight: 500,
54
+ placeholder,
55
+ noOptionsMessage: listError ? "Could not load data sources" : "No datasources found",
56
+ value,
57
+ invalid,
58
+ "aria-invalid": invalid,
59
+ getOptionLabel: (o) => {
60
+ if (o.meta && isUnsignedPluginSignature(o.meta.signature) && o !== value) {
61
+ return /* @__PURE__ */ React.createElement(Stack, { alignItems: "center", justifyContent: "space-between" }, /* @__PURE__ */ React.createElement("span", null, o.label), " ", /* @__PURE__ */ React.createElement(PluginSignatureBadge, { status: o.meta.signature }));
62
+ }
63
+ return o.label || "";
64
+ }
47
65
  }
66
+ ));
67
+ }
68
+ function getCurrentValue({
69
+ current,
70
+ selected,
71
+ notFound,
72
+ showNoDatasources,
73
+ hideTextValue
74
+ }) {
75
+ if (showNoDatasources) {
48
76
  return {
49
- label: (current != null ? current : "no name") + " - not found",
50
- value: (current != null ? current : "no name") + " - not found",
51
- imgUrl: "",
52
- hideText: hideTextValue
77
+ label: "No datasources found"
53
78
  };
54
79
  }
55
- getDataSourceOptions() {
56
- const options = this.dataSourceSrv.getList().map((ds) => ({
57
- value: ds.uid,
58
- label: ds.name,
59
- imgUrl: ds.meta.info.logos.small,
60
- meta: ds.meta
61
- }));
62
- return options;
80
+ if (selected) {
81
+ return toOption$1(selected, hideTextValue);
63
82
  }
64
- render() {
65
- const { autoFocus, onBlur, openMenuOnFocus, placeholder } = this.props;
66
- const { error } = this.state;
67
- const options = this.getDataSourceOptions();
68
- const value = this.getCurrentValue();
69
- return /* @__PURE__ */ React.createElement("div", { "aria-label": selectors.components.DataSourcePicker.container }, /* @__PURE__ */ React.createElement(
70
- Select,
71
- {
72
- className: "ds-picker select-container",
73
- isMulti: false,
74
- isClearable: false,
75
- backspaceRemovesValue: false,
76
- onChange: this.onChange,
77
- options,
78
- autoFocus,
79
- onBlur,
80
- openMenuOnFocus,
81
- maxMenuHeight: 500,
82
- placeholder,
83
- noOptionsMessage: "No datasources found",
84
- value,
85
- invalid: !!error,
86
- getOptionLabel: (o) => {
87
- if (o.meta && isUnsignedPluginSignature(o.meta.signature) && o !== value) {
88
- return /* @__PURE__ */ React.createElement(Stack, { alignItems: "center", justifyContent: "space-between" }, /* @__PURE__ */ React.createElement("span", null, o.label), " ", /* @__PURE__ */ React.createElement(PluginSignatureBadge, { status: o.meta.signature }));
89
- }
90
- return o.label || "";
91
- }
92
- }
93
- ));
83
+ if (!notFound) {
84
+ return void 0;
94
85
  }
86
+ return {
87
+ label: (current != null ? current : "no name") + " - not found",
88
+ value: (current != null ? current : "no name") + " - not found",
89
+ imgUrl: "",
90
+ hideText: hideTextValue
91
+ };
92
+ }
93
+ function toOption$1(ds, hideTextValue) {
94
+ return {
95
+ label: ds.name.substr(0, 37),
96
+ value: ds.name,
97
+ imgUrl: ds.meta.info.logos.small,
98
+ hideText: hideTextValue,
99
+ meta: ds.meta
100
+ };
95
101
  }
96
- __publicField$6(DataSourcePicker, "defaultProps", {
97
- autoFocus: false,
98
- openMenuOnFocus: false,
99
- placeholder: "Select datasource"
100
- });
101
102
 
102
103
  export { DataSourcePicker };
103
104
  //# sourceMappingURL=DataSourcePicker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataSourcePicker.js","sources":["../../../../src/components/DataSourcePicker/DataSourcePicker.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport { Stack, Select } from '@grafana/ui';\nimport { type DataSourceInstanceSettings, type SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { isUnsignedPluginSignature, PluginSignatureBadge } from '../Plugins/PluginSignatureBadge';\nimport { getDataSourceSrv, type DataSourceSrv } from '@grafana/runtime';\n\nexport interface Props {\n onChange: (ds: DataSourceInstanceSettings) => void;\n current: string | null;\n hideTextValue?: boolean;\n onBlur?: () => void;\n autoFocus?: boolean;\n openMenuOnFocus?: boolean;\n placeholder?: string;\n tracing?: boolean;\n mixed?: boolean;\n dashboard?: boolean;\n metrics?: boolean;\n annotations?: boolean;\n variables?: boolean;\n pluginId?: string;\n noDefault?: boolean;\n}\n\nexport interface State {\n error?: string;\n}\n\nexport class DataSourcePicker extends PureComponent<Props, State> {\n dataSourceSrv: DataSourceSrv = getDataSourceSrv();\n\n static defaultProps: Partial<Props> = {\n autoFocus: false,\n openMenuOnFocus: false,\n placeholder: 'Select datasource',\n };\n\n state: State = {};\n\n constructor(props: Props) {\n super(props);\n }\n\n componentDidMount() {\n const { current } = this.props;\n const dsSettings = this.dataSourceSrv.getInstanceSettings(current!);\n if (!dsSettings) {\n this.setState({ error: 'Could not find data source ' + current });\n }\n }\n\n onChange = (item: SelectableValue<string>) => {\n const dsSettings = this.dataSourceSrv.getInstanceSettings(item.value!);\n\n if (dsSettings) {\n this.props.onChange(dsSettings);\n this.setState({ error: undefined });\n }\n };\n\n private getCurrentValue(): SelectableValue<string> {\n const { current, hideTextValue, noDefault } = this.props;\n\n if (!current && noDefault) {\n return {\n label: 'No datasources found',\n };\n }\n\n const ds = this.dataSourceSrv.getInstanceSettings(current!);\n\n if (ds) {\n return {\n label: ds.name.substr(0, 37),\n value: ds.name,\n imgUrl: ds.meta.info.logos.small,\n hideText: hideTextValue,\n meta: ds.meta,\n };\n }\n\n return {\n label: (current ?? 'no name') + ' - not found',\n value: (current ?? 'no name') + ' - not found',\n imgUrl: '',\n hideText: hideTextValue,\n };\n }\n\n getDataSourceOptions(): Array<SelectableValue<string>> {\n const options: Array<SelectableValue<string>> = this.dataSourceSrv.getList().map((ds) => ({\n value: ds.uid,\n label: ds.name,\n imgUrl: ds.meta.info.logos.small,\n meta: ds.meta,\n }));\n\n return options;\n }\n\n render() {\n const { autoFocus, onBlur, openMenuOnFocus, placeholder } = this.props;\n const { error } = this.state;\n const options = this.getDataSourceOptions();\n const value = this.getCurrentValue();\n\n return (\n <div aria-label={selectors.components.DataSourcePicker.container}>\n <Select\n className=\"ds-picker select-container\"\n isMulti={false}\n isClearable={false}\n backspaceRemovesValue={false}\n onChange={this.onChange}\n options={options}\n autoFocus={autoFocus}\n onBlur={onBlur}\n openMenuOnFocus={openMenuOnFocus}\n maxMenuHeight={500}\n placeholder={placeholder}\n noOptionsMessage=\"No datasources found\"\n value={value}\n invalid={!!error}\n getOptionLabel={(o) => {\n if (o.meta && isUnsignedPluginSignature(o.meta.signature) && o !== value) {\n return (\n <Stack alignItems=\"center\" justifyContent=\"space-between\">\n <span>{o.label}</span> <PluginSignatureBadge status={o.meta.signature} />\n </Stack>\n );\n }\n return o.label || '';\n }}\n />\n </div>\n );\n }\n}\n"],"names":["__publicField"],"mappings":"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"}
1
+ {"version":3,"file":"DataSourcePicker.js","sources":["../../../../src/components/DataSourcePicker/DataSourcePicker.tsx"],"sourcesContent":["import React from 'react';\nimport { Stack, Select } from '@grafana/ui';\nimport { type DataSourceInstanceSettings, type SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { useDataSourceInstanceList, useDataSourceInstanceListItem } from '@grafana/plugin-compat/datasources';\nimport { isUnsignedPluginSignature, PluginSignatureBadge } from '../Plugins/PluginSignatureBadge';\n\nexport interface Props {\n // Mirrors `DataSourceInstanceListItem` instead of importing it: `@grafana/data` only exports it from 13.3,\n // so with our `^13.0.0` peer range consumers on 13.0–13.2 would get `any`. Callbacks typed with the real\n // `DataSourceInstanceListItem` (13.3+) still fit because the shapes are identical.\n /**\n * Receives the selected data source's list item (`uid`, `type`, `name`, `meta`). Call\n * `getDataSourceInstanceSettings(ds.uid)` from `@grafana/plugin-compat` if you need the full settings.\n */\n onChange: (ds: Pick<DataSourceInstanceSettings, 'uid' | 'type' | 'name' | 'meta'>) => void;\n /**\n * Reference to the selected data source, resolved the way Grafana does: uid, name, template variable or\n * built-in. `null`/`undefined` resolves to the default data source.\n */\n current?: string | null;\n hideTextValue?: boolean;\n onBlur?: () => void;\n autoFocus?: boolean;\n openMenuOnFocus?: boolean;\n placeholder?: string;\n tracing?: boolean;\n mixed?: boolean;\n dashboard?: boolean;\n metrics?: boolean;\n annotations?: boolean;\n variables?: boolean;\n pluginId?: string;\n noDefault?: boolean;\n}\n\ntype DataSourceListItem = Parameters<Props['onChange']>[0];\n\nexport function DataSourcePicker({\n onChange,\n current: currentProp,\n hideTextValue,\n onBlur,\n autoFocus = false,\n openMenuOnFocus = false,\n placeholder = 'Select datasource',\n noDefault,\n}: Props) {\n const current = currentProp ?? null;\n const showNoDatasources = !current && !!noDefault;\n const { items, isLoading: isListLoading, error: listError } = useDataSourceInstanceList();\n const currentResult = useDataSourceInstanceListItem(current);\n const selected: DataSourceListItem | undefined = currentResult.item;\n const isCurrentLoading = !showNoDatasources && currentResult.isLoading;\n const isLoading = isListLoading || isCurrentLoading;\n const notFound = !selected && !isCurrentLoading && !showNoDatasources;\n\n const handleChange = (option: SelectableValue<string>) => {\n const item = items.find((ds) => ds.uid === option.value);\n if (item) {\n onChange(item);\n }\n };\n\n const options: Array<SelectableValue<string>> = items.map((ds) => ({\n value: ds.uid,\n label: ds.name,\n imgUrl: ds.meta.info.logos.small,\n meta: ds.meta,\n }));\n\n const value = getCurrentValue({ current, selected, notFound, showNoDatasources, hideTextValue });\n const invalid = !!listError || notFound;\n\n return (\n <div aria-label={selectors.components.DataSourcePicker.container}>\n <Select\n className=\"ds-picker select-container\"\n isMulti={false}\n isClearable={false}\n backspaceRemovesValue={false}\n onChange={handleChange}\n options={options}\n isLoading={isLoading}\n autoFocus={autoFocus}\n onBlur={onBlur}\n openMenuOnFocus={openMenuOnFocus}\n maxMenuHeight={500}\n placeholder={placeholder}\n noOptionsMessage={listError ? 'Could not load data sources' : 'No datasources found'}\n value={value}\n invalid={invalid}\n aria-invalid={invalid}\n getOptionLabel={(o) => {\n if (o.meta && isUnsignedPluginSignature(o.meta.signature) && o !== value) {\n return (\n <Stack alignItems=\"center\" justifyContent=\"space-between\">\n <span>{o.label}</span> <PluginSignatureBadge status={o.meta.signature} />\n </Stack>\n );\n }\n return o.label || '';\n }}\n />\n </div>\n );\n}\n\nfunction getCurrentValue({\n current,\n selected,\n notFound,\n showNoDatasources,\n hideTextValue,\n}: {\n current: string | null;\n selected?: DataSourceListItem;\n notFound: boolean;\n showNoDatasources: boolean;\n hideTextValue?: boolean;\n}): SelectableValue<string> | undefined {\n if (showNoDatasources) {\n return {\n label: 'No datasources found',\n };\n }\n\n if (selected) {\n return toOption(selected, hideTextValue);\n }\n\n if (!notFound) {\n return undefined;\n }\n\n return {\n label: (current ?? 'no name') + ' - not found',\n value: (current ?? 'no name') + ' - not found',\n imgUrl: '',\n hideText: hideTextValue,\n };\n}\n\nfunction toOption(ds: DataSourceListItem, hideTextValue?: boolean): SelectableValue<string> {\n return {\n label: ds.name.substr(0, 37),\n value: ds.name,\n imgUrl: ds.meta.info.logos.small,\n hideText: hideTextValue,\n meta: ds.meta,\n };\n}\n"],"names":["toOption"],"mappings":"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"}
@@ -27,7 +27,7 @@ class SqlDatasource extends DataSourceWithBackend {
27
27
  const result = this.getQueryModel().quoteLiteral(value);
28
28
  return result;
29
29
  } else {
30
- return value;
30
+ return value.replace(/'/g, "''");
31
31
  }
32
32
  }
33
33
  if (typeof value === "number") {
@@ -65,14 +65,16 @@ class SqlDatasource extends DataSourceWithBackend {
65
65
  }
66
66
  applyTemplateVariables(target, scopedVars) {
67
67
  const queryModel = this.getQueryModel(target, this.templateSrv, scopedVars);
68
- const rawSql = this.clean(queryModel.interpolate());
69
68
  return {
70
69
  refId: target.refId,
71
70
  datasource: this.getRef(),
72
- rawSql,
71
+ rawSql: queryModel.interpolate(),
73
72
  format: target.format
74
73
  };
75
74
  }
75
+ /**
76
+ * @deprecated `applyTemplateVariables` no longer calls this. Collapsing `''` to `'` breaks valid SQL string literals.
77
+ */
76
78
  clean(value) {
77
79
  return value.replace(/''/g, "'");
78
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SqlDatasource.js","sources":["../../../src/datasource/SqlDatasource.ts"],"sourcesContent":["import { lastValueFrom, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\nimport {\n type DataFrame,\n DataFrameView,\n type DataSourceInstanceSettings,\n type MetricFindValue,\n type ScopedVars,\n type TimeRange,\n type VariableModel,\n} from '@grafana/data';\nimport {\n type BackendDataSourceResponse,\n DataSourceWithBackend,\n type FetchResponse,\n getBackendSrv,\n getTemplateSrv,\n type TemplateSrv,\n toDataQueryResponse,\n} from '@grafana/runtime';\nimport { type DataQuery } from '@grafana/schema';\n\nimport { MACRO_NAMES } from './constants';\n// import { toTestingStatus } from '@grafana/runtime/utils/queryResponse';\nimport {\n type DB,\n QueryFormat,\n type ResponseParser,\n type SQLOptions,\n type SQLQuery,\n type SqlQueryModel,\n} from '../components/QueryEditor/types';\n\nexport interface SearchFilterOptions {\n searchFilter?: string;\n}\n\nexport interface VariableWithMultiSupport extends VariableWithOptions {\n multi: boolean;\n includeAll: boolean;\n allValue?: string | null;\n}\n\nexport interface VariableWithOptions extends VariableModel {\n current: VariableOption;\n options: VariableOption[];\n query: string;\n}\n\nexport interface VariableOption {\n selected: boolean;\n text: string | string[];\n value: string | string[];\n isNone?: boolean;\n}\n\nexport abstract class SqlDatasource extends DataSourceWithBackend<SQLQuery, SQLOptions> {\n id: number;\n name: string;\n interval: string;\n db: DB;\n dataset?: string;\n annotations = {};\n\n constructor(\n instanceSettings: DataSourceInstanceSettings<SQLOptions>,\n protected readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n this.name = instanceSettings.name;\n // If the id is not present, set it to 0 - it's deprecated in Grafana 13\n this.id = instanceSettings.id ?? 0;\n const settingsData = instanceSettings.jsonData || {};\n this.interval = settingsData.timeInterval || '1m';\n this.db = this.getDB();\n }\n\n abstract getDB(dsID?: number): DB;\n\n abstract getQueryModel(target?: SQLQuery, templateSrv?: TemplateSrv, scopedVars?: ScopedVars): SqlQueryModel;\n\n abstract getResponseParser(): ResponseParser;\n\n interpolateVariable = (value: string | string[] | number, variable: VariableWithMultiSupport) => {\n if (typeof value === 'string') {\n if (variable.multi || variable.includeAll) {\n const result = this.getQueryModel().quoteLiteral(value);\n return result;\n } else {\n return value;\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): SQLQuery {\n const queryModel = this.getQueryModel(target, this.templateSrv, scopedVars);\n const rawSql = this.clean(queryModel.interpolate());\n return {\n refId: target.refId,\n datasource: this.getRef(),\n rawSql,\n format: target.format,\n };\n }\n\n clean(value: string) {\n return value.replace(/''/g, \"'\");\n }\n\n async metricFindQuery(query: string, optionalOptions?: MetricFindQueryOptions): Promise<MetricFindValue[]> {\n const rawSql = this.templateSrv.replace(\n query,\n getSearchFilterScopedVar({ query, wildcardChar: '%', options: optionalOptions }),\n this.interpolateVariable\n );\n\n const interpolatedQuery: SQLQuery = {\n refId: 'tempvar',\n datasource: this.getRef(),\n rawSql,\n format: QueryFormat.Table,\n };\n\n const response = await this.runMetaQuery(interpolatedQuery, optionalOptions);\n return this.getResponseParser().transformMetricFindResponse(response);\n }\n\n async runSql<T extends object>(query: string, options?: RunSQLOptions) {\n const frame = await this.runMetaQuery({ rawSql: query, format: QueryFormat.Table, refId: options?.refId }, options);\n return new DataFrameView<T>(frame);\n }\n\n private runMetaQuery(request: Partial<SQLQuery>, options?: MetricFindQueryOptions): 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 data: {\n from: options?.range?.from.valueOf().toString(),\n to: options?.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];\n })\n )\n );\n }\n\n testDatasource(): Promise<{ status: string; message: string }> {\n return lastValueFrom(\n getBackendSrv()\n .fetch({\n url: '/api/ds/query',\n method: 'POST',\n data: {\n from: '5m',\n to: 'now',\n queries: [\n {\n refId: 'A',\n intervalMs: 1,\n maxDataPoints: 1,\n datasource: this.getRef(),\n datasourceId: this.id,\n rawSql: 'SELECT 1',\n format: 'table',\n },\n ],\n },\n })\n .pipe(\n map(() => ({ status: 'success', message: 'Database Connection OK' })),\n catchError((err) => {\n // return of(toTestingStatus(err));\n return of(err);\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 MetricFindQueryOptions {\n refId?: string;\n}\n\ninterface MetricFindQueryOptions extends SearchFilterOptions {\n range?: TimeRange;\n}\n\nexport const SEARCH_FILTER_VARIABLE = '__searchFilter';\n\nexport const containsSearchFilter = (query: string | unknown): boolean =>\n query && typeof query === 'string' ? query.indexOf(SEARCH_FILTER_VARIABLE) !== -1 : false;\n\nexport const getSearchFilterScopedVar = (args: {\n query: string;\n wildcardChar: string;\n options?: SearchFilterOptions;\n}): ScopedVars => {\n const { query, wildcardChar } = args;\n if (!containsSearchFilter(query)) {\n return {};\n }\n\n let { options } = args;\n\n options = options || { searchFilter: '' };\n const value = options.searchFilter ? `${options.searchFilter}${wildcardChar}` : `${wildcardChar}`;\n\n return {\n __searchFilter: {\n value,\n text: '',\n },\n };\n};\n"],"names":["__publicField"],"mappings":"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"}
1
+ {"version":3,"file":"SqlDatasource.js","sources":["../../../src/datasource/SqlDatasource.ts"],"sourcesContent":["import { lastValueFrom, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\nimport {\n type DataFrame,\n DataFrameView,\n type DataSourceInstanceSettings,\n type MetricFindValue,\n type ScopedVars,\n type TimeRange,\n type VariableModel,\n} from '@grafana/data';\nimport {\n type BackendDataSourceResponse,\n DataSourceWithBackend,\n type FetchResponse,\n getBackendSrv,\n getTemplateSrv,\n type TemplateSrv,\n toDataQueryResponse,\n} from '@grafana/runtime';\nimport { type DataQuery } from '@grafana/schema';\n\nimport { MACRO_NAMES } from './constants';\n// import { toTestingStatus } from '@grafana/runtime/utils/queryResponse';\nimport {\n type DB,\n QueryFormat,\n type ResponseParser,\n type SQLOptions,\n type SQLQuery,\n type SqlQueryModel,\n} from '../components/QueryEditor/types';\n\nexport interface SearchFilterOptions {\n searchFilter?: string;\n}\n\nexport interface VariableWithMultiSupport extends VariableWithOptions {\n multi: boolean;\n includeAll: boolean;\n allValue?: string | null;\n}\n\nexport interface VariableWithOptions extends VariableModel {\n current: VariableOption;\n options: VariableOption[];\n query: string;\n}\n\nexport interface VariableOption {\n selected: boolean;\n text: string | string[];\n value: string | string[];\n isNone?: boolean;\n}\n\nexport abstract class SqlDatasource extends DataSourceWithBackend<SQLQuery, SQLOptions> {\n id: number;\n name: string;\n interval: string;\n db: DB;\n dataset?: string;\n annotations = {};\n\n constructor(\n instanceSettings: DataSourceInstanceSettings<SQLOptions>,\n protected readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n this.name = instanceSettings.name;\n // If the id is not present, set it to 0 - it's deprecated in Grafana 13\n this.id = instanceSettings.id ?? 0;\n const settingsData = instanceSettings.jsonData || {};\n this.interval = settingsData.timeInterval || '1m';\n this.db = this.getDB();\n }\n\n abstract getDB(dsID?: number): DB;\n\n abstract getQueryModel(target?: SQLQuery, templateSrv?: TemplateSrv, scopedVars?: ScopedVars): SqlQueryModel;\n\n abstract getResponseParser(): ResponseParser;\n\n interpolateVariable = (value: string | string[] | number, variable: VariableWithMultiSupport) => {\n if (typeof value === 'string') {\n if (variable.multi || variable.includeAll) {\n const result = this.getQueryModel().quoteLiteral(value);\n return result;\n } else {\n return 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): SQLQuery {\n const queryModel = this.getQueryModel(target, this.templateSrv, scopedVars);\n return {\n refId: target.refId,\n datasource: this.getRef(),\n rawSql: queryModel.interpolate(),\n format: target.format,\n };\n }\n\n /**\n * @deprecated `applyTemplateVariables` no longer calls this. Collapsing `''` to `'` breaks valid SQL string literals.\n */\n clean(value: string) {\n return value.replace(/''/g, \"'\");\n }\n\n async metricFindQuery(query: string, optionalOptions?: MetricFindQueryOptions): Promise<MetricFindValue[]> {\n const rawSql = this.templateSrv.replace(\n query,\n getSearchFilterScopedVar({ query, wildcardChar: '%', options: optionalOptions }),\n this.interpolateVariable\n );\n\n const interpolatedQuery: SQLQuery = {\n refId: 'tempvar',\n datasource: this.getRef(),\n rawSql,\n format: QueryFormat.Table,\n };\n\n const response = await this.runMetaQuery(interpolatedQuery, optionalOptions);\n return this.getResponseParser().transformMetricFindResponse(response);\n }\n\n async runSql<T extends object>(query: string, options?: RunSQLOptions) {\n const frame = await this.runMetaQuery({ rawSql: query, format: QueryFormat.Table, refId: options?.refId }, options);\n return new DataFrameView<T>(frame);\n }\n\n private runMetaQuery(request: Partial<SQLQuery>, options?: MetricFindQueryOptions): 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 data: {\n from: options?.range?.from.valueOf().toString(),\n to: options?.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];\n })\n )\n );\n }\n\n testDatasource(): Promise<{ status: string; message: string }> {\n return lastValueFrom(\n getBackendSrv()\n .fetch({\n url: '/api/ds/query',\n method: 'POST',\n data: {\n from: '5m',\n to: 'now',\n queries: [\n {\n refId: 'A',\n intervalMs: 1,\n maxDataPoints: 1,\n datasource: this.getRef(),\n datasourceId: this.id,\n rawSql: 'SELECT 1',\n format: 'table',\n },\n ],\n },\n })\n .pipe(\n map(() => ({ status: 'success', message: 'Database Connection OK' })),\n catchError((err) => {\n // return of(toTestingStatus(err));\n return of(err);\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 MetricFindQueryOptions {\n refId?: string;\n}\n\ninterface MetricFindQueryOptions extends SearchFilterOptions {\n range?: TimeRange;\n}\n\nexport const SEARCH_FILTER_VARIABLE = '__searchFilter';\n\nexport const containsSearchFilter = (query: string | unknown): boolean =>\n query && typeof query === 'string' ? query.indexOf(SEARCH_FILTER_VARIABLE) !== -1 : false;\n\nexport const getSearchFilterScopedVar = (args: {\n query: string;\n wildcardChar: string;\n options?: SearchFilterOptions;\n}): ScopedVars => {\n const { query, wildcardChar } = args;\n if (!containsSearchFilter(query)) {\n return {};\n }\n\n let { options } = args;\n\n options = options || { searchFilter: '' };\n const value = options.searchFilter ? `${options.searchFilter}${wildcardChar}` : `${wildcardChar}`;\n\n return {\n __searchFilter: {\n value,\n text: '',\n },\n };\n};\n"],"names":["__publicField"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import React, { ComponentProps, PureComponent, ReactElement, ReactNode, Component, ErrorInfo, FunctionComponent, HTMLProps } from 'react';
1
+ import React, { ComponentProps, ReactElement, ReactNode, Component, ErrorInfo, PureComponent, FunctionComponent, HTMLProps } from 'react';
2
2
  import { Input, Segment as Segment$1, monacoTypes, Monaco, ButtonProps, Field, PopoverContent, Switch, SelectCommonProps, InlineLabel } from '@grafana/ui';
3
- import { DataSourceInstanceSettings, SelectableValue, DataSourceJsonData, VariableSuggestion, TimeRange, DataFrame, MetricFindValue, ThemeSpacingTokens, ScopedVars, VariableModel, DataFrameView, QueryEditorProps as QueryEditorProps$1, DataSourceSettings, RegistryItem, DataSourceApi, Registry, DataQuery as DataQuery$1, PanelData, DataQueryRequest, DataQueryResponse, LoadingState } from '@grafana/data';
4
- import { DataSourceSrv, DataSourceWithBackend, TemplateSrv } from '@grafana/runtime';
3
+ import { DataSourceInstanceSettings, DataSourceJsonData, VariableSuggestion, SelectableValue, TimeRange, DataFrame, MetricFindValue, ThemeSpacingTokens, ScopedVars, VariableModel, DataFrameView, QueryEditorProps as QueryEditorProps$1, DataSourceSettings, RegistryItem, DataSourceApi, Registry, DataQuery as DataQuery$1, PanelData, DataQueryRequest, DataQueryResponse, LoadingState } from '@grafana/data';
5
4
  import { JsonTree } from '@react-awesome-query-builder/ui';
6
5
  import { DataQuery } from '@grafana/schema';
6
+ import { DataSourceWithBackend, TemplateSrv } from '@grafana/runtime';
7
7
  import { SqlLanguage } from 'sql-formatter';
8
8
  import { Grammar } from 'prismjs';
9
9
  import { Observable } from 'rxjs';
@@ -46,8 +46,16 @@ interface DatePickerWithInputProps extends Omit<ComponentProps<typeof Input>, 'r
46
46
  declare const DatePickerWithInput: (props: DatePickerWithInputProps) => React.JSX.Element;
47
47
 
48
48
  interface Props$s {
49
- onChange: (ds: DataSourceInstanceSettings) => void;
50
- current: string | null;
49
+ /**
50
+ * Receives the selected data source's list item (`uid`, `type`, `name`, `meta`). Call
51
+ * `getDataSourceInstanceSettings(ds.uid)` from `@grafana/plugin-compat` if you need the full settings.
52
+ */
53
+ onChange: (ds: Pick<DataSourceInstanceSettings, 'uid' | 'type' | 'name' | 'meta'>) => void;
54
+ /**
55
+ * Reference to the selected data source, resolved the way Grafana does: uid, name, template variable or
56
+ * built-in. `null`/`undefined` resolves to the default data source.
57
+ */
58
+ current?: string | null;
51
59
  hideTextValue?: boolean;
52
60
  onBlur?: () => void;
53
61
  autoFocus?: boolean;
@@ -62,20 +70,7 @@ interface Props$s {
62
70
  pluginId?: string;
63
71
  noDefault?: boolean;
64
72
  }
65
- interface State$1 {
66
- error?: string;
67
- }
68
- declare class DataSourcePicker extends PureComponent<Props$s, State$1> {
69
- dataSourceSrv: DataSourceSrv;
70
- static defaultProps: Partial<Props$s>;
71
- state: State$1;
72
- constructor(props: Props$s);
73
- componentDidMount(): void;
74
- onChange: (item: SelectableValue<string>) => void;
75
- private getCurrentValue;
76
- getDataSourceOptions(): Array<SelectableValue<string>>;
77
- render(): React.JSX.Element;
78
- }
73
+ declare function DataSourcePicker({ onChange, current: currentProp, hideTextValue, onBlur, autoFocus, openMenuOnFocus, placeholder, noDefault, }: Props$s): React.JSX.Element;
79
74
 
80
75
  type DataLinkConfig = {
81
76
  field: string;
@@ -778,6 +773,9 @@ declare abstract class SqlDatasource extends DataSourceWithBackend<SQLQuery, SQL
778
773
  interpolateVariablesInQueries(queries: SQLQuery[], scopedVars: ScopedVars): SQLQuery[];
779
774
  filterQuery(query: SQLQuery): boolean;
780
775
  applyTemplateVariables(target: SQLQuery, scopedVars: ScopedVars): SQLQuery;
776
+ /**
777
+ * @deprecated `applyTemplateVariables` no longer calls this. Collapsing `''` to `'` breaks valid SQL string literals.
778
+ */
781
779
  clean(value: string): string;
782
780
  metricFindQuery(query: string, optionalOptions?: MetricFindQueryOptions): Promise<MetricFindValue[]>;
783
781
  runSql<T extends object>(query: string, options?: RunSQLOptions): Promise<DataFrameView<T>>;
@@ -1519,8 +1517,6 @@ declare function useHealthChecks(): {
1519
1517
  retry: (uid: string) => void;
1520
1518
  };
1521
1519
 
1522
- declare function resolvePluginName(pluginType: string): string;
1523
-
1524
1520
  type UseDatasourceSchemaResult = {
1525
1521
  schema: DatasourceConfigSchema | null;
1526
1522
  loading: boolean;
@@ -2016,5 +2012,5 @@ interface RequestLoopOptions<TQuery extends DataQuery$1 = DataQuery$1> {
2016
2012
  */
2017
2013
  declare function getRequestLooper<T extends DataQuery$1 = DataQuery$1>(req: DataQueryRequest<T>, options: RequestLoopOptions<T>): Observable<DataQueryResponse>;
2018
2014
 
2019
- export { AUTH_GROUP_IDS, AccessoryButton, AdvancedHttpSettings, Auth, AuthMethod, BINARY_OPERATIONS_KEY, CatalogSelector, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemPriority, ConfigDescriptionLink, ConfigSection, ConfigSubSection, ConnectionSettings, CustomHeadersSettings, DataLink, DataLinks, DataSourceDescription, DataSourcePicker, DatasetSelector, DatasourceConfigWizard, DatasourceErrorBoundary, DatasourceWithAsyncBackend, DatePicker, DatePickerWithInput, DebounceInput, EditorField, EditorFieldGroup, EditorHeader, EditorList, EditorMode, EditorRow, EditorRows, EditorStack, EditorSwitch, FlexItem, GroupByRow, InlineSelect, InputGroup, LabelFilters, LinkedToken, MacroType, OperationExplainedBox, OperationList, OperationListExplained, OperationsEditorRow, OperatorType, QUERY_FORMAT_OPTIONS, QueryBuilderHints, QueryEditorMode, QueryEditorModeToggle, QueryEditorRow, QueryFormat, QueryHeaderSwitch, QueryModellerBase, QueryOptionGroup, ROOT_CONFIG_FIELDS, RawQuery, RunQueryButton, RunQueryButtons, SQLEditor, SQLEditorMode, SQLEditorTestUtils, SecureSocksProxyToggle, Segment, Space, SqlDatasource, SqlQueryEditor, StatementPosition, SuggestionKind, TLSSettings, TableSelector, TokenType, buildCelContext, buildCloneDatasourcePayload, buildCreateDatasourcePayload, buildUpdateDatasourcePayload, clearExpressionCache, computeVirtualFieldValues, convertLegacyAuthProps, datasourceToProvisioningYaml, evaluateCelDirect, evaluateCelExpression, evaluateComputedRead, evaluateDependsOn, extractFieldRefs, fetchConfigSchema, formKey, formatDate, formatYamlDiff, generateLLMHint, generateProvisioningTemplate, generateTroubleshootingFields, getConfigSchema, getRequestLooper, getStandardSQLCompletionProvider, getWatchedValue, language as grafanaStandardSQLLanguage, conf as grafanaStandardSQLLanguageConf, isAuthGroupId, isValidCelExpression, parseDependsOn, resolveActiveOverride, resolveGroups, resolvePluginName, resolveRequiredFieldsGroup, toOption, useDatasourceSchema, useHealthChecks };
2020
- export type { Aggregate, AllowedValuesValidationRule, Props$c as AuthProps, BaseFieldRef, BaseValidationRule, ColumnDefinition, ComputedMapping, ConfigField, ConfigGroup, CustomMeta, CustomValidationRule, DB, DataLinkConfig, DatasourceConfigSchema, DatasourceConfigWizardProps, DatasourceHealth, DatePickerProps, DatePickerWithInputProps, DebounceInputProps, DirectMapping, Expression, FieldEffect, FieldItemSchema, FieldKind, FieldOption, FieldOverride, FieldPack, FieldPackID, FieldPatch, FieldRelationship, FieldUI, FieldValidationRule, FormState, HealthState, IndexedPairMapping, Instruction, ItemCountValidationRule, LanguageCompletionProvider, LanguageDefinition, LengthValidationRule, MappingField, MetaDefinition, NameValue, PatternValidationRule, PositionContext, Props$s as Props, QueryBuilderLabelFilter, QueryBuilderOperation, QueryBuilderOperationDefinition, QueryBuilderOperationParamDef, QueryBuilderOperationParamEditorProps, QueryBuilderOperationParamValue, QueryEditorProps, QueryRowFilter, QueryStats, QueryWithDefaults, RAQBFieldTypes, RangeValidationRule, RelationshipType, RequestLoopOptions, ResolvedGroup, ResourceSelectorProps, ResponseParser, Role, RunQueryButtonsProps, RunningQueryInfo, SQLConnectionLimits, SQLExpression, SQLFilters, SQLMonarchLanguage, SQLOptions, SQLQuery, SQLSelectableValue, SchemaDefinition, SecureFieldState, SegmentProps, SqlQueryForInterpolation, SqlQueryModel, State$1 as State, StatementPlacementProvider, StorageMapping, SuggestionKindProvider, Props$f as TLSSettingsProps, TableDefinition, TableFieldSchema, TableIdentifier, TableSchema, TargetLocation, TestQueryModel, UIComponent, UIWidth, ValidationResults, ValueType, VisualQuery, VisualQueryBinary, VisualQueryModeller };
2015
+ export { AUTH_GROUP_IDS, AccessoryButton, AdvancedHttpSettings, Auth, AuthMethod, BINARY_OPERATIONS_KEY, CatalogSelector, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemPriority, ConfigDescriptionLink, ConfigSection, ConfigSubSection, ConnectionSettings, CustomHeadersSettings, DataLink, DataLinks, DataSourceDescription, DataSourcePicker, DatasetSelector, DatasourceConfigWizard, DatasourceErrorBoundary, DatasourceWithAsyncBackend, DatePicker, DatePickerWithInput, DebounceInput, EditorField, EditorFieldGroup, EditorHeader, EditorList, EditorMode, EditorRow, EditorRows, EditorStack, EditorSwitch, FlexItem, GroupByRow, InlineSelect, InputGroup, LabelFilters, LinkedToken, MacroType, OperationExplainedBox, OperationList, OperationListExplained, OperationsEditorRow, OperatorType, QUERY_FORMAT_OPTIONS, QueryBuilderHints, QueryEditorMode, QueryEditorModeToggle, QueryEditorRow, QueryFormat, QueryHeaderSwitch, QueryModellerBase, QueryOptionGroup, ROOT_CONFIG_FIELDS, RawQuery, RunQueryButton, RunQueryButtons, SQLEditor, SQLEditorMode, SQLEditorTestUtils, SecureSocksProxyToggle, Segment, Space, SqlDatasource, SqlQueryEditor, StatementPosition, SuggestionKind, TLSSettings, TableSelector, TokenType, buildCelContext, buildCloneDatasourcePayload, buildCreateDatasourcePayload, buildUpdateDatasourcePayload, clearExpressionCache, computeVirtualFieldValues, convertLegacyAuthProps, datasourceToProvisioningYaml, evaluateCelDirect, evaluateCelExpression, evaluateComputedRead, evaluateDependsOn, extractFieldRefs, fetchConfigSchema, formKey, formatDate, formatYamlDiff, generateLLMHint, generateProvisioningTemplate, generateTroubleshootingFields, getConfigSchema, getRequestLooper, getStandardSQLCompletionProvider, getWatchedValue, language as grafanaStandardSQLLanguage, conf as grafanaStandardSQLLanguageConf, isAuthGroupId, isValidCelExpression, parseDependsOn, resolveActiveOverride, resolveGroups, resolveRequiredFieldsGroup, toOption, useDatasourceSchema, useHealthChecks };
2016
+ export type { Aggregate, AllowedValuesValidationRule, Props$c as AuthProps, BaseFieldRef, BaseValidationRule, ColumnDefinition, ComputedMapping, ConfigField, ConfigGroup, CustomMeta, CustomValidationRule, DB, DataLinkConfig, DatasourceConfigSchema, DatasourceConfigWizardProps, DatasourceHealth, DatePickerProps, DatePickerWithInputProps, DebounceInputProps, DirectMapping, Expression, FieldEffect, FieldItemSchema, FieldKind, FieldOption, FieldOverride, FieldPack, FieldPackID, FieldPatch, FieldRelationship, FieldUI, FieldValidationRule, FormState, HealthState, IndexedPairMapping, Instruction, ItemCountValidationRule, LanguageCompletionProvider, LanguageDefinition, LengthValidationRule, MappingField, MetaDefinition, NameValue, PatternValidationRule, PositionContext, Props$s as Props, QueryBuilderLabelFilter, QueryBuilderOperation, QueryBuilderOperationDefinition, QueryBuilderOperationParamDef, QueryBuilderOperationParamEditorProps, QueryBuilderOperationParamValue, QueryEditorProps, QueryRowFilter, QueryStats, QueryWithDefaults, RAQBFieldTypes, RangeValidationRule, RelationshipType, RequestLoopOptions, ResolvedGroup, ResourceSelectorProps, ResponseParser, Role, RunQueryButtonsProps, RunningQueryInfo, SQLConnectionLimits, SQLExpression, SQLFilters, SQLMonarchLanguage, SQLOptions, SQLQuery, SQLSelectableValue, SchemaDefinition, SecureFieldState, SegmentProps, SqlQueryForInterpolation, SqlQueryModel, StatementPlacementProvider, StorageMapping, SuggestionKindProvider, Props$f as TLSSettingsProps, TableDefinition, TableFieldSchema, TableIdentifier, TableSchema, TargetLocation, TestQueryModel, UIComponent, UIWidth, ValidationResults, ValueType, VisualQuery, VisualQueryBinary, VisualQueryModeller };
package/dist/esm/index.js CHANGED
@@ -40,7 +40,6 @@ export { AdvancedHttpSettings } from './components/ConfigEditor/AdvancedSettings
40
40
  export { DatasourceConfigWizard } from './components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js';
41
41
  export { DatasourceErrorBoundary } from './components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js';
42
42
  export { useHealthChecks } from './components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js';
43
- export { resolvePluginName } from './components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js';
44
43
  export { fetchConfigSchema, useDatasourceSchema } from './components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceSchema.js';
45
44
  export { buildCelContext, clearExpressionCache, evaluateCelDirect, evaluateCelExpression, extractFieldRefs, isValidCelExpression } from './components/ConfigEditor/DatasourceConfigWizard/cel.js';
46
45
  export { AUTH_GROUP_IDS, computeVirtualFieldValues, evaluateComputedRead, evaluateDependsOn, formKey, getWatchedValue, isAuthGroupId, parseDependsOn, resolveActiveOverride, resolveGroups, resolveRequiredFieldsGroup } from './components/ConfigEditor/DatasourceConfigWizard/config.js';