@grafana/aws-sdk 0.0.38 → 0.0.40
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.
- package/dist/ConnectionConfig.d.ts +1 -0
- package/dist/index.development.js +142 -224
- package/dist/index.development.js.map +1 -1
- package/dist/index.production.js +16 -1
- package/dist/index.production.js.map +1 -1
- package/dist/sql/ConfigEditor/ConfigSelect.d.ts +2 -1
- package/dist/sql/ConfigEditor/InlineInput.d.ts +1 -0
- package/dist/sql/QueryEditor/QueryCodeEditor.d.ts +2 -3
- package/dist/sql/ResourceSelector.d.ts +1 -1
- package/package.json +13 -10
|
@@ -8,88 +8,7 @@ var ui = require('@grafana/ui');
|
|
|
8
8
|
var data = require('@grafana/data');
|
|
9
9
|
var lodash = require('lodash');
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
Copyright (c) Microsoft Corporation.
|
|
13
|
-
|
|
14
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
|
15
|
-
purpose with or without fee is hereby granted.
|
|
16
|
-
|
|
17
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
18
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
19
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
20
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
21
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
22
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
23
|
-
PERFORMANCE OF THIS SOFTWARE.
|
|
24
|
-
***************************************************************************** */
|
|
25
|
-
|
|
26
|
-
var __assign = function() {
|
|
27
|
-
__assign = Object.assign || function __assign(t) {
|
|
28
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
29
|
-
s = arguments[i];
|
|
30
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
31
|
-
}
|
|
32
|
-
return t;
|
|
33
|
-
};
|
|
34
|
-
return __assign.apply(this, arguments);
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
function __awaiter(thisArg, _arguments, P, generator) {
|
|
38
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
39
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
40
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
41
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
42
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
43
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function __generator(thisArg, body) {
|
|
48
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
49
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
50
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
51
|
-
function step(op) {
|
|
52
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
53
|
-
while (_) try {
|
|
54
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
55
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
56
|
-
switch (op[0]) {
|
|
57
|
-
case 0: case 1: t = op; break;
|
|
58
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
59
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
60
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
61
|
-
default:
|
|
62
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
63
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
64
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
65
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
66
|
-
if (t[2]) _.ops.pop();
|
|
67
|
-
_.trys.pop(); continue;
|
|
68
|
-
}
|
|
69
|
-
op = body.call(thisArg, _);
|
|
70
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
71
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function __read(o, n) {
|
|
76
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
77
|
-
if (!m) return o;
|
|
78
|
-
var i = m.call(o), r, ar = [], e;
|
|
79
|
-
try {
|
|
80
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
81
|
-
}
|
|
82
|
-
catch (error) { e = { error: error }; }
|
|
83
|
-
finally {
|
|
84
|
-
try {
|
|
85
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
86
|
-
}
|
|
87
|
-
finally { if (e) throw e.error; }
|
|
88
|
-
}
|
|
89
|
-
return ar;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
var standardRegions = [
|
|
11
|
+
const standardRegions = [
|
|
93
12
|
'af-south-1',
|
|
94
13
|
'ap-east-1',
|
|
95
14
|
'ap-northeast-1',
|
|
@@ -129,7 +48,7 @@ var standardRegions = [
|
|
|
129
48
|
AwsAuthType["ARN"] = "arn";
|
|
130
49
|
})(exports.AwsAuthType || (exports.AwsAuthType = {}));
|
|
131
50
|
|
|
132
|
-
|
|
51
|
+
const awsAuthProviderOptions = [
|
|
133
52
|
{
|
|
134
53
|
label: 'Workspace IAM Role',
|
|
135
54
|
value: exports.AwsAuthType.EC2IAMRole,
|
|
@@ -148,66 +67,66 @@ var awsAuthProviderOptions = [
|
|
|
148
67
|
},
|
|
149
68
|
];
|
|
150
69
|
|
|
151
|
-
|
|
152
|
-
|
|
70
|
+
const toOption = (value) => ({ value, label: value });
|
|
71
|
+
const ConnectionConfig = (props) => {
|
|
153
72
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
73
|
+
const [regions, setRegions] = React.useState((props.standardRegions || standardRegions).map(toOption));
|
|
74
|
+
const { loadRegions, onOptionsChange, skipHeader = false, skipEndpoint = false } = props;
|
|
75
|
+
const { labelWidth = 28, options } = props;
|
|
76
|
+
let profile = options.jsonData.profile;
|
|
158
77
|
if (profile === undefined) {
|
|
159
78
|
profile = options.database;
|
|
160
79
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
React.useEffect(
|
|
80
|
+
const settings = window.grafanaBootData.settings;
|
|
81
|
+
const awsAllowedAuthProviders = React.useMemo(() => { var _a; return (_a = settings.awsAllowedAuthProviders) !== null && _a !== void 0 ? _a : [exports.AwsAuthType.Default, exports.AwsAuthType.Keys, exports.AwsAuthType.Credentials]; }, [settings.awsAllowedAuthProviders]);
|
|
82
|
+
const awsAssumeRoleEnabled = (_a = settings.awsAssumeRoleEnabled) !== null && _a !== void 0 ? _a : true;
|
|
83
|
+
const currentProvider = awsAuthProviderOptions.find((p) => p.value === options.jsonData.authType);
|
|
84
|
+
React.useEffect(() => {
|
|
166
85
|
// Make sure a authType exists in the current model
|
|
167
86
|
if (!currentProvider && awsAllowedAuthProviders.length) {
|
|
168
|
-
onOptionsChange(
|
|
87
|
+
onOptionsChange(Object.assign(Object.assign({}, options), { jsonData: Object.assign(Object.assign({}, options.jsonData), { authType: awsAllowedAuthProviders[0] }) }));
|
|
169
88
|
}
|
|
170
89
|
}, [currentProvider, options, onOptionsChange, awsAllowedAuthProviders]);
|
|
171
|
-
React.useEffect(
|
|
90
|
+
React.useEffect(() => {
|
|
172
91
|
if (!loadRegions) {
|
|
173
92
|
return;
|
|
174
93
|
}
|
|
175
|
-
loadRegions().then(
|
|
94
|
+
loadRegions().then((regions) => setRegions(regions.map(toOption)));
|
|
176
95
|
}, [loadRegions]);
|
|
177
96
|
return (React__default.createElement(ui.FieldSet, { label: skipHeader ? '' : 'Connection Details', "data-testid": "connection-config" },
|
|
178
|
-
React__default.createElement(ui.InlineField, { label: "Authentication Provider", labelWidth:
|
|
179
|
-
React__default.createElement(ui.Select, { "aria-label": "Authentication Provider", className: "width-30", value: currentProvider, options: awsAuthProviderOptions.filter(
|
|
97
|
+
React__default.createElement(ui.InlineField, { label: "Authentication Provider", labelWidth: labelWidth, tooltip: "Specify which AWS credentials chain to use." },
|
|
98
|
+
React__default.createElement(ui.Select, { "aria-label": "Authentication Provider", className: "width-30", value: currentProvider, options: awsAuthProviderOptions.filter((opt) => awsAllowedAuthProviders.includes(opt.value)), defaultValue: options.jsonData.authType, onChange: (option) => {
|
|
180
99
|
data.onUpdateDatasourceJsonDataOptionSelect(props, 'authType')(option);
|
|
181
100
|
}, menuShouldPortal: true })),
|
|
182
|
-
options.jsonData.authType === 'credentials' && (React__default.createElement(ui.InlineField, { label: "Credentials Profile Name", labelWidth:
|
|
101
|
+
options.jsonData.authType === 'credentials' && (React__default.createElement(ui.InlineField, { label: "Credentials Profile Name", labelWidth: labelWidth, tooltip: "Credentials profile name, as specified in ~/.aws/credentials, leave blank for default." },
|
|
183
102
|
React__default.createElement(ui.Input, { "aria-label": "Credentials Profile Name", className: "width-30", placeholder: "default", value: profile, onChange: data.onUpdateDatasourceJsonDataOption(props, 'profile') }))),
|
|
184
103
|
options.jsonData.authType === 'keys' && (React__default.createElement(React__default.Fragment, null,
|
|
185
|
-
React__default.createElement(ui.InlineField, { label: "Access Key ID", labelWidth:
|
|
104
|
+
React__default.createElement(ui.InlineField, { label: "Access Key ID", labelWidth: labelWidth }, ((_b = props.options.secureJsonFields) === null || _b === void 0 ? void 0 : _b.accessKey) ? (React__default.createElement(ui.ButtonGroup, { className: "width-30" },
|
|
186
105
|
React__default.createElement(ui.Input, { disabled: true, placeholder: "Configured" }),
|
|
187
106
|
React__default.createElement(ui.ToolbarButton, { icon: "edit", tooltip: "Edit Access Key ID", type: "button", onClick: data.onUpdateDatasourceResetOption(props, 'accessKey') }))) : (React__default.createElement(ui.Input, { "aria-label": "Access Key ID", className: "width-30", value: (_d = (_c = options.secureJsonData) === null || _c === void 0 ? void 0 : _c.accessKey) !== null && _d !== void 0 ? _d : '', onChange: data.onUpdateDatasourceSecureJsonDataOption(props, 'accessKey') }))),
|
|
188
|
-
React__default.createElement(ui.InlineField, { label: "Secret Access Key", labelWidth:
|
|
107
|
+
React__default.createElement(ui.InlineField, { label: "Secret Access Key", labelWidth: labelWidth }, ((_e = props.options.secureJsonFields) === null || _e === void 0 ? void 0 : _e.secretKey) ? (React__default.createElement(ui.ButtonGroup, { className: "width-30" },
|
|
189
108
|
React__default.createElement(ui.Input, { disabled: true, placeholder: "Configured" }),
|
|
190
109
|
React__default.createElement(ui.ToolbarButton, { icon: "edit", type: "button", tooltip: "Edit Secret Access Key", onClick: data.onUpdateDatasourceResetOption(props, 'secretKey') }))) : (React__default.createElement(ui.Input, { "aria-label": "Secret Access Key", className: "width-30", value: (_g = (_f = options.secureJsonData) === null || _f === void 0 ? void 0 : _f.secretKey) !== null && _g !== void 0 ? _g : '', onChange: data.onUpdateDatasourceSecureJsonDataOption(props, 'secretKey') }))))),
|
|
191
110
|
awsAssumeRoleEnabled && (React__default.createElement(React__default.Fragment, null,
|
|
192
|
-
React__default.createElement(ui.InlineField, { label: "Assume Role ARN", labelWidth:
|
|
111
|
+
React__default.createElement(ui.InlineField, { label: "Assume Role ARN", labelWidth: labelWidth, tooltip: "Optionally, specify the ARN of a role to assume. Specifying a role here will ensure that the selected authentication provider is used to assume the specified role rather than using the credentials directly. Leave blank if you don't need to assume a role at all" },
|
|
193
112
|
React__default.createElement(ui.Input, { "aria-label": "Assume Role ARN", className: "width-30", placeholder: "arn:aws:iam:*", value: options.jsonData.assumeRoleArn || '', onChange: data.onUpdateDatasourceJsonDataOption(props, 'assumeRoleArn') })),
|
|
194
|
-
React__default.createElement(ui.InlineField, { label: "External ID", labelWidth:
|
|
113
|
+
React__default.createElement(ui.InlineField, { label: "External ID", labelWidth: labelWidth, tooltip: "If you are assuming a role in another account, that has been created with an external ID, specify the external ID here." },
|
|
195
114
|
React__default.createElement(ui.Input, { "aria-label": "External ID", className: "width-30", placeholder: "External ID", value: options.jsonData.externalId || '', onChange: data.onUpdateDatasourceJsonDataOption(props, 'externalId') })))),
|
|
196
|
-
!skipEndpoint && (React__default.createElement(ui.InlineField, { label: "Endpoint", labelWidth:
|
|
115
|
+
!skipEndpoint && (React__default.createElement(ui.InlineField, { label: "Endpoint", labelWidth: labelWidth, tooltip: "Optionally, specify a custom endpoint for the service" },
|
|
197
116
|
React__default.createElement(ui.Input, { "aria-label": "Endpoint", className: "width-30", placeholder: (_h = props.defaultEndpoint) !== null && _h !== void 0 ? _h : 'https://{service}.{region}.amazonaws.com', value: options.jsonData.endpoint || '', onChange: data.onUpdateDatasourceJsonDataOption(props, 'endpoint') }))),
|
|
198
|
-
React__default.createElement(ui.InlineField, { label: "Default Region", labelWidth:
|
|
199
|
-
React__default.createElement(ui.Select, { "aria-label": "Default Region", className: "width-30", value: regions.find(
|
|
117
|
+
React__default.createElement(ui.InlineField, { label: "Default Region", labelWidth: labelWidth, tooltip: "Specify the region, such as for US West (Oregon) use ` us-west-2 ` as the region." },
|
|
118
|
+
React__default.createElement(ui.Select, { "aria-label": "Default Region", className: "width-30", value: regions.find((region) => region.value === options.jsonData.defaultRegion), options: regions, defaultValue: options.jsonData.defaultRegion, allowCustomValue: true, onChange: data.onUpdateDatasourceJsonDataOptionSelect(props, 'defaultRegion'), formatCreateLabel: (r) => `Use region: ${r}`, menuShouldPortal: true })),
|
|
200
119
|
props.children));
|
|
201
120
|
};
|
|
202
121
|
|
|
203
|
-
|
|
122
|
+
const SIGV4ConnectionConfig = (props) => {
|
|
204
123
|
var _a, _b, _c, _d;
|
|
205
|
-
|
|
124
|
+
const { onOptionsChange, options } = props;
|
|
206
125
|
// Map HttpSettings props to ConnectionConfigProps
|
|
207
|
-
|
|
208
|
-
onOptionsChange:
|
|
126
|
+
const connectionConfigProps = {
|
|
127
|
+
onOptionsChange: (awsDataSourceSettings) => {
|
|
209
128
|
var _a, _b, _c, _d;
|
|
210
|
-
|
|
129
|
+
const dataSourceSettings = Object.assign(Object.assign({}, options), { jsonData: Object.assign(Object.assign({}, options.jsonData), { sigV4AuthType: awsDataSourceSettings.jsonData.authType, sigV4Profile: awsDataSourceSettings.jsonData.profile, sigV4AssumeRoleArn: awsDataSourceSettings.jsonData.assumeRoleArn, sigV4ExternalId: awsDataSourceSettings.jsonData.externalId, sigV4Region: awsDataSourceSettings.jsonData.defaultRegion, sigV4Endpoint: awsDataSourceSettings.jsonData.endpoint }), secureJsonFields: {
|
|
211
130
|
sigV4AccessKey: (_a = awsDataSourceSettings.secureJsonFields) === null || _a === void 0 ? void 0 : _a.accessKey,
|
|
212
131
|
sigV4SecretKey: (_b = awsDataSourceSettings.secureJsonFields) === null || _b === void 0 ? void 0 : _b.secretKey,
|
|
213
132
|
}, secureJsonData: {
|
|
@@ -216,7 +135,7 @@ var SIGV4ConnectionConfig = function (props) {
|
|
|
216
135
|
} });
|
|
217
136
|
onOptionsChange(dataSourceSettings);
|
|
218
137
|
},
|
|
219
|
-
options:
|
|
138
|
+
options: Object.assign(Object.assign({}, options), { jsonData: Object.assign(Object.assign({}, options.jsonData), { authType: options.jsonData.sigV4AuthType, profile: options.jsonData.sigV4Profile, assumeRoleArn: options.jsonData.sigV4AssumeRoleArn, externalId: options.jsonData.sigV4ExternalId, defaultRegion: options.jsonData.sigV4Region, endpoint: options.jsonData.sigV4Endpoint }), secureJsonFields: {
|
|
220
139
|
accessKey: (_a = options.secureJsonFields) === null || _a === void 0 ? void 0 : _a.sigV4AccessKey,
|
|
221
140
|
secretKey: (_b = options.secureJsonFields) === null || _b === void 0 ? void 0 : _b.sigV4SecretKey,
|
|
222
141
|
}, secureJsonData: {
|
|
@@ -227,24 +146,48 @@ var SIGV4ConnectionConfig = function (props) {
|
|
|
227
146
|
return (React__default.createElement(React__default.Fragment, null,
|
|
228
147
|
React__default.createElement("div", { className: "gf-form" },
|
|
229
148
|
React__default.createElement("h6", null, "SigV4 Auth Details")),
|
|
230
|
-
React__default.createElement(ConnectionConfig,
|
|
149
|
+
React__default.createElement(ConnectionConfig, Object.assign({}, connectionConfigProps, { skipHeader: true, skipEndpoint: true }))));
|
|
231
150
|
};
|
|
232
151
|
|
|
233
|
-
|
|
152
|
+
/*! *****************************************************************************
|
|
153
|
+
Copyright (c) Microsoft Corporation.
|
|
154
|
+
|
|
155
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
156
|
+
purpose with or without fee is hereby granted.
|
|
157
|
+
|
|
158
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
159
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
160
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
161
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
162
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
163
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
164
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
165
|
+
***************************************************************************** */
|
|
166
|
+
|
|
167
|
+
function __awaiter(thisArg, _arguments, P, generator) {
|
|
168
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
169
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
170
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
171
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
172
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
173
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const defaultKey = '__default';
|
|
234
178
|
|
|
235
179
|
function ResourceSelector(props) {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
var opts = [
|
|
180
|
+
const [resource, setResource] = React.useState(props.value || props.default || null);
|
|
181
|
+
const [resources, setResources] = React.useState(resource ? [resource] : []);
|
|
182
|
+
const [dependencies, setDependencies] = React.useState(props.dependencies);
|
|
183
|
+
const [isLoading, setIsLoading] = React.useState(false);
|
|
184
|
+
const [fetched, setFetched] = React.useState(false);
|
|
185
|
+
const defaultOpts = React.useMemo(() => {
|
|
186
|
+
const opts = [
|
|
244
187
|
{
|
|
245
|
-
label:
|
|
188
|
+
label: `default (${props.default})`,
|
|
246
189
|
value: defaultKey,
|
|
247
|
-
description:
|
|
190
|
+
description: `Default value set in the data source`,
|
|
248
191
|
},
|
|
249
192
|
];
|
|
250
193
|
if (props.value && props.value !== defaultKey) {
|
|
@@ -252,18 +195,18 @@ function ResourceSelector(props) {
|
|
|
252
195
|
}
|
|
253
196
|
return opts;
|
|
254
197
|
}, [props.default, props.value]);
|
|
255
|
-
|
|
256
|
-
React.useEffect(
|
|
198
|
+
const [options, setOptions] = React.useState(props.default ? defaultOpts : []);
|
|
199
|
+
React.useEffect(() => {
|
|
257
200
|
if (props.resources !== undefined) {
|
|
258
201
|
setResources(props.resources);
|
|
259
202
|
}
|
|
260
203
|
}, [props.resources]);
|
|
261
|
-
React.useEffect(
|
|
262
|
-
|
|
204
|
+
React.useEffect(() => {
|
|
205
|
+
const newOptions = props.default ? defaultOpts : [];
|
|
263
206
|
if (resources.length) {
|
|
264
|
-
resources.forEach(
|
|
265
|
-
|
|
266
|
-
if (!newOptions.find(
|
|
207
|
+
resources.forEach((r) => {
|
|
208
|
+
const value = typeof r === 'string' ? r : r.value;
|
|
209
|
+
if (!newOptions.find((o) => o.value === value)) {
|
|
267
210
|
typeof r === 'string' ? newOptions.push({ label: r, value: r }) : newOptions.push(r);
|
|
268
211
|
}
|
|
269
212
|
});
|
|
@@ -273,7 +216,7 @@ function ResourceSelector(props) {
|
|
|
273
216
|
setOptions([]);
|
|
274
217
|
}
|
|
275
218
|
}, [resources, defaultOpts, props.default]);
|
|
276
|
-
React.useEffect(
|
|
219
|
+
React.useEffect(() => {
|
|
277
220
|
// A change in the dependencies cause a state clean-up
|
|
278
221
|
if (!lodash.isEqual(props.dependencies, dependencies)) {
|
|
279
222
|
setFetched(false);
|
|
@@ -282,95 +225,74 @@ function ResourceSelector(props) {
|
|
|
282
225
|
setDependencies(props.dependencies);
|
|
283
226
|
}
|
|
284
227
|
}, [props, dependencies]);
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
case 3:
|
|
302
|
-
resources_1 = _a.sent();
|
|
303
|
-
setResources(resources_1);
|
|
304
|
-
return [3 /*break*/, 5];
|
|
305
|
-
case 4:
|
|
306
|
-
setFetched(true);
|
|
307
|
-
return [7 /*endfinally*/];
|
|
308
|
-
case 5: return [2 /*return*/];
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
}); };
|
|
312
|
-
var onChange = function (e) {
|
|
228
|
+
const fetch = () => __awaiter(this, void 0, void 0, function* () {
|
|
229
|
+
if (fetched) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
if (props.saveOptions) {
|
|
233
|
+
yield props.saveOptions();
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
const resources = yield props.fetch();
|
|
237
|
+
setResources(resources);
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
setFetched(true);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
const onChange = (e) => {
|
|
313
244
|
props.onChange(e);
|
|
314
245
|
if (e.value) {
|
|
315
246
|
setResource(e.value);
|
|
316
247
|
}
|
|
317
248
|
};
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
case 2:
|
|
328
|
-
_a.sent();
|
|
329
|
-
return [3 /*break*/, 4];
|
|
330
|
-
case 3:
|
|
331
|
-
setIsLoading(false);
|
|
332
|
-
return [7 /*endfinally*/];
|
|
333
|
-
case 4: return [2 /*return*/];
|
|
334
|
-
}
|
|
335
|
-
});
|
|
336
|
-
}); };
|
|
249
|
+
const onClick = () => __awaiter(this, void 0, void 0, function* () {
|
|
250
|
+
setIsLoading(true);
|
|
251
|
+
try {
|
|
252
|
+
yield fetch();
|
|
253
|
+
}
|
|
254
|
+
finally {
|
|
255
|
+
setIsLoading(false);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
337
258
|
return (React__default.createElement(ui.InlineField, { label: props.label, labelWidth: props.labelWidth, tooltip: props.tooltip, hidden: props.hidden },
|
|
338
259
|
React__default.createElement("div", { "data-testid": props['data-testid'], title: props.title },
|
|
339
|
-
React__default.createElement(ui.Select,
|
|
260
|
+
React__default.createElement(ui.Select, Object.assign({}, props, { "aria-label": props.label, options: options, onChange: onChange, isLoading: isLoading, className: props.className || 'min-width-6', onOpenMenu: () => props.fetch && onClick(), menuShouldPortal: true })))));
|
|
340
261
|
}
|
|
341
262
|
|
|
342
263
|
function ConfigSelect(props) {
|
|
343
|
-
var _a, _b;
|
|
344
|
-
|
|
345
|
-
|
|
264
|
+
var _a, _b, _c;
|
|
265
|
+
const { jsonData } = props.options;
|
|
266
|
+
const commonProps = {
|
|
346
267
|
title: jsonData.defaultRegion ? '' : 'select a default region',
|
|
347
|
-
labelWidth: 28,
|
|
268
|
+
labelWidth: (_a = props.labelWidth) !== null && _a !== void 0 ? _a : 28,
|
|
348
269
|
className: 'width-30',
|
|
349
270
|
};
|
|
350
271
|
// Any change in the AWS connection details will affect selectors
|
|
351
|
-
|
|
272
|
+
const dependencies = [
|
|
352
273
|
props.options.jsonData.assumeRoleArn,
|
|
353
274
|
props.options.jsonData.authType,
|
|
354
275
|
props.options.jsonData.defaultRegion,
|
|
355
276
|
props.options.jsonData.endpoint,
|
|
356
277
|
props.options.jsonData.externalId,
|
|
357
278
|
props.options.jsonData.profile,
|
|
358
|
-
(
|
|
359
|
-
(
|
|
279
|
+
(_b = props.options.secureJsonData) === null || _b === void 0 ? void 0 : _b.accessKey,
|
|
280
|
+
(_c = props.options.secureJsonData) === null || _c === void 0 ? void 0 : _c.secretKey,
|
|
360
281
|
].concat(props.dependencies);
|
|
361
|
-
return (React__default.createElement(ResourceSelector,
|
|
282
|
+
return (React__default.createElement(ResourceSelector, Object.assign({ label: props.label, "data-testid": props['data-testid'], onChange: props.onChange, fetch: props.fetch, value: props.value, saveOptions: props.saveOptions, dependencies: dependencies, hidden: props.hidden, disabled: props.disabled || !jsonData.defaultRegion, allowCustomValue: props.allowCustomValue, autoFocus: props.autoFocus, backspaceRemovesValue: props.backspaceRemovesValue, className: props.className, invalid: props.invalid, isClearable: props.isClearable, isMulti: props.isMulti, inputId: props.inputId, showAllSelectedWhenOpen: props.showAllSelectedWhenOpen, maxMenuHeight: props.maxMenuHeight, minMenuHeight: props.minMenuHeight, maxVisibleValues: props.maxVisibleValues, menuPlacement: props.menuPlacement, menuPosition: props.menuPosition, noOptionsMessage: props.noOptionsMessage, onBlur: props.onBlur, onCreateOption: props.onCreateOption, onInputChange: props.onInputChange, placeholder: props.placeholder, width: props.width, isOptionDisabled: props.isOptionDisabled }, commonProps)));
|
|
362
283
|
}
|
|
363
284
|
|
|
364
285
|
function InlineInput(props) {
|
|
365
|
-
|
|
286
|
+
var _a;
|
|
287
|
+
return (React__default.createElement(ui.InlineField, { label: props.label, labelWidth: (_a = props.labelWidth) !== null && _a !== void 0 ? _a : 28, tooltip: props.tooltip, hidden: props.hidden, disabled: props.disabled },
|
|
366
288
|
React__default.createElement(ui.Input, { "data-testid": props['data-testid'], className: "width-30", value: props.value, onChange: props.onChange, placeholder: props.placeholder, disabled: props.disabled })));
|
|
367
289
|
}
|
|
368
290
|
|
|
369
291
|
function QueryCodeEditor(props) {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
292
|
+
const { getSuggestions, query } = props;
|
|
293
|
+
const { rawSQL } = lodash.defaults(props.query, { rawSQL: '' });
|
|
294
|
+
const onRawSqlChange = (rawSQL) => {
|
|
295
|
+
const query = Object.assign(Object.assign({}, props.query), { rawSQL });
|
|
374
296
|
props.onChange(query);
|
|
375
297
|
props.onRunQuery();
|
|
376
298
|
};
|
|
@@ -378,17 +300,17 @@ function QueryCodeEditor(props) {
|
|
|
378
300
|
// https://github.com/grafana/grafana/issues/40121
|
|
379
301
|
// It was been fixed in 8.3 but keeping the workaround here to support older
|
|
380
302
|
// versions.
|
|
381
|
-
|
|
382
|
-
React.useEffect(
|
|
303
|
+
const suggestionsRef = React.useRef([]);
|
|
304
|
+
React.useEffect(() => {
|
|
383
305
|
suggestionsRef.current = getSuggestions(query);
|
|
384
306
|
}, [getSuggestions, query]);
|
|
385
|
-
return (React__default.createElement(ui.CodeEditor,
|
|
307
|
+
return (React__default.createElement(ui.CodeEditor, Object.assign({ language: props.language, value: rawSQL, onBlur: onRawSqlChange, showMiniMap: false, showLineNumbers: true, getSuggestions: () => suggestionsRef.current, height: "240px" }, props.editorProps)));
|
|
386
308
|
}
|
|
387
309
|
|
|
388
310
|
function FormatSelect(props) {
|
|
389
|
-
|
|
311
|
+
const onChangeFormat = (e) => {
|
|
390
312
|
var _a;
|
|
391
|
-
props.onChange(
|
|
313
|
+
props.onChange(Object.assign(Object.assign({}, props.query), { format: e.value || 0 }));
|
|
392
314
|
(_a = props.onRunQuery) === null || _a === void 0 ? void 0 : _a.call(props);
|
|
393
315
|
};
|
|
394
316
|
return (React__default.createElement(ui.InlineField, { label: "Format as", labelWidth: 11 },
|
|
@@ -400,7 +322,7 @@ function FormatSelect(props) {
|
|
|
400
322
|
FillValueOptions[FillValueOptions["Null"] = 1] = "Null";
|
|
401
323
|
FillValueOptions[FillValueOptions["Value"] = 2] = "Value";
|
|
402
324
|
})(exports.FillValueOptions || (exports.FillValueOptions = {}));
|
|
403
|
-
|
|
325
|
+
const SelectableFillValueOptions = [
|
|
404
326
|
{
|
|
405
327
|
label: 'Previous Value',
|
|
406
328
|
value: exports.FillValueOptions.Previous,
|
|
@@ -418,22 +340,18 @@ function FillValueSelect(props) {
|
|
|
418
340
|
var _a, _b, _c;
|
|
419
341
|
return (React__default.createElement(React__default.Fragment, null,
|
|
420
342
|
React__default.createElement(ui.InlineField, { label: "Fill value", tooltip: "value to fill missing points" },
|
|
421
|
-
React__default.createElement(ui.Select, { "aria-label": "Fill value", options: SelectableFillValueOptions, value: (_b = (_a = props.query.fillMode) === null || _a === void 0 ? void 0 : _a.mode) !== null && _b !== void 0 ? _b : exports.FillValueOptions.Previous, onChange:
|
|
422
|
-
var
|
|
423
|
-
|
|
424
|
-
props.onChange(__assign(__assign({}, props.query), {
|
|
343
|
+
React__default.createElement(ui.Select, { "aria-label": "Fill value", options: SelectableFillValueOptions, value: (_b = (_a = props.query.fillMode) === null || _a === void 0 ? void 0 : _a.mode) !== null && _b !== void 0 ? _b : exports.FillValueOptions.Previous, onChange: ({ value }) => {
|
|
344
|
+
var _a;
|
|
345
|
+
props.onChange(Object.assign(Object.assign({}, props.query), {
|
|
425
346
|
// Keep the fillMode.value in case FillValueOptions.Value mode is selected back
|
|
426
|
-
fillMode:
|
|
427
|
-
(
|
|
347
|
+
fillMode: Object.assign(Object.assign({}, props.query.fillMode), { mode: value }) }));
|
|
348
|
+
(_a = props.onRunQuery) === null || _a === void 0 ? void 0 : _a.call(props);
|
|
428
349
|
}, className: "width-12", menuShouldPortal: true })),
|
|
429
350
|
((_c = props.query.fillMode) === null || _c === void 0 ? void 0 : _c.mode) === exports.FillValueOptions.Value && (React__default.createElement(ui.InlineField, { label: "Value", labelWidth: 11 },
|
|
430
|
-
React__default.createElement(ui.Input, { type: "number", "aria-label": "Value", value: props.query.fillMode.value, onChange:
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
value: currentTarget.valueAsNumber,
|
|
435
|
-
} }));
|
|
436
|
-
}, onBlur: function () { var _a; return (_a = props.onRunQuery) === null || _a === void 0 ? void 0 : _a.call(props); } })))));
|
|
351
|
+
React__default.createElement(ui.Input, { type: "number", "aria-label": "Value", value: props.query.fillMode.value, onChange: ({ currentTarget }) => props.onChange(Object.assign(Object.assign({}, props.query), { fillMode: {
|
|
352
|
+
mode: exports.FillValueOptions.Value,
|
|
353
|
+
value: currentTarget.valueAsNumber,
|
|
354
|
+
} })), onBlur: () => { var _a; return (_a = props.onRunQuery) === null || _a === void 0 ? void 0 : _a.call(props); } })))));
|
|
437
355
|
}
|
|
438
356
|
|
|
439
357
|
/**
|
|
@@ -443,14 +361,14 @@ function filterSQLQuery(query) {
|
|
|
443
361
|
return !!query.rawSQL;
|
|
444
362
|
}
|
|
445
363
|
function applySQLTemplateVariables(query, scopedVars, getTemplateSrv) {
|
|
446
|
-
|
|
447
|
-
return
|
|
364
|
+
const templateSrv = getTemplateSrv();
|
|
365
|
+
return Object.assign(Object.assign({}, query), { rawSQL: templateSrv.replace(query.rawSQL, scopedVars, interpolateVariable) });
|
|
448
366
|
}
|
|
449
367
|
function interpolateVariable(value) {
|
|
450
368
|
if (typeof value === 'string') {
|
|
451
369
|
return value;
|
|
452
370
|
}
|
|
453
|
-
|
|
371
|
+
const quotedValues = value.map((v) => {
|
|
454
372
|
return quoteLiteral(v);
|
|
455
373
|
});
|
|
456
374
|
return quotedValues.join(',');
|
|
@@ -458,19 +376,19 @@ function interpolateVariable(value) {
|
|
|
458
376
|
function quoteLiteral(value) {
|
|
459
377
|
return "'" + String(value).replace(/'/g, "''") + "'";
|
|
460
378
|
}
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
templateSrv.getVariables().forEach(
|
|
465
|
-
|
|
466
|
-
|
|
379
|
+
const appendTemplateVariablesAsSuggestions = (getTemplateSrv, sugs) => {
|
|
380
|
+
const templateSrv = getTemplateSrv();
|
|
381
|
+
const templateSugs = [];
|
|
382
|
+
templateSrv.getVariables().forEach((variable) => {
|
|
383
|
+
const label = '$' + variable.name;
|
|
384
|
+
let val = templateSrv.replace(label);
|
|
467
385
|
if (val === label) {
|
|
468
386
|
val = '';
|
|
469
387
|
}
|
|
470
388
|
templateSugs.push({
|
|
471
|
-
label
|
|
389
|
+
label,
|
|
472
390
|
kind: ui.CodeEditorSuggestionItemKind.Text,
|
|
473
|
-
detail:
|
|
391
|
+
detail: `(Template Variable) ${val}`,
|
|
474
392
|
});
|
|
475
393
|
});
|
|
476
394
|
return sugs.concat(templateSugs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.development.js","sources":["../src/regions.ts","../src/types.ts","../src/providers.ts","../src/ConnectionConfig.tsx","../src/SIGV4ConnectionConfig.tsx","../src/sql/types.ts","../src/sql/ResourceSelector.tsx","../src/sql/ConfigEditor/ConfigSelect.tsx","../src/sql/ConfigEditor/InlineInput.tsx","../src/sql/QueryEditor/QueryCodeEditor.tsx","../src/sql/QueryEditor/FormatSelect.tsx","../src/sql/QueryEditor/FillValueSelect.tsx","../src/sql/utils/utils.ts"],"sourcesContent":["export const standardRegions: string[] = [\n 'af-south-1',\n 'ap-east-1',\n 'ap-northeast-1',\n 'ap-northeast-2',\n 'ap-northeast-3',\n 'ap-south-1',\n 'ap-southeast-1',\n 'ap-southeast-2',\n 'ca-central-1',\n 'cn-north-1',\n 'cn-northwest-1',\n 'eu-central-1',\n 'eu-north-1',\n 'eu-west-1',\n 'eu-west-2',\n 'eu-west-3',\n 'me-south-1',\n 'sa-east-1',\n 'us-east-1',\n 'us-east-2',\n 'us-gov-east-1',\n 'us-gov-west-1',\n 'us-iso-east-1',\n 'us-isob-east-1',\n 'us-west-1',\n 'us-west-2',\n];\n","import { DataSourceJsonData, DataSourceSettings } from '@grafana/data';\n\nexport enum AwsAuthType {\n Keys = 'keys',\n Credentials = 'credentials',\n Default = 'default', // was 'arn',\n EC2IAMRole = 'ec2_iam_role',\n /**\n * @deprecated use default\n */\n ARN = 'arn',\n}\n\nexport interface AwsAuthDataSourceJsonData extends DataSourceJsonData {\n authType?: AwsAuthType;\n assumeRoleArn?: string;\n externalId?: string;\n profile?: string; // Credentials profile name, as specified in ~/.aws/credentials\n defaultRegion?: string; // region if it is not defined by your credentials file\n endpoint?: string;\n}\n\nexport interface AwsAuthDataSourceSecureJsonData {\n accessKey?: string;\n secretKey?: string;\n sessionToken?: string;\n}\n\nexport type AwsAuthDataSourceSettings = DataSourceSettings<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData>;\n","import { SelectableValue } from '@grafana/data';\nimport { AwsAuthType } from './types';\n\nexport const awsAuthProviderOptions = [\n {\n label: 'Workspace IAM Role',\n value: AwsAuthType.EC2IAMRole,\n },\n {\n label: 'AWS SDK Default',\n value: AwsAuthType.Default,\n },\n {\n label: 'Access & secret key',\n value: AwsAuthType.Keys,\n },\n {\n label: 'Credentials file',\n value: AwsAuthType.Credentials,\n },\n] as Array<SelectableValue<AwsAuthType>>;\n","import React, { FC, useEffect, useMemo, useState } from 'react';\nimport { Input, Select, InlineField, ButtonGroup, ToolbarButton, FieldSet } from '@grafana/ui';\nimport {\n DataSourcePluginOptionsEditorProps,\n onUpdateDatasourceJsonDataOptionSelect,\n onUpdateDatasourceResetOption,\n onUpdateDatasourceJsonDataOption,\n onUpdateDatasourceSecureJsonDataOption,\n} from '@grafana/data';\n\nimport { standardRegions } from './regions';\nimport { AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData, AwsAuthType } from './types';\nimport { awsAuthProviderOptions } from './providers';\n\nconst toOption = (value: string) => ({ value, label: value });\n\nexport interface ConnectionConfigProps<J = AwsAuthDataSourceJsonData, S = AwsAuthDataSourceSecureJsonData>\n extends DataSourcePluginOptionsEditorProps<J, S> {\n standardRegions?: string[];\n loadRegions?: () => Promise<string[]>;\n defaultEndpoint?: string;\n skipHeader?: boolean;\n skipEndpoint?: boolean;\n children?: React.ReactNode;\n}\n\nexport const ConnectionConfig: FC<ConnectionConfigProps> = (props: ConnectionConfigProps) => {\n const [regions, setRegions] = useState((props.standardRegions || standardRegions).map(toOption));\n const { loadRegions, onOptionsChange, skipHeader = false, skipEndpoint = false } = props;\n const options = props.options;\n let profile = options.jsonData.profile;\n if (profile === undefined) {\n profile = options.database;\n }\n\n const settings = (window as any).grafanaBootData.settings;\n const awsAllowedAuthProviders = useMemo(\n () => settings.awsAllowedAuthProviders ?? [AwsAuthType.Default, AwsAuthType.Keys, AwsAuthType.Credentials],\n [settings.awsAllowedAuthProviders]\n );\n const awsAssumeRoleEnabled = settings.awsAssumeRoleEnabled ?? true;\n\n const currentProvider = awsAuthProviderOptions.find((p) => p.value === options.jsonData.authType);\n\n useEffect(() => {\n // Make sure a authType exists in the current model\n if (!currentProvider && awsAllowedAuthProviders.length) {\n onOptionsChange({\n ...options,\n jsonData: {\n ...options.jsonData,\n authType: awsAllowedAuthProviders[0],\n },\n });\n }\n }, [currentProvider, options, onOptionsChange, awsAllowedAuthProviders]);\n\n useEffect(() => {\n if (!loadRegions) {\n return;\n }\n\n loadRegions().then((regions) => setRegions(regions.map(toOption)));\n }, [loadRegions]);\n\n return (\n <FieldSet label={skipHeader ? '' : 'Connection Details'} data-testid=\"connection-config\">\n <InlineField\n label=\"Authentication Provider\"\n labelWidth={28}\n tooltip=\"Specify which AWS credentials chain to use.\"\n >\n <Select\n aria-label=\"Authentication Provider\"\n className=\"width-30\"\n value={currentProvider}\n options={awsAuthProviderOptions.filter((opt) => awsAllowedAuthProviders.includes(opt.value!))}\n defaultValue={options.jsonData.authType}\n onChange={(option) => {\n onUpdateDatasourceJsonDataOptionSelect(props, 'authType')(option);\n }}\n menuShouldPortal={true}\n />\n </InlineField>\n {options.jsonData.authType === 'credentials' && (\n <InlineField\n label=\"Credentials Profile Name\"\n labelWidth={28}\n tooltip=\"Credentials profile name, as specified in ~/.aws/credentials, leave blank for default.\"\n >\n <Input\n aria-label=\"Credentials Profile Name\"\n className=\"width-30\"\n placeholder=\"default\"\n value={profile}\n onChange={onUpdateDatasourceJsonDataOption(props, 'profile')}\n />\n </InlineField>\n )}\n\n {options.jsonData.authType === 'keys' && (\n <>\n <InlineField label=\"Access Key ID\" labelWidth={28}>\n {props.options.secureJsonFields?.accessKey ? (\n <ButtonGroup className=\"width-30\">\n <Input disabled placeholder=\"Configured\" />\n <ToolbarButton\n icon=\"edit\"\n tooltip=\"Edit Access Key ID\"\n type=\"button\"\n onClick={onUpdateDatasourceResetOption(props as any, 'accessKey')}\n />\n </ButtonGroup>\n ) : (\n <Input\n aria-label=\"Access Key ID\"\n className=\"width-30\"\n value={options.secureJsonData?.accessKey ?? ''}\n onChange={onUpdateDatasourceSecureJsonDataOption(props, 'accessKey')}\n />\n )}\n </InlineField>\n\n <InlineField label=\"Secret Access Key\" labelWidth={28}>\n {props.options.secureJsonFields?.secretKey ? (\n <ButtonGroup className=\"width-30\">\n <Input disabled placeholder=\"Configured\" />\n <ToolbarButton\n icon=\"edit\"\n type=\"button\"\n tooltip=\"Edit Secret Access Key\"\n onClick={onUpdateDatasourceResetOption(props as any, 'secretKey')}\n />\n </ButtonGroup>\n ) : (\n <Input\n aria-label=\"Secret Access Key\"\n className=\"width-30\"\n value={options.secureJsonData?.secretKey ?? ''}\n onChange={onUpdateDatasourceSecureJsonDataOption(props, 'secretKey')}\n />\n )}\n </InlineField>\n </>\n )}\n\n {awsAssumeRoleEnabled && (\n <>\n <InlineField\n label=\"Assume Role ARN\"\n labelWidth={28}\n tooltip=\"Optionally, specify the ARN of a role to assume. Specifying a role here will ensure that the selected authentication provider is used to assume the specified role rather than using the credentials directly. Leave blank if you don't need to assume a role at all\"\n >\n <Input\n aria-label=\"Assume Role ARN\"\n className=\"width-30\"\n placeholder=\"arn:aws:iam:*\"\n value={options.jsonData.assumeRoleArn || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'assumeRoleArn')}\n />\n </InlineField>\n <InlineField\n label=\"External ID\"\n labelWidth={28}\n tooltip=\"If you are assuming a role in another account, that has been created with an external ID, specify the external ID here.\"\n >\n <Input\n aria-label=\"External ID\"\n className=\"width-30\"\n placeholder=\"External ID\"\n value={options.jsonData.externalId || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'externalId')}\n />\n </InlineField>\n </>\n )}\n {!skipEndpoint && (\n <InlineField label=\"Endpoint\" labelWidth={28} tooltip=\"Optionally, specify a custom endpoint for the service\">\n <Input\n aria-label=\"Endpoint\"\n className=\"width-30\"\n placeholder={props.defaultEndpoint ?? 'https://{service}.{region}.amazonaws.com'}\n value={options.jsonData.endpoint || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'endpoint')}\n />\n </InlineField>\n )}\n <InlineField\n label=\"Default Region\"\n labelWidth={28}\n tooltip=\"Specify the region, such as for US West (Oregon) use ` us-west-2 ` as the region.\"\n >\n <Select\n aria-label=\"Default Region\"\n className=\"width-30\"\n value={regions.find((region) => region.value === options.jsonData.defaultRegion)}\n options={regions}\n defaultValue={options.jsonData.defaultRegion}\n allowCustomValue={true}\n onChange={onUpdateDatasourceJsonDataOptionSelect(props, 'defaultRegion')}\n formatCreateLabel={(r) => `Use region: ${r}`}\n menuShouldPortal={true}\n />\n </InlineField>\n {props.children}\n </FieldSet>\n );\n};\n","import React from 'react';\nimport { DataSourcePluginOptionsEditorProps, DataSourceSettings } from '@grafana/data';\nimport { ConnectionConfig, ConnectionConfigProps } from './ConnectionConfig';\n\nimport { AwsAuthDataSourceSecureJsonData, AwsAuthDataSourceJsonData } from './types';\n\nexport const SIGV4ConnectionConfig: React.FC<DataSourcePluginOptionsEditorProps<any, any>> = (\n props: DataSourcePluginOptionsEditorProps<any, any>\n) => {\n const { onOptionsChange, options } = props;\n\n // Map HttpSettings props to ConnectionConfigProps\n const connectionConfigProps: ConnectionConfigProps<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData> = {\n onOptionsChange: (awsDataSourceSettings) => {\n const dataSourceSettings: DataSourceSettings<any, any> = {\n ...options,\n jsonData: {\n ...options.jsonData,\n sigV4AuthType: awsDataSourceSettings.jsonData.authType,\n sigV4Profile: awsDataSourceSettings.jsonData.profile,\n sigV4AssumeRoleArn: awsDataSourceSettings.jsonData.assumeRoleArn,\n sigV4ExternalId: awsDataSourceSettings.jsonData.externalId,\n sigV4Region: awsDataSourceSettings.jsonData.defaultRegion,\n sigV4Endpoint: awsDataSourceSettings.jsonData.endpoint,\n },\n secureJsonFields: {\n sigV4AccessKey: awsDataSourceSettings.secureJsonFields?.accessKey,\n sigV4SecretKey: awsDataSourceSettings.secureJsonFields?.secretKey,\n },\n secureJsonData: {\n sigV4AccessKey: awsDataSourceSettings.secureJsonData?.accessKey,\n sigV4SecretKey: awsDataSourceSettings.secureJsonData?.secretKey,\n },\n };\n onOptionsChange(dataSourceSettings);\n },\n options: {\n ...options,\n jsonData: {\n ...options.jsonData,\n authType: options.jsonData.sigV4AuthType,\n profile: options.jsonData.sigV4Profile,\n assumeRoleArn: options.jsonData.sigV4AssumeRoleArn,\n externalId: options.jsonData.sigV4ExternalId,\n defaultRegion: options.jsonData.sigV4Region,\n endpoint: options.jsonData.sigV4Endpoint,\n },\n secureJsonFields: {\n accessKey: options.secureJsonFields?.sigV4AccessKey,\n secretKey: options.secureJsonFields?.sigV4SecretKey,\n },\n secureJsonData: {\n accessKey: options.secureJsonData?.sigV4AccessKey,\n secretKey: options.secureJsonData?.sigV4SecretKey,\n },\n },\n };\n\n return (\n <>\n <div className=\"gf-form\">\n <h6>SigV4 Auth Details</h6>\n </div>\n <ConnectionConfig {...connectionConfigProps} skipHeader skipEndpoint></ConnectionConfig>\n </>\n );\n};\n","import { DataQuery } from '@grafana/data';\nimport { FillValueOptions } from './QueryEditor/FillValueSelect';\n\nexport const defaultKey = '__default';\n\nexport interface SQLQuery extends DataQuery {\n rawSQL: string;\n format?: number;\n fillMode?: { mode: FillValueOptions; value?: number };\n}\n","import { SelectableValue } from '@grafana/data';\nimport { InlineField, Select } from '@grafana/ui';\nimport { SelectCommonProps } from '@grafana/ui/components/Select/types';\nimport { isEqual } from 'lodash';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { defaultKey } from './types';\n\nexport interface ResourceSelectorProps extends SelectCommonProps<string> {\n value: string | null;\n dependencies?: Array<string | null | undefined>;\n tooltip?: string;\n label?: string;\n 'data-testid'?: string;\n hidden?: boolean;\n // Options only needed for QueryEditor\n default?: string;\n // Options only needed for the ConfigEditor\n title?: string;\n labelWidth?: number;\n saveOptions?: () => Promise<void>;\n // Either set a way of fetching resources or the resource list\n fetch?: () => Promise<Array<string | SelectableValue<string>>>;\n resources?: string[];\n onChange: (e: SelectableValue<string> | null) => void;\n}\n\nexport function ResourceSelector(props: ResourceSelectorProps) {\n const [resource, setResource] = useState<string | null>(props.value || props.default || null);\n const [resources, setResources] = useState<Array<string | SelectableValue>>(resource ? [resource] : []);\n const [dependencies, setDependencies] = useState(props.dependencies);\n const [isLoading, setIsLoading] = useState(false);\n const [fetched, setFetched] = useState(false);\n const defaultOpts = useMemo(() => {\n const opts: Array<SelectableValue<string>> = [\n {\n label: `default (${props.default})`,\n value: defaultKey,\n description: `Default value set in the data source`,\n },\n ];\n if (props.value && props.value !== defaultKey) {\n opts.push({ label: props.value, value: props.value });\n }\n return opts;\n }, [props.default, props.value]);\n const [options, setOptions] = useState<Array<SelectableValue<string>>>(props.default ? defaultOpts : []);\n useEffect(() => {\n if (props.resources !== undefined) {\n setResources(props.resources);\n }\n }, [props.resources]);\n useEffect(() => {\n const newOptions: Array<SelectableValue<string>> = props.default ? defaultOpts : [];\n if (resources.length) {\n resources.forEach((r) => {\n const value = typeof r === 'string' ? r : r.value;\n if (!newOptions.find((o) => o.value === value)) {\n typeof r === 'string' ? newOptions.push({ label: r, value: r }) : newOptions.push(r);\n }\n });\n setOptions(newOptions);\n } else {\n setOptions([]);\n }\n }, [resources, defaultOpts, props.default]);\n\n useEffect(() => {\n // A change in the dependencies cause a state clean-up\n if (!isEqual(props.dependencies, dependencies)) {\n setFetched(false);\n setResource(null);\n props.onChange(null);\n setDependencies(props.dependencies);\n }\n }, [props, dependencies]);\n\n const fetch = async () => {\n if (fetched) {\n return;\n }\n if (props.saveOptions) {\n await props.saveOptions();\n }\n try {\n const resources = await props.fetch();\n setResources(resources);\n } finally {\n setFetched(true);\n }\n };\n\n const onChange = (e: SelectableValue<string>) => {\n props.onChange(e);\n if (e.value) {\n setResource(e.value);\n }\n };\n const onClick = async () => {\n setIsLoading(true);\n try {\n await fetch();\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <InlineField label={props.label} labelWidth={props.labelWidth} tooltip={props.tooltip} hidden={props.hidden}>\n <div data-testid={props['data-testid']} title={props.title}>\n <Select\n {...props}\n aria-label={props.label}\n options={options}\n onChange={onChange}\n isLoading={isLoading}\n className={props.className || 'min-width-6'}\n onOpenMenu={() => props.fetch && onClick()}\n menuShouldPortal={true}\n />\n </div>\n </InlineField>\n );\n}\n","import React from 'react';\nimport { DataSourcePluginOptionsEditorProps, SelectableValue } from '@grafana/data';\nimport { InputActionMeta } from '@grafana/ui/components/Select/types';\nimport { AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData } from '../../types';\nimport { ResourceSelector } from '../ResourceSelector';\n\nexport interface ConfigSelectProps\n extends DataSourcePluginOptionsEditorProps<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData> {\n value: string;\n fetch: () => Promise<Array<string | SelectableValue<string>>>;\n onChange: (e: SelectableValue<string> | null) => void;\n dependencies?: string[];\n label?: string;\n 'data-testid'?: string;\n hidden?: boolean;\n disabled?: boolean;\n allowCustomValue?: boolean;\n saveOptions: () => Promise<void>;\n autoFocus?: boolean;\n backspaceRemovesValue?: boolean;\n className?: string;\n invalid?: boolean;\n isClearable?: boolean;\n isMulti?: boolean;\n inputId?: string;\n showAllSelectedWhenOpen?: boolean;\n maxMenuHeight?: number;\n minMenuHeight?: number;\n maxVisibleValues?: number;\n menuPlacement?: 'auto' | 'bottom' | 'top';\n menuPosition?: 'fixed' | 'absolute';\n noOptionsMessage?: string;\n onBlur?: () => void;\n onCreateOption?: (value: string) => void;\n onInputChange?: (value: string, actionMeta: InputActionMeta) => void;\n placeholder?: string;\n width?: number;\n isOptionDisabled?: () => boolean;\n}\n\nexport function ConfigSelect(props: ConfigSelectProps) {\n const { jsonData } = props.options;\n const commonProps = {\n title: jsonData.defaultRegion ? '' : 'select a default region',\n labelWidth: 28,\n className: 'width-30',\n };\n // Any change in the AWS connection details will affect selectors\n const dependencies: string[] = [\n props.options.jsonData.assumeRoleArn,\n props.options.jsonData.authType,\n props.options.jsonData.defaultRegion,\n props.options.jsonData.endpoint,\n props.options.jsonData.externalId,\n props.options.jsonData.profile,\n props.options.secureJsonData?.accessKey,\n props.options.secureJsonData?.secretKey,\n ].concat(props.dependencies);\n return (\n <ResourceSelector\n label={props.label}\n data-testid={props['data-testid']}\n onChange={props.onChange}\n fetch={props.fetch}\n value={props.value}\n saveOptions={props.saveOptions}\n dependencies={dependencies}\n hidden={props.hidden}\n disabled={props.disabled || !jsonData.defaultRegion}\n allowCustomValue={props.allowCustomValue}\n autoFocus={props.autoFocus}\n backspaceRemovesValue={props.backspaceRemovesValue}\n className={props.className}\n invalid={props.invalid}\n isClearable={props.isClearable}\n isMulti={props.isMulti}\n inputId={props.inputId}\n showAllSelectedWhenOpen={props.showAllSelectedWhenOpen}\n maxMenuHeight={props.maxMenuHeight}\n minMenuHeight={props.minMenuHeight}\n maxVisibleValues={props.maxVisibleValues}\n menuPlacement={props.menuPlacement}\n menuPosition={props.menuPosition}\n noOptionsMessage={props.noOptionsMessage}\n onBlur={props.onBlur}\n onCreateOption={props.onCreateOption}\n onInputChange={props.onInputChange}\n placeholder={props.placeholder}\n width={props.width}\n isOptionDisabled={props.isOptionDisabled}\n {...commonProps}\n />\n );\n}\n","import React from 'react';\nimport { DataSourcePluginOptionsEditorProps } from '@grafana/data';\nimport { AwsAuthDataSourceSecureJsonData } from '../../types';\nimport { InlineField, Input } from '@grafana/ui';\nimport { FormEvent } from 'react-dom/node_modules/@types/react';\n\nexport interface InlineInputProps extends DataSourcePluginOptionsEditorProps<{}, AwsAuthDataSourceSecureJsonData> {\n value: string;\n onChange: (e: FormEvent<HTMLInputElement>) => void;\n label?: string;\n tooltip?: string;\n placeholder?: string;\n 'data-testid'?: string;\n hidden?: boolean;\n disabled?: boolean;\n}\n\nexport function InlineInput(props: InlineInputProps) {\n return (\n <InlineField\n label={props.label}\n labelWidth={28}\n tooltip={props.tooltip}\n hidden={props.hidden}\n disabled={props.disabled}\n >\n <Input\n data-testid={props['data-testid']}\n className=\"width-30\"\n value={props.value}\n onChange={props.onChange}\n placeholder={props.placeholder}\n disabled={props.disabled}\n />\n </InlineField>\n );\n}\n","import { defaults } from 'lodash';\n\nimport React, { useRef, useEffect } from 'react';\nimport { CodeEditor, CodeEditorSuggestionItem } from '@grafana/ui';\nimport { DataQuery } from '@grafana/data';\nimport { MonacoOptions } from '@grafana/ui/components/Monaco/types';\n\ntype EditorProps = {\n width?: number | string;\n height?: number | string;\n readOnly?: boolean;\n showMiniMap?: boolean;\n showLineNumbers?: boolean;\n monacoOptions?: MonacoOptions;\n};\n\ntype Props<TQuery extends DataQuery> = {\n query: TQuery;\n language: string;\n editorProps?: EditorProps;\n onChange: (value: TQuery) => void;\n onRunQuery: () => void;\n getSuggestions: (query: TQuery) => CodeEditorSuggestionItem[];\n};\n\nexport function QueryCodeEditor<TQuery extends DataQuery>(props: Props<TQuery>) {\n const { getSuggestions, query } = props;\n const { rawSQL } = defaults(props.query, { rawSQL: '' });\n const onRawSqlChange = (rawSQL: string) => {\n const query = {\n ...props.query,\n rawSQL,\n };\n props.onChange(query);\n props.onRunQuery();\n };\n\n // Use a reference for suggestions because a bug in CodeEditor getSuggestions\n // https://github.com/grafana/grafana/issues/40121\n // It was been fixed in 8.3 but keeping the workaround here to support older\n // versions.\n const suggestionsRef = useRef<CodeEditorSuggestionItem[]>([]);\n useEffect(() => {\n suggestionsRef.current = getSuggestions(query);\n }, [getSuggestions, query]);\n\n return (\n <CodeEditor\n language={props.language}\n value={rawSQL}\n onBlur={onRawSqlChange}\n showMiniMap={false}\n showLineNumbers={true}\n getSuggestions={() => suggestionsRef.current}\n height=\"240px\"\n {...props.editorProps}\n />\n );\n}\n","import React from 'react';\nimport { DataQuery, SelectableValue } from '@grafana/data';\nimport { InlineField, Select } from '@grafana/ui';\n\nexport type FormatSelectProps<TQuery extends DataQuery, FormatOptions> = {\n query: TQuery;\n options: Array<SelectableValue<FormatOptions>>;\n onChange: (value: TQuery) => void;\n onRunQuery?: () => void;\n};\n\nexport function FormatSelect<TQuery extends DataQuery & Record<string, any>, FormatOptions>(\n props: FormatSelectProps<TQuery, FormatOptions>\n) {\n const onChangeFormat = (e: SelectableValue<FormatOptions>) => {\n props.onChange({\n ...props.query,\n format: e.value || 0,\n });\n props.onRunQuery?.();\n };\n return (\n <InlineField label=\"Format as\" labelWidth={11}>\n <Select\n aria-label=\"Format as\"\n options={props.options}\n value={props.query.format}\n onChange={onChangeFormat}\n className=\"width-12\"\n menuShouldPortal={true}\n />\n </InlineField>\n );\n}\n","import React from 'react';\nimport { DataQuery, SelectableValue } from '@grafana/data';\nimport { InlineField, Input, Select } from '@grafana/ui';\n\nexport enum FillValueOptions {\n Previous,\n Null,\n Value,\n}\n\nexport const SelectableFillValueOptions: Array<SelectableValue<FillValueOptions>> = [\n {\n label: 'Previous Value',\n value: FillValueOptions.Previous,\n },\n {\n label: 'NULL',\n value: FillValueOptions.Null,\n },\n {\n label: 'Value',\n value: FillValueOptions.Value,\n },\n];\n\nexport type FillValueSelectProps<TQuery extends DataQuery> = {\n query: TQuery;\n onChange: (value: TQuery) => void;\n onRunQuery?: () => void;\n};\n\nexport function FillValueSelect<TQuery extends DataQuery & Record<string, any>>(props: FillValueSelectProps<TQuery>) {\n return (\n <>\n <InlineField label=\"Fill value\" tooltip=\"value to fill missing points\">\n <Select\n aria-label=\"Fill value\"\n options={SelectableFillValueOptions}\n value={props.query.fillMode?.mode ?? FillValueOptions.Previous}\n onChange={({ value }) => {\n props.onChange({\n ...props.query,\n // Keep the fillMode.value in case FillValueOptions.Value mode is selected back\n fillMode: { ...props.query.fillMode, mode: value },\n });\n props.onRunQuery?.();\n }}\n className=\"width-12\"\n menuShouldPortal={true}\n />\n </InlineField>\n {props.query.fillMode?.mode === FillValueOptions.Value && (\n <InlineField label=\"Value\" labelWidth={11}>\n <Input\n type=\"number\"\n aria-label=\"Value\"\n value={props.query.fillMode.value}\n onChange={({ currentTarget }: React.FormEvent<HTMLInputElement>) =>\n props.onChange({\n ...props.query,\n fillMode: {\n mode: FillValueOptions.Value,\n value: currentTarget.valueAsNumber,\n },\n })\n }\n onBlur={() => props.onRunQuery?.()}\n />\n </InlineField>\n )}\n </>\n );\n}\n","import { ScopedVars, VariableModel } from '@grafana/data';\nimport { SQLQuery } from '../types';\nimport { CodeEditorSuggestionItem, CodeEditorSuggestionItemKind } from '@grafana/ui';\n\n/**\n * Do not execute queries that do not exist yet\n */\nexport function filterSQLQuery(query: SQLQuery): boolean {\n return !!query.rawSQL;\n}\n\nexport function applySQLTemplateVariables(\n query: SQLQuery,\n scopedVars: ScopedVars,\n getTemplateSrv: () => any\n): SQLQuery {\n const templateSrv = getTemplateSrv();\n return {\n ...query,\n rawSQL: templateSrv.replace(query.rawSQL, scopedVars, interpolateVariable),\n };\n}\n\nfunction interpolateVariable(value: string | string[]) {\n if (typeof value === 'string') {\n return value;\n }\n\n const quotedValues = value.map((v) => {\n return quoteLiteral(v);\n });\n return quotedValues.join(',');\n}\n\nfunction quoteLiteral(value: any) {\n return \"'\" + String(value).replace(/'/g, \"''\") + \"'\";\n}\n\nexport const appendTemplateVariablesAsSuggestions = (getTemplateSrv: () => any, sugs: CodeEditorSuggestionItem[]) => {\n const templateSrv = getTemplateSrv();\n const templateSugs: CodeEditorSuggestionItem[] = [];\n templateSrv.getVariables().forEach((variable: VariableModel) => {\n const label = '$' + variable.name;\n let val = templateSrv.replace(label);\n if (val === label) {\n val = '';\n }\n templateSugs.push({\n label,\n kind: CodeEditorSuggestionItemKind.Text,\n detail: `(Template Variable) ${val}`,\n });\n });\n\n return sugs.concat(templateSugs);\n};\n"],"names":["AwsAuthType","useState","useMemo","useEffect","React","FieldSet","InlineField","Select","onUpdateDatasourceJsonDataOptionSelect","Input","onUpdateDatasourceJsonDataOption","ButtonGroup","ToolbarButton","onUpdateDatasourceResetOption","onUpdateDatasourceSecureJsonDataOption","isEqual","defaults","useRef","CodeEditor","FillValueOptions","CodeEditorSuggestionItemKind"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.development.js","sources":["../src/regions.ts","../src/types.ts","../src/providers.ts","../src/ConnectionConfig.tsx","../src/SIGV4ConnectionConfig.tsx","../src/sql/types.ts","../src/sql/ResourceSelector.tsx","../src/sql/ConfigEditor/ConfigSelect.tsx","../src/sql/ConfigEditor/InlineInput.tsx","../src/sql/QueryEditor/QueryCodeEditor.tsx","../src/sql/QueryEditor/FormatSelect.tsx","../src/sql/QueryEditor/FillValueSelect.tsx","../src/sql/utils/utils.ts"],"sourcesContent":["export const standardRegions: string[] = [\n 'af-south-1',\n 'ap-east-1',\n 'ap-northeast-1',\n 'ap-northeast-2',\n 'ap-northeast-3',\n 'ap-south-1',\n 'ap-southeast-1',\n 'ap-southeast-2',\n 'ca-central-1',\n 'cn-north-1',\n 'cn-northwest-1',\n 'eu-central-1',\n 'eu-north-1',\n 'eu-west-1',\n 'eu-west-2',\n 'eu-west-3',\n 'me-south-1',\n 'sa-east-1',\n 'us-east-1',\n 'us-east-2',\n 'us-gov-east-1',\n 'us-gov-west-1',\n 'us-iso-east-1',\n 'us-isob-east-1',\n 'us-west-1',\n 'us-west-2',\n];\n","import { DataSourceJsonData, DataSourceSettings } from '@grafana/data';\n\nexport enum AwsAuthType {\n Keys = 'keys',\n Credentials = 'credentials',\n Default = 'default', // was 'arn',\n EC2IAMRole = 'ec2_iam_role',\n /**\n * @deprecated use default\n */\n ARN = 'arn',\n}\n\nexport interface AwsAuthDataSourceJsonData extends DataSourceJsonData {\n authType?: AwsAuthType;\n assumeRoleArn?: string;\n externalId?: string;\n profile?: string; // Credentials profile name, as specified in ~/.aws/credentials\n defaultRegion?: string; // region if it is not defined by your credentials file\n endpoint?: string;\n}\n\nexport interface AwsAuthDataSourceSecureJsonData {\n accessKey?: string;\n secretKey?: string;\n sessionToken?: string;\n}\n\nexport type AwsAuthDataSourceSettings = DataSourceSettings<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData>;\n","import { SelectableValue } from '@grafana/data';\nimport { AwsAuthType } from './types';\n\nexport const awsAuthProviderOptions = [\n {\n label: 'Workspace IAM Role',\n value: AwsAuthType.EC2IAMRole,\n },\n {\n label: 'AWS SDK Default',\n value: AwsAuthType.Default,\n },\n {\n label: 'Access & secret key',\n value: AwsAuthType.Keys,\n },\n {\n label: 'Credentials file',\n value: AwsAuthType.Credentials,\n },\n] as Array<SelectableValue<AwsAuthType>>;\n","import React, { FC, useEffect, useMemo, useState } from 'react';\nimport { Input, Select, InlineField, ButtonGroup, ToolbarButton, FieldSet } from '@grafana/ui';\nimport {\n DataSourcePluginOptionsEditorProps,\n onUpdateDatasourceJsonDataOptionSelect,\n onUpdateDatasourceResetOption,\n onUpdateDatasourceJsonDataOption,\n onUpdateDatasourceSecureJsonDataOption,\n} from '@grafana/data';\n\nimport { standardRegions } from './regions';\nimport { AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData, AwsAuthType } from './types';\nimport { awsAuthProviderOptions } from './providers';\n\nconst toOption = (value: string) => ({ value, label: value });\n\nexport interface ConnectionConfigProps<J = AwsAuthDataSourceJsonData, S = AwsAuthDataSourceSecureJsonData>\n extends DataSourcePluginOptionsEditorProps<J, S> {\n standardRegions?: string[];\n loadRegions?: () => Promise<string[]>;\n defaultEndpoint?: string;\n skipHeader?: boolean;\n skipEndpoint?: boolean;\n children?: React.ReactNode;\n labelWidth?: number;\n}\n\nexport const ConnectionConfig: FC<ConnectionConfigProps> = (props: ConnectionConfigProps) => {\n const [regions, setRegions] = useState((props.standardRegions || standardRegions).map(toOption));\n const { loadRegions, onOptionsChange, skipHeader = false, skipEndpoint = false } = props;\n const { labelWidth = 28, options } = props;\n let profile = options.jsonData.profile;\n if (profile === undefined) {\n profile = options.database;\n }\n\n const settings = (window as any).grafanaBootData.settings;\n const awsAllowedAuthProviders = useMemo(\n () => settings.awsAllowedAuthProviders ?? [AwsAuthType.Default, AwsAuthType.Keys, AwsAuthType.Credentials],\n [settings.awsAllowedAuthProviders]\n );\n const awsAssumeRoleEnabled = settings.awsAssumeRoleEnabled ?? true;\n\n const currentProvider = awsAuthProviderOptions.find((p) => p.value === options.jsonData.authType);\n\n useEffect(() => {\n // Make sure a authType exists in the current model\n if (!currentProvider && awsAllowedAuthProviders.length) {\n onOptionsChange({\n ...options,\n jsonData: {\n ...options.jsonData,\n authType: awsAllowedAuthProviders[0],\n },\n });\n }\n }, [currentProvider, options, onOptionsChange, awsAllowedAuthProviders]);\n\n useEffect(() => {\n if (!loadRegions) {\n return;\n }\n\n loadRegions().then((regions) => setRegions(regions.map(toOption)));\n }, [loadRegions]);\n\n return (\n <FieldSet label={skipHeader ? '' : 'Connection Details'} data-testid=\"connection-config\">\n <InlineField\n label=\"Authentication Provider\"\n labelWidth={labelWidth}\n tooltip=\"Specify which AWS credentials chain to use.\"\n >\n <Select\n aria-label=\"Authentication Provider\"\n className=\"width-30\"\n value={currentProvider}\n options={awsAuthProviderOptions.filter((opt) => awsAllowedAuthProviders.includes(opt.value!))}\n defaultValue={options.jsonData.authType}\n onChange={(option) => {\n onUpdateDatasourceJsonDataOptionSelect(props, 'authType')(option);\n }}\n menuShouldPortal={true}\n />\n </InlineField>\n {options.jsonData.authType === 'credentials' && (\n <InlineField\n label=\"Credentials Profile Name\"\n labelWidth={labelWidth}\n tooltip=\"Credentials profile name, as specified in ~/.aws/credentials, leave blank for default.\"\n >\n <Input\n aria-label=\"Credentials Profile Name\"\n className=\"width-30\"\n placeholder=\"default\"\n value={profile}\n onChange={onUpdateDatasourceJsonDataOption(props, 'profile')}\n />\n </InlineField>\n )}\n\n {options.jsonData.authType === 'keys' && (\n <>\n <InlineField label=\"Access Key ID\" labelWidth={labelWidth}>\n {props.options.secureJsonFields?.accessKey ? (\n <ButtonGroup className=\"width-30\">\n <Input disabled placeholder=\"Configured\" />\n <ToolbarButton\n icon=\"edit\"\n tooltip=\"Edit Access Key ID\"\n type=\"button\"\n onClick={onUpdateDatasourceResetOption(props as any, 'accessKey')}\n />\n </ButtonGroup>\n ) : (\n <Input\n aria-label=\"Access Key ID\"\n className=\"width-30\"\n value={options.secureJsonData?.accessKey ?? ''}\n onChange={onUpdateDatasourceSecureJsonDataOption(props, 'accessKey')}\n />\n )}\n </InlineField>\n\n <InlineField label=\"Secret Access Key\" labelWidth={labelWidth}>\n {props.options.secureJsonFields?.secretKey ? (\n <ButtonGroup className=\"width-30\">\n <Input disabled placeholder=\"Configured\" />\n <ToolbarButton\n icon=\"edit\"\n type=\"button\"\n tooltip=\"Edit Secret Access Key\"\n onClick={onUpdateDatasourceResetOption(props as any, 'secretKey')}\n />\n </ButtonGroup>\n ) : (\n <Input\n aria-label=\"Secret Access Key\"\n className=\"width-30\"\n value={options.secureJsonData?.secretKey ?? ''}\n onChange={onUpdateDatasourceSecureJsonDataOption(props, 'secretKey')}\n />\n )}\n </InlineField>\n </>\n )}\n\n {awsAssumeRoleEnabled && (\n <>\n <InlineField\n label=\"Assume Role ARN\"\n labelWidth={labelWidth}\n tooltip=\"Optionally, specify the ARN of a role to assume. Specifying a role here will ensure that the selected authentication provider is used to assume the specified role rather than using the credentials directly. Leave blank if you don't need to assume a role at all\"\n >\n <Input\n aria-label=\"Assume Role ARN\"\n className=\"width-30\"\n placeholder=\"arn:aws:iam:*\"\n value={options.jsonData.assumeRoleArn || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'assumeRoleArn')}\n />\n </InlineField>\n <InlineField\n label=\"External ID\"\n labelWidth={labelWidth}\n tooltip=\"If you are assuming a role in another account, that has been created with an external ID, specify the external ID here.\"\n >\n <Input\n aria-label=\"External ID\"\n className=\"width-30\"\n placeholder=\"External ID\"\n value={options.jsonData.externalId || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'externalId')}\n />\n </InlineField>\n </>\n )}\n {!skipEndpoint && (\n <InlineField\n label=\"Endpoint\"\n labelWidth={labelWidth}\n tooltip=\"Optionally, specify a custom endpoint for the service\"\n >\n <Input\n aria-label=\"Endpoint\"\n className=\"width-30\"\n placeholder={props.defaultEndpoint ?? 'https://{service}.{region}.amazonaws.com'}\n value={options.jsonData.endpoint || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'endpoint')}\n />\n </InlineField>\n )}\n <InlineField\n label=\"Default Region\"\n labelWidth={labelWidth}\n tooltip=\"Specify the region, such as for US West (Oregon) use ` us-west-2 ` as the region.\"\n >\n <Select\n aria-label=\"Default Region\"\n className=\"width-30\"\n value={regions.find((region) => region.value === options.jsonData.defaultRegion)}\n options={regions}\n defaultValue={options.jsonData.defaultRegion}\n allowCustomValue={true}\n onChange={onUpdateDatasourceJsonDataOptionSelect(props, 'defaultRegion')}\n formatCreateLabel={(r) => `Use region: ${r}`}\n menuShouldPortal={true}\n />\n </InlineField>\n {props.children}\n </FieldSet>\n );\n};\n","import React from 'react';\nimport { DataSourcePluginOptionsEditorProps, DataSourceSettings } from '@grafana/data';\nimport { ConnectionConfig, ConnectionConfigProps } from './ConnectionConfig';\n\nimport { AwsAuthDataSourceSecureJsonData, AwsAuthDataSourceJsonData } from './types';\n\nexport const SIGV4ConnectionConfig: React.FC<DataSourcePluginOptionsEditorProps<any, any>> = (\n props: DataSourcePluginOptionsEditorProps<any, any>\n) => {\n const { onOptionsChange, options } = props;\n\n // Map HttpSettings props to ConnectionConfigProps\n const connectionConfigProps: ConnectionConfigProps<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData> = {\n onOptionsChange: (awsDataSourceSettings) => {\n const dataSourceSettings: DataSourceSettings<any, any> = {\n ...options,\n jsonData: {\n ...options.jsonData,\n sigV4AuthType: awsDataSourceSettings.jsonData.authType,\n sigV4Profile: awsDataSourceSettings.jsonData.profile,\n sigV4AssumeRoleArn: awsDataSourceSettings.jsonData.assumeRoleArn,\n sigV4ExternalId: awsDataSourceSettings.jsonData.externalId,\n sigV4Region: awsDataSourceSettings.jsonData.defaultRegion,\n sigV4Endpoint: awsDataSourceSettings.jsonData.endpoint,\n },\n secureJsonFields: {\n sigV4AccessKey: awsDataSourceSettings.secureJsonFields?.accessKey,\n sigV4SecretKey: awsDataSourceSettings.secureJsonFields?.secretKey,\n },\n secureJsonData: {\n sigV4AccessKey: awsDataSourceSettings.secureJsonData?.accessKey,\n sigV4SecretKey: awsDataSourceSettings.secureJsonData?.secretKey,\n },\n };\n onOptionsChange(dataSourceSettings);\n },\n options: {\n ...options,\n jsonData: {\n ...options.jsonData,\n authType: options.jsonData.sigV4AuthType,\n profile: options.jsonData.sigV4Profile,\n assumeRoleArn: options.jsonData.sigV4AssumeRoleArn,\n externalId: options.jsonData.sigV4ExternalId,\n defaultRegion: options.jsonData.sigV4Region,\n endpoint: options.jsonData.sigV4Endpoint,\n },\n secureJsonFields: {\n accessKey: options.secureJsonFields?.sigV4AccessKey,\n secretKey: options.secureJsonFields?.sigV4SecretKey,\n },\n secureJsonData: {\n accessKey: options.secureJsonData?.sigV4AccessKey,\n secretKey: options.secureJsonData?.sigV4SecretKey,\n },\n },\n };\n\n return (\n <>\n <div className=\"gf-form\">\n <h6>SigV4 Auth Details</h6>\n </div>\n <ConnectionConfig {...connectionConfigProps} skipHeader skipEndpoint></ConnectionConfig>\n </>\n );\n};\n","import { DataQuery } from '@grafana/data';\nimport { FillValueOptions } from './QueryEditor/FillValueSelect';\n\nexport const defaultKey = '__default';\n\nexport interface SQLQuery extends DataQuery {\n rawSQL: string;\n format?: number;\n fillMode?: { mode: FillValueOptions; value?: number };\n}\n","import { SelectableValue } from '@grafana/data';\nimport { InlineField, Select, SelectCommonProps } from '@grafana/ui';\nimport { isEqual } from 'lodash';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { defaultKey } from './types';\n\nexport interface ResourceSelectorProps extends SelectCommonProps<string> {\n value: string | null;\n dependencies?: Array<string | null | undefined>;\n tooltip?: string;\n label?: string;\n 'data-testid'?: string;\n hidden?: boolean;\n // Options only needed for QueryEditor\n default?: string;\n // Options only needed for the ConfigEditor\n title?: string;\n labelWidth?: number;\n saveOptions?: () => Promise<void>;\n // Either set a way of fetching resources or the resource list\n fetch?: () => Promise<Array<string | SelectableValue<string>>>;\n resources?: string[];\n onChange: (e: SelectableValue<string> | null) => void;\n}\n\nexport function ResourceSelector(props: ResourceSelectorProps) {\n const [resource, setResource] = useState<string | null>(props.value || props.default || null);\n const [resources, setResources] = useState<Array<string | SelectableValue>>(resource ? [resource] : []);\n const [dependencies, setDependencies] = useState(props.dependencies);\n const [isLoading, setIsLoading] = useState(false);\n const [fetched, setFetched] = useState(false);\n const defaultOpts = useMemo(() => {\n const opts: Array<SelectableValue<string>> = [\n {\n label: `default (${props.default})`,\n value: defaultKey,\n description: `Default value set in the data source`,\n },\n ];\n if (props.value && props.value !== defaultKey) {\n opts.push({ label: props.value, value: props.value });\n }\n return opts;\n }, [props.default, props.value]);\n const [options, setOptions] = useState<Array<SelectableValue<string>>>(props.default ? defaultOpts : []);\n useEffect(() => {\n if (props.resources !== undefined) {\n setResources(props.resources);\n }\n }, [props.resources]);\n useEffect(() => {\n const newOptions: Array<SelectableValue<string>> = props.default ? defaultOpts : [];\n if (resources.length) {\n resources.forEach((r) => {\n const value = typeof r === 'string' ? r : r.value;\n if (!newOptions.find((o) => o.value === value)) {\n typeof r === 'string' ? newOptions.push({ label: r, value: r }) : newOptions.push(r);\n }\n });\n setOptions(newOptions);\n } else {\n setOptions([]);\n }\n }, [resources, defaultOpts, props.default]);\n\n useEffect(() => {\n // A change in the dependencies cause a state clean-up\n if (!isEqual(props.dependencies, dependencies)) {\n setFetched(false);\n setResource(null);\n props.onChange(null);\n setDependencies(props.dependencies);\n }\n }, [props, dependencies]);\n\n const fetch = async () => {\n if (fetched) {\n return;\n }\n if (props.saveOptions) {\n await props.saveOptions();\n }\n try {\n const resources = await props.fetch();\n setResources(resources);\n } finally {\n setFetched(true);\n }\n };\n\n const onChange = (e: SelectableValue<string>) => {\n props.onChange(e);\n if (e.value) {\n setResource(e.value);\n }\n };\n const onClick = async () => {\n setIsLoading(true);\n try {\n await fetch();\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <InlineField label={props.label} labelWidth={props.labelWidth} tooltip={props.tooltip} hidden={props.hidden}>\n <div data-testid={props['data-testid']} title={props.title}>\n <Select\n {...props}\n aria-label={props.label}\n options={options}\n onChange={onChange}\n isLoading={isLoading}\n className={props.className || 'min-width-6'}\n onOpenMenu={() => props.fetch && onClick()}\n menuShouldPortal={true}\n />\n </div>\n </InlineField>\n );\n}\n","import React from 'react';\nimport { DataSourcePluginOptionsEditorProps, SelectableValue } from '@grafana/data';\nimport { InputActionMeta } from '@grafana/ui';\nimport { AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData } from '../../types';\nimport { ResourceSelector } from '../ResourceSelector';\n\nexport interface ConfigSelectProps\n extends DataSourcePluginOptionsEditorProps<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData> {\n value: string;\n fetch: () => Promise<Array<string | SelectableValue<string>>>;\n onChange: (e: SelectableValue<string> | null) => void;\n dependencies?: string[];\n label?: string;\n 'data-testid'?: string;\n hidden?: boolean;\n disabled?: boolean;\n allowCustomValue?: boolean;\n saveOptions: () => Promise<void>;\n autoFocus?: boolean;\n backspaceRemovesValue?: boolean;\n className?: string;\n invalid?: boolean;\n isClearable?: boolean;\n isMulti?: boolean;\n inputId?: string;\n showAllSelectedWhenOpen?: boolean;\n maxMenuHeight?: number;\n minMenuHeight?: number;\n maxVisibleValues?: number;\n menuPlacement?: 'auto' | 'bottom' | 'top';\n menuPosition?: 'fixed' | 'absolute';\n noOptionsMessage?: string;\n onBlur?: () => void;\n onCreateOption?: (value: string) => void;\n onInputChange?: (value: string, actionMeta: InputActionMeta) => void;\n placeholder?: string;\n width?: number;\n isOptionDisabled?: () => boolean;\n labelWidth?: number;\n}\n\nexport function ConfigSelect(props: ConfigSelectProps) {\n const { jsonData } = props.options;\n const commonProps = {\n title: jsonData.defaultRegion ? '' : 'select a default region',\n labelWidth: props.labelWidth ?? 28,\n className: 'width-30',\n };\n // Any change in the AWS connection details will affect selectors\n const dependencies: string[] = [\n props.options.jsonData.assumeRoleArn,\n props.options.jsonData.authType,\n props.options.jsonData.defaultRegion,\n props.options.jsonData.endpoint,\n props.options.jsonData.externalId,\n props.options.jsonData.profile,\n props.options.secureJsonData?.accessKey,\n props.options.secureJsonData?.secretKey,\n ].concat(props.dependencies);\n return (\n <ResourceSelector\n label={props.label}\n data-testid={props['data-testid']}\n onChange={props.onChange}\n fetch={props.fetch}\n value={props.value}\n saveOptions={props.saveOptions}\n dependencies={dependencies}\n hidden={props.hidden}\n disabled={props.disabled || !jsonData.defaultRegion}\n allowCustomValue={props.allowCustomValue}\n autoFocus={props.autoFocus}\n backspaceRemovesValue={props.backspaceRemovesValue}\n className={props.className}\n invalid={props.invalid}\n isClearable={props.isClearable}\n isMulti={props.isMulti}\n inputId={props.inputId}\n showAllSelectedWhenOpen={props.showAllSelectedWhenOpen}\n maxMenuHeight={props.maxMenuHeight}\n minMenuHeight={props.minMenuHeight}\n maxVisibleValues={props.maxVisibleValues}\n menuPlacement={props.menuPlacement}\n menuPosition={props.menuPosition}\n noOptionsMessage={props.noOptionsMessage}\n onBlur={props.onBlur}\n onCreateOption={props.onCreateOption}\n onInputChange={props.onInputChange}\n placeholder={props.placeholder}\n width={props.width}\n isOptionDisabled={props.isOptionDisabled}\n {...commonProps}\n />\n );\n}\n","import React from 'react';\nimport { DataSourcePluginOptionsEditorProps } from '@grafana/data';\nimport { AwsAuthDataSourceSecureJsonData } from '../../types';\nimport { InlineField, Input } from '@grafana/ui';\nimport { FormEvent } from 'react-dom/node_modules/@types/react';\n\nexport interface InlineInputProps extends DataSourcePluginOptionsEditorProps<{}, AwsAuthDataSourceSecureJsonData> {\n value: string;\n onChange: (e: FormEvent<HTMLInputElement>) => void;\n label?: string;\n tooltip?: string;\n placeholder?: string;\n 'data-testid'?: string;\n hidden?: boolean;\n disabled?: boolean;\n labelWidth?: number;\n}\n\nexport function InlineInput(props: InlineInputProps) {\n return (\n <InlineField\n label={props.label}\n labelWidth={props.labelWidth ?? 28}\n tooltip={props.tooltip}\n hidden={props.hidden}\n disabled={props.disabled}\n >\n <Input\n data-testid={props['data-testid']}\n className=\"width-30\"\n value={props.value}\n onChange={props.onChange}\n placeholder={props.placeholder}\n disabled={props.disabled}\n />\n </InlineField>\n );\n}\n","import { defaults } from 'lodash';\n\nimport React, { useRef, useEffect } from 'react';\nimport { CodeEditor, CodeEditorSuggestionItem, CodeEditorMonacoOptions } from '@grafana/ui';\nimport { DataQuery } from '@grafana/data';\n\ntype EditorProps = {\n width?: number | string;\n height?: number | string;\n readOnly?: boolean;\n showMiniMap?: boolean;\n showLineNumbers?: boolean;\n monacoOptions?: CodeEditorMonacoOptions;\n};\n\ntype Props<TQuery extends DataQuery> = {\n query: TQuery;\n language: string;\n editorProps?: EditorProps;\n onChange: (value: TQuery) => void;\n onRunQuery: () => void;\n getSuggestions: (query: TQuery) => CodeEditorSuggestionItem[];\n};\n\nexport function QueryCodeEditor<TQuery extends DataQuery>(props: Props<TQuery>) {\n const { getSuggestions, query } = props;\n const { rawSQL } = defaults(props.query, { rawSQL: '' });\n const onRawSqlChange = (rawSQL: string) => {\n const query = {\n ...props.query,\n rawSQL,\n };\n props.onChange(query);\n props.onRunQuery();\n };\n\n // Use a reference for suggestions because a bug in CodeEditor getSuggestions\n // https://github.com/grafana/grafana/issues/40121\n // It was been fixed in 8.3 but keeping the workaround here to support older\n // versions.\n const suggestionsRef = useRef<CodeEditorSuggestionItem[]>([]);\n useEffect(() => {\n suggestionsRef.current = getSuggestions(query);\n }, [getSuggestions, query]);\n\n return (\n <CodeEditor\n language={props.language}\n value={rawSQL}\n onBlur={onRawSqlChange}\n showMiniMap={false}\n showLineNumbers={true}\n getSuggestions={() => suggestionsRef.current}\n height=\"240px\"\n {...props.editorProps}\n />\n );\n}\n","import React from 'react';\nimport { DataQuery, SelectableValue } from '@grafana/data';\nimport { InlineField, Select } from '@grafana/ui';\n\nexport type FormatSelectProps<TQuery extends DataQuery, FormatOptions> = {\n query: TQuery;\n options: Array<SelectableValue<FormatOptions>>;\n onChange: (value: TQuery) => void;\n onRunQuery?: () => void;\n};\n\nexport function FormatSelect<TQuery extends DataQuery & Record<string, any>, FormatOptions>(\n props: FormatSelectProps<TQuery, FormatOptions>\n) {\n const onChangeFormat = (e: SelectableValue<FormatOptions>) => {\n props.onChange({\n ...props.query,\n format: e.value || 0,\n });\n props.onRunQuery?.();\n };\n return (\n <InlineField label=\"Format as\" labelWidth={11}>\n <Select\n aria-label=\"Format as\"\n options={props.options}\n value={props.query.format}\n onChange={onChangeFormat}\n className=\"width-12\"\n menuShouldPortal={true}\n />\n </InlineField>\n );\n}\n","import React from 'react';\nimport { DataQuery, SelectableValue } from '@grafana/data';\nimport { InlineField, Input, Select } from '@grafana/ui';\n\nexport enum FillValueOptions {\n Previous,\n Null,\n Value,\n}\n\nexport const SelectableFillValueOptions: Array<SelectableValue<FillValueOptions>> = [\n {\n label: 'Previous Value',\n value: FillValueOptions.Previous,\n },\n {\n label: 'NULL',\n value: FillValueOptions.Null,\n },\n {\n label: 'Value',\n value: FillValueOptions.Value,\n },\n];\n\nexport type FillValueSelectProps<TQuery extends DataQuery> = {\n query: TQuery;\n onChange: (value: TQuery) => void;\n onRunQuery?: () => void;\n};\n\nexport function FillValueSelect<TQuery extends DataQuery & Record<string, any>>(props: FillValueSelectProps<TQuery>) {\n return (\n <>\n <InlineField label=\"Fill value\" tooltip=\"value to fill missing points\">\n <Select\n aria-label=\"Fill value\"\n options={SelectableFillValueOptions}\n value={props.query.fillMode?.mode ?? FillValueOptions.Previous}\n onChange={({ value }) => {\n props.onChange({\n ...props.query,\n // Keep the fillMode.value in case FillValueOptions.Value mode is selected back\n fillMode: { ...props.query.fillMode, mode: value },\n });\n props.onRunQuery?.();\n }}\n className=\"width-12\"\n menuShouldPortal={true}\n />\n </InlineField>\n {props.query.fillMode?.mode === FillValueOptions.Value && (\n <InlineField label=\"Value\" labelWidth={11}>\n <Input\n type=\"number\"\n aria-label=\"Value\"\n value={props.query.fillMode.value}\n onChange={({ currentTarget }: React.FormEvent<HTMLInputElement>) =>\n props.onChange({\n ...props.query,\n fillMode: {\n mode: FillValueOptions.Value,\n value: currentTarget.valueAsNumber,\n },\n })\n }\n onBlur={() => props.onRunQuery?.()}\n />\n </InlineField>\n )}\n </>\n );\n}\n","import { ScopedVars, VariableModel } from '@grafana/data';\nimport { SQLQuery } from '../types';\nimport { CodeEditorSuggestionItem, CodeEditorSuggestionItemKind } from '@grafana/ui';\n\n/**\n * Do not execute queries that do not exist yet\n */\nexport function filterSQLQuery(query: SQLQuery): boolean {\n return !!query.rawSQL;\n}\n\nexport function applySQLTemplateVariables(\n query: SQLQuery,\n scopedVars: ScopedVars,\n getTemplateSrv: () => any\n): SQLQuery {\n const templateSrv = getTemplateSrv();\n return {\n ...query,\n rawSQL: templateSrv.replace(query.rawSQL, scopedVars, interpolateVariable),\n };\n}\n\nfunction interpolateVariable(value: string | string[]) {\n if (typeof value === 'string') {\n return value;\n }\n\n const quotedValues = value.map((v) => {\n return quoteLiteral(v);\n });\n return quotedValues.join(',');\n}\n\nfunction quoteLiteral(value: any) {\n return \"'\" + String(value).replace(/'/g, \"''\") + \"'\";\n}\n\nexport const appendTemplateVariablesAsSuggestions = (getTemplateSrv: () => any, sugs: CodeEditorSuggestionItem[]) => {\n const templateSrv = getTemplateSrv();\n const templateSugs: CodeEditorSuggestionItem[] = [];\n templateSrv.getVariables().forEach((variable: VariableModel) => {\n const label = '$' + variable.name;\n let val = templateSrv.replace(label);\n if (val === label) {\n val = '';\n }\n templateSugs.push({\n label,\n kind: CodeEditorSuggestionItemKind.Text,\n detail: `(Template Variable) ${val}`,\n });\n });\n\n return sugs.concat(templateSugs);\n};\n"],"names":["AwsAuthType","useState","useMemo","useEffect","React","FieldSet","InlineField","Select","onUpdateDatasourceJsonDataOptionSelect","Input","onUpdateDatasourceJsonDataOption","ButtonGroup","ToolbarButton","onUpdateDatasourceResetOption","onUpdateDatasourceSecureJsonDataOption","isEqual","defaults","useRef","CodeEditor","FillValueOptions","CodeEditorSuggestionItemKind"],"mappings":"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"}
|
package/dist/index.production.js
CHANGED
|
@@ -1,2 +1,17 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("react"),a=(e=t)&&"object"==typeof e&&"default"in e?e.default:e,n=require("@grafana/ui"),l=require("@grafana/data"),o=require("lodash"),s=function(){return(s=Object.assign||function(e){for(var t,a=1,n=arguments.length;a<n;a++)for(var l in t=arguments[a])Object.prototype.hasOwnProperty.call(t,l)&&(e[l]=t[l]);return e}).apply(this,arguments)};function i(e,t,a,n){return new(a||(a=Promise))((function(l,o){function s(e){try{r(n.next(e))}catch(e){o(e)}}function i(e){try{r(n.throw(e))}catch(e){o(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(s,i)}r((n=n.apply(e,t||[])).next())}))}function r(e,t){var a,n,l,o,s={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return o={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function i(o){return function(i){return function(o){if(a)throw new TypeError("Generator is already executing.");for(;s;)try{if(a=1,n&&(l=2&o[0]?n.return:o[0]?n.throw||((l=n.return)&&l.call(n),0):n.next)&&!(l=l.call(n,o[1])).done)return l;switch(n=0,l&&(o=[2&o[0],l.value]),o[0]){case 0:case 1:l=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,n=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(l=s.trys,(l=l.length>0&&l[l.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!l||o[1]>l[0]&&o[1]<l[3])){s.label=o[1];break}if(6===o[0]&&s.label<l[1]){s.label=l[1],l=o;break}if(l&&s.label<l[2]){s.label=l[2],s.ops.push(o);break}l[2]&&s.ops.pop(),s.trys.pop();continue}o=t.call(e,s)}catch(e){o=[6,e],n=0}finally{a=l=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,i])}}}function u(e,t){var a="function"==typeof Symbol&&e[Symbol.iterator];if(!a)return e;var n,l,o=a.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=o.next()).done;)s.push(n.value)}catch(e){l={error:e}}finally{try{n&&!n.done&&(a=o.return)&&a.call(o)}finally{if(l)throw l.error}}return s}var c,d=["af-south-1","ap-east-1","ap-northeast-1","ap-northeast-2","ap-northeast-3","ap-south-1","ap-southeast-1","ap-southeast-2","ca-central-1","cn-north-1","cn-northwest-1","eu-central-1","eu-north-1","eu-west-1","eu-west-2","eu-west-3","me-south-1","sa-east-1","us-east-1","us-east-2","us-gov-east-1","us-gov-west-1","us-iso-east-1","us-isob-east-1","us-west-1","us-west-2"];(c=exports.AwsAuthType||(exports.AwsAuthType={})).Keys="keys",c.Credentials="credentials",c.Default="default",c.EC2IAMRole="ec2_iam_role",c.ARN="arn";var p,h=[{label:"Workspace IAM Role",value:exports.AwsAuthType.EC2IAMRole},{label:"AWS SDK Default",value:exports.AwsAuthType.Default},{label:"Access & secret key",value:exports.AwsAuthType.Keys},{label:"Credentials file",value:exports.AwsAuthType.Credentials}],f=function(e){return{value:e,label:e}},v=function(e){var o,i,r,c,p,v,m,g,y=u(t.useState((e.standardRegions||d).map(f)),2),b=y[0],D=y[1],w=e.loadRegions,E=e.onOptionsChange,A=e.skipHeader,S=void 0!==A&&A,C=e.skipEndpoint,x=void 0!==C&&C,V=e.options,I=V.jsonData.profile;void 0===I&&(I=V.database);var F=window.grafanaBootData.settings,O=t.useMemo((function(){var e;return null!==(e=F.awsAllowedAuthProviders)&&void 0!==e?e:[exports.AwsAuthType.Default,exports.AwsAuthType.Keys,exports.AwsAuthType.Credentials]}),[F.awsAllowedAuthProviders]),R=null===(o=F.awsAssumeRoleEnabled)||void 0===o||o,j=h.find((function(e){return e.value===V.jsonData.authType}));return t.useEffect((function(){!j&&O.length&&E(s(s({},V),{jsonData:s(s({},V.jsonData),{authType:O[0]})}))}),[j,V,E,O]),t.useEffect((function(){w&&w().then((function(e){return D(e.map(f))}))}),[w]),a.createElement(n.FieldSet,{label:S?"":"Connection Details","data-testid":"connection-config"},a.createElement(n.InlineField,{label:"Authentication Provider",labelWidth:28,tooltip:"Specify which AWS credentials chain to use."},a.createElement(n.Select,{"aria-label":"Authentication Provider",className:"width-30",value:j,options:h.filter((function(e){return O.includes(e.value)})),defaultValue:V.jsonData.authType,onChange:function(t){l.onUpdateDatasourceJsonDataOptionSelect(e,"authType")(t)},menuShouldPortal:!0})),"credentials"===V.jsonData.authType&&a.createElement(n.InlineField,{label:"Credentials Profile Name",labelWidth:28,tooltip:"Credentials profile name, as specified in ~/.aws/credentials, leave blank for default."},a.createElement(n.Input,{"aria-label":"Credentials Profile Name",className:"width-30",placeholder:"default",value:I,onChange:l.onUpdateDatasourceJsonDataOption(e,"profile")})),"keys"===V.jsonData.authType&&a.createElement(a.Fragment,null,a.createElement(n.InlineField,{label:"Access Key ID",labelWidth:28},(null===(i=e.options.secureJsonFields)||void 0===i?void 0:i.accessKey)?a.createElement(n.ButtonGroup,{className:"width-30"},a.createElement(n.Input,{disabled:!0,placeholder:"Configured"}),a.createElement(n.ToolbarButton,{icon:"edit",tooltip:"Edit Access Key ID",type:"button",onClick:l.onUpdateDatasourceResetOption(e,"accessKey")})):a.createElement(n.Input,{"aria-label":"Access Key ID",className:"width-30",value:null!==(c=null===(r=V.secureJsonData)||void 0===r?void 0:r.accessKey)&&void 0!==c?c:"",onChange:l.onUpdateDatasourceSecureJsonDataOption(e,"accessKey")})),a.createElement(n.InlineField,{label:"Secret Access Key",labelWidth:28},(null===(p=e.options.secureJsonFields)||void 0===p?void 0:p.secretKey)?a.createElement(n.ButtonGroup,{className:"width-30"},a.createElement(n.Input,{disabled:!0,placeholder:"Configured"}),a.createElement(n.ToolbarButton,{icon:"edit",type:"button",tooltip:"Edit Secret Access Key",onClick:l.onUpdateDatasourceResetOption(e,"secretKey")})):a.createElement(n.Input,{"aria-label":"Secret Access Key",className:"width-30",value:null!==(m=null===(v=V.secureJsonData)||void 0===v?void 0:v.secretKey)&&void 0!==m?m:"",onChange:l.onUpdateDatasourceSecureJsonDataOption(e,"secretKey")}))),R&&a.createElement(a.Fragment,null,a.createElement(n.InlineField,{label:"Assume Role ARN",labelWidth:28,tooltip:"Optionally, specify the ARN of a role to assume. Specifying a role here will ensure that the selected authentication provider is used to assume the specified role rather than using the credentials directly. Leave blank if you don't need to assume a role at all"},a.createElement(n.Input,{"aria-label":"Assume Role ARN",className:"width-30",placeholder:"arn:aws:iam:*",value:V.jsonData.assumeRoleArn||"",onChange:l.onUpdateDatasourceJsonDataOption(e,"assumeRoleArn")})),a.createElement(n.InlineField,{label:"External ID",labelWidth:28,tooltip:"If you are assuming a role in another account, that has been created with an external ID, specify the external ID here."},a.createElement(n.Input,{"aria-label":"External ID",className:"width-30",placeholder:"External ID",value:V.jsonData.externalId||"",onChange:l.onUpdateDatasourceJsonDataOption(e,"externalId")}))),!x&&a.createElement(n.InlineField,{label:"Endpoint",labelWidth:28,tooltip:"Optionally, specify a custom endpoint for the service"},a.createElement(n.Input,{"aria-label":"Endpoint",className:"width-30",placeholder:null!==(g=e.defaultEndpoint)&&void 0!==g?g:"https://{service}.{region}.amazonaws.com",value:V.jsonData.endpoint||"",onChange:l.onUpdateDatasourceJsonDataOption(e,"endpoint")})),a.createElement(n.InlineField,{label:"Default Region",labelWidth:28,tooltip:"Specify the region, such as for US West (Oregon) use ` us-west-2 ` as the region."},a.createElement(n.Select,{"aria-label":"Default Region",className:"width-30",value:b.find((function(e){return e.value===V.jsonData.defaultRegion})),options:b,defaultValue:V.jsonData.defaultRegion,allowCustomValue:!0,onChange:l.onUpdateDatasourceJsonDataOptionSelect(e,"defaultRegion"),formatCreateLabel:function(e){return"Use region: "+e},menuShouldPortal:!0})),e.children)};function m(e){var l=this,c=u(t.useState(e.value||e.default||null),2),d=c[0],p=c[1],h=u(t.useState(d?[d]:[]),2),f=h[0],v=h[1],m=u(t.useState(e.dependencies),2),g=m[0],y=m[1],b=u(t.useState(!1),2),D=b[0],w=b[1],E=u(t.useState(!1),2),A=E[0],S=E[1],C=t.useMemo((function(){var t=[{label:"default ("+e.default+")",value:"__default",description:"Default value set in the data source"}];return e.value&&"__default"!==e.value&&t.push({label:e.value,value:e.value}),t}),[e.default,e.value]),x=u(t.useState(e.default?C:[]),2),V=x[0],I=x[1];t.useEffect((function(){void 0!==e.resources&&v(e.resources)}),[e.resources]),t.useEffect((function(){var t=e.default?C:[];f.length?(f.forEach((function(e){var a="string"==typeof e?e:e.value;t.find((function(e){return e.value===a}))||("string"==typeof e?t.push({label:e,value:e}):t.push(e))})),I(t)):I([])}),[f,C,e.default]),t.useEffect((function(){o.isEqual(e.dependencies,g)||(S(!1),p(null),e.onChange(null),y(e.dependencies))}),[e,g]);return a.createElement(n.InlineField,{label:e.label,labelWidth:e.labelWidth,tooltip:e.tooltip,hidden:e.hidden},a.createElement("div",{"data-testid":e["data-testid"],title:e.title},a.createElement(n.Select,s({},e,{"aria-label":e.label,options:V,onChange:function(t){e.onChange(t),t.value&&p(t.value)},isLoading:D,className:e.className||"min-width-6",onOpenMenu:function(){return e.fetch&&i(l,void 0,void 0,(function(){return r(this,(function(t){switch(t.label){case 0:w(!0),t.label=1;case 1:return t.trys.push([1,,3,4]),[4,i(l,void 0,void 0,(function(){var t;return r(this,(function(a){switch(a.label){case 0:return A?[2]:e.saveOptions?[4,e.saveOptions()]:[3,2];case 1:a.sent(),a.label=2;case 2:return a.trys.push([2,,4,5]),[4,e.fetch()];case 3:return t=a.sent(),v(t),[3,5];case 4:return S(!0),[7];case 5:return[2]}}))}))];case 2:return t.sent(),[3,4];case 3:return w(!1),[7];case 4:return[2]}}))}))},menuShouldPortal:!0}))))}(p=exports.FillValueOptions||(exports.FillValueOptions={}))[p.Previous=0]="Previous",p[p.Null=1]="Null",p[p.Value=2]="Value";var g=[{label:"Previous Value",value:exports.FillValueOptions.Previous},{label:"NULL",value:exports.FillValueOptions.Null},{label:"Value",value:exports.FillValueOptions.Value}];function y(e){return"string"==typeof e?e:e.map((function(e){return function(e){return"'"+String(e).replace(/'/g,"''")+"'"}(e)})).join(",")}exports.ConfigSelect=function(e){var t,n,l=e.options.jsonData,o={title:l.defaultRegion?"":"select a default region",labelWidth:28,className:"width-30"},i=[e.options.jsonData.assumeRoleArn,e.options.jsonData.authType,e.options.jsonData.defaultRegion,e.options.jsonData.endpoint,e.options.jsonData.externalId,e.options.jsonData.profile,null===(t=e.options.secureJsonData)||void 0===t?void 0:t.accessKey,null===(n=e.options.secureJsonData)||void 0===n?void 0:n.secretKey].concat(e.dependencies);return a.createElement(m,s({label:e.label,"data-testid":e["data-testid"],onChange:e.onChange,fetch:e.fetch,value:e.value,saveOptions:e.saveOptions,dependencies:i,hidden:e.hidden,disabled:e.disabled||!l.defaultRegion,allowCustomValue:e.allowCustomValue,autoFocus:e.autoFocus,backspaceRemovesValue:e.backspaceRemovesValue,className:e.className,invalid:e.invalid,isClearable:e.isClearable,isMulti:e.isMulti,inputId:e.inputId,showAllSelectedWhenOpen:e.showAllSelectedWhenOpen,maxMenuHeight:e.maxMenuHeight,minMenuHeight:e.minMenuHeight,maxVisibleValues:e.maxVisibleValues,menuPlacement:e.menuPlacement,menuPosition:e.menuPosition,noOptionsMessage:e.noOptionsMessage,onBlur:e.onBlur,onCreateOption:e.onCreateOption,onInputChange:e.onInputChange,placeholder:e.placeholder,width:e.width,isOptionDisabled:e.isOptionDisabled},o))},exports.ConnectionConfig=v,exports.FillValueSelect=function(e){var t,l,o;return a.createElement(a.Fragment,null,a.createElement(n.InlineField,{label:"Fill value",tooltip:"value to fill missing points"},a.createElement(n.Select,{"aria-label":"Fill value",options:g,value:null!==(l=null===(t=e.query.fillMode)||void 0===t?void 0:t.mode)&&void 0!==l?l:exports.FillValueOptions.Previous,onChange:function(t){var a,n=t.value;e.onChange(s(s({},e.query),{fillMode:s(s({},e.query.fillMode),{mode:n})})),null===(a=e.onRunQuery)||void 0===a||a.call(e)},className:"width-12",menuShouldPortal:!0})),(null===(o=e.query.fillMode)||void 0===o?void 0:o.mode)===exports.FillValueOptions.Value&&a.createElement(n.InlineField,{label:"Value",labelWidth:11},a.createElement(n.Input,{type:"number","aria-label":"Value",value:e.query.fillMode.value,onChange:function(t){var a=t.currentTarget;return e.onChange(s(s({},e.query),{fillMode:{mode:exports.FillValueOptions.Value,value:a.valueAsNumber}}))},onBlur:function(){var t;return null===(t=e.onRunQuery)||void 0===t?void 0:t.call(e)}})))},exports.FormatSelect=function(e){return a.createElement(n.InlineField,{label:"Format as",labelWidth:11},a.createElement(n.Select,{"aria-label":"Format as",options:e.options,value:e.query.format,onChange:function(t){var a;e.onChange(s(s({},e.query),{format:t.value||0})),null===(a=e.onRunQuery)||void 0===a||a.call(e)},className:"width-12",menuShouldPortal:!0}))},exports.InlineInput=function(e){return a.createElement(n.InlineField,{label:e.label,labelWidth:28,tooltip:e.tooltip,hidden:e.hidden,disabled:e.disabled},a.createElement(n.Input,{"data-testid":e["data-testid"],className:"width-30",value:e.value,onChange:e.onChange,placeholder:e.placeholder,disabled:e.disabled}))},exports.QueryCodeEditor=function(e){var l=e.getSuggestions,i=e.query,r=o.defaults(e.query,{rawSQL:""}).rawSQL,u=t.useRef([]);return t.useEffect((function(){u.current=l(i)}),[l,i]),a.createElement(n.CodeEditor,s({language:e.language,value:r,onBlur:function(t){var a=s(s({},e.query),{rawSQL:t});e.onChange(a),e.onRunQuery()},showMiniMap:!1,showLineNumbers:!0,getSuggestions:function(){return u.current},height:"240px"},e.editorProps))},exports.ResourceSelector=m,exports.SIGV4ConnectionConfig=function(e){var t,n,l,o,i=e.onOptionsChange,r=e.options,u={onOptionsChange:function(e){var t,a,n,l,o=s(s({},r),{jsonData:s(s({},r.jsonData),{sigV4AuthType:e.jsonData.authType,sigV4Profile:e.jsonData.profile,sigV4AssumeRoleArn:e.jsonData.assumeRoleArn,sigV4ExternalId:e.jsonData.externalId,sigV4Region:e.jsonData.defaultRegion,sigV4Endpoint:e.jsonData.endpoint}),secureJsonFields:{sigV4AccessKey:null===(t=e.secureJsonFields)||void 0===t?void 0:t.accessKey,sigV4SecretKey:null===(a=e.secureJsonFields)||void 0===a?void 0:a.secretKey},secureJsonData:{sigV4AccessKey:null===(n=e.secureJsonData)||void 0===n?void 0:n.accessKey,sigV4SecretKey:null===(l=e.secureJsonData)||void 0===l?void 0:l.secretKey}});i(o)},options:s(s({},r),{jsonData:s(s({},r.jsonData),{authType:r.jsonData.sigV4AuthType,profile:r.jsonData.sigV4Profile,assumeRoleArn:r.jsonData.sigV4AssumeRoleArn,externalId:r.jsonData.sigV4ExternalId,defaultRegion:r.jsonData.sigV4Region,endpoint:r.jsonData.sigV4Endpoint}),secureJsonFields:{accessKey:null===(t=r.secureJsonFields)||void 0===t?void 0:t.sigV4AccessKey,secretKey:null===(n=r.secureJsonFields)||void 0===n?void 0:n.sigV4SecretKey},secureJsonData:{accessKey:null===(l=r.secureJsonData)||void 0===l?void 0:l.sigV4AccessKey,secretKey:null===(o=r.secureJsonData)||void 0===o?void 0:o.sigV4SecretKey}})};return a.createElement(a.Fragment,null,a.createElement("div",{className:"gf-form"},a.createElement("h6",null,"SigV4 Auth Details")),a.createElement(v,s({},u,{skipHeader:!0,skipEndpoint:!0})))},exports.appendTemplateVariablesAsSuggestions=function(e,t){var a=e(),l=[];return a.getVariables().forEach((function(e){var t="$"+e.name,o=a.replace(t);o===t&&(o=""),l.push({label:t,kind:n.CodeEditorSuggestionItemKind.Text,detail:"(Template Variable) "+o})})),t.concat(l)},exports.applySQLTemplateVariables=function(e,t,a){var n=a();return s(s({},e),{rawSQL:n.replace(e.rawSQL,t,y)})},exports.awsAuthProviderOptions=h,exports.filterSQLQuery=function(e){return!!e.rawSQL},exports.standardRegions=d;
|
|
1
|
+
Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("react"),a=(e=t)&&"object"==typeof e&&"default"in e?e.default:e,n=require("@grafana/ui"),l=require("@grafana/data"),s=require("lodash");const o=["af-south-1","ap-east-1","ap-northeast-1","ap-northeast-2","ap-northeast-3","ap-south-1","ap-southeast-1","ap-southeast-2","ca-central-1","cn-north-1","cn-northwest-1","eu-central-1","eu-north-1","eu-west-1","eu-west-2","eu-west-3","me-south-1","sa-east-1","us-east-1","us-east-2","us-gov-east-1","us-gov-west-1","us-iso-east-1","us-isob-east-1","us-west-1","us-west-2"];var i;(i=exports.AwsAuthType||(exports.AwsAuthType={})).Keys="keys",i.Credentials="credentials",i.Default="default",i.EC2IAMRole="ec2_iam_role",i.ARN="arn";const u=[{label:"Workspace IAM Role",value:exports.AwsAuthType.EC2IAMRole},{label:"AWS SDK Default",value:exports.AwsAuthType.Default},{label:"Access & secret key",value:exports.AwsAuthType.Keys},{label:"Credentials file",value:exports.AwsAuthType.Credentials}],r=e=>({value:e,label:e}),c=e=>{var s,i,c,d,p,h,g,v;const[m,f]=t.useState((e.standardRegions||o).map(r)),{loadRegions:b,onOptionsChange:y,skipHeader:D=!1,skipEndpoint:E=!1}=e,{labelWidth:O=28,options:j}=e;let w=j.jsonData.profile;void 0===w&&(w=j.database);const A=window.grafanaBootData.settings,C=t.useMemo(()=>{var e;return null!==(e=A.awsAllowedAuthProviders)&&void 0!==e?e:[exports.AwsAuthType.Default,exports.AwsAuthType.Keys,exports.AwsAuthType.Credentials]},[A.awsAllowedAuthProviders]),S=null===(s=A.awsAssumeRoleEnabled)||void 0===s||s,V=u.find(e=>e.value===j.jsonData.authType);return t.useEffect(()=>{!V&&C.length&&y(Object.assign(Object.assign({},j),{jsonData:Object.assign(Object.assign({},j.jsonData),{authType:C[0]})}))},[V,j,y,C]),t.useEffect(()=>{b&&b().then(e=>f(e.map(r)))},[b]),a.createElement(n.FieldSet,{label:D?"":"Connection Details","data-testid":"connection-config"},a.createElement(n.InlineField,{label:"Authentication Provider",labelWidth:O,tooltip:"Specify which AWS credentials chain to use."},a.createElement(n.Select,{"aria-label":"Authentication Provider",className:"width-30",value:V,options:u.filter(e=>C.includes(e.value)),defaultValue:j.jsonData.authType,onChange:t=>{l.onUpdateDatasourceJsonDataOptionSelect(e,"authType")(t)},menuShouldPortal:!0})),"credentials"===j.jsonData.authType&&a.createElement(n.InlineField,{label:"Credentials Profile Name",labelWidth:O,tooltip:"Credentials profile name, as specified in ~/.aws/credentials, leave blank for default."},a.createElement(n.Input,{"aria-label":"Credentials Profile Name",className:"width-30",placeholder:"default",value:w,onChange:l.onUpdateDatasourceJsonDataOption(e,"profile")})),"keys"===j.jsonData.authType&&a.createElement(a.Fragment,null,a.createElement(n.InlineField,{label:"Access Key ID",labelWidth:O},(null===(i=e.options.secureJsonFields)||void 0===i?void 0:i.accessKey)?a.createElement(n.ButtonGroup,{className:"width-30"},a.createElement(n.Input,{disabled:!0,placeholder:"Configured"}),a.createElement(n.ToolbarButton,{icon:"edit",tooltip:"Edit Access Key ID",type:"button",onClick:l.onUpdateDatasourceResetOption(e,"accessKey")})):a.createElement(n.Input,{"aria-label":"Access Key ID",className:"width-30",value:null!==(d=null===(c=j.secureJsonData)||void 0===c?void 0:c.accessKey)&&void 0!==d?d:"",onChange:l.onUpdateDatasourceSecureJsonDataOption(e,"accessKey")})),a.createElement(n.InlineField,{label:"Secret Access Key",labelWidth:O},(null===(p=e.options.secureJsonFields)||void 0===p?void 0:p.secretKey)?a.createElement(n.ButtonGroup,{className:"width-30"},a.createElement(n.Input,{disabled:!0,placeholder:"Configured"}),a.createElement(n.ToolbarButton,{icon:"edit",type:"button",tooltip:"Edit Secret Access Key",onClick:l.onUpdateDatasourceResetOption(e,"secretKey")})):a.createElement(n.Input,{"aria-label":"Secret Access Key",className:"width-30",value:null!==(g=null===(h=j.secureJsonData)||void 0===h?void 0:h.secretKey)&&void 0!==g?g:"",onChange:l.onUpdateDatasourceSecureJsonDataOption(e,"secretKey")}))),S&&a.createElement(a.Fragment,null,a.createElement(n.InlineField,{label:"Assume Role ARN",labelWidth:O,tooltip:"Optionally, specify the ARN of a role to assume. Specifying a role here will ensure that the selected authentication provider is used to assume the specified role rather than using the credentials directly. Leave blank if you don't need to assume a role at all"},a.createElement(n.Input,{"aria-label":"Assume Role ARN",className:"width-30",placeholder:"arn:aws:iam:*",value:j.jsonData.assumeRoleArn||"",onChange:l.onUpdateDatasourceJsonDataOption(e,"assumeRoleArn")})),a.createElement(n.InlineField,{label:"External ID",labelWidth:O,tooltip:"If you are assuming a role in another account, that has been created with an external ID, specify the external ID here."},a.createElement(n.Input,{"aria-label":"External ID",className:"width-30",placeholder:"External ID",value:j.jsonData.externalId||"",onChange:l.onUpdateDatasourceJsonDataOption(e,"externalId")}))),!E&&a.createElement(n.InlineField,{label:"Endpoint",labelWidth:O,tooltip:"Optionally, specify a custom endpoint for the service"},a.createElement(n.Input,{"aria-label":"Endpoint",className:"width-30",placeholder:null!==(v=e.defaultEndpoint)&&void 0!==v?v:"https://{service}.{region}.amazonaws.com",value:j.jsonData.endpoint||"",onChange:l.onUpdateDatasourceJsonDataOption(e,"endpoint")})),a.createElement(n.InlineField,{label:"Default Region",labelWidth:O,tooltip:"Specify the region, such as for US West (Oregon) use ` us-west-2 ` as the region."},a.createElement(n.Select,{"aria-label":"Default Region",className:"width-30",value:m.find(e=>e.value===j.jsonData.defaultRegion),options:m,defaultValue:j.jsonData.defaultRegion,allowCustomValue:!0,onChange:l.onUpdateDatasourceJsonDataOptionSelect(e,"defaultRegion"),formatCreateLabel:e=>"Use region: "+e,menuShouldPortal:!0})),e.children)};
|
|
2
|
+
/*! *****************************************************************************
|
|
3
|
+
Copyright (c) Microsoft Corporation.
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted.
|
|
7
|
+
|
|
8
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
9
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
10
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
11
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
12
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
13
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
14
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
15
|
+
***************************************************************************** */
|
|
16
|
+
function d(e,t,a,n){return new(a||(a=Promise))((function(l,s){function o(e){try{u(n.next(e))}catch(e){s(e)}}function i(e){try{u(n.throw(e))}catch(e){s(e)}}function u(e){var t;e.done?l(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(o,i)}u((n=n.apply(e,t||[])).next())}))}function p(e){const[l,o]=t.useState(e.value||e.default||null),[i,u]=t.useState(l?[l]:[]),[r,c]=t.useState(e.dependencies),[p,h]=t.useState(!1),[g,v]=t.useState(!1),m=t.useMemo(()=>{const t=[{label:`default (${e.default})`,value:"__default",description:"Default value set in the data source"}];return e.value&&"__default"!==e.value&&t.push({label:e.value,value:e.value}),t},[e.default,e.value]),[f,b]=t.useState(e.default?m:[]);t.useEffect(()=>{void 0!==e.resources&&u(e.resources)},[e.resources]),t.useEffect(()=>{const t=e.default?m:[];i.length?(i.forEach(e=>{const a="string"==typeof e?e:e.value;t.find(e=>e.value===a)||("string"==typeof e?t.push({label:e,value:e}):t.push(e))}),b(t)):b([])},[i,m,e.default]),t.useEffect(()=>{s.isEqual(e.dependencies,r)||(v(!1),o(null),e.onChange(null),c(e.dependencies))},[e,r]);const y=()=>d(this,void 0,void 0,(function*(){if(!g){e.saveOptions&&(yield e.saveOptions());try{const t=yield e.fetch();u(t)}finally{v(!0)}}})),D=()=>d(this,void 0,void 0,(function*(){h(!0);try{yield y()}finally{h(!1)}}));return a.createElement(n.InlineField,{label:e.label,labelWidth:e.labelWidth,tooltip:e.tooltip,hidden:e.hidden},a.createElement("div",{"data-testid":e["data-testid"],title:e.title},a.createElement(n.Select,Object.assign({},e,{"aria-label":e.label,options:f,onChange:t=>{e.onChange(t),t.value&&o(t.value)},isLoading:p,className:e.className||"min-width-6",onOpenMenu:()=>e.fetch&&D(),menuShouldPortal:!0}))))}var h;(h=exports.FillValueOptions||(exports.FillValueOptions={}))[h.Previous=0]="Previous",h[h.Null=1]="Null",h[h.Value=2]="Value";const g=[{label:"Previous Value",value:exports.FillValueOptions.Previous},{label:"NULL",value:exports.FillValueOptions.Null},{label:"Value",value:exports.FillValueOptions.Value}];function v(e){if("string"==typeof e)return e;return e.map(e=>function(e){return"'"+String(e).replace(/'/g,"''")+"'"}(e)).join(",")}exports.ConfigSelect=function(e){var t,n,l;const{jsonData:s}=e.options,o={title:s.defaultRegion?"":"select a default region",labelWidth:null!==(t=e.labelWidth)&&void 0!==t?t:28,className:"width-30"},i=[e.options.jsonData.assumeRoleArn,e.options.jsonData.authType,e.options.jsonData.defaultRegion,e.options.jsonData.endpoint,e.options.jsonData.externalId,e.options.jsonData.profile,null===(n=e.options.secureJsonData)||void 0===n?void 0:n.accessKey,null===(l=e.options.secureJsonData)||void 0===l?void 0:l.secretKey].concat(e.dependencies);return a.createElement(p,Object.assign({label:e.label,"data-testid":e["data-testid"],onChange:e.onChange,fetch:e.fetch,value:e.value,saveOptions:e.saveOptions,dependencies:i,hidden:e.hidden,disabled:e.disabled||!s.defaultRegion,allowCustomValue:e.allowCustomValue,autoFocus:e.autoFocus,backspaceRemovesValue:e.backspaceRemovesValue,className:e.className,invalid:e.invalid,isClearable:e.isClearable,isMulti:e.isMulti,inputId:e.inputId,showAllSelectedWhenOpen:e.showAllSelectedWhenOpen,maxMenuHeight:e.maxMenuHeight,minMenuHeight:e.minMenuHeight,maxVisibleValues:e.maxVisibleValues,menuPlacement:e.menuPlacement,menuPosition:e.menuPosition,noOptionsMessage:e.noOptionsMessage,onBlur:e.onBlur,onCreateOption:e.onCreateOption,onInputChange:e.onInputChange,placeholder:e.placeholder,width:e.width,isOptionDisabled:e.isOptionDisabled},o))},exports.ConnectionConfig=c,exports.FillValueSelect=function(e){var t,l,s;return a.createElement(a.Fragment,null,a.createElement(n.InlineField,{label:"Fill value",tooltip:"value to fill missing points"},a.createElement(n.Select,{"aria-label":"Fill value",options:g,value:null!==(l=null===(t=e.query.fillMode)||void 0===t?void 0:t.mode)&&void 0!==l?l:exports.FillValueOptions.Previous,onChange:({value:t})=>{var a;e.onChange(Object.assign(Object.assign({},e.query),{fillMode:Object.assign(Object.assign({},e.query.fillMode),{mode:t})})),null===(a=e.onRunQuery)||void 0===a||a.call(e)},className:"width-12",menuShouldPortal:!0})),(null===(s=e.query.fillMode)||void 0===s?void 0:s.mode)===exports.FillValueOptions.Value&&a.createElement(n.InlineField,{label:"Value",labelWidth:11},a.createElement(n.Input,{type:"number","aria-label":"Value",value:e.query.fillMode.value,onChange:({currentTarget:t})=>e.onChange(Object.assign(Object.assign({},e.query),{fillMode:{mode:exports.FillValueOptions.Value,value:t.valueAsNumber}})),onBlur:()=>{var t;return null===(t=e.onRunQuery)||void 0===t?void 0:t.call(e)}})))},exports.FormatSelect=function(e){return a.createElement(n.InlineField,{label:"Format as",labelWidth:11},a.createElement(n.Select,{"aria-label":"Format as",options:e.options,value:e.query.format,onChange:t=>{var a;e.onChange(Object.assign(Object.assign({},e.query),{format:t.value||0})),null===(a=e.onRunQuery)||void 0===a||a.call(e)},className:"width-12",menuShouldPortal:!0}))},exports.InlineInput=function(e){var t;return a.createElement(n.InlineField,{label:e.label,labelWidth:null!==(t=e.labelWidth)&&void 0!==t?t:28,tooltip:e.tooltip,hidden:e.hidden,disabled:e.disabled},a.createElement(n.Input,{"data-testid":e["data-testid"],className:"width-30",value:e.value,onChange:e.onChange,placeholder:e.placeholder,disabled:e.disabled}))},exports.QueryCodeEditor=function(e){const{getSuggestions:l,query:o}=e,{rawSQL:i}=s.defaults(e.query,{rawSQL:""}),u=t.useRef([]);return t.useEffect(()=>{u.current=l(o)},[l,o]),a.createElement(n.CodeEditor,Object.assign({language:e.language,value:i,onBlur:t=>{const a=Object.assign(Object.assign({},e.query),{rawSQL:t});e.onChange(a),e.onRunQuery()},showMiniMap:!1,showLineNumbers:!0,getSuggestions:()=>u.current,height:"240px"},e.editorProps))},exports.ResourceSelector=p,exports.SIGV4ConnectionConfig=e=>{var t,n,l,s;const{onOptionsChange:o,options:i}=e,u={onOptionsChange:e=>{var t,a,n,l;const s=Object.assign(Object.assign({},i),{jsonData:Object.assign(Object.assign({},i.jsonData),{sigV4AuthType:e.jsonData.authType,sigV4Profile:e.jsonData.profile,sigV4AssumeRoleArn:e.jsonData.assumeRoleArn,sigV4ExternalId:e.jsonData.externalId,sigV4Region:e.jsonData.defaultRegion,sigV4Endpoint:e.jsonData.endpoint}),secureJsonFields:{sigV4AccessKey:null===(t=e.secureJsonFields)||void 0===t?void 0:t.accessKey,sigV4SecretKey:null===(a=e.secureJsonFields)||void 0===a?void 0:a.secretKey},secureJsonData:{sigV4AccessKey:null===(n=e.secureJsonData)||void 0===n?void 0:n.accessKey,sigV4SecretKey:null===(l=e.secureJsonData)||void 0===l?void 0:l.secretKey}});o(s)},options:Object.assign(Object.assign({},i),{jsonData:Object.assign(Object.assign({},i.jsonData),{authType:i.jsonData.sigV4AuthType,profile:i.jsonData.sigV4Profile,assumeRoleArn:i.jsonData.sigV4AssumeRoleArn,externalId:i.jsonData.sigV4ExternalId,defaultRegion:i.jsonData.sigV4Region,endpoint:i.jsonData.sigV4Endpoint}),secureJsonFields:{accessKey:null===(t=i.secureJsonFields)||void 0===t?void 0:t.sigV4AccessKey,secretKey:null===(n=i.secureJsonFields)||void 0===n?void 0:n.sigV4SecretKey},secureJsonData:{accessKey:null===(l=i.secureJsonData)||void 0===l?void 0:l.sigV4AccessKey,secretKey:null===(s=i.secureJsonData)||void 0===s?void 0:s.sigV4SecretKey}})};return a.createElement(a.Fragment,null,a.createElement("div",{className:"gf-form"},a.createElement("h6",null,"SigV4 Auth Details")),a.createElement(c,Object.assign({},u,{skipHeader:!0,skipEndpoint:!0})))},exports.appendTemplateVariablesAsSuggestions=(e,t)=>{const a=e(),l=[];return a.getVariables().forEach(e=>{const t="$"+e.name;let s=a.replace(t);s===t&&(s=""),l.push({label:t,kind:n.CodeEditorSuggestionItemKind.Text,detail:"(Template Variable) "+s})}),t.concat(l)},exports.applySQLTemplateVariables=function(e,t,a){const n=a();return Object.assign(Object.assign({},e),{rawSQL:n.replace(e.rawSQL,t,v)})},exports.awsAuthProviderOptions=u,exports.filterSQLQuery=function(e){return!!e.rawSQL},exports.standardRegions=o;
|
|
2
17
|
//# sourceMappingURL=index.production.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.production.js","sources":["../src/types.ts","../src/regions.ts","../src/sql/QueryEditor/FillValueSelect.tsx","../src/providers.ts","../src/ConnectionConfig.tsx","../src/sql/ResourceSelector.tsx","../src/sql/types.ts","../src/sql/utils/utils.ts","../src/sql/ConfigEditor/ConfigSelect.tsx","../src/sql/QueryEditor/FormatSelect.tsx","../src/sql/ConfigEditor/InlineInput.tsx","../src/sql/QueryEditor/QueryCodeEditor.tsx","../src/SIGV4ConnectionConfig.tsx"],"sourcesContent":["import { DataSourceJsonData, DataSourceSettings } from '@grafana/data';\n\nexport enum AwsAuthType {\n Keys = 'keys',\n Credentials = 'credentials',\n Default = 'default', // was 'arn',\n EC2IAMRole = 'ec2_iam_role',\n /**\n * @deprecated use default\n */\n ARN = 'arn',\n}\n\nexport interface AwsAuthDataSourceJsonData extends DataSourceJsonData {\n authType?: AwsAuthType;\n assumeRoleArn?: string;\n externalId?: string;\n profile?: string; // Credentials profile name, as specified in ~/.aws/credentials\n defaultRegion?: string; // region if it is not defined by your credentials file\n endpoint?: string;\n}\n\nexport interface AwsAuthDataSourceSecureJsonData {\n accessKey?: string;\n secretKey?: string;\n sessionToken?: string;\n}\n\nexport type AwsAuthDataSourceSettings = DataSourceSettings<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData>;\n","export const standardRegions: string[] = [\n 'af-south-1',\n 'ap-east-1',\n 'ap-northeast-1',\n 'ap-northeast-2',\n 'ap-northeast-3',\n 'ap-south-1',\n 'ap-southeast-1',\n 'ap-southeast-2',\n 'ca-central-1',\n 'cn-north-1',\n 'cn-northwest-1',\n 'eu-central-1',\n 'eu-north-1',\n 'eu-west-1',\n 'eu-west-2',\n 'eu-west-3',\n 'me-south-1',\n 'sa-east-1',\n 'us-east-1',\n 'us-east-2',\n 'us-gov-east-1',\n 'us-gov-west-1',\n 'us-iso-east-1',\n 'us-isob-east-1',\n 'us-west-1',\n 'us-west-2',\n];\n","import React from 'react';\nimport { DataQuery, SelectableValue } from '@grafana/data';\nimport { InlineField, Input, Select } from '@grafana/ui';\n\nexport enum FillValueOptions {\n Previous,\n Null,\n Value,\n}\n\nexport const SelectableFillValueOptions: Array<SelectableValue<FillValueOptions>> = [\n {\n label: 'Previous Value',\n value: FillValueOptions.Previous,\n },\n {\n label: 'NULL',\n value: FillValueOptions.Null,\n },\n {\n label: 'Value',\n value: FillValueOptions.Value,\n },\n];\n\nexport type FillValueSelectProps<TQuery extends DataQuery> = {\n query: TQuery;\n onChange: (value: TQuery) => void;\n onRunQuery?: () => void;\n};\n\nexport function FillValueSelect<TQuery extends DataQuery & Record<string, any>>(props: FillValueSelectProps<TQuery>) {\n return (\n <>\n <InlineField label=\"Fill value\" tooltip=\"value to fill missing points\">\n <Select\n aria-label=\"Fill value\"\n options={SelectableFillValueOptions}\n value={props.query.fillMode?.mode ?? FillValueOptions.Previous}\n onChange={({ value }) => {\n props.onChange({\n ...props.query,\n // Keep the fillMode.value in case FillValueOptions.Value mode is selected back\n fillMode: { ...props.query.fillMode, mode: value },\n });\n props.onRunQuery?.();\n }}\n className=\"width-12\"\n menuShouldPortal={true}\n />\n </InlineField>\n {props.query.fillMode?.mode === FillValueOptions.Value && (\n <InlineField label=\"Value\" labelWidth={11}>\n <Input\n type=\"number\"\n aria-label=\"Value\"\n value={props.query.fillMode.value}\n onChange={({ currentTarget }: React.FormEvent<HTMLInputElement>) =>\n props.onChange({\n ...props.query,\n fillMode: {\n mode: FillValueOptions.Value,\n value: currentTarget.valueAsNumber,\n },\n })\n }\n onBlur={() => props.onRunQuery?.()}\n />\n </InlineField>\n )}\n </>\n );\n}\n","import { SelectableValue } from '@grafana/data';\nimport { AwsAuthType } from './types';\n\nexport const awsAuthProviderOptions = [\n {\n label: 'Workspace IAM Role',\n value: AwsAuthType.EC2IAMRole,\n },\n {\n label: 'AWS SDK Default',\n value: AwsAuthType.Default,\n },\n {\n label: 'Access & secret key',\n value: AwsAuthType.Keys,\n },\n {\n label: 'Credentials file',\n value: AwsAuthType.Credentials,\n },\n] as Array<SelectableValue<AwsAuthType>>;\n","import React, { FC, useEffect, useMemo, useState } from 'react';\nimport { Input, Select, InlineField, ButtonGroup, ToolbarButton, FieldSet } from '@grafana/ui';\nimport {\n DataSourcePluginOptionsEditorProps,\n onUpdateDatasourceJsonDataOptionSelect,\n onUpdateDatasourceResetOption,\n onUpdateDatasourceJsonDataOption,\n onUpdateDatasourceSecureJsonDataOption,\n} from '@grafana/data';\n\nimport { standardRegions } from './regions';\nimport { AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData, AwsAuthType } from './types';\nimport { awsAuthProviderOptions } from './providers';\n\nconst toOption = (value: string) => ({ value, label: value });\n\nexport interface ConnectionConfigProps<J = AwsAuthDataSourceJsonData, S = AwsAuthDataSourceSecureJsonData>\n extends DataSourcePluginOptionsEditorProps<J, S> {\n standardRegions?: string[];\n loadRegions?: () => Promise<string[]>;\n defaultEndpoint?: string;\n skipHeader?: boolean;\n skipEndpoint?: boolean;\n children?: React.ReactNode;\n}\n\nexport const ConnectionConfig: FC<ConnectionConfigProps> = (props: ConnectionConfigProps) => {\n const [regions, setRegions] = useState((props.standardRegions || standardRegions).map(toOption));\n const { loadRegions, onOptionsChange, skipHeader = false, skipEndpoint = false } = props;\n const options = props.options;\n let profile = options.jsonData.profile;\n if (profile === undefined) {\n profile = options.database;\n }\n\n const settings = (window as any).grafanaBootData.settings;\n const awsAllowedAuthProviders = useMemo(\n () => settings.awsAllowedAuthProviders ?? [AwsAuthType.Default, AwsAuthType.Keys, AwsAuthType.Credentials],\n [settings.awsAllowedAuthProviders]\n );\n const awsAssumeRoleEnabled = settings.awsAssumeRoleEnabled ?? true;\n\n const currentProvider = awsAuthProviderOptions.find((p) => p.value === options.jsonData.authType);\n\n useEffect(() => {\n // Make sure a authType exists in the current model\n if (!currentProvider && awsAllowedAuthProviders.length) {\n onOptionsChange({\n ...options,\n jsonData: {\n ...options.jsonData,\n authType: awsAllowedAuthProviders[0],\n },\n });\n }\n }, [currentProvider, options, onOptionsChange, awsAllowedAuthProviders]);\n\n useEffect(() => {\n if (!loadRegions) {\n return;\n }\n\n loadRegions().then((regions) => setRegions(regions.map(toOption)));\n }, [loadRegions]);\n\n return (\n <FieldSet label={skipHeader ? '' : 'Connection Details'} data-testid=\"connection-config\">\n <InlineField\n label=\"Authentication Provider\"\n labelWidth={28}\n tooltip=\"Specify which AWS credentials chain to use.\"\n >\n <Select\n aria-label=\"Authentication Provider\"\n className=\"width-30\"\n value={currentProvider}\n options={awsAuthProviderOptions.filter((opt) => awsAllowedAuthProviders.includes(opt.value!))}\n defaultValue={options.jsonData.authType}\n onChange={(option) => {\n onUpdateDatasourceJsonDataOptionSelect(props, 'authType')(option);\n }}\n menuShouldPortal={true}\n />\n </InlineField>\n {options.jsonData.authType === 'credentials' && (\n <InlineField\n label=\"Credentials Profile Name\"\n labelWidth={28}\n tooltip=\"Credentials profile name, as specified in ~/.aws/credentials, leave blank for default.\"\n >\n <Input\n aria-label=\"Credentials Profile Name\"\n className=\"width-30\"\n placeholder=\"default\"\n value={profile}\n onChange={onUpdateDatasourceJsonDataOption(props, 'profile')}\n />\n </InlineField>\n )}\n\n {options.jsonData.authType === 'keys' && (\n <>\n <InlineField label=\"Access Key ID\" labelWidth={28}>\n {props.options.secureJsonFields?.accessKey ? (\n <ButtonGroup className=\"width-30\">\n <Input disabled placeholder=\"Configured\" />\n <ToolbarButton\n icon=\"edit\"\n tooltip=\"Edit Access Key ID\"\n type=\"button\"\n onClick={onUpdateDatasourceResetOption(props as any, 'accessKey')}\n />\n </ButtonGroup>\n ) : (\n <Input\n aria-label=\"Access Key ID\"\n className=\"width-30\"\n value={options.secureJsonData?.accessKey ?? ''}\n onChange={onUpdateDatasourceSecureJsonDataOption(props, 'accessKey')}\n />\n )}\n </InlineField>\n\n <InlineField label=\"Secret Access Key\" labelWidth={28}>\n {props.options.secureJsonFields?.secretKey ? (\n <ButtonGroup className=\"width-30\">\n <Input disabled placeholder=\"Configured\" />\n <ToolbarButton\n icon=\"edit\"\n type=\"button\"\n tooltip=\"Edit Secret Access Key\"\n onClick={onUpdateDatasourceResetOption(props as any, 'secretKey')}\n />\n </ButtonGroup>\n ) : (\n <Input\n aria-label=\"Secret Access Key\"\n className=\"width-30\"\n value={options.secureJsonData?.secretKey ?? ''}\n onChange={onUpdateDatasourceSecureJsonDataOption(props, 'secretKey')}\n />\n )}\n </InlineField>\n </>\n )}\n\n {awsAssumeRoleEnabled && (\n <>\n <InlineField\n label=\"Assume Role ARN\"\n labelWidth={28}\n tooltip=\"Optionally, specify the ARN of a role to assume. Specifying a role here will ensure that the selected authentication provider is used to assume the specified role rather than using the credentials directly. Leave blank if you don't need to assume a role at all\"\n >\n <Input\n aria-label=\"Assume Role ARN\"\n className=\"width-30\"\n placeholder=\"arn:aws:iam:*\"\n value={options.jsonData.assumeRoleArn || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'assumeRoleArn')}\n />\n </InlineField>\n <InlineField\n label=\"External ID\"\n labelWidth={28}\n tooltip=\"If you are assuming a role in another account, that has been created with an external ID, specify the external ID here.\"\n >\n <Input\n aria-label=\"External ID\"\n className=\"width-30\"\n placeholder=\"External ID\"\n value={options.jsonData.externalId || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'externalId')}\n />\n </InlineField>\n </>\n )}\n {!skipEndpoint && (\n <InlineField label=\"Endpoint\" labelWidth={28} tooltip=\"Optionally, specify a custom endpoint for the service\">\n <Input\n aria-label=\"Endpoint\"\n className=\"width-30\"\n placeholder={props.defaultEndpoint ?? 'https://{service}.{region}.amazonaws.com'}\n value={options.jsonData.endpoint || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'endpoint')}\n />\n </InlineField>\n )}\n <InlineField\n label=\"Default Region\"\n labelWidth={28}\n tooltip=\"Specify the region, such as for US West (Oregon) use ` us-west-2 ` as the region.\"\n >\n <Select\n aria-label=\"Default Region\"\n className=\"width-30\"\n value={regions.find((region) => region.value === options.jsonData.defaultRegion)}\n options={regions}\n defaultValue={options.jsonData.defaultRegion}\n allowCustomValue={true}\n onChange={onUpdateDatasourceJsonDataOptionSelect(props, 'defaultRegion')}\n formatCreateLabel={(r) => `Use region: ${r}`}\n menuShouldPortal={true}\n />\n </InlineField>\n {props.children}\n </FieldSet>\n );\n};\n","import { SelectableValue } from '@grafana/data';\nimport { InlineField, Select } from '@grafana/ui';\nimport { SelectCommonProps } from '@grafana/ui/components/Select/types';\nimport { isEqual } from 'lodash';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { defaultKey } from './types';\n\nexport interface ResourceSelectorProps extends SelectCommonProps<string> {\n value: string | null;\n dependencies?: Array<string | null | undefined>;\n tooltip?: string;\n label?: string;\n 'data-testid'?: string;\n hidden?: boolean;\n // Options only needed for QueryEditor\n default?: string;\n // Options only needed for the ConfigEditor\n title?: string;\n labelWidth?: number;\n saveOptions?: () => Promise<void>;\n // Either set a way of fetching resources or the resource list\n fetch?: () => Promise<Array<string | SelectableValue<string>>>;\n resources?: string[];\n onChange: (e: SelectableValue<string> | null) => void;\n}\n\nexport function ResourceSelector(props: ResourceSelectorProps) {\n const [resource, setResource] = useState<string | null>(props.value || props.default || null);\n const [resources, setResources] = useState<Array<string | SelectableValue>>(resource ? [resource] : []);\n const [dependencies, setDependencies] = useState(props.dependencies);\n const [isLoading, setIsLoading] = useState(false);\n const [fetched, setFetched] = useState(false);\n const defaultOpts = useMemo(() => {\n const opts: Array<SelectableValue<string>> = [\n {\n label: `default (${props.default})`,\n value: defaultKey,\n description: `Default value set in the data source`,\n },\n ];\n if (props.value && props.value !== defaultKey) {\n opts.push({ label: props.value, value: props.value });\n }\n return opts;\n }, [props.default, props.value]);\n const [options, setOptions] = useState<Array<SelectableValue<string>>>(props.default ? defaultOpts : []);\n useEffect(() => {\n if (props.resources !== undefined) {\n setResources(props.resources);\n }\n }, [props.resources]);\n useEffect(() => {\n const newOptions: Array<SelectableValue<string>> = props.default ? defaultOpts : [];\n if (resources.length) {\n resources.forEach((r) => {\n const value = typeof r === 'string' ? r : r.value;\n if (!newOptions.find((o) => o.value === value)) {\n typeof r === 'string' ? newOptions.push({ label: r, value: r }) : newOptions.push(r);\n }\n });\n setOptions(newOptions);\n } else {\n setOptions([]);\n }\n }, [resources, defaultOpts, props.default]);\n\n useEffect(() => {\n // A change in the dependencies cause a state clean-up\n if (!isEqual(props.dependencies, dependencies)) {\n setFetched(false);\n setResource(null);\n props.onChange(null);\n setDependencies(props.dependencies);\n }\n }, [props, dependencies]);\n\n const fetch = async () => {\n if (fetched) {\n return;\n }\n if (props.saveOptions) {\n await props.saveOptions();\n }\n try {\n const resources = await props.fetch();\n setResources(resources);\n } finally {\n setFetched(true);\n }\n };\n\n const onChange = (e: SelectableValue<string>) => {\n props.onChange(e);\n if (e.value) {\n setResource(e.value);\n }\n };\n const onClick = async () => {\n setIsLoading(true);\n try {\n await fetch();\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <InlineField label={props.label} labelWidth={props.labelWidth} tooltip={props.tooltip} hidden={props.hidden}>\n <div data-testid={props['data-testid']} title={props.title}>\n <Select\n {...props}\n aria-label={props.label}\n options={options}\n onChange={onChange}\n isLoading={isLoading}\n className={props.className || 'min-width-6'}\n onOpenMenu={() => props.fetch && onClick()}\n menuShouldPortal={true}\n />\n </div>\n </InlineField>\n );\n}\n","import { DataQuery } from '@grafana/data';\nimport { FillValueOptions } from './QueryEditor/FillValueSelect';\n\nexport const defaultKey = '__default';\n\nexport interface SQLQuery extends DataQuery {\n rawSQL: string;\n format?: number;\n fillMode?: { mode: FillValueOptions; value?: number };\n}\n","import { ScopedVars, VariableModel } from '@grafana/data';\nimport { SQLQuery } from '../types';\nimport { CodeEditorSuggestionItem, CodeEditorSuggestionItemKind } from '@grafana/ui';\n\n/**\n * Do not execute queries that do not exist yet\n */\nexport function filterSQLQuery(query: SQLQuery): boolean {\n return !!query.rawSQL;\n}\n\nexport function applySQLTemplateVariables(\n query: SQLQuery,\n scopedVars: ScopedVars,\n getTemplateSrv: () => any\n): SQLQuery {\n const templateSrv = getTemplateSrv();\n return {\n ...query,\n rawSQL: templateSrv.replace(query.rawSQL, scopedVars, interpolateVariable),\n };\n}\n\nfunction interpolateVariable(value: string | string[]) {\n if (typeof value === 'string') {\n return value;\n }\n\n const quotedValues = value.map((v) => {\n return quoteLiteral(v);\n });\n return quotedValues.join(',');\n}\n\nfunction quoteLiteral(value: any) {\n return \"'\" + String(value).replace(/'/g, \"''\") + \"'\";\n}\n\nexport const appendTemplateVariablesAsSuggestions = (getTemplateSrv: () => any, sugs: CodeEditorSuggestionItem[]) => {\n const templateSrv = getTemplateSrv();\n const templateSugs: CodeEditorSuggestionItem[] = [];\n templateSrv.getVariables().forEach((variable: VariableModel) => {\n const label = '$' + variable.name;\n let val = templateSrv.replace(label);\n if (val === label) {\n val = '';\n }\n templateSugs.push({\n label,\n kind: CodeEditorSuggestionItemKind.Text,\n detail: `(Template Variable) ${val}`,\n });\n });\n\n return sugs.concat(templateSugs);\n};\n","import React from 'react';\nimport { DataSourcePluginOptionsEditorProps, SelectableValue } from '@grafana/data';\nimport { InputActionMeta } from '@grafana/ui/components/Select/types';\nimport { AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData } from '../../types';\nimport { ResourceSelector } from '../ResourceSelector';\n\nexport interface ConfigSelectProps\n extends DataSourcePluginOptionsEditorProps<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData> {\n value: string;\n fetch: () => Promise<Array<string | SelectableValue<string>>>;\n onChange: (e: SelectableValue<string> | null) => void;\n dependencies?: string[];\n label?: string;\n 'data-testid'?: string;\n hidden?: boolean;\n disabled?: boolean;\n allowCustomValue?: boolean;\n saveOptions: () => Promise<void>;\n autoFocus?: boolean;\n backspaceRemovesValue?: boolean;\n className?: string;\n invalid?: boolean;\n isClearable?: boolean;\n isMulti?: boolean;\n inputId?: string;\n showAllSelectedWhenOpen?: boolean;\n maxMenuHeight?: number;\n minMenuHeight?: number;\n maxVisibleValues?: number;\n menuPlacement?: 'auto' | 'bottom' | 'top';\n menuPosition?: 'fixed' | 'absolute';\n noOptionsMessage?: string;\n onBlur?: () => void;\n onCreateOption?: (value: string) => void;\n onInputChange?: (value: string, actionMeta: InputActionMeta) => void;\n placeholder?: string;\n width?: number;\n isOptionDisabled?: () => boolean;\n}\n\nexport function ConfigSelect(props: ConfigSelectProps) {\n const { jsonData } = props.options;\n const commonProps = {\n title: jsonData.defaultRegion ? '' : 'select a default region',\n labelWidth: 28,\n className: 'width-30',\n };\n // Any change in the AWS connection details will affect selectors\n const dependencies: string[] = [\n props.options.jsonData.assumeRoleArn,\n props.options.jsonData.authType,\n props.options.jsonData.defaultRegion,\n props.options.jsonData.endpoint,\n props.options.jsonData.externalId,\n props.options.jsonData.profile,\n props.options.secureJsonData?.accessKey,\n props.options.secureJsonData?.secretKey,\n ].concat(props.dependencies);\n return (\n <ResourceSelector\n label={props.label}\n data-testid={props['data-testid']}\n onChange={props.onChange}\n fetch={props.fetch}\n value={props.value}\n saveOptions={props.saveOptions}\n dependencies={dependencies}\n hidden={props.hidden}\n disabled={props.disabled || !jsonData.defaultRegion}\n allowCustomValue={props.allowCustomValue}\n autoFocus={props.autoFocus}\n backspaceRemovesValue={props.backspaceRemovesValue}\n className={props.className}\n invalid={props.invalid}\n isClearable={props.isClearable}\n isMulti={props.isMulti}\n inputId={props.inputId}\n showAllSelectedWhenOpen={props.showAllSelectedWhenOpen}\n maxMenuHeight={props.maxMenuHeight}\n minMenuHeight={props.minMenuHeight}\n maxVisibleValues={props.maxVisibleValues}\n menuPlacement={props.menuPlacement}\n menuPosition={props.menuPosition}\n noOptionsMessage={props.noOptionsMessage}\n onBlur={props.onBlur}\n onCreateOption={props.onCreateOption}\n onInputChange={props.onInputChange}\n placeholder={props.placeholder}\n width={props.width}\n isOptionDisabled={props.isOptionDisabled}\n {...commonProps}\n />\n );\n}\n","import React from 'react';\nimport { DataQuery, SelectableValue } from '@grafana/data';\nimport { InlineField, Select } from '@grafana/ui';\n\nexport type FormatSelectProps<TQuery extends DataQuery, FormatOptions> = {\n query: TQuery;\n options: Array<SelectableValue<FormatOptions>>;\n onChange: (value: TQuery) => void;\n onRunQuery?: () => void;\n};\n\nexport function FormatSelect<TQuery extends DataQuery & Record<string, any>, FormatOptions>(\n props: FormatSelectProps<TQuery, FormatOptions>\n) {\n const onChangeFormat = (e: SelectableValue<FormatOptions>) => {\n props.onChange({\n ...props.query,\n format: e.value || 0,\n });\n props.onRunQuery?.();\n };\n return (\n <InlineField label=\"Format as\" labelWidth={11}>\n <Select\n aria-label=\"Format as\"\n options={props.options}\n value={props.query.format}\n onChange={onChangeFormat}\n className=\"width-12\"\n menuShouldPortal={true}\n />\n </InlineField>\n );\n}\n","import React from 'react';\nimport { DataSourcePluginOptionsEditorProps } from '@grafana/data';\nimport { AwsAuthDataSourceSecureJsonData } from '../../types';\nimport { InlineField, Input } from '@grafana/ui';\nimport { FormEvent } from 'react-dom/node_modules/@types/react';\n\nexport interface InlineInputProps extends DataSourcePluginOptionsEditorProps<{}, AwsAuthDataSourceSecureJsonData> {\n value: string;\n onChange: (e: FormEvent<HTMLInputElement>) => void;\n label?: string;\n tooltip?: string;\n placeholder?: string;\n 'data-testid'?: string;\n hidden?: boolean;\n disabled?: boolean;\n}\n\nexport function InlineInput(props: InlineInputProps) {\n return (\n <InlineField\n label={props.label}\n labelWidth={28}\n tooltip={props.tooltip}\n hidden={props.hidden}\n disabled={props.disabled}\n >\n <Input\n data-testid={props['data-testid']}\n className=\"width-30\"\n value={props.value}\n onChange={props.onChange}\n placeholder={props.placeholder}\n disabled={props.disabled}\n />\n </InlineField>\n );\n}\n","import { defaults } from 'lodash';\n\nimport React, { useRef, useEffect } from 'react';\nimport { CodeEditor, CodeEditorSuggestionItem } from '@grafana/ui';\nimport { DataQuery } from '@grafana/data';\nimport { MonacoOptions } from '@grafana/ui/components/Monaco/types';\n\ntype EditorProps = {\n width?: number | string;\n height?: number | string;\n readOnly?: boolean;\n showMiniMap?: boolean;\n showLineNumbers?: boolean;\n monacoOptions?: MonacoOptions;\n};\n\ntype Props<TQuery extends DataQuery> = {\n query: TQuery;\n language: string;\n editorProps?: EditorProps;\n onChange: (value: TQuery) => void;\n onRunQuery: () => void;\n getSuggestions: (query: TQuery) => CodeEditorSuggestionItem[];\n};\n\nexport function QueryCodeEditor<TQuery extends DataQuery>(props: Props<TQuery>) {\n const { getSuggestions, query } = props;\n const { rawSQL } = defaults(props.query, { rawSQL: '' });\n const onRawSqlChange = (rawSQL: string) => {\n const query = {\n ...props.query,\n rawSQL,\n };\n props.onChange(query);\n props.onRunQuery();\n };\n\n // Use a reference for suggestions because a bug in CodeEditor getSuggestions\n // https://github.com/grafana/grafana/issues/40121\n // It was been fixed in 8.3 but keeping the workaround here to support older\n // versions.\n const suggestionsRef = useRef<CodeEditorSuggestionItem[]>([]);\n useEffect(() => {\n suggestionsRef.current = getSuggestions(query);\n }, [getSuggestions, query]);\n\n return (\n <CodeEditor\n language={props.language}\n value={rawSQL}\n onBlur={onRawSqlChange}\n showMiniMap={false}\n showLineNumbers={true}\n getSuggestions={() => suggestionsRef.current}\n height=\"240px\"\n {...props.editorProps}\n />\n );\n}\n","import React from 'react';\nimport { DataSourcePluginOptionsEditorProps, DataSourceSettings } from '@grafana/data';\nimport { ConnectionConfig, ConnectionConfigProps } from './ConnectionConfig';\n\nimport { AwsAuthDataSourceSecureJsonData, AwsAuthDataSourceJsonData } from './types';\n\nexport const SIGV4ConnectionConfig: React.FC<DataSourcePluginOptionsEditorProps<any, any>> = (\n props: DataSourcePluginOptionsEditorProps<any, any>\n) => {\n const { onOptionsChange, options } = props;\n\n // Map HttpSettings props to ConnectionConfigProps\n const connectionConfigProps: ConnectionConfigProps<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData> = {\n onOptionsChange: (awsDataSourceSettings) => {\n const dataSourceSettings: DataSourceSettings<any, any> = {\n ...options,\n jsonData: {\n ...options.jsonData,\n sigV4AuthType: awsDataSourceSettings.jsonData.authType,\n sigV4Profile: awsDataSourceSettings.jsonData.profile,\n sigV4AssumeRoleArn: awsDataSourceSettings.jsonData.assumeRoleArn,\n sigV4ExternalId: awsDataSourceSettings.jsonData.externalId,\n sigV4Region: awsDataSourceSettings.jsonData.defaultRegion,\n sigV4Endpoint: awsDataSourceSettings.jsonData.endpoint,\n },\n secureJsonFields: {\n sigV4AccessKey: awsDataSourceSettings.secureJsonFields?.accessKey,\n sigV4SecretKey: awsDataSourceSettings.secureJsonFields?.secretKey,\n },\n secureJsonData: {\n sigV4AccessKey: awsDataSourceSettings.secureJsonData?.accessKey,\n sigV4SecretKey: awsDataSourceSettings.secureJsonData?.secretKey,\n },\n };\n onOptionsChange(dataSourceSettings);\n },\n options: {\n ...options,\n jsonData: {\n ...options.jsonData,\n authType: options.jsonData.sigV4AuthType,\n profile: options.jsonData.sigV4Profile,\n assumeRoleArn: options.jsonData.sigV4AssumeRoleArn,\n externalId: options.jsonData.sigV4ExternalId,\n defaultRegion: options.jsonData.sigV4Region,\n endpoint: options.jsonData.sigV4Endpoint,\n },\n secureJsonFields: {\n accessKey: options.secureJsonFields?.sigV4AccessKey,\n secretKey: options.secureJsonFields?.sigV4SecretKey,\n },\n secureJsonData: {\n accessKey: options.secureJsonData?.sigV4AccessKey,\n secretKey: options.secureJsonData?.sigV4SecretKey,\n },\n },\n };\n\n return (\n <>\n <div className=\"gf-form\">\n <h6>SigV4 Auth Details</h6>\n </div>\n <ConnectionConfig {...connectionConfigProps} skipHeader skipEndpoint></ConnectionConfig>\n </>\n );\n};\n"],"names":["AwsAuthType","standardRegions","FillValueOptions","awsAuthProviderOptions","label","value","EC2IAMRole","Default","Keys","Credentials","toOption","ConnectionConfig","props","_j","__read","useState","map","regions","setRegions","loadRegions","onOptionsChange","_k","skipHeader","_l","skipEndpoint","options","profile","jsonData","undefined","database","settings","window","grafanaBootData","awsAllowedAuthProviders","useMemo","awsAssumeRoleEnabled","currentProvider","find","p","authType","useEffect","length","then","React","FieldSet","InlineField","labelWidth","tooltip","Select","className","filter","opt","includes","defaultValue","onChange","option","onUpdateDatasourceJsonDataOptionSelect","menuShouldPortal","Input","placeholder","onUpdateDatasourceJsonDataOption","secureJsonFields","accessKey","ButtonGroup","disabled","ToolbarButton","icon","type","onClick","onUpdateDatasourceResetOption","secureJsonData","onUpdateDatasourceSecureJsonDataOption","secretKey","assumeRoleArn","externalId","defaultEndpoint","endpoint","region","defaultRegion","allowCustomValue","formatCreateLabel","r","children","ResourceSelector","_a","default","resource","setResource","_b","resources","setResources","_c","dependencies","setDependencies","_d","isLoading","setIsLoading","_e","fetched","setFetched","defaultOpts","opts","description","push","_f","setOptions","newOptions","forEach","o","isEqual","hidden","title","e","onOpenMenu","fetch","saveOptions","resources_1","SelectableFillValueOptions","Previous","Null","Value","interpolateVariable","v","String","replace","quoteLiteral","join","commonProps","concat","autoFocus","backspaceRemovesValue","invalid","isClearable","isMulti","inputId","showAllSelectedWhenOpen","maxMenuHeight","minMenuHeight","maxVisibleValues","menuPlacement","menuPosition","noOptionsMessage","onBlur","onCreateOption","onInputChange","width","isOptionDisabled","query","fillMode","mode","onRunQuery","currentTarget","valueAsNumber","format","getSuggestions","rawSQL","defaults","suggestionsRef","useRef","current","CodeEditor","language","showMiniMap","showLineNumbers","height","editorProps","connectionConfigProps","awsDataSourceSettings","dataSourceSettings","sigV4AuthType","sigV4Profile","sigV4AssumeRoleArn","sigV4ExternalId","sigV4Region","sigV4Endpoint","sigV4AccessKey","sigV4SecretKey","getTemplateSrv","sugs","templateSrv","templateSugs","getVariables","variable","name","val","kind","CodeEditorSuggestionItemKind","Text","detail","scopedVars"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.production.js","sources":["../src/regions.ts","../src/types.ts","../src/providers.ts","../src/ConnectionConfig.tsx","../src/sql/ResourceSelector.tsx","../src/sql/types.ts","../src/sql/QueryEditor/FillValueSelect.tsx","../src/sql/utils/utils.ts","../src/sql/ConfigEditor/ConfigSelect.tsx","../src/sql/QueryEditor/FormatSelect.tsx","../src/sql/ConfigEditor/InlineInput.tsx","../src/sql/QueryEditor/QueryCodeEditor.tsx","../src/SIGV4ConnectionConfig.tsx"],"sourcesContent":["export const standardRegions: string[] = [\n 'af-south-1',\n 'ap-east-1',\n 'ap-northeast-1',\n 'ap-northeast-2',\n 'ap-northeast-3',\n 'ap-south-1',\n 'ap-southeast-1',\n 'ap-southeast-2',\n 'ca-central-1',\n 'cn-north-1',\n 'cn-northwest-1',\n 'eu-central-1',\n 'eu-north-1',\n 'eu-west-1',\n 'eu-west-2',\n 'eu-west-3',\n 'me-south-1',\n 'sa-east-1',\n 'us-east-1',\n 'us-east-2',\n 'us-gov-east-1',\n 'us-gov-west-1',\n 'us-iso-east-1',\n 'us-isob-east-1',\n 'us-west-1',\n 'us-west-2',\n];\n","import { DataSourceJsonData, DataSourceSettings } from '@grafana/data';\n\nexport enum AwsAuthType {\n Keys = 'keys',\n Credentials = 'credentials',\n Default = 'default', // was 'arn',\n EC2IAMRole = 'ec2_iam_role',\n /**\n * @deprecated use default\n */\n ARN = 'arn',\n}\n\nexport interface AwsAuthDataSourceJsonData extends DataSourceJsonData {\n authType?: AwsAuthType;\n assumeRoleArn?: string;\n externalId?: string;\n profile?: string; // Credentials profile name, as specified in ~/.aws/credentials\n defaultRegion?: string; // region if it is not defined by your credentials file\n endpoint?: string;\n}\n\nexport interface AwsAuthDataSourceSecureJsonData {\n accessKey?: string;\n secretKey?: string;\n sessionToken?: string;\n}\n\nexport type AwsAuthDataSourceSettings = DataSourceSettings<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData>;\n","import { SelectableValue } from '@grafana/data';\nimport { AwsAuthType } from './types';\n\nexport const awsAuthProviderOptions = [\n {\n label: 'Workspace IAM Role',\n value: AwsAuthType.EC2IAMRole,\n },\n {\n label: 'AWS SDK Default',\n value: AwsAuthType.Default,\n },\n {\n label: 'Access & secret key',\n value: AwsAuthType.Keys,\n },\n {\n label: 'Credentials file',\n value: AwsAuthType.Credentials,\n },\n] as Array<SelectableValue<AwsAuthType>>;\n","import React, { FC, useEffect, useMemo, useState } from 'react';\nimport { Input, Select, InlineField, ButtonGroup, ToolbarButton, FieldSet } from '@grafana/ui';\nimport {\n DataSourcePluginOptionsEditorProps,\n onUpdateDatasourceJsonDataOptionSelect,\n onUpdateDatasourceResetOption,\n onUpdateDatasourceJsonDataOption,\n onUpdateDatasourceSecureJsonDataOption,\n} from '@grafana/data';\n\nimport { standardRegions } from './regions';\nimport { AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData, AwsAuthType } from './types';\nimport { awsAuthProviderOptions } from './providers';\n\nconst toOption = (value: string) => ({ value, label: value });\n\nexport interface ConnectionConfigProps<J = AwsAuthDataSourceJsonData, S = AwsAuthDataSourceSecureJsonData>\n extends DataSourcePluginOptionsEditorProps<J, S> {\n standardRegions?: string[];\n loadRegions?: () => Promise<string[]>;\n defaultEndpoint?: string;\n skipHeader?: boolean;\n skipEndpoint?: boolean;\n children?: React.ReactNode;\n labelWidth?: number;\n}\n\nexport const ConnectionConfig: FC<ConnectionConfigProps> = (props: ConnectionConfigProps) => {\n const [regions, setRegions] = useState((props.standardRegions || standardRegions).map(toOption));\n const { loadRegions, onOptionsChange, skipHeader = false, skipEndpoint = false } = props;\n const { labelWidth = 28, options } = props;\n let profile = options.jsonData.profile;\n if (profile === undefined) {\n profile = options.database;\n }\n\n const settings = (window as any).grafanaBootData.settings;\n const awsAllowedAuthProviders = useMemo(\n () => settings.awsAllowedAuthProviders ?? [AwsAuthType.Default, AwsAuthType.Keys, AwsAuthType.Credentials],\n [settings.awsAllowedAuthProviders]\n );\n const awsAssumeRoleEnabled = settings.awsAssumeRoleEnabled ?? true;\n\n const currentProvider = awsAuthProviderOptions.find((p) => p.value === options.jsonData.authType);\n\n useEffect(() => {\n // Make sure a authType exists in the current model\n if (!currentProvider && awsAllowedAuthProviders.length) {\n onOptionsChange({\n ...options,\n jsonData: {\n ...options.jsonData,\n authType: awsAllowedAuthProviders[0],\n },\n });\n }\n }, [currentProvider, options, onOptionsChange, awsAllowedAuthProviders]);\n\n useEffect(() => {\n if (!loadRegions) {\n return;\n }\n\n loadRegions().then((regions) => setRegions(regions.map(toOption)));\n }, [loadRegions]);\n\n return (\n <FieldSet label={skipHeader ? '' : 'Connection Details'} data-testid=\"connection-config\">\n <InlineField\n label=\"Authentication Provider\"\n labelWidth={labelWidth}\n tooltip=\"Specify which AWS credentials chain to use.\"\n >\n <Select\n aria-label=\"Authentication Provider\"\n className=\"width-30\"\n value={currentProvider}\n options={awsAuthProviderOptions.filter((opt) => awsAllowedAuthProviders.includes(opt.value!))}\n defaultValue={options.jsonData.authType}\n onChange={(option) => {\n onUpdateDatasourceJsonDataOptionSelect(props, 'authType')(option);\n }}\n menuShouldPortal={true}\n />\n </InlineField>\n {options.jsonData.authType === 'credentials' && (\n <InlineField\n label=\"Credentials Profile Name\"\n labelWidth={labelWidth}\n tooltip=\"Credentials profile name, as specified in ~/.aws/credentials, leave blank for default.\"\n >\n <Input\n aria-label=\"Credentials Profile Name\"\n className=\"width-30\"\n placeholder=\"default\"\n value={profile}\n onChange={onUpdateDatasourceJsonDataOption(props, 'profile')}\n />\n </InlineField>\n )}\n\n {options.jsonData.authType === 'keys' && (\n <>\n <InlineField label=\"Access Key ID\" labelWidth={labelWidth}>\n {props.options.secureJsonFields?.accessKey ? (\n <ButtonGroup className=\"width-30\">\n <Input disabled placeholder=\"Configured\" />\n <ToolbarButton\n icon=\"edit\"\n tooltip=\"Edit Access Key ID\"\n type=\"button\"\n onClick={onUpdateDatasourceResetOption(props as any, 'accessKey')}\n />\n </ButtonGroup>\n ) : (\n <Input\n aria-label=\"Access Key ID\"\n className=\"width-30\"\n value={options.secureJsonData?.accessKey ?? ''}\n onChange={onUpdateDatasourceSecureJsonDataOption(props, 'accessKey')}\n />\n )}\n </InlineField>\n\n <InlineField label=\"Secret Access Key\" labelWidth={labelWidth}>\n {props.options.secureJsonFields?.secretKey ? (\n <ButtonGroup className=\"width-30\">\n <Input disabled placeholder=\"Configured\" />\n <ToolbarButton\n icon=\"edit\"\n type=\"button\"\n tooltip=\"Edit Secret Access Key\"\n onClick={onUpdateDatasourceResetOption(props as any, 'secretKey')}\n />\n </ButtonGroup>\n ) : (\n <Input\n aria-label=\"Secret Access Key\"\n className=\"width-30\"\n value={options.secureJsonData?.secretKey ?? ''}\n onChange={onUpdateDatasourceSecureJsonDataOption(props, 'secretKey')}\n />\n )}\n </InlineField>\n </>\n )}\n\n {awsAssumeRoleEnabled && (\n <>\n <InlineField\n label=\"Assume Role ARN\"\n labelWidth={labelWidth}\n tooltip=\"Optionally, specify the ARN of a role to assume. Specifying a role here will ensure that the selected authentication provider is used to assume the specified role rather than using the credentials directly. Leave blank if you don't need to assume a role at all\"\n >\n <Input\n aria-label=\"Assume Role ARN\"\n className=\"width-30\"\n placeholder=\"arn:aws:iam:*\"\n value={options.jsonData.assumeRoleArn || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'assumeRoleArn')}\n />\n </InlineField>\n <InlineField\n label=\"External ID\"\n labelWidth={labelWidth}\n tooltip=\"If you are assuming a role in another account, that has been created with an external ID, specify the external ID here.\"\n >\n <Input\n aria-label=\"External ID\"\n className=\"width-30\"\n placeholder=\"External ID\"\n value={options.jsonData.externalId || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'externalId')}\n />\n </InlineField>\n </>\n )}\n {!skipEndpoint && (\n <InlineField\n label=\"Endpoint\"\n labelWidth={labelWidth}\n tooltip=\"Optionally, specify a custom endpoint for the service\"\n >\n <Input\n aria-label=\"Endpoint\"\n className=\"width-30\"\n placeholder={props.defaultEndpoint ?? 'https://{service}.{region}.amazonaws.com'}\n value={options.jsonData.endpoint || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'endpoint')}\n />\n </InlineField>\n )}\n <InlineField\n label=\"Default Region\"\n labelWidth={labelWidth}\n tooltip=\"Specify the region, such as for US West (Oregon) use ` us-west-2 ` as the region.\"\n >\n <Select\n aria-label=\"Default Region\"\n className=\"width-30\"\n value={regions.find((region) => region.value === options.jsonData.defaultRegion)}\n options={regions}\n defaultValue={options.jsonData.defaultRegion}\n allowCustomValue={true}\n onChange={onUpdateDatasourceJsonDataOptionSelect(props, 'defaultRegion')}\n formatCreateLabel={(r) => `Use region: ${r}`}\n menuShouldPortal={true}\n />\n </InlineField>\n {props.children}\n </FieldSet>\n );\n};\n","import { SelectableValue } from '@grafana/data';\nimport { InlineField, Select, SelectCommonProps } from '@grafana/ui';\nimport { isEqual } from 'lodash';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { defaultKey } from './types';\n\nexport interface ResourceSelectorProps extends SelectCommonProps<string> {\n value: string | null;\n dependencies?: Array<string | null | undefined>;\n tooltip?: string;\n label?: string;\n 'data-testid'?: string;\n hidden?: boolean;\n // Options only needed for QueryEditor\n default?: string;\n // Options only needed for the ConfigEditor\n title?: string;\n labelWidth?: number;\n saveOptions?: () => Promise<void>;\n // Either set a way of fetching resources or the resource list\n fetch?: () => Promise<Array<string | SelectableValue<string>>>;\n resources?: string[];\n onChange: (e: SelectableValue<string> | null) => void;\n}\n\nexport function ResourceSelector(props: ResourceSelectorProps) {\n const [resource, setResource] = useState<string | null>(props.value || props.default || null);\n const [resources, setResources] = useState<Array<string | SelectableValue>>(resource ? [resource] : []);\n const [dependencies, setDependencies] = useState(props.dependencies);\n const [isLoading, setIsLoading] = useState(false);\n const [fetched, setFetched] = useState(false);\n const defaultOpts = useMemo(() => {\n const opts: Array<SelectableValue<string>> = [\n {\n label: `default (${props.default})`,\n value: defaultKey,\n description: `Default value set in the data source`,\n },\n ];\n if (props.value && props.value !== defaultKey) {\n opts.push({ label: props.value, value: props.value });\n }\n return opts;\n }, [props.default, props.value]);\n const [options, setOptions] = useState<Array<SelectableValue<string>>>(props.default ? defaultOpts : []);\n useEffect(() => {\n if (props.resources !== undefined) {\n setResources(props.resources);\n }\n }, [props.resources]);\n useEffect(() => {\n const newOptions: Array<SelectableValue<string>> = props.default ? defaultOpts : [];\n if (resources.length) {\n resources.forEach((r) => {\n const value = typeof r === 'string' ? r : r.value;\n if (!newOptions.find((o) => o.value === value)) {\n typeof r === 'string' ? newOptions.push({ label: r, value: r }) : newOptions.push(r);\n }\n });\n setOptions(newOptions);\n } else {\n setOptions([]);\n }\n }, [resources, defaultOpts, props.default]);\n\n useEffect(() => {\n // A change in the dependencies cause a state clean-up\n if (!isEqual(props.dependencies, dependencies)) {\n setFetched(false);\n setResource(null);\n props.onChange(null);\n setDependencies(props.dependencies);\n }\n }, [props, dependencies]);\n\n const fetch = async () => {\n if (fetched) {\n return;\n }\n if (props.saveOptions) {\n await props.saveOptions();\n }\n try {\n const resources = await props.fetch();\n setResources(resources);\n } finally {\n setFetched(true);\n }\n };\n\n const onChange = (e: SelectableValue<string>) => {\n props.onChange(e);\n if (e.value) {\n setResource(e.value);\n }\n };\n const onClick = async () => {\n setIsLoading(true);\n try {\n await fetch();\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <InlineField label={props.label} labelWidth={props.labelWidth} tooltip={props.tooltip} hidden={props.hidden}>\n <div data-testid={props['data-testid']} title={props.title}>\n <Select\n {...props}\n aria-label={props.label}\n options={options}\n onChange={onChange}\n isLoading={isLoading}\n className={props.className || 'min-width-6'}\n onOpenMenu={() => props.fetch && onClick()}\n menuShouldPortal={true}\n />\n </div>\n </InlineField>\n );\n}\n","import { DataQuery } from '@grafana/data';\nimport { FillValueOptions } from './QueryEditor/FillValueSelect';\n\nexport const defaultKey = '__default';\n\nexport interface SQLQuery extends DataQuery {\n rawSQL: string;\n format?: number;\n fillMode?: { mode: FillValueOptions; value?: number };\n}\n","import React from 'react';\nimport { DataQuery, SelectableValue } from '@grafana/data';\nimport { InlineField, Input, Select } from '@grafana/ui';\n\nexport enum FillValueOptions {\n Previous,\n Null,\n Value,\n}\n\nexport const SelectableFillValueOptions: Array<SelectableValue<FillValueOptions>> = [\n {\n label: 'Previous Value',\n value: FillValueOptions.Previous,\n },\n {\n label: 'NULL',\n value: FillValueOptions.Null,\n },\n {\n label: 'Value',\n value: FillValueOptions.Value,\n },\n];\n\nexport type FillValueSelectProps<TQuery extends DataQuery> = {\n query: TQuery;\n onChange: (value: TQuery) => void;\n onRunQuery?: () => void;\n};\n\nexport function FillValueSelect<TQuery extends DataQuery & Record<string, any>>(props: FillValueSelectProps<TQuery>) {\n return (\n <>\n <InlineField label=\"Fill value\" tooltip=\"value to fill missing points\">\n <Select\n aria-label=\"Fill value\"\n options={SelectableFillValueOptions}\n value={props.query.fillMode?.mode ?? FillValueOptions.Previous}\n onChange={({ value }) => {\n props.onChange({\n ...props.query,\n // Keep the fillMode.value in case FillValueOptions.Value mode is selected back\n fillMode: { ...props.query.fillMode, mode: value },\n });\n props.onRunQuery?.();\n }}\n className=\"width-12\"\n menuShouldPortal={true}\n />\n </InlineField>\n {props.query.fillMode?.mode === FillValueOptions.Value && (\n <InlineField label=\"Value\" labelWidth={11}>\n <Input\n type=\"number\"\n aria-label=\"Value\"\n value={props.query.fillMode.value}\n onChange={({ currentTarget }: React.FormEvent<HTMLInputElement>) =>\n props.onChange({\n ...props.query,\n fillMode: {\n mode: FillValueOptions.Value,\n value: currentTarget.valueAsNumber,\n },\n })\n }\n onBlur={() => props.onRunQuery?.()}\n />\n </InlineField>\n )}\n </>\n );\n}\n","import { ScopedVars, VariableModel } from '@grafana/data';\nimport { SQLQuery } from '../types';\nimport { CodeEditorSuggestionItem, CodeEditorSuggestionItemKind } from '@grafana/ui';\n\n/**\n * Do not execute queries that do not exist yet\n */\nexport function filterSQLQuery(query: SQLQuery): boolean {\n return !!query.rawSQL;\n}\n\nexport function applySQLTemplateVariables(\n query: SQLQuery,\n scopedVars: ScopedVars,\n getTemplateSrv: () => any\n): SQLQuery {\n const templateSrv = getTemplateSrv();\n return {\n ...query,\n rawSQL: templateSrv.replace(query.rawSQL, scopedVars, interpolateVariable),\n };\n}\n\nfunction interpolateVariable(value: string | string[]) {\n if (typeof value === 'string') {\n return value;\n }\n\n const quotedValues = value.map((v) => {\n return quoteLiteral(v);\n });\n return quotedValues.join(',');\n}\n\nfunction quoteLiteral(value: any) {\n return \"'\" + String(value).replace(/'/g, \"''\") + \"'\";\n}\n\nexport const appendTemplateVariablesAsSuggestions = (getTemplateSrv: () => any, sugs: CodeEditorSuggestionItem[]) => {\n const templateSrv = getTemplateSrv();\n const templateSugs: CodeEditorSuggestionItem[] = [];\n templateSrv.getVariables().forEach((variable: VariableModel) => {\n const label = '$' + variable.name;\n let val = templateSrv.replace(label);\n if (val === label) {\n val = '';\n }\n templateSugs.push({\n label,\n kind: CodeEditorSuggestionItemKind.Text,\n detail: `(Template Variable) ${val}`,\n });\n });\n\n return sugs.concat(templateSugs);\n};\n","import React from 'react';\nimport { DataSourcePluginOptionsEditorProps, SelectableValue } from '@grafana/data';\nimport { InputActionMeta } from '@grafana/ui';\nimport { AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData } from '../../types';\nimport { ResourceSelector } from '../ResourceSelector';\n\nexport interface ConfigSelectProps\n extends DataSourcePluginOptionsEditorProps<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData> {\n value: string;\n fetch: () => Promise<Array<string | SelectableValue<string>>>;\n onChange: (e: SelectableValue<string> | null) => void;\n dependencies?: string[];\n label?: string;\n 'data-testid'?: string;\n hidden?: boolean;\n disabled?: boolean;\n allowCustomValue?: boolean;\n saveOptions: () => Promise<void>;\n autoFocus?: boolean;\n backspaceRemovesValue?: boolean;\n className?: string;\n invalid?: boolean;\n isClearable?: boolean;\n isMulti?: boolean;\n inputId?: string;\n showAllSelectedWhenOpen?: boolean;\n maxMenuHeight?: number;\n minMenuHeight?: number;\n maxVisibleValues?: number;\n menuPlacement?: 'auto' | 'bottom' | 'top';\n menuPosition?: 'fixed' | 'absolute';\n noOptionsMessage?: string;\n onBlur?: () => void;\n onCreateOption?: (value: string) => void;\n onInputChange?: (value: string, actionMeta: InputActionMeta) => void;\n placeholder?: string;\n width?: number;\n isOptionDisabled?: () => boolean;\n labelWidth?: number;\n}\n\nexport function ConfigSelect(props: ConfigSelectProps) {\n const { jsonData } = props.options;\n const commonProps = {\n title: jsonData.defaultRegion ? '' : 'select a default region',\n labelWidth: props.labelWidth ?? 28,\n className: 'width-30',\n };\n // Any change in the AWS connection details will affect selectors\n const dependencies: string[] = [\n props.options.jsonData.assumeRoleArn,\n props.options.jsonData.authType,\n props.options.jsonData.defaultRegion,\n props.options.jsonData.endpoint,\n props.options.jsonData.externalId,\n props.options.jsonData.profile,\n props.options.secureJsonData?.accessKey,\n props.options.secureJsonData?.secretKey,\n ].concat(props.dependencies);\n return (\n <ResourceSelector\n label={props.label}\n data-testid={props['data-testid']}\n onChange={props.onChange}\n fetch={props.fetch}\n value={props.value}\n saveOptions={props.saveOptions}\n dependencies={dependencies}\n hidden={props.hidden}\n disabled={props.disabled || !jsonData.defaultRegion}\n allowCustomValue={props.allowCustomValue}\n autoFocus={props.autoFocus}\n backspaceRemovesValue={props.backspaceRemovesValue}\n className={props.className}\n invalid={props.invalid}\n isClearable={props.isClearable}\n isMulti={props.isMulti}\n inputId={props.inputId}\n showAllSelectedWhenOpen={props.showAllSelectedWhenOpen}\n maxMenuHeight={props.maxMenuHeight}\n minMenuHeight={props.minMenuHeight}\n maxVisibleValues={props.maxVisibleValues}\n menuPlacement={props.menuPlacement}\n menuPosition={props.menuPosition}\n noOptionsMessage={props.noOptionsMessage}\n onBlur={props.onBlur}\n onCreateOption={props.onCreateOption}\n onInputChange={props.onInputChange}\n placeholder={props.placeholder}\n width={props.width}\n isOptionDisabled={props.isOptionDisabled}\n {...commonProps}\n />\n );\n}\n","import React from 'react';\nimport { DataQuery, SelectableValue } from '@grafana/data';\nimport { InlineField, Select } from '@grafana/ui';\n\nexport type FormatSelectProps<TQuery extends DataQuery, FormatOptions> = {\n query: TQuery;\n options: Array<SelectableValue<FormatOptions>>;\n onChange: (value: TQuery) => void;\n onRunQuery?: () => void;\n};\n\nexport function FormatSelect<TQuery extends DataQuery & Record<string, any>, FormatOptions>(\n props: FormatSelectProps<TQuery, FormatOptions>\n) {\n const onChangeFormat = (e: SelectableValue<FormatOptions>) => {\n props.onChange({\n ...props.query,\n format: e.value || 0,\n });\n props.onRunQuery?.();\n };\n return (\n <InlineField label=\"Format as\" labelWidth={11}>\n <Select\n aria-label=\"Format as\"\n options={props.options}\n value={props.query.format}\n onChange={onChangeFormat}\n className=\"width-12\"\n menuShouldPortal={true}\n />\n </InlineField>\n );\n}\n","import React from 'react';\nimport { DataSourcePluginOptionsEditorProps } from '@grafana/data';\nimport { AwsAuthDataSourceSecureJsonData } from '../../types';\nimport { InlineField, Input } from '@grafana/ui';\nimport { FormEvent } from 'react-dom/node_modules/@types/react';\n\nexport interface InlineInputProps extends DataSourcePluginOptionsEditorProps<{}, AwsAuthDataSourceSecureJsonData> {\n value: string;\n onChange: (e: FormEvent<HTMLInputElement>) => void;\n label?: string;\n tooltip?: string;\n placeholder?: string;\n 'data-testid'?: string;\n hidden?: boolean;\n disabled?: boolean;\n labelWidth?: number;\n}\n\nexport function InlineInput(props: InlineInputProps) {\n return (\n <InlineField\n label={props.label}\n labelWidth={props.labelWidth ?? 28}\n tooltip={props.tooltip}\n hidden={props.hidden}\n disabled={props.disabled}\n >\n <Input\n data-testid={props['data-testid']}\n className=\"width-30\"\n value={props.value}\n onChange={props.onChange}\n placeholder={props.placeholder}\n disabled={props.disabled}\n />\n </InlineField>\n );\n}\n","import { defaults } from 'lodash';\n\nimport React, { useRef, useEffect } from 'react';\nimport { CodeEditor, CodeEditorSuggestionItem, CodeEditorMonacoOptions } from '@grafana/ui';\nimport { DataQuery } from '@grafana/data';\n\ntype EditorProps = {\n width?: number | string;\n height?: number | string;\n readOnly?: boolean;\n showMiniMap?: boolean;\n showLineNumbers?: boolean;\n monacoOptions?: CodeEditorMonacoOptions;\n};\n\ntype Props<TQuery extends DataQuery> = {\n query: TQuery;\n language: string;\n editorProps?: EditorProps;\n onChange: (value: TQuery) => void;\n onRunQuery: () => void;\n getSuggestions: (query: TQuery) => CodeEditorSuggestionItem[];\n};\n\nexport function QueryCodeEditor<TQuery extends DataQuery>(props: Props<TQuery>) {\n const { getSuggestions, query } = props;\n const { rawSQL } = defaults(props.query, { rawSQL: '' });\n const onRawSqlChange = (rawSQL: string) => {\n const query = {\n ...props.query,\n rawSQL,\n };\n props.onChange(query);\n props.onRunQuery();\n };\n\n // Use a reference for suggestions because a bug in CodeEditor getSuggestions\n // https://github.com/grafana/grafana/issues/40121\n // It was been fixed in 8.3 but keeping the workaround here to support older\n // versions.\n const suggestionsRef = useRef<CodeEditorSuggestionItem[]>([]);\n useEffect(() => {\n suggestionsRef.current = getSuggestions(query);\n }, [getSuggestions, query]);\n\n return (\n <CodeEditor\n language={props.language}\n value={rawSQL}\n onBlur={onRawSqlChange}\n showMiniMap={false}\n showLineNumbers={true}\n getSuggestions={() => suggestionsRef.current}\n height=\"240px\"\n {...props.editorProps}\n />\n );\n}\n","import React from 'react';\nimport { DataSourcePluginOptionsEditorProps, DataSourceSettings } from '@grafana/data';\nimport { ConnectionConfig, ConnectionConfigProps } from './ConnectionConfig';\n\nimport { AwsAuthDataSourceSecureJsonData, AwsAuthDataSourceJsonData } from './types';\n\nexport const SIGV4ConnectionConfig: React.FC<DataSourcePluginOptionsEditorProps<any, any>> = (\n props: DataSourcePluginOptionsEditorProps<any, any>\n) => {\n const { onOptionsChange, options } = props;\n\n // Map HttpSettings props to ConnectionConfigProps\n const connectionConfigProps: ConnectionConfigProps<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData> = {\n onOptionsChange: (awsDataSourceSettings) => {\n const dataSourceSettings: DataSourceSettings<any, any> = {\n ...options,\n jsonData: {\n ...options.jsonData,\n sigV4AuthType: awsDataSourceSettings.jsonData.authType,\n sigV4Profile: awsDataSourceSettings.jsonData.profile,\n sigV4AssumeRoleArn: awsDataSourceSettings.jsonData.assumeRoleArn,\n sigV4ExternalId: awsDataSourceSettings.jsonData.externalId,\n sigV4Region: awsDataSourceSettings.jsonData.defaultRegion,\n sigV4Endpoint: awsDataSourceSettings.jsonData.endpoint,\n },\n secureJsonFields: {\n sigV4AccessKey: awsDataSourceSettings.secureJsonFields?.accessKey,\n sigV4SecretKey: awsDataSourceSettings.secureJsonFields?.secretKey,\n },\n secureJsonData: {\n sigV4AccessKey: awsDataSourceSettings.secureJsonData?.accessKey,\n sigV4SecretKey: awsDataSourceSettings.secureJsonData?.secretKey,\n },\n };\n onOptionsChange(dataSourceSettings);\n },\n options: {\n ...options,\n jsonData: {\n ...options.jsonData,\n authType: options.jsonData.sigV4AuthType,\n profile: options.jsonData.sigV4Profile,\n assumeRoleArn: options.jsonData.sigV4AssumeRoleArn,\n externalId: options.jsonData.sigV4ExternalId,\n defaultRegion: options.jsonData.sigV4Region,\n endpoint: options.jsonData.sigV4Endpoint,\n },\n secureJsonFields: {\n accessKey: options.secureJsonFields?.sigV4AccessKey,\n secretKey: options.secureJsonFields?.sigV4SecretKey,\n },\n secureJsonData: {\n accessKey: options.secureJsonData?.sigV4AccessKey,\n secretKey: options.secureJsonData?.sigV4SecretKey,\n },\n },\n };\n\n return (\n <>\n <div className=\"gf-form\">\n <h6>SigV4 Auth Details</h6>\n </div>\n <ConnectionConfig {...connectionConfigProps} skipHeader skipEndpoint></ConnectionConfig>\n </>\n );\n};\n"],"names":["standardRegions","AwsAuthType","awsAuthProviderOptions","label","value","EC2IAMRole","Default","Keys","Credentials","toOption","ConnectionConfig","props","regions","setRegions","useState","map","loadRegions","onOptionsChange","skipHeader","skipEndpoint","labelWidth","options","profile","jsonData","undefined","database","settings","window","grafanaBootData","awsAllowedAuthProviders","useMemo","awsAssumeRoleEnabled","currentProvider","find","p","authType","useEffect","length","then","React","FieldSet","InlineField","tooltip","Select","className","filter","opt","includes","defaultValue","onChange","option","onUpdateDatasourceJsonDataOptionSelect","menuShouldPortal","Input","placeholder","onUpdateDatasourceJsonDataOption","secureJsonFields","accessKey","ButtonGroup","disabled","ToolbarButton","icon","type","onClick","onUpdateDatasourceResetOption","secureJsonData","onUpdateDatasourceSecureJsonDataOption","secretKey","assumeRoleArn","externalId","defaultEndpoint","endpoint","region","defaultRegion","allowCustomValue","formatCreateLabel","r","children","ResourceSelector","resource","setResource","default","resources","setResources","dependencies","setDependencies","isLoading","setIsLoading","fetched","setFetched","defaultOpts","opts","description","push","setOptions","newOptions","forEach","o","isEqual","fetch","saveOptions","hidden","title","e","onOpenMenu","FillValueOptions","SelectableFillValueOptions","Previous","Null","Value","interpolateVariable","v","String","replace","quoteLiteral","join","commonProps","concat","autoFocus","backspaceRemovesValue","invalid","isClearable","isMulti","inputId","showAllSelectedWhenOpen","maxMenuHeight","minMenuHeight","maxVisibleValues","menuPlacement","menuPosition","noOptionsMessage","onBlur","onCreateOption","onInputChange","width","isOptionDisabled","query","fillMode","mode","onRunQuery","currentTarget","valueAsNumber","format","getSuggestions","rawSQL","defaults","suggestionsRef","useRef","current","CodeEditor","language","showMiniMap","showLineNumbers","height","editorProps","connectionConfigProps","awsDataSourceSettings","dataSourceSettings","sigV4AuthType","sigV4Profile","sigV4AssumeRoleArn","sigV4ExternalId","sigV4Region","sigV4Endpoint","sigV4AccessKey","sigV4SecretKey","getTemplateSrv","sugs","templateSrv","templateSugs","getVariables","variable","name","val","kind","CodeEditorSuggestionItemKind","Text","detail","scopedVars"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DataSourcePluginOptionsEditorProps, SelectableValue } from '@grafana/data';
|
|
2
|
-
import { InputActionMeta } from '@grafana/ui
|
|
2
|
+
import { InputActionMeta } from '@grafana/ui';
|
|
3
3
|
import { AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData } from '../../types';
|
|
4
4
|
export interface ConfigSelectProps extends DataSourcePluginOptionsEditorProps<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData> {
|
|
5
5
|
value: string;
|
|
@@ -32,5 +32,6 @@ export interface ConfigSelectProps extends DataSourcePluginOptionsEditorProps<Aw
|
|
|
32
32
|
placeholder?: string;
|
|
33
33
|
width?: number;
|
|
34
34
|
isOptionDisabled?: () => boolean;
|
|
35
|
+
labelWidth?: number;
|
|
35
36
|
}
|
|
36
37
|
export declare function ConfigSelect(props: ConfigSelectProps): JSX.Element;
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { CodeEditorSuggestionItem } from '@grafana/ui';
|
|
1
|
+
import { CodeEditorSuggestionItem, CodeEditorMonacoOptions } from '@grafana/ui';
|
|
2
2
|
import { DataQuery } from '@grafana/data';
|
|
3
|
-
import { MonacoOptions } from '@grafana/ui/components/Monaco/types';
|
|
4
3
|
declare type EditorProps = {
|
|
5
4
|
width?: number | string;
|
|
6
5
|
height?: number | string;
|
|
7
6
|
readOnly?: boolean;
|
|
8
7
|
showMiniMap?: boolean;
|
|
9
8
|
showLineNumbers?: boolean;
|
|
10
|
-
monacoOptions?:
|
|
9
|
+
monacoOptions?: CodeEditorMonacoOptions;
|
|
11
10
|
};
|
|
12
11
|
declare type Props<TQuery extends DataQuery> = {
|
|
13
12
|
query: TQuery;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SelectableValue } from '@grafana/data';
|
|
2
|
-
import { SelectCommonProps } from '@grafana/ui
|
|
2
|
+
import { SelectCommonProps } from '@grafana/ui';
|
|
3
3
|
export interface ResourceSelectorProps extends SelectCommonProps<string> {
|
|
4
4
|
value: string | null;
|
|
5
5
|
dependencies?: Array<string | null | undefined>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grafana/aws-sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.40",
|
|
4
4
|
"description": "Common AWS features for grafana",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -25,18 +25,18 @@
|
|
|
25
25
|
"@babel/preset-env": "^7.13.12",
|
|
26
26
|
"@babel/preset-react": "^7.13.13",
|
|
27
27
|
"@babel/preset-typescript": "^7.13.0",
|
|
28
|
-
"@grafana/data": "
|
|
29
|
-
"@grafana/runtime": "
|
|
30
|
-
"@grafana/toolkit": "
|
|
31
|
-
"@grafana/ui": "
|
|
28
|
+
"@grafana/data": "9.2.3",
|
|
29
|
+
"@grafana/runtime": "9.2.3",
|
|
30
|
+
"@grafana/toolkit": "9.2.3",
|
|
31
|
+
"@grafana/ui": "9.2.3",
|
|
32
32
|
"@rollup/plugin-commonjs": "11.0.2",
|
|
33
33
|
"@rollup/plugin-json": "4.0.3",
|
|
34
34
|
"@rollup/plugin-node-resolve": "7.1.1",
|
|
35
|
-
"@testing-library/jest-dom": "
|
|
36
|
-
"@testing-library/react": "
|
|
37
|
-
"@testing-library/react-hooks": "
|
|
35
|
+
"@testing-library/jest-dom": "5.16.5",
|
|
36
|
+
"@testing-library/react": "12.1.5",
|
|
37
|
+
"@testing-library/react-hooks": "8.0.1",
|
|
38
38
|
"@types/braintree__sanitize-url": "4.0.0",
|
|
39
|
-
"@types/jest": "
|
|
39
|
+
"@types/jest": "27.4.1",
|
|
40
40
|
"@types/jquery": "3.3.38",
|
|
41
41
|
"@types/lodash": "4.14.123",
|
|
42
42
|
"@types/node": "10.14.1",
|
|
@@ -47,8 +47,11 @@
|
|
|
47
47
|
"@types/rollup-plugin-visualizer": "2.6.0",
|
|
48
48
|
"@types/sinon": "^7.5.2",
|
|
49
49
|
"babel-jest": "^26.6.3",
|
|
50
|
-
"jest": "
|
|
50
|
+
"jest": "27.5.1",
|
|
51
|
+
"node-notifier": "^10.0.1",
|
|
51
52
|
"pretty-format": "25.1.0",
|
|
53
|
+
"react": "17.0.2",
|
|
54
|
+
"react-dom": "17.0.2",
|
|
52
55
|
"react-select-event": "^5.3.0",
|
|
53
56
|
"react-test-renderer": "^17.0.2",
|
|
54
57
|
"rimraf": "^3.0.2",
|