@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.
Files changed (217) hide show
  1. package/dist/cjs/index.cjs +1076 -318
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +439 -115
  4. package/dist/cjs/schemas.cjs +14853 -0
  5. package/dist/cjs/schemas.cjs.map +1 -0
  6. package/dist/cjs/schemas.d.cts +373 -0
  7. package/dist/cjs/test-utils.d.cts +23 -23
  8. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js +2 -2
  9. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js +14 -9
  10. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js.map +1 -1
  11. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js +27 -0
  12. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js.map +1 -0
  13. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js +16 -5
  14. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js.map +1 -1
  15. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js.map +1 -1
  16. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js +9 -4
  17. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js.map +1 -1
  18. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js +61 -11
  19. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js.map +1 -1
  20. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{useDatasourceConfigForm.js → hooks/useDatasourceConfigForm.js} +71 -29
  21. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js.map +1 -0
  22. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js +106 -0
  23. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js.map +1 -0
  24. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{AuthorizationHeaderField.js → inputs/AuthorizationHeaderField.js} +6 -8
  25. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js.map +1 -0
  26. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{ComplexFieldNote.js → inputs/ComplexFieldNote.js} +6 -4
  27. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js.map +1 -0
  28. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js +106 -0
  29. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js.map +1 -0
  30. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{IndexedPairEditor.js → inputs/IndexedPairEditor.js} +52 -52
  31. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js.map +1 -0
  32. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js +190 -0
  33. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js.map +1 -0
  34. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{PdcFieldNote.js → inputs/PdcFieldNote.js} +5 -8
  35. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PdcFieldNote.js.map +1 -0
  36. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{SecureFieldInput.js → inputs/SecureFieldInput.js} +8 -10
  37. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js.map +1 -0
  38. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js +80 -0
  39. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js.map +1 -0
  40. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js +76 -41
  41. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js.map +1 -1
  42. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js +30 -0
  43. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js.map +1 -0
  44. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/tabStyles.js +4 -4
  45. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/tabStyles.js.map +1 -1
  46. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/wizardStyles.js +3 -3
  47. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/wizardStyles.js.map +1 -1
  48. package/dist/esm/components/DataLinks/DataLink.js +2 -2
  49. package/dist/esm/components/DataLinks/DataLinks.js +2 -2
  50. package/dist/esm/components/DataSourcePicker/DataSourcePicker.js +7 -7
  51. package/dist/esm/components/DatePicker/styles.js +2 -2
  52. package/dist/esm/components/DatePickerWithInput/styles.js +2 -2
  53. package/dist/esm/components/QueryEditor/EditorField.js +2 -2
  54. package/dist/esm/components/QueryEditor/EditorHeader.js +2 -2
  55. package/dist/esm/components/QueryEditor/EditorRow.js +2 -2
  56. package/dist/esm/components/QueryEditor/EditorSwitch.js +2 -2
  57. package/dist/esm/components/QueryEditor/InputGroup.js +2 -2
  58. package/dist/esm/components/QueryEditor/Space.js +2 -2
  59. package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js +2 -2
  60. package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js +2 -2
  61. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js +2 -2
  62. package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js +2 -2
  63. package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js +2 -2
  64. package/dist/esm/datasource/SqlDatasource.js +10 -10
  65. package/dist/esm/datasource/schema/cel.js +42 -0
  66. package/dist/esm/datasource/schema/cel.js.map +1 -0
  67. package/dist/esm/datasource/schema/config.js +37 -14
  68. package/dist/esm/datasource/schema/config.js.map +1 -1
  69. package/dist/esm/datasource/schema/datasource.js +129 -3
  70. package/dist/esm/datasource/schema/datasource.js.map +1 -1
  71. package/dist/esm/datasource/schema/datasources/alertmanager.schema.json.js +77 -0
  72. package/dist/esm/datasource/schema/datasources/alertmanager.schema.json.js.map +1 -0
  73. package/dist/esm/datasource/schema/datasources/cloudwatch.schema.json.js +384 -0
  74. package/dist/esm/datasource/schema/datasources/cloudwatch.schema.json.js.map +1 -0
  75. package/dist/esm/datasource/schema/datasources/elasticsearch.schema.json.js +287 -0
  76. package/dist/esm/datasource/schema/datasources/elasticsearch.schema.json.js.map +1 -0
  77. package/dist/esm/datasource/schema/datasources/grafana-amazonprometheus-datasource.schema.json.js +166 -0
  78. package/dist/esm/datasource/schema/datasources/grafana-amazonprometheus-datasource.schema.json.js.map +1 -0
  79. package/dist/esm/datasource/schema/datasources/grafana-appdynamics-datasource.schema.json.js +145 -0
  80. package/dist/esm/datasource/schema/datasources/grafana-appdynamics-datasource.schema.json.js.map +1 -0
  81. package/dist/esm/datasource/schema/datasources/grafana-astradb-datasource.schema.json.js +123 -0
  82. package/dist/esm/datasource/schema/datasources/grafana-astradb-datasource.schema.json.js.map +1 -0
  83. package/dist/esm/datasource/schema/datasources/grafana-athena-datasource.schema.json.js +158 -0
  84. package/dist/esm/datasource/schema/datasources/grafana-athena-datasource.schema.json.js.map +1 -0
  85. package/dist/esm/datasource/schema/datasources/grafana-azure-data-explorer-datasource.schema.json.js +204 -0
  86. package/dist/esm/datasource/schema/datasources/grafana-azure-data-explorer-datasource.schema.json.js.map +1 -0
  87. package/dist/esm/datasource/schema/datasources/grafana-azure-monitor-datasource.schema.json.js +294 -0
  88. package/dist/esm/datasource/schema/datasources/grafana-azure-monitor-datasource.schema.json.js.map +1 -0
  89. package/dist/esm/datasource/schema/datasources/grafana-azuredevops-datasource.schema.json.js +101 -0
  90. package/dist/esm/datasource/schema/datasources/grafana-azuredevops-datasource.schema.json.js.map +1 -0
  91. package/dist/esm/datasource/schema/datasources/grafana-azureprometheus-datasource.schema.json.js +125 -0
  92. package/dist/esm/datasource/schema/datasources/grafana-azureprometheus-datasource.schema.json.js.map +1 -0
  93. package/dist/esm/datasource/schema/datasources/grafana-bigquery-datasource.schema.json.js +508 -0
  94. package/dist/esm/datasource/schema/datasources/grafana-bigquery-datasource.schema.json.js.map +1 -0
  95. package/dist/esm/datasource/schema/datasources/grafana-clickhouse-datasource.schema.json.js +1400 -0
  96. package/dist/esm/datasource/schema/datasources/grafana-clickhouse-datasource.schema.json.js.map +1 -0
  97. package/dist/esm/datasource/schema/datasources/grafana-cockroachdb-datasource.schema.json.js +302 -0
  98. package/dist/esm/datasource/schema/datasources/grafana-cockroachdb-datasource.schema.json.js.map +1 -0
  99. package/dist/esm/datasource/schema/datasources/grafana-databricks-datasource.schema.json.js +291 -0
  100. package/dist/esm/datasource/schema/datasources/grafana-databricks-datasource.schema.json.js.map +1 -0
  101. package/dist/esm/datasource/schema/datasources/grafana-datadog-datasource.schema.json.js +155 -0
  102. package/dist/esm/datasource/schema/datasources/grafana-datadog-datasource.schema.json.js.map +1 -0
  103. package/dist/esm/datasource/schema/datasources/grafana-dynatrace-datasource.schema.json.js +179 -0
  104. package/dist/esm/datasource/schema/datasources/grafana-dynatrace-datasource.schema.json.js.map +1 -0
  105. package/dist/esm/datasource/schema/datasources/grafana-falconlogscale-datasource.schema.json.js +134 -0
  106. package/dist/esm/datasource/schema/datasources/grafana-falconlogscale-datasource.schema.json.js.map +1 -0
  107. package/dist/esm/datasource/schema/datasources/grafana-github-datasource.schema.json.js +156 -0
  108. package/dist/esm/datasource/schema/datasources/grafana-github-datasource.schema.json.js.map +1 -0
  109. package/dist/esm/datasource/schema/datasources/grafana-gitlab-datasource.schema.json.js +84 -0
  110. package/dist/esm/datasource/schema/datasources/grafana-gitlab-datasource.schema.json.js.map +1 -0
  111. package/dist/esm/datasource/schema/datasources/grafana-googlesheets-datasource.schema.json.js +231 -0
  112. package/dist/esm/datasource/schema/datasources/grafana-googlesheets-datasource.schema.json.js.map +1 -0
  113. package/dist/esm/datasource/schema/datasources/grafana-honeycomb-datasource.schema.json.js +87 -0
  114. package/dist/esm/datasource/schema/datasources/grafana-honeycomb-datasource.schema.json.js.map +1 -0
  115. package/dist/esm/datasource/schema/datasources/grafana-iot-sitewise-datasource.schema.json.js +159 -0
  116. package/dist/esm/datasource/schema/datasources/grafana-iot-sitewise-datasource.schema.json.js.map +1 -0
  117. package/dist/esm/datasource/schema/datasources/grafana-jira-datasource.schema.json.js +188 -0
  118. package/dist/esm/datasource/schema/datasources/grafana-jira-datasource.schema.json.js.map +1 -0
  119. package/dist/esm/datasource/schema/datasources/grafana-looker-datasource.schema.json.js +82 -0
  120. package/dist/esm/datasource/schema/datasources/grafana-looker-datasource.schema.json.js.map +1 -0
  121. package/dist/esm/datasource/schema/datasources/grafana-mongodb-datasource.schema.json.js +278 -0
  122. package/dist/esm/datasource/schema/datasources/grafana-mongodb-datasource.schema.json.js.map +1 -0
  123. package/dist/esm/datasource/schema/datasources/grafana-mqtt-datasource.schema.json.js +168 -0
  124. package/dist/esm/datasource/schema/datasources/grafana-mqtt-datasource.schema.json.js.map +1 -0
  125. package/dist/esm/datasource/schema/datasources/grafana-newrelic-datasource.schema.json.js +129 -0
  126. package/dist/esm/datasource/schema/datasources/grafana-newrelic-datasource.schema.json.js.map +1 -0
  127. package/dist/esm/datasource/schema/datasources/grafana-odbc-datasource.schema.json.js +56 -0
  128. package/dist/esm/datasource/schema/datasources/grafana-odbc-datasource.schema.json.js.map +1 -0
  129. package/dist/esm/datasource/schema/datasources/grafana-opensearch-datasource.schema.json.js +212 -0
  130. package/dist/esm/datasource/schema/datasources/grafana-opensearch-datasource.schema.json.js.map +1 -0
  131. package/dist/esm/datasource/schema/datasources/grafana-oracle-datasource.schema.json.js +186 -0
  132. package/dist/esm/datasource/schema/datasources/grafana-oracle-datasource.schema.json.js.map +1 -0
  133. package/dist/esm/datasource/schema/datasources/grafana-pagerduty-datasource.schema.json.js +85 -0
  134. package/dist/esm/datasource/schema/datasources/grafana-pagerduty-datasource.schema.json.js.map +1 -0
  135. package/dist/esm/datasource/schema/datasources/grafana-postgresql-datasource.schema.json.js +411 -0
  136. package/dist/esm/datasource/schema/datasources/grafana-postgresql-datasource.schema.json.js.map +1 -0
  137. package/dist/esm/datasource/schema/datasources/grafana-pyroscope-datasource.schema.json.js +41 -0
  138. package/dist/esm/datasource/schema/datasources/grafana-pyroscope-datasource.schema.json.js.map +1 -0
  139. package/dist/esm/datasource/schema/datasources/grafana-redshift-datasource.schema.json.js +201 -0
  140. package/dist/esm/datasource/schema/datasources/grafana-redshift-datasource.schema.json.js.map +1 -0
  141. package/dist/esm/datasource/schema/datasources/grafana-salesforce-datasource.schema.json.js +201 -0
  142. package/dist/esm/datasource/schema/datasources/grafana-salesforce-datasource.schema.json.js.map +1 -0
  143. package/dist/esm/datasource/schema/datasources/grafana-saphana-datasource.schema.json.js +208 -0
  144. package/dist/esm/datasource/schema/datasources/grafana-saphana-datasource.schema.json.js.map +1 -0
  145. package/dist/esm/datasource/schema/datasources/grafana-sentry-datasource.schema.json.js +94 -0
  146. package/dist/esm/datasource/schema/datasources/grafana-sentry-datasource.schema.json.js.map +1 -0
  147. package/dist/esm/datasource/schema/datasources/grafana-servicenow-datasource.schema.json.js +179 -0
  148. package/dist/esm/datasource/schema/datasources/grafana-servicenow-datasource.schema.json.js.map +1 -0
  149. package/dist/esm/datasource/schema/datasources/grafana-snowflake-datasource.schema.json.js +304 -0
  150. package/dist/esm/datasource/schema/datasources/grafana-snowflake-datasource.schema.json.js.map +1 -0
  151. package/dist/esm/datasource/schema/datasources/grafana-splunk-datasource.schema.json.js +319 -0
  152. package/dist/esm/datasource/schema/datasources/grafana-splunk-datasource.schema.json.js.map +1 -0
  153. package/dist/esm/datasource/schema/datasources/grafana-splunkobservability-datasource.schema.json.js +90 -0
  154. package/dist/esm/datasource/schema/datasources/grafana-splunkobservability-datasource.schema.json.js.map +1 -0
  155. package/dist/esm/datasource/schema/datasources/grafana-strava-datasource.schema.json.js +74 -0
  156. package/dist/esm/datasource/schema/datasources/grafana-strava-datasource.schema.json.js.map +1 -0
  157. package/dist/esm/datasource/schema/datasources/grafana-sumologic-datasource.schema.json.js +102 -0
  158. package/dist/esm/datasource/schema/datasources/grafana-sumologic-datasource.schema.json.js.map +1 -0
  159. package/dist/esm/datasource/schema/datasources/grafana-surrealdb-datasource.schema.json.js +92 -0
  160. package/dist/esm/datasource/schema/datasources/grafana-surrealdb-datasource.schema.json.js.map +1 -0
  161. package/dist/esm/datasource/schema/datasources/grafana-timestream-datasource.schema.json.js +145 -0
  162. package/dist/esm/datasource/schema/datasources/grafana-timestream-datasource.schema.json.js.map +1 -0
  163. package/dist/esm/datasource/schema/datasources/grafana-wavefront-datasource.schema.json.js +80 -0
  164. package/dist/esm/datasource/schema/datasources/grafana-wavefront-datasource.schema.json.js.map +1 -0
  165. package/dist/esm/datasource/schema/datasources/grafana-x-ray-datasource.schema.json.js +112 -0
  166. package/dist/esm/datasource/schema/datasources/grafana-x-ray-datasource.schema.json.js.map +1 -0
  167. package/dist/esm/datasource/schema/datasources/grafana-yugabyte-datasource.schema.json.js +114 -0
  168. package/dist/esm/datasource/schema/datasources/grafana-yugabyte-datasource.schema.json.js.map +1 -0
  169. package/dist/esm/datasource/schema/datasources/graphite.schema.json.js +104 -0
  170. package/dist/esm/datasource/schema/datasources/graphite.schema.json.js.map +1 -0
  171. package/dist/esm/datasource/schema/datasources/influxdb.schema.json.js +717 -0
  172. package/dist/esm/datasource/schema/datasources/influxdb.schema.json.js.map +1 -0
  173. package/dist/esm/datasource/schema/datasources/jaeger.schema.json.js +59 -0
  174. package/dist/esm/datasource/schema/datasources/jaeger.schema.json.js.map +1 -0
  175. package/dist/esm/datasource/schema/datasources/loki.schema.json.js +545 -0
  176. package/dist/esm/datasource/schema/datasources/loki.schema.json.js.map +1 -0
  177. package/dist/esm/datasource/schema/datasources/marcusolsson-csv-datasource.schema.json.js +45 -0
  178. package/dist/esm/datasource/schema/datasources/marcusolsson-csv-datasource.schema.json.js.map +1 -0
  179. package/dist/esm/datasource/schema/datasources/marcusolsson-json-datasource.schema.json.js +36 -0
  180. package/dist/esm/datasource/schema/datasources/marcusolsson-json-datasource.schema.json.js.map +1 -0
  181. package/dist/esm/datasource/schema/datasources/mssql.schema.json.js +292 -0
  182. package/dist/esm/datasource/schema/datasources/mssql.schema.json.js.map +1 -0
  183. package/dist/esm/datasource/schema/datasources/mysql.schema.json.js +304 -0
  184. package/dist/esm/datasource/schema/datasources/mysql.schema.json.js.map +1 -0
  185. package/dist/esm/datasource/schema/datasources/opentsdb.schema.json.js +113 -0
  186. package/dist/esm/datasource/schema/datasources/opentsdb.schema.json.js.map +1 -0
  187. package/dist/esm/datasource/schema/datasources/prometheus.schema.json.js +783 -0
  188. package/dist/esm/datasource/schema/datasources/prometheus.schema.json.js.map +1 -0
  189. package/dist/esm/datasource/schema/datasources/stackdriver.schema.json.js +224 -0
  190. package/dist/esm/datasource/schema/datasources/stackdriver.schema.json.js.map +1 -0
  191. package/dist/esm/datasource/schema/datasources/tempo.schema.json.js +664 -0
  192. package/dist/esm/datasource/schema/datasources/tempo.schema.json.js.map +1 -0
  193. package/dist/esm/datasource/schema/datasources/yesoreyeram-infinity-datasource.schema.json.js +1073 -0
  194. package/dist/esm/datasource/schema/datasources/yesoreyeram-infinity-datasource.schema.json.js.map +1 -0
  195. package/dist/esm/datasource/schema/datasources/zipkin.schema.json.js +40 -0
  196. package/dist/esm/datasource/schema/datasources/zipkin.schema.json.js.map +1 -0
  197. package/dist/esm/datasource/schema/llmHints.js.map +1 -1
  198. package/dist/esm/datasource/schema/provisioningYaml.js +3 -1
  199. package/dist/esm/datasource/schema/provisioningYaml.js.map +1 -1
  200. package/dist/esm/datasource/schema/schemaRegistry.js +139 -0
  201. package/dist/esm/datasource/schema/schemaRegistry.js.map +1 -0
  202. package/dist/esm/index.d.ts +439 -115
  203. package/dist/esm/index.js +6 -2
  204. package/dist/esm/index.js.map +1 -1
  205. package/dist/esm/schemas.d.ts +373 -0
  206. package/dist/esm/schemas.js +2 -0
  207. package/dist/esm/schemas.js.map +1 -0
  208. package/dist/esm/test-utils.d.ts +23 -23
  209. package/package.json +23 -6
  210. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/AuthorizationHeaderField.js.map +0 -1
  211. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/ComplexFieldNote.js.map +0 -1
  212. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/IndexedPairEditor.js.map +0 -1
  213. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/PdcFieldNote.js.map +0 -1
  214. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SecureFieldInput.js.map +0 -1
  215. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/StringArrayInput.js +0 -84
  216. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/StringArrayInput.js.map +0 -1
  217. 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$l);
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$l(theme) {
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$h(theme, width);
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$h = stylesFactory((theme, width) => {
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$i);
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$i = (theme) => {
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$k);
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$k(theme) {
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$j);
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$j = () => {
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$2 = Object.defineProperty;
9
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
- var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
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$2(this, "id");
16
- __publicField$2(this, "name");
17
- __publicField$2(this, "interval");
18
- __publicField$2(this, "db");
19
- __publicField$2(this, "dataset");
20
- __publicField$2(this, "annotations", {});
21
- __publicField$2(this, "interpolateVariable", (value, variable) => {
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 = (_a = schema.groups) == null ? void 0 : _a.find((g) => g.id === "auth");
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 parsed = parseDependsOn(f.dependsOn);
52
- if (parsed && fieldMap.has(parsed.field)) {
53
- includeIds.add(parsed.field);
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 parsed = parseDependsOn(f.dependsOn);
60
- if (parsed && requiredIds.has(parsed.field)) {
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: "Required",
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(/^(.+?)\s*==\s*(?:'([^']*)'|"([^"]*)"|(.+))$/);
103
+ const m = expr.match(/^([\w.]+)\s*(==|!=)\s*(?:'([^']*)'|"([^"]*)"|(\S+))$/);
84
104
  if (!m) {
85
105
  return null;
86
106
  }
87
- return { field: m[1].trim(), value: ((_b = (_a = m[2]) != null ? _a : m[3]) != null ? _b : m[4]).trim() };
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 (String((_a = watchedValues[depKey]) != null ? _a : "") === parsed.value) {
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":"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"}
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