@grafana/plugin-ui 0.14.1-dsconfig.bccd84e → 0.14.1-dsconfig.ced809d
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/cjs/index.cjs +1076 -318
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +439 -115
- package/dist/cjs/schemas.cjs +14853 -0
- package/dist/cjs/schemas.cjs.map +1 -0
- package/dist/cjs/schemas.d.cts +373 -0
- package/dist/cjs/test-utils.d.cts +23 -23
- package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js +2 -2
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js +14 -9
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js +27 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js +16 -5
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js +9 -4
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js +61 -11
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{useDatasourceConfigForm.js → hooks/useDatasourceConfigForm.js} +71 -29
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js +106 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{AuthorizationHeaderField.js → inputs/AuthorizationHeaderField.js} +6 -8
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{ComplexFieldNote.js → inputs/ComplexFieldNote.js} +6 -4
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js +106 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{IndexedPairEditor.js → inputs/IndexedPairEditor.js} +52 -52
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js +190 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{PdcFieldNote.js → inputs/PdcFieldNote.js} +5 -8
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PdcFieldNote.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{SecureFieldInput.js → inputs/SecureFieldInput.js} +8 -10
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js +80 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js +76 -41
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js +30 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/tabStyles.js +4 -4
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/tabStyles.js.map +1 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/wizardStyles.js +3 -3
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/wizardStyles.js.map +1 -1
- package/dist/esm/components/DataLinks/DataLink.js +2 -2
- package/dist/esm/components/DataLinks/DataLinks.js +2 -2
- package/dist/esm/components/DataSourcePicker/DataSourcePicker.js +7 -7
- package/dist/esm/components/DatePicker/styles.js +2 -2
- package/dist/esm/components/DatePickerWithInput/styles.js +2 -2
- package/dist/esm/components/QueryEditor/EditorField.js +2 -2
- package/dist/esm/components/QueryEditor/EditorHeader.js +2 -2
- package/dist/esm/components/QueryEditor/EditorRow.js +2 -2
- package/dist/esm/components/QueryEditor/EditorSwitch.js +2 -2
- package/dist/esm/components/QueryEditor/InputGroup.js +2 -2
- package/dist/esm/components/QueryEditor/Space.js +2 -2
- package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js +2 -2
- package/dist/esm/datasource/SqlDatasource.js +10 -10
- package/dist/esm/datasource/schema/cel.js +42 -0
- package/dist/esm/datasource/schema/cel.js.map +1 -0
- package/dist/esm/datasource/schema/config.js +37 -14
- package/dist/esm/datasource/schema/config.js.map +1 -1
- package/dist/esm/datasource/schema/datasource.js +129 -3
- package/dist/esm/datasource/schema/datasource.js.map +1 -1
- package/dist/esm/datasource/schema/datasources/alertmanager.schema.json.js +77 -0
- package/dist/esm/datasource/schema/datasources/alertmanager.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/cloudwatch.schema.json.js +384 -0
- package/dist/esm/datasource/schema/datasources/cloudwatch.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/elasticsearch.schema.json.js +287 -0
- package/dist/esm/datasource/schema/datasources/elasticsearch.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-amazonprometheus-datasource.schema.json.js +166 -0
- package/dist/esm/datasource/schema/datasources/grafana-amazonprometheus-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-appdynamics-datasource.schema.json.js +145 -0
- package/dist/esm/datasource/schema/datasources/grafana-appdynamics-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-astradb-datasource.schema.json.js +123 -0
- package/dist/esm/datasource/schema/datasources/grafana-astradb-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-athena-datasource.schema.json.js +158 -0
- package/dist/esm/datasource/schema/datasources/grafana-athena-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-azure-data-explorer-datasource.schema.json.js +204 -0
- package/dist/esm/datasource/schema/datasources/grafana-azure-data-explorer-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-azure-monitor-datasource.schema.json.js +294 -0
- package/dist/esm/datasource/schema/datasources/grafana-azure-monitor-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-azuredevops-datasource.schema.json.js +101 -0
- package/dist/esm/datasource/schema/datasources/grafana-azuredevops-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-azureprometheus-datasource.schema.json.js +125 -0
- package/dist/esm/datasource/schema/datasources/grafana-azureprometheus-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-bigquery-datasource.schema.json.js +508 -0
- package/dist/esm/datasource/schema/datasources/grafana-bigquery-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-clickhouse-datasource.schema.json.js +1400 -0
- package/dist/esm/datasource/schema/datasources/grafana-clickhouse-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-cockroachdb-datasource.schema.json.js +302 -0
- package/dist/esm/datasource/schema/datasources/grafana-cockroachdb-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-databricks-datasource.schema.json.js +291 -0
- package/dist/esm/datasource/schema/datasources/grafana-databricks-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-datadog-datasource.schema.json.js +155 -0
- package/dist/esm/datasource/schema/datasources/grafana-datadog-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-dynatrace-datasource.schema.json.js +179 -0
- package/dist/esm/datasource/schema/datasources/grafana-dynatrace-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-falconlogscale-datasource.schema.json.js +134 -0
- package/dist/esm/datasource/schema/datasources/grafana-falconlogscale-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-github-datasource.schema.json.js +156 -0
- package/dist/esm/datasource/schema/datasources/grafana-github-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-gitlab-datasource.schema.json.js +84 -0
- package/dist/esm/datasource/schema/datasources/grafana-gitlab-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-googlesheets-datasource.schema.json.js +231 -0
- package/dist/esm/datasource/schema/datasources/grafana-googlesheets-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-honeycomb-datasource.schema.json.js +87 -0
- package/dist/esm/datasource/schema/datasources/grafana-honeycomb-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-iot-sitewise-datasource.schema.json.js +159 -0
- package/dist/esm/datasource/schema/datasources/grafana-iot-sitewise-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-jira-datasource.schema.json.js +188 -0
- package/dist/esm/datasource/schema/datasources/grafana-jira-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-looker-datasource.schema.json.js +82 -0
- package/dist/esm/datasource/schema/datasources/grafana-looker-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-mongodb-datasource.schema.json.js +278 -0
- package/dist/esm/datasource/schema/datasources/grafana-mongodb-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-mqtt-datasource.schema.json.js +168 -0
- package/dist/esm/datasource/schema/datasources/grafana-mqtt-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-newrelic-datasource.schema.json.js +129 -0
- package/dist/esm/datasource/schema/datasources/grafana-newrelic-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-odbc-datasource.schema.json.js +56 -0
- package/dist/esm/datasource/schema/datasources/grafana-odbc-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-opensearch-datasource.schema.json.js +212 -0
- package/dist/esm/datasource/schema/datasources/grafana-opensearch-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-oracle-datasource.schema.json.js +186 -0
- package/dist/esm/datasource/schema/datasources/grafana-oracle-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-pagerduty-datasource.schema.json.js +85 -0
- package/dist/esm/datasource/schema/datasources/grafana-pagerduty-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-postgresql-datasource.schema.json.js +411 -0
- package/dist/esm/datasource/schema/datasources/grafana-postgresql-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-pyroscope-datasource.schema.json.js +41 -0
- package/dist/esm/datasource/schema/datasources/grafana-pyroscope-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-redshift-datasource.schema.json.js +201 -0
- package/dist/esm/datasource/schema/datasources/grafana-redshift-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-salesforce-datasource.schema.json.js +201 -0
- package/dist/esm/datasource/schema/datasources/grafana-salesforce-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-saphana-datasource.schema.json.js +208 -0
- package/dist/esm/datasource/schema/datasources/grafana-saphana-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-sentry-datasource.schema.json.js +94 -0
- package/dist/esm/datasource/schema/datasources/grafana-sentry-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-servicenow-datasource.schema.json.js +179 -0
- package/dist/esm/datasource/schema/datasources/grafana-servicenow-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-snowflake-datasource.schema.json.js +304 -0
- package/dist/esm/datasource/schema/datasources/grafana-snowflake-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-splunk-datasource.schema.json.js +319 -0
- package/dist/esm/datasource/schema/datasources/grafana-splunk-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-splunkobservability-datasource.schema.json.js +90 -0
- package/dist/esm/datasource/schema/datasources/grafana-splunkobservability-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-strava-datasource.schema.json.js +74 -0
- package/dist/esm/datasource/schema/datasources/grafana-strava-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-sumologic-datasource.schema.json.js +102 -0
- package/dist/esm/datasource/schema/datasources/grafana-sumologic-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-surrealdb-datasource.schema.json.js +92 -0
- package/dist/esm/datasource/schema/datasources/grafana-surrealdb-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-timestream-datasource.schema.json.js +145 -0
- package/dist/esm/datasource/schema/datasources/grafana-timestream-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-wavefront-datasource.schema.json.js +80 -0
- package/dist/esm/datasource/schema/datasources/grafana-wavefront-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-x-ray-datasource.schema.json.js +112 -0
- package/dist/esm/datasource/schema/datasources/grafana-x-ray-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/grafana-yugabyte-datasource.schema.json.js +114 -0
- package/dist/esm/datasource/schema/datasources/grafana-yugabyte-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/graphite.schema.json.js +104 -0
- package/dist/esm/datasource/schema/datasources/graphite.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/influxdb.schema.json.js +717 -0
- package/dist/esm/datasource/schema/datasources/influxdb.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/jaeger.schema.json.js +59 -0
- package/dist/esm/datasource/schema/datasources/jaeger.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/loki.schema.json.js +545 -0
- package/dist/esm/datasource/schema/datasources/loki.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/marcusolsson-csv-datasource.schema.json.js +45 -0
- package/dist/esm/datasource/schema/datasources/marcusolsson-csv-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/marcusolsson-json-datasource.schema.json.js +36 -0
- package/dist/esm/datasource/schema/datasources/marcusolsson-json-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/mssql.schema.json.js +292 -0
- package/dist/esm/datasource/schema/datasources/mssql.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/mysql.schema.json.js +304 -0
- package/dist/esm/datasource/schema/datasources/mysql.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/opentsdb.schema.json.js +113 -0
- package/dist/esm/datasource/schema/datasources/opentsdb.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/prometheus.schema.json.js +783 -0
- package/dist/esm/datasource/schema/datasources/prometheus.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/stackdriver.schema.json.js +224 -0
- package/dist/esm/datasource/schema/datasources/stackdriver.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/tempo.schema.json.js +664 -0
- package/dist/esm/datasource/schema/datasources/tempo.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/yesoreyeram-infinity-datasource.schema.json.js +1073 -0
- package/dist/esm/datasource/schema/datasources/yesoreyeram-infinity-datasource.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/datasources/zipkin.schema.json.js +40 -0
- package/dist/esm/datasource/schema/datasources/zipkin.schema.json.js.map +1 -0
- package/dist/esm/datasource/schema/llmHints.js.map +1 -1
- package/dist/esm/datasource/schema/provisioningYaml.js +3 -1
- package/dist/esm/datasource/schema/provisioningYaml.js.map +1 -1
- package/dist/esm/datasource/schema/schemaRegistry.js +139 -0
- package/dist/esm/datasource/schema/schemaRegistry.js.map +1 -0
- package/dist/esm/index.d.ts +439 -115
- package/dist/esm/index.js +6 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/schemas.d.ts +373 -0
- package/dist/esm/schemas.js +2 -0
- package/dist/esm/schemas.js.map +1 -0
- package/dist/esm/test-utils.d.ts +23 -23
- package/package.json +23 -6
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/AuthorizationHeaderField.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/ComplexFieldNote.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/IndexedPairEditor.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/PdcFieldNote.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SecureFieldInput.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/StringArrayInput.js +0 -84
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/StringArrayInput.js.map +0 -1
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/useDatasourceConfigForm.js.map +0 -1
|
@@ -19,7 +19,7 @@ function RawEditor({
|
|
|
19
19
|
language = "sql"
|
|
20
20
|
}) {
|
|
21
21
|
const theme = useTheme2();
|
|
22
|
-
const styles = useStyles2(getStyles$
|
|
22
|
+
const styles = useStyles2(getStyles$n);
|
|
23
23
|
const [isExpanded, setIsExpanded] = useState(false);
|
|
24
24
|
const [toolboxRef, toolboxMeasure] = useMeasure();
|
|
25
25
|
const [editorRef, editorMeasure] = useMeasure();
|
|
@@ -89,7 +89,7 @@ function RawEditor({
|
|
|
89
89
|
renderEditor(true)
|
|
90
90
|
));
|
|
91
91
|
}
|
|
92
|
-
function getStyles$
|
|
92
|
+
function getStyles$n(theme) {
|
|
93
93
|
return {
|
|
94
94
|
modal: css`
|
|
95
95
|
width: 95vw;
|
|
@@ -8,12 +8,12 @@ const EditorField = (props) => {
|
|
|
8
8
|
var _a;
|
|
9
9
|
const { label, optional, tooltip, children, width, ...fieldProps } = props;
|
|
10
10
|
const theme = useTheme2();
|
|
11
|
-
const styles = getStyles$
|
|
11
|
+
const styles = getStyles$j(theme, width);
|
|
12
12
|
const childInputId = (fieldProps == null ? void 0 : fieldProps.htmlFor) || ((_a = ReactUtils) == null ? void 0 : _a.getChildId(children));
|
|
13
13
|
const labelEl = /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("label", { className: styles.label, htmlFor: childInputId }, label, optional && /* @__PURE__ */ React.createElement("span", { className: styles.optional }, " - optional"), tooltip && /* @__PURE__ */ React.createElement(Tooltip, { placement: "top", content: tooltip, theme: "info" }, /* @__PURE__ */ React.createElement(Icon, { name: "info-circle", size: "sm", className: styles.icon }))), /* @__PURE__ */ React.createElement(Space, { v: 0.5 }));
|
|
14
14
|
return /* @__PURE__ */ React.createElement("div", { className: styles.root }, /* @__PURE__ */ React.createElement(Field, { className: styles.field, label: labelEl, ...fieldProps }, children));
|
|
15
15
|
};
|
|
16
|
-
const getStyles$
|
|
16
|
+
const getStyles$j = stylesFactory((theme, width) => {
|
|
17
17
|
return {
|
|
18
18
|
root: css({
|
|
19
19
|
minWidth: theme.spacing(width != null ? width : 0)
|
|
@@ -5,10 +5,10 @@ import { useStyles2 } from '@grafana/ui';
|
|
|
5
5
|
import { EditorStack } from '../EditorStack.js';
|
|
6
6
|
|
|
7
7
|
const EditorRow = ({ children }) => {
|
|
8
|
-
const styles = useStyles2(getStyles$
|
|
8
|
+
const styles = useStyles2(getStyles$k);
|
|
9
9
|
return /* @__PURE__ */ React.createElement("div", { className: styles.root }, /* @__PURE__ */ React.createElement(EditorStack, { gap: 2 }, children));
|
|
10
10
|
};
|
|
11
|
-
const getStyles$
|
|
11
|
+
const getStyles$k = (theme) => {
|
|
12
12
|
return {
|
|
13
13
|
root: css({
|
|
14
14
|
padding: theme.spacing(1),
|
|
@@ -7,7 +7,7 @@ import { formatSQL } from '../utils/formatSQL.js';
|
|
|
7
7
|
|
|
8
8
|
function Preview({ rawSql, language = "sql" }) {
|
|
9
9
|
const [_, copyToClipboard] = useCopyToClipboard();
|
|
10
|
-
const styles = useStyles2(getStyles$
|
|
10
|
+
const styles = useStyles2(getStyles$m);
|
|
11
11
|
const labelElement = /* @__PURE__ */ React.createElement("div", { className: styles.labelWrapper }, /* @__PURE__ */ React.createElement("label", { className: styles.label }, "Preview"), /* @__PURE__ */ React.createElement(IconButton, { tooltip: "Copy to clipboard", onClick: () => copyToClipboard(rawSql), name: "copy" }));
|
|
12
12
|
return /* @__PURE__ */ React.createElement(Field, { label: labelElement, className: styles.grow }, /* @__PURE__ */ React.createElement(
|
|
13
13
|
CodeEditor,
|
|
@@ -21,7 +21,7 @@ function Preview({ rawSql, language = "sql" }) {
|
|
|
21
21
|
}
|
|
22
22
|
));
|
|
23
23
|
}
|
|
24
|
-
function getStyles$
|
|
24
|
+
function getStyles$m(theme) {
|
|
25
25
|
return {
|
|
26
26
|
grow: css({ flexGrow: 1 }),
|
|
27
27
|
label: css({ fontSize: 12, fontWeight: theme.typography.fontWeightMedium }),
|
|
@@ -12,7 +12,7 @@ import { EditorStack } from '../EditorStack.js';
|
|
|
12
12
|
const asteriskValue = { label: "*", value: "*" };
|
|
13
13
|
function SelectRow({ sql, columns, onSqlChange, functions }) {
|
|
14
14
|
var _a;
|
|
15
|
-
const styles = useStyles2(getStyles$
|
|
15
|
+
const styles = useStyles2(getStyles$l);
|
|
16
16
|
const columnsWithAsterisk = [asteriskValue, ...columns || []];
|
|
17
17
|
const onColumnChange = useCallback(
|
|
18
18
|
(item, index) => (column) => {
|
|
@@ -108,7 +108,7 @@ function SelectRow({ sql, columns, onSqlChange, functions }) {
|
|
|
108
108
|
}
|
|
109
109
|
));
|
|
110
110
|
}
|
|
111
|
-
const getStyles$
|
|
111
|
+
const getStyles$l = () => {
|
|
112
112
|
return { addButton: css({ alignSelf: "flex-start" }) };
|
|
113
113
|
};
|
|
114
114
|
function getColumnValue({ parameters }) {
|
|
@@ -5,20 +5,20 @@ import { DataSourceWithBackend, getTemplateSrv, getBackendSrv, toDataQueryRespon
|
|
|
5
5
|
import { MACRO_NAMES } from './constants.js';
|
|
6
6
|
import { QueryFormat } from '../components/QueryEditor/types.js';
|
|
7
7
|
|
|
8
|
-
var __defProp$
|
|
9
|
-
var __defNormalProp$
|
|
10
|
-
var __publicField$
|
|
8
|
+
var __defProp$3 = Object.defineProperty;
|
|
9
|
+
var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
10
|
+
var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
11
11
|
class SqlDatasource extends DataSourceWithBackend {
|
|
12
12
|
constructor(instanceSettings, templateSrv = getTemplateSrv()) {
|
|
13
13
|
super(instanceSettings);
|
|
14
14
|
this.templateSrv = templateSrv;
|
|
15
|
-
__publicField$
|
|
16
|
-
__publicField$
|
|
17
|
-
__publicField$
|
|
18
|
-
__publicField$
|
|
19
|
-
__publicField$
|
|
20
|
-
__publicField$
|
|
21
|
-
__publicField$
|
|
15
|
+
__publicField$3(this, "id");
|
|
16
|
+
__publicField$3(this, "name");
|
|
17
|
+
__publicField$3(this, "interval");
|
|
18
|
+
__publicField$3(this, "db");
|
|
19
|
+
__publicField$3(this, "dataset");
|
|
20
|
+
__publicField$3(this, "annotations", {});
|
|
21
|
+
__publicField$3(this, "interpolateVariable", (value, variable) => {
|
|
22
22
|
if (typeof value === "string") {
|
|
23
23
|
if (variable.multi || variable.includeAll) {
|
|
24
24
|
const result = this.getQueryModel().quoteLiteral(value);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { parse } from '@marcbachmann/cel-js';
|
|
2
|
+
|
|
3
|
+
const exprCache = /* @__PURE__ */ new Map();
|
|
4
|
+
function getCompiled(expr) {
|
|
5
|
+
if (exprCache.has(expr)) {
|
|
6
|
+
return exprCache.get(expr);
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
const compiled = parse(expr);
|
|
10
|
+
exprCache.set(expr, compiled);
|
|
11
|
+
return compiled;
|
|
12
|
+
} catch (e) {
|
|
13
|
+
exprCache.set(expr, null);
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function evaluateCelExpression(expr, context, defaultValue = false) {
|
|
18
|
+
if (!expr || !expr.trim()) {
|
|
19
|
+
return defaultValue;
|
|
20
|
+
}
|
|
21
|
+
const compiled = getCompiled(expr);
|
|
22
|
+
if (!compiled) {
|
|
23
|
+
return defaultValue;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const result = compiled(context);
|
|
27
|
+
return !!result;
|
|
28
|
+
} catch (e) {
|
|
29
|
+
return defaultValue;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function extractFieldRefs(expr) {
|
|
33
|
+
const matches = expr.matchAll(/([\w.]+)\s*(?:==|!=)/g);
|
|
34
|
+
const refs = /* @__PURE__ */ new Set();
|
|
35
|
+
for (const m of matches) {
|
|
36
|
+
refs.add(m[1]);
|
|
37
|
+
}
|
|
38
|
+
return [...refs];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { evaluateCelExpression, extractFieldRefs };
|
|
42
|
+
//# sourceMappingURL=cel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cel.js","sources":["../../../../src/datasource/schema/cel.ts"],"sourcesContent":["/**\n * CEL (Common Expression Language) expression evaluator for schema conditions.\n *\n * Used by `dependsOn`, `requiredWhen`, `disabledWhen`, and `overrides[].when`.\n * Wraps @marcbachmann/cel-js with field-ID-aware context building.\n *\n * Go equivalent: github.com/google/cel-go\n */\n\nimport { evaluate as celEvaluate, parse as celParse } from '@marcbachmann/cel-js';\n\n// ============================================================\n// Expression cache — parse once, evaluate many times\n// ============================================================\n\ntype CompiledExpr = (ctx: Record<string, unknown>) => unknown;\nconst exprCache = new Map<string, CompiledExpr | null>();\n\nfunction getCompiled(expr: string): CompiledExpr | null {\n if (exprCache.has(expr)) {\n return exprCache.get(expr)!;\n }\n try {\n const compiled = celParse(expr);\n exprCache.set(expr, compiled);\n return compiled;\n } catch {\n exprCache.set(expr, null);\n return null;\n }\n}\n\n// ============================================================\n// Context builder — flat field values → nested object for CEL\n// ============================================================\n\n/**\n * Build a nested context object from flat form values keyed by field IDs.\n *\n * CEL interprets dots as property access, so `jsonData.auth_method == 'oauth2'`\n * requires `{ jsonData: { auth_method: 'oauth2' } }`.\n *\n * This function takes flat key-value pairs (from react-hook-form `watch()`)\n * and builds the nested structure CEL expects.\n *\n * @param values - Flat map of form keys to values (e.g. `{ \"auth_method\": \"oauth2\", \"oauth2.oauth2_type\": \"jwt\" }`)\n * @param fieldIdToFormKey - Optional map from field ID to form key for translation\n */\nexport function buildCelContext(values: Record<string, unknown>): Record<string, unknown> {\n const ctx: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(values)) {\n setNestedValue(ctx, key, value);\n }\n\n return ctx;\n}\n\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let current = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = value;\n}\n\n// ============================================================\n// Public API\n// ============================================================\n\n/**\n * Evaluate a CEL expression against a context of field values.\n * Returns the boolean result, or `defaultValue` if the expression is invalid.\n *\n * @example\n * ```ts\n * evaluateCelExpression(\"jsonData.auth_method == 'oauth2'\", { jsonData: { auth_method: 'oauth2' } })\n * // => true\n *\n * evaluateCelExpression(\"auth_method == 'oauth2' && oauth2_type == 'jwt'\", { auth_method: 'oauth2', oauth2_type: 'jwt' })\n * // => true\n * ```\n */\nexport function evaluateCelExpression(expr: string, context: Record<string, unknown>, defaultValue = false): boolean {\n if (!expr || !expr.trim()) {\n return defaultValue;\n }\n\n const compiled = getCompiled(expr);\n if (!compiled) {\n return defaultValue;\n }\n\n try {\n const result = compiled(context);\n return !!result;\n } catch {\n return defaultValue;\n }\n}\n\n/**\n * Evaluate a CEL expression directly using `evaluate` (no caching).\n * Useful for one-off evaluations or testing.\n */\nexport function evaluateCelDirect(expr: string, context: Record<string, unknown>): unknown {\n return celEvaluate(expr, context);\n}\n\n/**\n * Validate that a CEL expression can be parsed without errors.\n * Returns true if valid, false otherwise.\n */\nexport function isValidCelExpression(expr: string): boolean {\n try {\n celParse(expr);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Extract all field ID references from a simple expression.\n * Used by `resolveRequiredFieldsGroup` to find dependency relationships.\n *\n * For simple expressions like `fieldA == 'x'`, returns `['fieldA']`.\n * For compound expressions like `fieldA == 'x' && fieldB == 'y'`, returns `['fieldA', 'fieldB']`.\n *\n * This uses regex extraction (not AST walking) for simplicity and speed.\n */\nexport function extractFieldRefs(expr: string): string[] {\n // Match identifiers (possibly dotted) that precede == or !=\n const matches = expr.matchAll(/([\\w.]+)\\s*(?:==|!=)/g);\n const refs = new Set<string>();\n for (const m of matches) {\n refs.add(m[1]);\n }\n return [...refs];\n}\n\n/**\n * Clear the expression cache. Useful for testing.\n */\nexport function clearExpressionCache(): void {\n exprCache.clear();\n}\n"],"names":["celParse"],"mappings":";;AAgBA,MAAM,SAAA,uBAAgB,GAAA,EAAiC;AAEvD,SAAS,YAAY,IAAA,EAAmC;AACtD,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,SAAA,CAAU,IAAI,IAAI,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAWA,MAAS,IAAI,CAAA;AAC9B,IAAA,SAAA,CAAU,GAAA,CAAI,MAAM,QAAQ,CAAA;AAC5B,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,CAAA,OAAQ,CAAA,EAAA;AACN,IAAA,SAAA,CAAU,GAAA,CAAI,MAAM,IAAI,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AA0DO,SAAS,qBAAA,CAAsB,IAAA,EAAc,OAAA,EAAkC,YAAA,GAAe,KAAA,EAAgB;AACnH,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,MAAK,EAAG;AACzB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,SAAS,OAAO,CAAA;AAC/B,IAAA,OAAO,CAAC,CAAC,MAAA;AAAA,EACX,CAAA,CAAA,OAAQ,CAAA,EAAA;AACN,IAAA,OAAO,YAAA;AAAA,EACT;AACF;AAgCO,SAAS,iBAAiB,IAAA,EAAwB;AAEvD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,uBAAuB,CAAA;AACrD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EACf;AACA,EAAA,OAAO,CAAC,GAAG,IAAI,CAAA;AACjB;;;;"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { extractFieldRefs } from './cel.js';
|
|
2
|
+
|
|
1
3
|
function resolveGroups(schema) {
|
|
2
4
|
const fieldMap = /* @__PURE__ */ new Map();
|
|
3
5
|
for (const f of schema.fields) {
|
|
@@ -21,18 +23,18 @@ function resolveGroups(schema) {
|
|
|
21
23
|
];
|
|
22
24
|
}
|
|
23
25
|
function resolveRequiredFieldsGroup(schema) {
|
|
24
|
-
var _a;
|
|
26
|
+
var _a, _b;
|
|
25
27
|
const fieldMap = /* @__PURE__ */ new Map();
|
|
26
28
|
for (const f of schema.fields) {
|
|
27
29
|
fieldMap.set(f.id, f);
|
|
28
30
|
}
|
|
29
31
|
const requiredIds = /* @__PURE__ */ new Set();
|
|
30
32
|
for (const f of schema.fields) {
|
|
31
|
-
if (f.required) {
|
|
33
|
+
if (f.required || ((_a = f.tags) == null ? void 0 : _a.includes("pinned"))) {
|
|
32
34
|
requiredIds.add(f.id);
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
|
-
const authGroup = (
|
|
37
|
+
const authGroup = (_b = schema.groups) == null ? void 0 : _b.find((g) => g.id === "auth");
|
|
36
38
|
if (authGroup) {
|
|
37
39
|
for (const ref of authGroup.fieldRefs) {
|
|
38
40
|
if (fieldMap.has(ref)) {
|
|
@@ -48,16 +50,17 @@ function resolveRequiredFieldsGroup(schema) {
|
|
|
48
50
|
includeIds.add(id);
|
|
49
51
|
const f = fieldMap.get(id);
|
|
50
52
|
if (f == null ? void 0 : f.dependsOn) {
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
53
|
+
for (const ref of extractFieldRefs(f.dependsOn)) {
|
|
54
|
+
if (fieldMap.has(ref)) {
|
|
55
|
+
includeIds.add(ref);
|
|
56
|
+
}
|
|
54
57
|
}
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
60
|
for (const f of schema.fields) {
|
|
58
61
|
if (f.dependsOn && !includeIds.has(f.id)) {
|
|
59
|
-
const
|
|
60
|
-
if (
|
|
62
|
+
const refs = extractFieldRefs(f.dependsOn);
|
|
63
|
+
if (refs.some((ref) => requiredIds.has(ref))) {
|
|
61
64
|
includeIds.add(f.id);
|
|
62
65
|
}
|
|
63
66
|
}
|
|
@@ -69,7 +72,7 @@ function resolveRequiredFieldsGroup(schema) {
|
|
|
69
72
|
return {
|
|
70
73
|
group: {
|
|
71
74
|
id: "_required",
|
|
72
|
-
title: "
|
|
75
|
+
title: "General",
|
|
73
76
|
fieldRefs: virtualFields.map((f) => f.id)
|
|
74
77
|
},
|
|
75
78
|
fields: virtualFields
|
|
@@ -78,16 +81,36 @@ function resolveRequiredFieldsGroup(schema) {
|
|
|
78
81
|
function formKey(field) {
|
|
79
82
|
return field.section ? `${field.section}.${field.key}` : field.key;
|
|
80
83
|
}
|
|
84
|
+
function getWatchedValue(watchedValues, key) {
|
|
85
|
+
if (key.includes(".")) {
|
|
86
|
+
const parts = key.split(".");
|
|
87
|
+
let current = watchedValues;
|
|
88
|
+
for (const part of parts) {
|
|
89
|
+
if (current == null || typeof current !== "object") {
|
|
90
|
+
return watchedValues[key];
|
|
91
|
+
}
|
|
92
|
+
current = current[part];
|
|
93
|
+
}
|
|
94
|
+
if (current !== void 0) {
|
|
95
|
+
return current;
|
|
96
|
+
}
|
|
97
|
+
return watchedValues[key];
|
|
98
|
+
}
|
|
99
|
+
return watchedValues[key];
|
|
100
|
+
}
|
|
81
101
|
function parseDependsOn(expr) {
|
|
82
102
|
var _a, _b;
|
|
83
|
-
const m = expr.match(/^(
|
|
103
|
+
const m = expr.match(/^([\w.]+)\s*(==|!=)\s*(?:'([^']*)'|"([^"]*)"|(\S+))$/);
|
|
84
104
|
if (!m) {
|
|
85
105
|
return null;
|
|
86
106
|
}
|
|
87
|
-
return { field: m[1]
|
|
107
|
+
return { field: m[1], value: ((_b = (_a = m[3]) != null ? _a : m[4]) != null ? _b : m[5]).trim(), negate: m[2] === "!=" };
|
|
108
|
+
}
|
|
109
|
+
function evaluateDependsOn(parsed, currentValue) {
|
|
110
|
+
const matches = String(currentValue != null ? currentValue : "") === parsed.value;
|
|
111
|
+
return parsed.negate ? !matches : matches;
|
|
88
112
|
}
|
|
89
113
|
function resolveActiveOverride(field, watchedValues, fieldById) {
|
|
90
|
-
var _a;
|
|
91
114
|
if (!field.overrides || field.overrides.length === 0) {
|
|
92
115
|
return void 0;
|
|
93
116
|
}
|
|
@@ -98,7 +121,7 @@ function resolveActiveOverride(field, watchedValues, fieldById) {
|
|
|
98
121
|
}
|
|
99
122
|
const depField = fieldById.get(parsed.field);
|
|
100
123
|
const depKey = depField ? formKey(depField) : parsed.field;
|
|
101
|
-
if (
|
|
124
|
+
if (evaluateDependsOn(parsed, getWatchedValue(watchedValues, depKey))) {
|
|
102
125
|
return ov;
|
|
103
126
|
}
|
|
104
127
|
}
|
|
@@ -231,5 +254,5 @@ function computeVirtualFieldValues(schema, existingValues) {
|
|
|
231
254
|
return virtualValues;
|
|
232
255
|
}
|
|
233
256
|
|
|
234
|
-
export { computeVirtualFieldValues, evaluateComputedRead, formKey, parseDependsOn, resolveActiveOverride, resolveGroups, resolveRequiredFieldsGroup };
|
|
257
|
+
export { computeVirtualFieldValues, evaluateComputedRead, evaluateDependsOn, formKey, getWatchedValue, parseDependsOn, resolveActiveOverride, resolveGroups, resolveRequiredFieldsGroup };
|
|
235
258
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../../../src/datasource/schema/config.ts"],"sourcesContent":["/**\n * Datasource configuration schema types and pure helper functions.\n *\n * These types describe the structure of datasource plugin configuration schemas\n * (dsconfig format). Schemas define fields, groups, validations, and relationships\n * that drive the DatasourceConfigWizard UI and provisioning YAML generation.\n */\n\nexport type DatasourceConfigSchema = {\n schemaVersion: string;\n pluginType: string;\n pluginName: string;\n docURL?: string;\n fields: ConfigField[];\n groups?: ConfigGroup[];\n relationships?: FieldRelationship[];\n};\n\nexport type ConfigField = {\n id: string;\n key: string;\n label?: string;\n description?: string;\n docURL?: string;\n valueType: ValueType;\n semanticType?: SemanticType;\n target?: TargetLocation;\n section?: string;\n kind?: FieldKind;\n isItemField?: boolean;\n lifecycle?: Lifecycle;\n ui?: FieldUI;\n validations?: FieldValidationRule[];\n dependsOn?: string;\n required?: boolean;\n requiredWhen?: string;\n disabledWhen?: string;\n overrides?: FieldOverride[];\n effects?: FieldEffect[];\n item?: FieldItemSchema;\n storage?: StorageMapping;\n tags?: string[];\n examples?: unknown[];\n defaultValue?: unknown;\n};\n\nexport type FieldItemSchema = {\n valueType: ValueType;\n fields?: ConfigField[];\n};\n\nexport type ValueType = 'string' | 'number' | 'boolean' | 'array' | 'object' | 'map' | 'any';\nexport type SemanticType = 'url' | 'password' | 'token' | 'hostname' | 'duration' | 'datasourceUid' | 'query';\nexport type FieldKind = 'storage' | 'virtual';\nexport type Lifecycle = 'stable' | 'deprecated' | 'experimental';\nexport type TargetLocation = 'root' | 'jsonData' | 'secureJsonData';\n\nexport type UIComponent =\n | 'input'\n | 'textarea'\n | 'select'\n | 'multiselect'\n | 'radio'\n | 'checkbox'\n | 'switch'\n | 'code'\n | 'keyvalue'\n | 'list';\n\nexport type FieldUI = {\n component: UIComponent;\n multiline?: boolean;\n rows?: number;\n options?: FieldOption[];\n allowCustom?: boolean;\n width?: 'full' | 'half';\n placeholder?: string;\n language?: string;\n};\n\nexport type FieldOption = {\n label: string;\n value: unknown;\n description?: string;\n};\n\nexport type FieldValidationRule =\n | PatternValidation\n | RangeValidation\n | LengthValidation\n | ItemCountValidation\n | AllowedValuesValidation\n | CustomValidation;\n\ntype BaseValidation = {\n id?: string;\n message?: string;\n};\nexport type PatternValidation = BaseValidation & {\n type: 'pattern';\n pattern: string;\n};\nexport type RangeValidation = BaseValidation & {\n type: 'range';\n min?: number;\n max?: number;\n};\nexport type LengthValidation = BaseValidation & {\n type: 'length';\n min?: number;\n max?: number;\n};\nexport type ItemCountValidation = BaseValidation & {\n type: 'itemCount';\n min?: number;\n max?: number;\n};\nexport type AllowedValuesValidation = BaseValidation & {\n type: 'allowedValues';\n values: unknown[];\n};\nexport type CustomValidation = BaseValidation & {\n type: 'custom';\n expression: string;\n};\n\nexport type FieldOverride = {\n when: string;\n defaultValue?: unknown;\n readOnly?: boolean;\n description?: string;\n placeholder?: string;\n tooltip?: string;\n validations?: FieldValidationRule[];\n options?: FieldOption[];\n};\n\nexport type FieldEffect = {\n when: string;\n set: Record<string, unknown>;\n};\n\nexport type StorageMapping = DirectMapping | IndexedPairMapping | ComputedMapping;\ntype DirectMapping = {\n type: 'direct';\n};\ntype IndexedPairMapping = {\n type: 'indexedPair';\n key: MappingField;\n value: MappingField;\n startIndex?: number;\n};\ntype ComputedMapping = {\n type: 'computed';\n read?: string;\n write?: string;\n};\ntype MappingField = {\n target: TargetLocation;\n pattern: string;\n};\n\nexport type ConfigGroup = {\n id: string;\n title: string;\n description?: string;\n order?: number;\n optional?: boolean;\n fieldRefs: string[];\n};\n\nexport type FieldRelationship = {\n type: 'pair' | 'group' | 'datasourceReference';\n fields: string[];\n description?: string;\n targetPluginType?: string;\n};\n\n/**\n * Resolve a schema's groups into arrays of ConfigField objects.\n * If the schema has no groups, returns a single group containing all non-virtual fields.\n */\nexport function resolveGroups(schema: DatasourceConfigSchema): Array<{ group: ConfigGroup; fields: ConfigField[] }> {\n const fieldMap = new Map<string, ConfigField>();\n for (const f of schema.fields) {\n fieldMap.set(f.id, f);\n }\n\n if (schema.groups && schema.groups.length > 0) {\n return schema.groups\n .slice()\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n .map((g) => ({\n group: g,\n fields: g.fieldRefs.map((ref) => fieldMap.get(ref)).filter((f): f is ConfigField => f != null),\n }));\n }\n\n // No groups: single step with all storage fields\n const allFields = schema.fields.filter((f) => f.kind !== 'virtual' && !f.isItemField);\n return [\n {\n group: { id: 'default', title: 'Configuration', fieldRefs: allFields.map((f) => f.id) },\n fields: allFields,\n },\n ];\n}\n\n/**\n * Build a virtual \"Required\" group containing all required fields, any parent\n * fields they depend on (via `dependsOn`), and any child fields that depend on\n * required fields. When the schema contains an \"auth\" group, its fields are\n * also pulled in (auth is effectively required for Prometheus/Loki/Tempo style\n * datasources). Fields are returned in schema order and de-duplicated.\n * Returns `null` when the virtual group would be empty.\n */\nexport function resolveRequiredFieldsGroup(\n schema: DatasourceConfigSchema\n): { group: ConfigGroup; fields: ConfigField[] } | null {\n const fieldMap = new Map<string, ConfigField>();\n for (const f of schema.fields) {\n fieldMap.set(f.id, f);\n }\n\n const requiredIds = new Set<string>();\n for (const f of schema.fields) {\n if (f.required) {\n requiredIds.add(f.id);\n }\n }\n\n // Include all fields from the \"auth\" group as effectively required\n const authGroup = schema.groups?.find((g) => g.id === 'auth');\n if (authGroup) {\n for (const ref of authGroup.fieldRefs) {\n if (fieldMap.has(ref)) {\n requiredIds.add(ref);\n }\n }\n }\n\n if (requiredIds.size === 0) {\n return null;\n }\n\n const includeIds = new Set<string>();\n\n // Required fields + parent fields they depend on\n for (const id of requiredIds) {\n includeIds.add(id);\n const f = fieldMap.get(id);\n if (f?.dependsOn) {\n const parsed = parseDependsOn(f.dependsOn);\n if (parsed && fieldMap.has(parsed.field)) {\n includeIds.add(parsed.field);\n }\n }\n }\n\n // Child fields that depend on any required field\n for (const f of schema.fields) {\n if (f.dependsOn && !includeIds.has(f.id)) {\n const parsed = parseDependsOn(f.dependsOn);\n if (parsed && requiredIds.has(parsed.field)) {\n includeIds.add(f.id);\n }\n }\n }\n\n const virtualFields = schema.fields.filter((f) => includeIds.has(f.id));\n if (virtualFields.length === 0) {\n return null;\n }\n\n return {\n group: {\n id: '_required',\n title: 'Required',\n fieldRefs: virtualFields.map((f) => f.id),\n },\n fields: virtualFields,\n };\n}\n\n/**\n * Unique form key for a field. Section-scoped fields (e.g. section:\"logs\", key:\"defaultTable\")\n * get a prefixed key (\"logs.defaultTable\") so they don't collide with top-level fields that\n * share the same key name.\n */\nexport function formKey(field: ConfigField): string {\n return field.section ? `${field.section}.${field.key}` : field.key;\n}\n\n/**\n * Parse a simple CEL-like dependsOn expression: \"fieldId == 'value'\" or \"fieldId == true\".\n * Returns { field, value } or null if unparseable.\n */\nexport function parseDependsOn(expr: string): { field: string; value: string } | null {\n const m = expr.match(/^(.+?)\\s*==\\s*(?:'([^']*)'|\"([^\"]*)\"|(.+))$/);\n if (!m) {\n return null;\n }\n return { field: m[1].trim(), value: (m[2] ?? m[3] ?? m[4]).trim() };\n}\n\n/**\n * Resolve the first matching override for a field given current form values.\n * Override `when` uses the same \"fieldId == 'value'\" syntax as dependsOn.\n * Returns the matching override or undefined if none match.\n */\nexport function resolveActiveOverride(\n field: ConfigField,\n watchedValues: Record<string, unknown>,\n fieldById: Map<string, ConfigField>\n): FieldOverride | undefined {\n if (!field.overrides || field.overrides.length === 0) {\n return undefined;\n }\n for (const ov of field.overrides) {\n const parsed = parseDependsOn(ov.when);\n if (!parsed) {\n continue;\n }\n const depField = fieldById.get(parsed.field);\n const depKey = depField ? formKey(depField) : parsed.field;\n if (String(watchedValues[depKey] ?? '') === parsed.value) {\n return ov;\n }\n }\n return undefined;\n}\n\n/**\n * Resolve a field reference like \"root.basicAuth\" or \"jsonData.oauthPassThru\"\n * to its current value from a flat form values map, using the schema's field definitions.\n */\nfunction resolveFieldValue(ref: string, values: Record<string, unknown>, fields: ConfigField[]): unknown {\n // Try direct match on formKey first\n if (ref in values) {\n return values[ref];\n }\n // Try matching by field ID → formKey\n const field = fields.find((f) => f.id === ref);\n if (field) {\n const fk = formKey(field);\n if (fk in values) {\n return values[fk];\n }\n }\n return undefined;\n}\n\n/**\n * Evaluate a simple computed.read expression against form values.\n * Supports patterns used in dsconfig schemas:\n * - \"fieldRef == true ? 'a' : (fieldRef == true ? 'b' : 'c')\"\n * - Simple ternary chains with equality checks\n * Falls back to the field's defaultValue if the expression can't be evaluated.\n */\nexport function evaluateComputedRead(expr: string, values: Record<string, unknown>, fields: ConfigField[]): unknown {\n // Recursively evaluate ternary: condition ? trueVal : falseVal\n function evalExpr(s: string): unknown {\n s = s.trim();\n\n // Strip outer parens\n if (s.startsWith('(') && findMatchingParen(s, 0) === s.length - 1) {\n s = s.slice(1, -1).trim();\n }\n\n // Ternary: find top-level \"?\"\n const qIdx = findTopLevel(s, '?');\n if (qIdx !== -1) {\n const condition = s.slice(0, qIdx).trim();\n const rest = s.slice(qIdx + 1);\n const cIdx = findTopLevel(rest, ':');\n if (cIdx !== -1) {\n const trueExpr = rest.slice(0, cIdx).trim();\n const falseExpr = rest.slice(cIdx + 1).trim();\n return evalCondition(condition) ? evalExpr(trueExpr) : evalExpr(falseExpr);\n }\n }\n\n // String literal\n const strMatch = s.match(/^'([^']*)'$/) ?? s.match(/^\"([^\"]*)\"$/);\n if (strMatch) {\n return strMatch[1];\n }\n // Boolean/number literals\n if (s === 'true') {\n return true;\n }\n if (s === 'false') {\n return false;\n }\n if (/^-?\\d+(\\.\\d+)?$/.test(s)) {\n return Number(s);\n }\n\n // Field reference\n return resolveFieldValue(s, values, fields);\n }\n\n function evalCondition(cond: string): boolean {\n // \"ref == value\" or \"ref != value\"\n const eqMatch = cond.match(/^(.+?)\\s*(==|!=)\\s*(.+)$/);\n if (eqMatch) {\n const left = evalExpr(eqMatch[1]);\n const right = evalExpr(eqMatch[3]);\n const eq = String(left) === String(right);\n return eqMatch[2] === '==' ? eq : !eq;\n }\n // Truthy check\n return !!evalExpr(cond);\n }\n\n function findMatchingParen(s: string, start: number): number {\n let depth = 0;\n for (let i = start; i < s.length; i++) {\n if (s[i] === '(') {\n depth++;\n } else if (s[i] === ')') {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n return -1;\n }\n\n function findTopLevel(s: string, char: string): number {\n let depth = 0;\n let inStr: string | null = null;\n for (let i = 0; i < s.length; i++) {\n const c = s[i];\n if (inStr) {\n if (c === inStr) {\n inStr = null;\n }\n continue;\n }\n if (c === \"'\" || c === '\"') {\n inStr = c;\n continue;\n }\n if (c === '(') {\n depth++;\n continue;\n }\n if (c === ')') {\n depth--;\n continue;\n }\n if (depth === 0 && c === char) {\n return i;\n }\n }\n return -1;\n }\n\n try {\n return evalExpr(expr);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Compute initial values for all virtual fields that have storage.computed.read expressions.\n * Call after loading existing storage field values.\n */\nexport function computeVirtualFieldValues(\n schema: DatasourceConfigSchema,\n existingValues: Record<string, unknown>\n): Record<string, unknown> {\n const virtualValues: Record<string, unknown> = {};\n for (const field of schema.fields) {\n if (field.kind !== 'virtual') {\n continue;\n }\n const fk = formKey(field);\n if (field.storage?.type === 'computed' && field.storage.read) {\n const val = evaluateComputedRead(field.storage.read, existingValues, schema.fields);\n if (val !== undefined) {\n virtualValues[fk] = val;\n } else if (field.defaultValue !== undefined) {\n virtualValues[fk] = field.defaultValue;\n }\n } else if (field.defaultValue !== undefined) {\n virtualValues[fk] = field.defaultValue;\n }\n }\n return virtualValues;\n}\n"],"names":[],"mappings":"AAsLO,SAAS,cAAc,MAAA,EAAsF;AAClH,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAC9C,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,MAAA,EAAQ;AAC7B,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,EACtB;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7C,IAAA,OAAO,OAAO,MAAA,CACX,KAAA,GACA,IAAA,CAAK,CAAC,GAAG,CAAA,KAAG;AA/LnB,MAAA,IAAA,EAAA,EAAA,EAAA;AA+LuB,MAAA,OAAA,CAAA,CAAA,EAAA,GAAA,CAAA,CAAE,KAAA,KAAF,IAAA,GAAA,EAAA,GAAW,CAAA,KAAA,CAAM,EAAA,GAAA,CAAA,CAAE,UAAF,IAAA,GAAA,EAAA,GAAW,CAAA,CAAA;AAAA,IAAA,CAAE,CAAA,CAC9C,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA,CAAE,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,KAAQ,QAAA,CAAS,GAAA,CAAI,GAAG,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAwB,KAAK,IAAI;AAAA,KAC/F,CAAE,CAAA;AAAA,EACN;AAGA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,CAAC,CAAA,CAAE,WAAW,CAAA;AACpF,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,eAAA,EAAiB,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,EAAE;AAAA,MACtF,MAAA,EAAQ;AAAA;AACV,GACF;AACF;AAUO,SAAS,2BACd,MAAA,EACsD;AA1NxD,EAAA,IAAA,EAAA;AA2NE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAC9C,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,MAAA,EAAQ;AAC7B,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,EACtB;AAEA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,MAAA,EAAQ;AAC7B,IAAA,IAAI,EAAE,QAAA,EAAU;AACd,MAAA,WAAA,CAAY,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,IACtB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAA,CAAY,YAAO,MAAA,KAAP,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,KAAK,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,MAAA,CAAA;AACtD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,KAAA,MAAW,GAAA,IAAO,UAAU,SAAA,EAAW;AACrC,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,QAAA,WAAA,CAAY,IAAI,GAAG,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AAGnC,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,UAAA,CAAW,IAAI,EAAE,CAAA;AACjB,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACzB,IAAA,IAAI,uBAAG,SAAA,EAAW;AAChB,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAA,CAAE,SAAS,CAAA;AACzC,MAAA,IAAI,MAAA,IAAU,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EAAG;AACxC,QAAA,UAAA,CAAW,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,MAAA,EAAQ;AAC7B,IAAA,IAAI,EAAE,SAAA,IAAa,CAAC,WAAW,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACxC,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAA,CAAE,SAAS,CAAA;AACzC,MAAA,IAAI,MAAA,IAAU,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EAAG;AAC3C,QAAA,UAAA,CAAW,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,CAAC,MAAM,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AACtE,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,EAAA,EAAI,WAAA;AAAA,MACJ,KAAA,EAAO,UAAA;AAAA,MACP,WAAW,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE;AAAA,KAC1C;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;AAOO,SAAS,QAAQ,KAAA,EAA4B;AAClD,EAAA,OAAO,KAAA,CAAM,UAAU,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,GAAG,CAAA,CAAA,GAAK,KAAA,CAAM,GAAA;AACjE;AAMO,SAAS,eAAe,IAAA,EAAuD;AAzStF,EAAA,IAAA,EAAA,EAAA,EAAA;AA0SE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,6CAA6C,CAAA;AAClE,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,OAAO,CAAA,CAAE,CAAC,EAAE,IAAA,EAAK,EAAG,SAAQ,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,CAAE,CAAC,MAAH,IAAA,GAAA,EAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,KAAX,IAAA,GAAA,EAAA,GAAgB,EAAE,CAAC,CAAA,EAAG,MAAK,EAAE;AACpE;AAOO,SAAS,qBAAA,CACd,KAAA,EACA,aAAA,EACA,SAAA,EAC2B;AA1T7B,EAAA,IAAA,EAAA;AA2TE,EAAA,IAAI,CAAC,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAA,CAAU,WAAW,CAAA,EAAG;AACpD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,SAAA,EAAW;AAChC,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,EAAA,CAAG,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,QAAA,GAAW,OAAA,CAAQ,QAAQ,IAAI,MAAA,CAAO,KAAA;AACrD,IAAA,IAAI,MAAA,CAAA,CAAO,mBAAc,MAAM,CAAA,KAApB,YAAyB,EAAE,CAAA,KAAM,OAAO,KAAA,EAAO;AACxD,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,iBAAA,CAAkB,GAAA,EAAa,MAAA,EAAiC,MAAA,EAAgC;AAEvG,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,GAAG,CAAA;AAC7C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,EAAA,GAAK,QAAQ,KAAK,CAAA;AACxB,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,OAAO,OAAO,EAAE,CAAA;AAAA,IAClB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,oBAAA,CAAqB,IAAA,EAAc,MAAA,EAAiC,MAAA,EAAgC;AAElH,EAAA,SAAS,SAAS,CAAA,EAAoB;AAzWxC,IAAA,IAAA,EAAA;AA0WI,IAAA,CAAA,GAAI,EAAE,IAAA,EAAK;AAGX,IAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,iBAAA,CAAkB,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AACjE,MAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAAA,IAC1B;AAGA,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAA,EAAG,GAAG,CAAA;AAChC,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,MAAM,YAAY,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,IAAI,EAAE,IAAA,EAAK;AACxC,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AAC7B,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,GAAG,CAAA;AACnC,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,EAAE,IAAA,EAAK;AAC1C,QAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAC,EAAE,IAAA,EAAK;AAC5C,QAAA,OAAO,cAAc,SAAS,CAAA,GAAI,SAAS,QAAQ,CAAA,GAAI,SAAS,SAAS,CAAA;AAAA,MAC3E;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAA,CAAW,OAAE,KAAA,CAAM,aAAa,MAArB,IAAA,GAAA,EAAA,GAA0B,CAAA,CAAE,MAAM,aAAa,CAAA;AAChE,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,SAAS,CAAC,CAAA;AAAA,IACnB;AAEA,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,CAAC,CAAA,EAAG;AAC7B,MAAA,OAAO,OAAO,CAAC,CAAA;AAAA,IACjB;AAGA,IAAA,OAAO,iBAAA,CAAkB,CAAA,EAAG,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC5C;AAEA,EAAA,SAAS,cAAc,IAAA,EAAuB;AAE5C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,0BAA0B,CAAA;AACrD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA;AAChC,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAI,CAAA,KAAM,OAAO,KAAK,CAAA;AACxC,MAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,IAAA,GAAO,KAAK,CAAC,EAAA;AAAA,IACrC;AAEA,IAAA,OAAO,CAAC,CAAC,QAAA,CAAS,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,SAAS,iBAAA,CAAkB,GAAW,KAAA,EAAuB;AAC3D,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,EAAK;AAChB,QAAA,KAAA,EAAA;AAAA,MACF,CAAA,MAAA,IAAW,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,EAAK;AACvB,QAAA,KAAA,EAAA;AACA,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,OAAO,CAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,SAAS,YAAA,CAAa,GAAW,IAAA,EAAsB;AACrD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAI,MAAM,KAAA,EAAO;AACf,UAAA,KAAA,GAAQ,IAAA;AAAA,QACV;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAK;AAC1B,QAAA,KAAA,GAAQ,CAAA;AACR,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAM,GAAA,EAAK;AACb,QAAA,KAAA,EAAA;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAM,GAAA,EAAK;AACb,QAAA,KAAA,EAAA;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,KAAU,CAAA,IAAK,CAAA,KAAM,IAAA,EAAM;AAC7B,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,SAAS,IAAI,CAAA;AAAA,EACtB,CAAA,CAAA,OAAQ,CAAA,EAAA;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAMO,SAAS,yBAAA,CACd,QACA,cAAA,EACyB;AA1d3B,EAAA,IAAA,EAAA;AA2dE,EAAA,MAAM,gBAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,QAAQ,KAAK,CAAA;AACxB,IAAA,IAAA,CAAA,CAAI,WAAM,OAAA,KAAN,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,UAAS,UAAA,IAAc,KAAA,CAAM,QAAQ,IAAA,EAAM;AAC5D,MAAA,MAAM,MAAM,oBAAA,CAAqB,KAAA,CAAM,QAAQ,IAAA,EAAM,cAAA,EAAgB,OAAO,MAAM,CAAA;AAClF,MAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,QAAA,aAAA,CAAc,EAAE,CAAA,GAAI,GAAA;AAAA,MACtB,CAAA,MAAA,IAAW,KAAA,CAAM,YAAA,KAAiB,MAAA,EAAW;AAC3C,QAAA,aAAA,CAAc,EAAE,IAAI,KAAA,CAAM,YAAA;AAAA,MAC5B;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,YAAA,KAAiB,MAAA,EAAW;AAC3C,MAAA,aAAA,CAAc,EAAE,IAAI,KAAA,CAAM,YAAA;AAAA,IAC5B;AAAA,EACF;AACA,EAAA,OAAO,aAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../../src/datasource/schema/config.ts"],"sourcesContent":["/**\n * Pure helper functions for working with DatasourceConfigSchema.\n *\n * Types are defined in schema.ts — import them from there directly.\n */\n\nimport { extractFieldRefs } from './cel';\nimport type { DatasourceConfigSchema, ConfigField, ConfigGroup, FieldOverride } from './schema';\n\n/**\n * Resolve a schema's groups into arrays of ConfigField objects.\n * If the schema has no groups, returns a single group containing all non-virtual fields.\n */\nexport function resolveGroups(schema: DatasourceConfigSchema): Array<{ group: ConfigGroup; fields: ConfigField[] }> {\n const fieldMap = new Map<string, ConfigField>();\n for (const f of schema.fields) {\n fieldMap.set(f.id, f);\n }\n\n if (schema.groups && schema.groups.length > 0) {\n return schema.groups\n .slice()\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n .map((g) => ({\n group: g,\n fields: g.fieldRefs.map((ref) => fieldMap.get(ref)).filter((f): f is ConfigField => f != null),\n }));\n }\n\n // No groups: single step with all storage fields\n const allFields = schema.fields.filter((f) => f.kind !== 'virtual' && !f.isItemField);\n return [\n {\n group: { id: 'default', title: 'Configuration', fieldRefs: allFields.map((f) => f.id) },\n fields: allFields,\n },\n ];\n}\n\n/**\n * Build a virtual \"Required\" group containing all required fields, any parent\n * fields they depend on (via `dependsOn`), and any child fields that depend on\n * required fields. When the schema contains an \"auth\" group, its fields are\n * also pulled in (auth is effectively required for Prometheus/Loki/Tempo style\n * datasources). Fields are returned in schema order and de-duplicated.\n * Returns `null` when the virtual group would be empty.\n */\nexport function resolveRequiredFieldsGroup(\n schema: DatasourceConfigSchema\n): { group: ConfigGroup; fields: ConfigField[] } | null {\n const fieldMap = new Map<string, ConfigField>();\n for (const f of schema.fields) {\n fieldMap.set(f.id, f);\n }\n\n const requiredIds = new Set<string>();\n for (const f of schema.fields) {\n if (f.required || f.tags?.includes('pinned')) {\n requiredIds.add(f.id);\n }\n }\n\n // Include all fields from the \"auth\" group as effectively required\n const authGroup = schema.groups?.find((g) => g.id === 'auth');\n if (authGroup) {\n for (const ref of authGroup.fieldRefs) {\n if (fieldMap.has(ref)) {\n requiredIds.add(ref);\n }\n }\n }\n\n if (requiredIds.size === 0) {\n return null;\n }\n\n const includeIds = new Set<string>();\n\n // Required fields + parent fields they depend on\n for (const id of requiredIds) {\n includeIds.add(id);\n const f = fieldMap.get(id);\n if (f?.dependsOn) {\n for (const ref of extractFieldRefs(f.dependsOn)) {\n if (fieldMap.has(ref)) {\n includeIds.add(ref);\n }\n }\n }\n }\n\n // Child fields that depend on any required field\n for (const f of schema.fields) {\n if (f.dependsOn && !includeIds.has(f.id)) {\n const refs = extractFieldRefs(f.dependsOn);\n if (refs.some((ref) => requiredIds.has(ref))) {\n includeIds.add(f.id);\n }\n }\n }\n\n const virtualFields = schema.fields.filter((f) => includeIds.has(f.id));\n if (virtualFields.length === 0) {\n return null;\n }\n\n return {\n group: {\n id: '_required',\n title: 'General',\n fieldRefs: virtualFields.map((f) => f.id),\n },\n fields: virtualFields,\n };\n}\n\n/**\n * Unique form key for a field. Section-scoped fields (e.g. section:\"logs\", key:\"defaultTable\")\n * get a prefixed key (\"logs.defaultTable\") so they don't collide with top-level fields that\n * share the same key name.\n */\nexport function formKey(field: ConfigField): string {\n return field.section ? `${field.section}.${field.key}` : field.key;\n}\n\n/**\n * Resolve a possibly-dotted key against watchedValues from react-hook-form.\n * RHF's `watch()` returns nested objects for dotted Controller names\n * (e.g. \"logs.otelEnabled\" → { logs: { otelEnabled: true } }),\n * so a flat `obj[\"logs.otelEnabled\"]` lookup misses.\n *\n * For dotted keys we must try the nested path **first**: react-hook-form's\n * Controller `onChange` writes nested objects via its internal `set()`, but\n * `reset()` may have created a flat dotted key with the same name. After user\n * interaction the nested value is authoritative; the stale flat key must not\n * shadow it. This mirrors RHF's own `get()` semantics (nested-first, flat\n * fallback).\n */\nexport function getWatchedValue(watchedValues: Record<string, unknown>, key: string): unknown {\n // For dotted keys, prefer the nested path walk.\n if (key.includes('.')) {\n const parts = key.split('.');\n let current: unknown = watchedValues;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') {\n // Nested path doesn't exist — fall back to flat key\n return watchedValues[key];\n }\n current = (current as Record<string, unknown>)[part];\n }\n if (current !== undefined) {\n return current;\n }\n // Nested walk yielded undefined — try flat key as fallback\n return watchedValues[key];\n }\n // Non-dotted key: direct property access\n return watchedValues[key];\n}\n\n/**\n * Parse a simple CEL-like dependsOn expression: \"fieldId == 'value'\" or \"fieldId != 'value'\".\n * Only single comparisons are supported — no &&, ||, or parentheses.\n * Field IDs may contain dots and underscores (e.g. \"jsonData.oauth2.oauth2_type\").\n * Values may be single-quoted, double-quoted, or unquoted literals (true/false/numbers).\n * Returns { field, value, negate } or null if unparseable.\n */\nexport function parseDependsOn(expr: string): { field: string; value: string; negate: boolean } | null {\n // Match: fieldRef == 'value' | fieldRef == \"value\" | fieldRef == literal\n // Field ref: word chars and dots, no parens/operators.\n // Unquoted values: non-whitespace, no quotes, no logical operators.\n const m = expr.match(/^([\\w.]+)\\s*(==|!=)\\s*(?:'([^']*)'|\"([^\"]*)\"|(\\S+))$/);\n if (!m) {\n return null;\n }\n return { field: m[1], value: (m[3] ?? m[4] ?? m[5]).trim(), negate: m[2] === '!=' };\n}\n\n/**\n * Evaluate a parsed dependsOn condition against a value.\n * Handles both == and != operators.\n */\nexport function evaluateDependsOn(parsed: { value: string; negate: boolean }, currentValue: unknown): boolean {\n const matches = String(currentValue ?? '') === parsed.value;\n return parsed.negate ? !matches : matches;\n}\n\n/**\n * Resolve the first matching override for a field given current form values.\n * Override `when` uses the same \"fieldId == 'value'\" syntax as dependsOn.\n * Returns the matching override or undefined if none match.\n */\nexport function resolveActiveOverride(\n field: ConfigField,\n watchedValues: Record<string, unknown>,\n fieldById: Map<string, ConfigField>\n): FieldOverride | undefined {\n if (!field.overrides || field.overrides.length === 0) {\n return undefined;\n }\n for (const ov of field.overrides) {\n const parsed = parseDependsOn(ov.when);\n if (!parsed) {\n continue;\n }\n const depField = fieldById.get(parsed.field);\n const depKey = depField ? formKey(depField) : parsed.field;\n if (evaluateDependsOn(parsed, getWatchedValue(watchedValues, depKey))) {\n return ov;\n }\n }\n return undefined;\n}\n\n/**\n * Resolve a field reference like \"root.basicAuth\" or \"jsonData.oauthPassThru\"\n * to its current value from a flat form values map, using the schema's field definitions.\n */\nfunction resolveFieldValue(ref: string, values: Record<string, unknown>, fields: ConfigField[]): unknown {\n // Try direct match on formKey first\n if (ref in values) {\n return values[ref];\n }\n // Try matching by field ID → formKey\n const field = fields.find((f) => f.id === ref);\n if (field) {\n const fk = formKey(field);\n if (fk in values) {\n return values[fk];\n }\n }\n return undefined;\n}\n\n/**\n * Evaluate a simple computed.read expression against form values.\n * Supports patterns used in dsconfig schemas:\n * - \"fieldRef == true ? 'a' : (fieldRef == true ? 'b' : 'c')\"\n * - Simple ternary chains with equality checks\n * Falls back to the field's defaultValue if the expression can't be evaluated.\n */\nexport function evaluateComputedRead(expr: string, values: Record<string, unknown>, fields: ConfigField[]): unknown {\n // Recursively evaluate ternary: condition ? trueVal : falseVal\n function evalExpr(s: string): unknown {\n s = s.trim();\n\n // Strip outer parens\n if (s.startsWith('(') && findMatchingParen(s, 0) === s.length - 1) {\n s = s.slice(1, -1).trim();\n }\n\n // Ternary: find top-level \"?\"\n const qIdx = findTopLevel(s, '?');\n if (qIdx !== -1) {\n const condition = s.slice(0, qIdx).trim();\n const rest = s.slice(qIdx + 1);\n const cIdx = findTopLevel(rest, ':');\n if (cIdx !== -1) {\n const trueExpr = rest.slice(0, cIdx).trim();\n const falseExpr = rest.slice(cIdx + 1).trim();\n return evalCondition(condition) ? evalExpr(trueExpr) : evalExpr(falseExpr);\n }\n }\n\n // String literal\n const strMatch = s.match(/^'([^']*)'$/) ?? s.match(/^\"([^\"]*)\"$/);\n if (strMatch) {\n return strMatch[1];\n }\n // Boolean/number literals\n if (s === 'true') {\n return true;\n }\n if (s === 'false') {\n return false;\n }\n if (/^-?\\d+(\\.\\d+)?$/.test(s)) {\n return Number(s);\n }\n\n // Field reference\n return resolveFieldValue(s, values, fields);\n }\n\n function evalCondition(cond: string): boolean {\n // \"ref == value\" or \"ref != value\"\n const eqMatch = cond.match(/^(.+?)\\s*(==|!=)\\s*(.+)$/);\n if (eqMatch) {\n const left = evalExpr(eqMatch[1]);\n const right = evalExpr(eqMatch[3]);\n const eq = String(left) === String(right);\n return eqMatch[2] === '==' ? eq : !eq;\n }\n // Truthy check\n return !!evalExpr(cond);\n }\n\n function findMatchingParen(s: string, start: number): number {\n let depth = 0;\n for (let i = start; i < s.length; i++) {\n if (s[i] === '(') {\n depth++;\n } else if (s[i] === ')') {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n return -1;\n }\n\n function findTopLevel(s: string, char: string): number {\n let depth = 0;\n let inStr: string | null = null;\n for (let i = 0; i < s.length; i++) {\n const c = s[i];\n if (inStr) {\n if (c === inStr) {\n inStr = null;\n }\n continue;\n }\n if (c === \"'\" || c === '\"') {\n inStr = c;\n continue;\n }\n if (c === '(') {\n depth++;\n continue;\n }\n if (c === ')') {\n depth--;\n continue;\n }\n if (depth === 0 && c === char) {\n return i;\n }\n }\n return -1;\n }\n\n try {\n return evalExpr(expr);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Compute initial values for all virtual fields that have storage.computed.read expressions.\n * Call after loading existing storage field values.\n */\nexport function computeVirtualFieldValues(\n schema: DatasourceConfigSchema,\n existingValues: Record<string, unknown>\n): Record<string, unknown> {\n const virtualValues: Record<string, unknown> = {};\n for (const field of schema.fields) {\n if (field.kind !== 'virtual') {\n continue;\n }\n const fk = formKey(field);\n if (field.storage?.type === 'computed' && field.storage.read) {\n const val = evaluateComputedRead(field.storage.read, existingValues, schema.fields);\n if (val !== undefined) {\n virtualValues[fk] = val;\n } else if (field.defaultValue !== undefined) {\n virtualValues[fk] = field.defaultValue;\n }\n } else if (field.defaultValue !== undefined) {\n virtualValues[fk] = field.defaultValue;\n }\n }\n return virtualValues;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,52 @@ import { getBackendSrv } from '@grafana/runtime';
|
|
|
2
2
|
import { formKey } from './config.js';
|
|
3
3
|
|
|
4
4
|
const SECURE_FIELD_CONFIGURED = "__CONFIGURED__";
|
|
5
|
+
function resolveSecureKeyTemplate(template, item, index) {
|
|
6
|
+
return template.replace(/\{index1\}/g, String(index + 1)).replace(/\{index\}/g, String(index)).replace(/\{item\.(\w+)\}/g, (_, key) => {
|
|
7
|
+
var _a;
|
|
8
|
+
return String((_a = item[key]) != null ? _a : "");
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function evaluateItemCondition(condition, item) {
|
|
12
|
+
const trimmed = condition.trim();
|
|
13
|
+
if (trimmed === "true") {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
const match = trimmed.match(/^item\.(\w+)\s*==\s*(.+)$/);
|
|
17
|
+
if (!match) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const [, key, rawValue] = match;
|
|
21
|
+
const actualValue = item[key];
|
|
22
|
+
const expected = rawValue.trim();
|
|
23
|
+
if (expected === "true") {
|
|
24
|
+
return actualValue === true;
|
|
25
|
+
}
|
|
26
|
+
if (expected === "false") {
|
|
27
|
+
return actualValue === false;
|
|
28
|
+
}
|
|
29
|
+
const unquoted = expected.replace(/^['"]|['"]$/g, "");
|
|
30
|
+
return String(actualValue) === unquoted;
|
|
31
|
+
}
|
|
32
|
+
function findActiveSecureOverride(itemFields, item, index) {
|
|
33
|
+
for (const field of itemFields) {
|
|
34
|
+
if (!field.overrides) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
for (const override of field.overrides) {
|
|
38
|
+
if (!override.secureKey) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (evaluateItemCondition(override.when, item)) {
|
|
42
|
+
return {
|
|
43
|
+
fieldKey: field.key,
|
|
44
|
+
resolvedKey: resolveSecureKeyTemplate(override.secureKey, item, index)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
5
51
|
function patternToRegex(pattern) {
|
|
6
52
|
const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
7
53
|
return new RegExp("^" + escaped.replace("\\{index\\}", "(\\d+)") + "$");
|
|
@@ -108,7 +154,7 @@ function resolveRawPath(ref, ds) {
|
|
|
108
154
|
return void 0;
|
|
109
155
|
}
|
|
110
156
|
async function fetchExistingValues(dsUid, fields) {
|
|
111
|
-
var _a, _b, _c, _d, _e;
|
|
157
|
+
var _a, _b, _c, _d, _e, _f;
|
|
112
158
|
try {
|
|
113
159
|
const ds = await getBackendSrv().get(`/api/datasources/uid/${dsUid}`, void 0, void 0, {
|
|
114
160
|
showErrorAlert: false
|
|
@@ -149,6 +195,32 @@ async function fetchExistingValues(dsUid, fields) {
|
|
|
149
195
|
}
|
|
150
196
|
}
|
|
151
197
|
}
|
|
198
|
+
for (const field of fields) {
|
|
199
|
+
if (field.valueType !== "array" || !((_f = field.item) == null ? void 0 : _f.fields)) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const itemFields = field.item.fields;
|
|
203
|
+
const hasSecureOverride = itemFields.some((f) => {
|
|
204
|
+
var _a2;
|
|
205
|
+
return (_a2 = f.overrides) == null ? void 0 : _a2.some((o) => o.secureKey);
|
|
206
|
+
});
|
|
207
|
+
if (!hasSecureOverride) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
const fk = formKey(field);
|
|
211
|
+
const arr = values[fk];
|
|
212
|
+
if (!Array.isArray(arr)) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
values[fk] = arr.map((item, idx) => {
|
|
216
|
+
var _a2;
|
|
217
|
+
const match = findActiveSecureOverride(itemFields, item, idx);
|
|
218
|
+
if (match && ((_a2 = ds.secureJsonFields) == null ? void 0 : _a2[match.resolvedKey])) {
|
|
219
|
+
return { ...item, [match.fieldKey]: SECURE_FIELD_CONFIGURED };
|
|
220
|
+
}
|
|
221
|
+
return item;
|
|
222
|
+
});
|
|
223
|
+
}
|
|
152
224
|
return { values, readOnly: !!ds.readOnly };
|
|
153
225
|
} catch (err) {
|
|
154
226
|
const message = err instanceof Error ? err.message : "Failed to load datasource configuration";
|
|
@@ -156,7 +228,7 @@ async function fetchExistingValues(dsUid, fields) {
|
|
|
156
228
|
}
|
|
157
229
|
}
|
|
158
230
|
function buildDatasourceConfigPayload(data, fields, existing, isFieldVisible) {
|
|
159
|
-
var _a, _b, _c, _d;
|
|
231
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
160
232
|
const rootFields = {};
|
|
161
233
|
const jsonData = { ...(_a = existing.jsonData) != null ? _a : {} };
|
|
162
234
|
const secureJsonData = {};
|
|
@@ -205,6 +277,60 @@ function buildDatasourceConfigPayload(data, fields, existing, isFieldVisible) {
|
|
|
205
277
|
break;
|
|
206
278
|
}
|
|
207
279
|
}
|
|
280
|
+
for (const field of fields) {
|
|
281
|
+
if (field.valueType !== "array" || !((_e = field.item) == null ? void 0 : _e.fields) || field.target !== "jsonData") {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const itemFields = field.item.fields;
|
|
285
|
+
const hasSecureOverride = itemFields.some((f) => {
|
|
286
|
+
var _a2;
|
|
287
|
+
return (_a2 = f.overrides) == null ? void 0 : _a2.some((o) => o.secureKey);
|
|
288
|
+
});
|
|
289
|
+
if (!hasSecureOverride) {
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
const arr = field.section ? (_f = jsonData[field.section]) == null ? void 0 : _f[field.key] : jsonData[field.key];
|
|
293
|
+
if (!Array.isArray(arr)) {
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
const secureKeyOverrides = [];
|
|
297
|
+
for (const f of itemFields) {
|
|
298
|
+
for (const o of (_g = f.overrides) != null ? _g : []) {
|
|
299
|
+
if (o.secureKey) {
|
|
300
|
+
secureKeyOverrides.push({ fieldKey: f.key, override: o });
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
const activeSecureKeys = /* @__PURE__ */ new Set();
|
|
305
|
+
for (let i = 0; i < arr.length; i++) {
|
|
306
|
+
const item = arr[i];
|
|
307
|
+
const match = findActiveSecureOverride(itemFields, item, i);
|
|
308
|
+
if (!match) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
const resolvedKey = match.resolvedKey;
|
|
312
|
+
activeSecureKeys.add(resolvedKey);
|
|
313
|
+
const itemValue = item[match.fieldKey];
|
|
314
|
+
if (itemValue === SECURE_FIELD_CONFIGURED) {
|
|
315
|
+
secureJsonFields[resolvedKey] = true;
|
|
316
|
+
} else if (itemValue && itemValue !== "") {
|
|
317
|
+
secureJsonData[resolvedKey] = String(itemValue);
|
|
318
|
+
secureJsonFields[resolvedKey] = false;
|
|
319
|
+
item[match.fieldKey] = "";
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const existingSecureFields = (_h = existing.secureJsonFields) != null ? _h : {};
|
|
323
|
+
for (const existingKey of Object.keys(existingSecureFields)) {
|
|
324
|
+
const couldBeFromThisField = secureKeyOverrides.some((sko) => {
|
|
325
|
+
const staticPrefix = sko.override.secureKey.split("{")[0];
|
|
326
|
+
return staticPrefix && existingKey.startsWith(staticPrefix);
|
|
327
|
+
});
|
|
328
|
+
if (couldBeFromThisField && !activeSecureKeys.has(existingKey)) {
|
|
329
|
+
secureJsonFields[existingKey] = false;
|
|
330
|
+
secureJsonData[existingKey] = "";
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
208
334
|
return { rootFields, jsonData, secureJsonData, secureJsonFields };
|
|
209
335
|
}
|
|
210
336
|
async function submitDatasourceConfig(dsUid, data, fields, isFieldVisible) {
|
|
@@ -224,5 +350,5 @@ async function submitDatasourceConfig(dsUid, data, fields, isFieldVisible) {
|
|
|
224
350
|
});
|
|
225
351
|
}
|
|
226
352
|
|
|
227
|
-
export { SECURE_FIELD_CONFIGURED, buildDatasourceConfigPayload, expandIndexedPair, fetchExistingValues, flattenIndexedPair, submitDatasourceConfig };
|
|
353
|
+
export { SECURE_FIELD_CONFIGURED, buildDatasourceConfigPayload, expandIndexedPair, fetchExistingValues, findActiveSecureOverride, flattenIndexedPair, resolveSecureKeyTemplate, submitDatasourceConfig };
|
|
228
354
|
//# sourceMappingURL=datasource.js.map
|