@grafana/plugin-ui 0.14.1-dsconfig.4bdebf6 → 0.14.1-dsconfig.7535e54

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 (234) hide show
  1. package/dist/cjs/index.cjs +1067 -1158
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +248 -158
  4. package/dist/cjs/schemas.cjs +20 -13391
  5. package/dist/cjs/schemas.cjs.map +1 -1
  6. package/dist/cjs/schemas.d.cts +112 -2
  7. package/dist/cjs/test-utils.d.cts +23 -23
  8. package/dist/cjs/useDatasourceSchema-DLkP-L1p.js +15795 -0
  9. package/dist/cjs/useDatasourceSchema-DLkP-L1p.js.map +1 -0
  10. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js +2 -2
  11. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js +16 -11
  12. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js.map +1 -1
  13. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js +18 -7
  14. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js.map +1 -1
  15. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js +1 -1
  16. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js.map +1 -1
  17. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js +11 -6
  18. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js.map +1 -1
  19. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js +75 -0
  20. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js.map +1 -0
  21. package/dist/esm/{datasource/schema → components/ConfigEditor/DatasourceConfigWizard}/config.js +37 -14
  22. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/config.js.map +1 -0
  23. package/dist/esm/{datasource/schema → components/ConfigEditor/DatasourceConfigWizard}/datasource.js +129 -3
  24. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/datasource.js.map +1 -0
  25. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js +62 -12
  26. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js.map +1 -1
  27. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{useDatasourceConfigForm.js → hooks/useDatasourceConfigForm.js} +71 -29
  28. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js.map +1 -0
  29. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js.map +1 -0
  30. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{AuthorizationHeaderField.js → inputs/AuthorizationHeaderField.js} +6 -8
  31. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js.map +1 -0
  32. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{ComplexFieldNote.js → inputs/ComplexFieldNote.js} +6 -4
  33. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js.map +1 -0
  34. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js +106 -0
  35. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js.map +1 -0
  36. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{IndexedPairEditor.js → inputs/IndexedPairEditor.js} +52 -52
  37. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js.map +1 -0
  38. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js +190 -0
  39. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js.map +1 -0
  40. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{PdcFieldNote.js → inputs/PdcFieldNote.js} +5 -8
  41. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PdcFieldNote.js.map +1 -0
  42. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{SecureFieldInput.js → inputs/SecureFieldInput.js} +8 -10
  43. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js.map +1 -0
  44. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js +80 -0
  45. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js.map +1 -0
  46. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js +76 -41
  47. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js.map +1 -1
  48. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{tabStyles.js → styles.js} +125 -6
  49. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/styles.js.map +1 -0
  50. package/dist/esm/components/DataLinks/DataLink.js +2 -2
  51. package/dist/esm/components/DataLinks/DataLinks.js +2 -2
  52. package/dist/esm/components/DatePicker/styles.js +2 -2
  53. package/dist/esm/components/DatePickerWithInput/styles.js +2 -2
  54. package/dist/esm/components/QueryEditor/EditorField.js +2 -2
  55. package/dist/esm/components/QueryEditor/EditorHeader.js +2 -2
  56. package/dist/esm/components/QueryEditor/EditorRow.js +2 -2
  57. package/dist/esm/components/QueryEditor/EditorSwitch.js +2 -2
  58. package/dist/esm/components/QueryEditor/InputGroup.js +2 -2
  59. package/dist/esm/components/QueryEditor/Space.js +2 -2
  60. package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js +2 -2
  61. package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js +2 -2
  62. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js +2 -2
  63. package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js +2 -2
  64. package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js +2 -2
  65. package/dist/esm/index.d.ts +248 -158
  66. package/dist/esm/index.js +8 -6
  67. package/dist/esm/index.js.map +1 -1
  68. package/dist/esm/{datasource/schema/datasources → schema/registry}/cloudwatch.schema.json.js +3 -3
  69. package/dist/esm/schema/registry/grafana-bigquery-datasource.schema.json.js +508 -0
  70. package/dist/esm/schema/registry/grafana-bigquery-datasource.schema.json.js.map +1 -0
  71. package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-clickhouse-datasource.schema.json.js +206 -44
  72. package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-clickhouse-datasource.schema.json.js.map +1 -1
  73. package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-googlesheets-datasource.schema.json.js +103 -107
  74. package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-googlesheets-datasource.schema.json.js.map +1 -1
  75. package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-mqtt-datasource.schema.json.js +3 -3
  76. package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-postgresql-datasource.schema.json.js +170 -223
  77. package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-postgresql-datasource.schema.json.js.map +1 -1
  78. package/dist/esm/schema/registry/index.js +137 -0
  79. package/dist/esm/schema/registry/index.js.map +1 -0
  80. package/dist/esm/{datasource/schema/datasources → schema/registry}/influxdb.schema.json.js +22 -8
  81. package/dist/esm/{datasource/schema/datasources → schema/registry}/influxdb.schema.json.js.map +1 -1
  82. package/dist/esm/{datasource/schema/datasources → schema/registry}/loki.schema.json.js +3 -3
  83. package/dist/esm/schema/registry/mysql.schema.json.js +304 -0
  84. package/dist/esm/schema/registry/mysql.schema.json.js.map +1 -0
  85. package/dist/esm/{datasource/schema/datasources → schema/registry}/prometheus.schema.json.js +1 -1
  86. package/dist/esm/schema/registry/stackdriver.schema.json.js +224 -0
  87. package/dist/esm/{datasource/schema/datasources → schema/registry}/stackdriver.schema.json.js.map +1 -1
  88. package/dist/esm/{datasource/schema/datasources → schema/registry}/tempo.schema.json.js +52 -6
  89. package/dist/esm/{datasource/schema/datasources → schema/registry}/tempo.schema.json.js.map +1 -1
  90. package/dist/esm/schema/registry/yesoreyeram-infinity-datasource.schema.json.js +1073 -0
  91. package/dist/esm/schema/registry/yesoreyeram-infinity-datasource.schema.json.js.map +1 -0
  92. package/dist/esm/schema/utils/dsconfig.js +97 -0
  93. package/dist/esm/schema/utils/dsconfig.js.map +1 -0
  94. package/dist/esm/{datasource/schema/llmHints.js → schema/utils/llm.js} +1 -1
  95. package/dist/esm/schema/utils/llm.js.map +1 -0
  96. package/dist/esm/{datasource/schema/provisioningYaml.js → schema/utils/provisioning.js} +79 -3
  97. package/dist/esm/schema/utils/provisioning.js.map +1 -0
  98. package/dist/esm/schema/utils/useDatasourceSchema.js +16 -0
  99. package/dist/esm/schema/utils/useDatasourceSchema.js.map +1 -0
  100. package/dist/esm/schemas.d.ts +112 -2
  101. package/dist/esm/schemas.js +5 -1
  102. package/dist/esm/schemas.js.map +1 -1
  103. package/dist/esm/test-utils.d.ts +23 -23
  104. package/package.json +9 -6
  105. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/AuthorizationHeaderField.js.map +0 -1
  106. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/ComplexFieldNote.js.map +0 -1
  107. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/IndexedPairEditor.js.map +0 -1
  108. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/PdcFieldNote.js.map +0 -1
  109. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SecureFieldInput.js.map +0 -1
  110. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/StringArrayInput.js +0 -84
  111. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/StringArrayInput.js.map +0 -1
  112. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/tabStyles.js.map +0 -1
  113. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/useDatasourceConfigForm.js.map +0 -1
  114. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/useHealthChecks.js.map +0 -1
  115. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/wizardStyles.js +0 -124
  116. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/wizardStyles.js.map +0 -1
  117. package/dist/esm/datasource/schema/config.js.map +0 -1
  118. package/dist/esm/datasource/schema/datasource.js.map +0 -1
  119. package/dist/esm/datasource/schema/datasources/grafana-bigquery-datasource.schema.json.js +0 -159
  120. package/dist/esm/datasource/schema/datasources/grafana-bigquery-datasource.schema.json.js.map +0 -1
  121. package/dist/esm/datasource/schema/datasources/mysql.schema.json.js +0 -137
  122. package/dist/esm/datasource/schema/datasources/mysql.schema.json.js.map +0 -1
  123. package/dist/esm/datasource/schema/datasources/stackdriver.schema.json.js +0 -135
  124. package/dist/esm/datasource/schema/datasources/yesoreyeram-infinity-datasource.schema.json.js +0 -386
  125. package/dist/esm/datasource/schema/datasources/yesoreyeram-infinity-datasource.schema.json.js.map +0 -1
  126. package/dist/esm/datasource/schema/llmHints.js.map +0 -1
  127. package/dist/esm/datasource/schema/provisioningYaml.js.map +0 -1
  128. package/dist/esm/datasource/schema/schemaRegistry.js +0 -139
  129. package/dist/esm/datasource/schema/schemaRegistry.js.map +0 -1
  130. /package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/{useHealthChecks.js → hooks/useHealthChecks.js} +0 -0
  131. /package/dist/esm/{datasource/schema/datasources → schema/registry}/alertmanager.schema.json.js +0 -0
  132. /package/dist/esm/{datasource/schema/datasources → schema/registry}/alertmanager.schema.json.js.map +0 -0
  133. /package/dist/esm/{datasource/schema/datasources → schema/registry}/cloudwatch.schema.json.js.map +0 -0
  134. /package/dist/esm/{datasource/schema/datasources → schema/registry}/elasticsearch.schema.json.js +0 -0
  135. /package/dist/esm/{datasource/schema/datasources → schema/registry}/elasticsearch.schema.json.js.map +0 -0
  136. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-amazonprometheus-datasource.schema.json.js +0 -0
  137. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-amazonprometheus-datasource.schema.json.js.map +0 -0
  138. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-appdynamics-datasource.schema.json.js +0 -0
  139. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-appdynamics-datasource.schema.json.js.map +0 -0
  140. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-astradb-datasource.schema.json.js +0 -0
  141. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-astradb-datasource.schema.json.js.map +0 -0
  142. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-athena-datasource.schema.json.js +0 -0
  143. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-athena-datasource.schema.json.js.map +0 -0
  144. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azure-data-explorer-datasource.schema.json.js +0 -0
  145. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azure-data-explorer-datasource.schema.json.js.map +0 -0
  146. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azure-monitor-datasource.schema.json.js +0 -0
  147. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azure-monitor-datasource.schema.json.js.map +0 -0
  148. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azuredevops-datasource.schema.json.js +0 -0
  149. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azuredevops-datasource.schema.json.js.map +0 -0
  150. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azureprometheus-datasource.schema.json.js +0 -0
  151. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-azureprometheus-datasource.schema.json.js.map +0 -0
  152. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-cockroachdb-datasource.schema.json.js +0 -0
  153. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-cockroachdb-datasource.schema.json.js.map +0 -0
  154. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-databricks-datasource.schema.json.js +0 -0
  155. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-databricks-datasource.schema.json.js.map +0 -0
  156. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-datadog-datasource.schema.json.js +0 -0
  157. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-datadog-datasource.schema.json.js.map +0 -0
  158. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-dynatrace-datasource.schema.json.js +0 -0
  159. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-dynatrace-datasource.schema.json.js.map +0 -0
  160. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-falconlogscale-datasource.schema.json.js +0 -0
  161. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-falconlogscale-datasource.schema.json.js.map +0 -0
  162. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-github-datasource.schema.json.js +0 -0
  163. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-github-datasource.schema.json.js.map +0 -0
  164. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-gitlab-datasource.schema.json.js +0 -0
  165. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-gitlab-datasource.schema.json.js.map +0 -0
  166. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-honeycomb-datasource.schema.json.js +0 -0
  167. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-honeycomb-datasource.schema.json.js.map +0 -0
  168. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-iot-sitewise-datasource.schema.json.js +0 -0
  169. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-iot-sitewise-datasource.schema.json.js.map +0 -0
  170. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-jira-datasource.schema.json.js +0 -0
  171. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-jira-datasource.schema.json.js.map +0 -0
  172. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-looker-datasource.schema.json.js +0 -0
  173. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-looker-datasource.schema.json.js.map +0 -0
  174. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-mongodb-datasource.schema.json.js +0 -0
  175. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-mongodb-datasource.schema.json.js.map +0 -0
  176. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-mqtt-datasource.schema.json.js.map +0 -0
  177. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-newrelic-datasource.schema.json.js +0 -0
  178. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-newrelic-datasource.schema.json.js.map +0 -0
  179. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-odbc-datasource.schema.json.js +0 -0
  180. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-odbc-datasource.schema.json.js.map +0 -0
  181. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-opensearch-datasource.schema.json.js +0 -0
  182. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-opensearch-datasource.schema.json.js.map +0 -0
  183. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-oracle-datasource.schema.json.js +0 -0
  184. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-oracle-datasource.schema.json.js.map +0 -0
  185. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-pagerduty-datasource.schema.json.js +0 -0
  186. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-pagerduty-datasource.schema.json.js.map +0 -0
  187. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-pyroscope-datasource.schema.json.js +0 -0
  188. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-pyroscope-datasource.schema.json.js.map +0 -0
  189. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-redshift-datasource.schema.json.js +0 -0
  190. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-redshift-datasource.schema.json.js.map +0 -0
  191. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-salesforce-datasource.schema.json.js +0 -0
  192. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-salesforce-datasource.schema.json.js.map +0 -0
  193. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-saphana-datasource.schema.json.js +0 -0
  194. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-saphana-datasource.schema.json.js.map +0 -0
  195. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-sentry-datasource.schema.json.js +0 -0
  196. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-sentry-datasource.schema.json.js.map +0 -0
  197. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-servicenow-datasource.schema.json.js +0 -0
  198. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-servicenow-datasource.schema.json.js.map +0 -0
  199. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-snowflake-datasource.schema.json.js +0 -0
  200. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-snowflake-datasource.schema.json.js.map +0 -0
  201. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-splunk-datasource.schema.json.js +0 -0
  202. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-splunk-datasource.schema.json.js.map +0 -0
  203. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-splunkobservability-datasource.schema.json.js +0 -0
  204. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-splunkobservability-datasource.schema.json.js.map +0 -0
  205. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-strava-datasource.schema.json.js +0 -0
  206. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-strava-datasource.schema.json.js.map +0 -0
  207. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-sumologic-datasource.schema.json.js +0 -0
  208. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-sumologic-datasource.schema.json.js.map +0 -0
  209. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-surrealdb-datasource.schema.json.js +0 -0
  210. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-surrealdb-datasource.schema.json.js.map +0 -0
  211. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-timestream-datasource.schema.json.js +0 -0
  212. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-timestream-datasource.schema.json.js.map +0 -0
  213. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-wavefront-datasource.schema.json.js +0 -0
  214. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-wavefront-datasource.schema.json.js.map +0 -0
  215. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-x-ray-datasource.schema.json.js +0 -0
  216. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-x-ray-datasource.schema.json.js.map +0 -0
  217. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-yugabyte-datasource.schema.json.js +0 -0
  218. /package/dist/esm/{datasource/schema/datasources → schema/registry}/grafana-yugabyte-datasource.schema.json.js.map +0 -0
  219. /package/dist/esm/{datasource/schema/datasources → schema/registry}/graphite.schema.json.js +0 -0
  220. /package/dist/esm/{datasource/schema/datasources → schema/registry}/graphite.schema.json.js.map +0 -0
  221. /package/dist/esm/{datasource/schema/datasources → schema/registry}/jaeger.schema.json.js +0 -0
  222. /package/dist/esm/{datasource/schema/datasources → schema/registry}/jaeger.schema.json.js.map +0 -0
  223. /package/dist/esm/{datasource/schema/datasources → schema/registry}/loki.schema.json.js.map +0 -0
  224. /package/dist/esm/{datasource/schema/datasources → schema/registry}/marcusolsson-csv-datasource.schema.json.js +0 -0
  225. /package/dist/esm/{datasource/schema/datasources → schema/registry}/marcusolsson-csv-datasource.schema.json.js.map +0 -0
  226. /package/dist/esm/{datasource/schema/datasources → schema/registry}/marcusolsson-json-datasource.schema.json.js +0 -0
  227. /package/dist/esm/{datasource/schema/datasources → schema/registry}/marcusolsson-json-datasource.schema.json.js.map +0 -0
  228. /package/dist/esm/{datasource/schema/datasources → schema/registry}/mssql.schema.json.js +0 -0
  229. /package/dist/esm/{datasource/schema/datasources → schema/registry}/mssql.schema.json.js.map +0 -0
  230. /package/dist/esm/{datasource/schema/datasources → schema/registry}/opentsdb.schema.json.js +0 -0
  231. /package/dist/esm/{datasource/schema/datasources → schema/registry}/opentsdb.schema.json.js.map +0 -0
  232. /package/dist/esm/{datasource/schema/datasources → schema/registry}/prometheus.schema.json.js.map +0 -0
  233. /package/dist/esm/{datasource/schema/datasources → schema/registry}/zipkin.schema.json.js +0 -0
  234. /package/dist/esm/{datasource/schema/datasources → schema/registry}/zipkin.schema.json.js.map +0 -0
@@ -17,12 +17,13 @@ var AutoSizer = require('react-virtualized-auto-sizer');
17
17
  var sqlFormatter = require('sql-formatter');
18
18
  var rxjs = require('rxjs');
19
19
  var operators$1 = require('rxjs/operators');
20
+ var useDatasourceSchema = require('./useDatasourceSchema-DLkP-L1p.js');
20
21
  var reactHookForm = require('react-hook-form');
22
+ require('@marcbachmann/cel-js');
21
23
  var dnd = require('@hello-pangea/dnd');
22
24
  var reactPopperTooltip = require('react-popper-tooltip');
23
25
  var Prism = require('prismjs');
24
- var yaml = require('js-yaml');
25
- var schemas = require('./schemas.cjs');
26
+ require('js-yaml');
26
27
 
27
28
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
28
29
 
@@ -30,7 +31,6 @@ var React__default = /*#__PURE__*/_interopDefaultCompat(React);
30
31
  var Calendar__default = /*#__PURE__*/_interopDefaultCompat(Calendar);
31
32
  var AutoSizer__default = /*#__PURE__*/_interopDefaultCompat(AutoSizer);
32
33
  var Prism__default = /*#__PURE__*/_interopDefaultCompat(Prism);
33
- var yaml__default = /*#__PURE__*/_interopDefaultCompat(yaml);
34
34
 
35
35
  const QueryEditorRow = (props) => {
36
36
  var _a, _b;
@@ -79,7 +79,7 @@ function Segment(props) {
79
79
  );
80
80
  }
81
81
 
82
- const getStyles$v = (theme) => {
82
+ const getStyles$x = (theme) => {
83
83
  const containerBorder = theme.isDark ? theme.v1.palette.dark9 : theme.v1.palette.gray5;
84
84
  return {
85
85
  container: css.css`
@@ -229,7 +229,7 @@ const getBodyStyles = (theme) => {
229
229
 
230
230
  const DatePicker = React.memo((props) => {
231
231
  const theme = ui.useTheme2();
232
- const styles = getStyles$v(theme);
232
+ const styles = getStyles$x(theme);
233
233
  const { isOpen, onClose } = props;
234
234
  if (!isOpen) {
235
235
  return null;
@@ -259,7 +259,7 @@ const Body = React.memo(({ value, onChange }) => {
259
259
  });
260
260
  Body.displayName = "Body";
261
261
 
262
- function getStyles$u() {
262
+ function getStyles$w() {
263
263
  return {
264
264
  input: css.css({
265
265
  /* hides the native Calendar picker icon given when using type=date */
@@ -275,7 +275,7 @@ const formatDate = (date) => date.toISOString().split("T")[0];
275
275
  const DatePickerWithInput = (props) => {
276
276
  const { value, onChange, className, ...rest } = props;
277
277
  const [open, setOpen] = React.useState(false);
278
- const styles = getStyles$u();
278
+ const styles = getStyles$w();
279
279
  return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement(
280
280
  ui.Input,
281
281
  {
@@ -437,7 +437,7 @@ __publicField$4(DataSourcePicker, "defaultProps", {
437
437
  });
438
438
 
439
439
  const { FormField, Switch } = ui.LegacyForms;
440
- const getStyles$t = ui.stylesFactory(() => ({
440
+ const getStyles$v = ui.stylesFactory(() => ({
441
441
  firstRow: css.css`
442
442
  display: flex;
443
443
  `,
@@ -454,7 +454,7 @@ const getStyles$t = ui.stylesFactory(() => ({
454
454
  }));
455
455
  const DataLink = (props) => {
456
456
  const { value, onChange, onDelete, suggestions, className } = props;
457
- const styles = getStyles$t();
457
+ const styles = getStyles$v();
458
458
  const [showInternalLink, setShowInternalLink] = useInternalLink(value.datasourceUid);
459
459
  const handleChange = (field) => (event) => {
460
460
  onChange({
@@ -571,7 +571,7 @@ function useInternalLink(datasourceUid) {
571
571
  return [showInternalLink, setShowInternalLink];
572
572
  }
573
573
 
574
- const getStyles$s = (theme) => ({
574
+ const getStyles$u = (theme) => ({
575
575
  infoText: css.css`
576
576
  padding-bottom: ${theme.v1.spacing.md};
577
577
  color: ${theme.v1.colors.textWeak};
@@ -583,7 +583,7 @@ const getStyles$s = (theme) => ({
583
583
  const DataLinks = (props) => {
584
584
  const { value, onChange } = props;
585
585
  const theme = ui.useTheme2();
586
- const styles = getStyles$s(theme);
586
+ const styles = getStyles$u(theme);
587
587
  return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement("h3", { className: "page-heading" }, "Data links"), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.infoText }, "Add links to existing fields. Links will be shown in log row details next to the field value."), /* @__PURE__ */ React__default.default.createElement("div", { className: "gf-form-group" }, value && value.map((field, index) => {
588
588
  return /* @__PURE__ */ React__default.default.createElement(
589
589
  DataLink,
@@ -5479,7 +5479,7 @@ const getButtonStyles = (theme) => ({
5479
5479
  });
5480
5480
 
5481
5481
  const InputGroup = ({ children }) => {
5482
- const styles = ui.useStyles2(getStyles$r);
5482
+ const styles = ui.useStyles2(getStyles$t);
5483
5483
  const modifiedChildren = React.Children.map(children, (child) => {
5484
5484
  if (React.isValidElement(child) && child.props.invalid) {
5485
5485
  return React.cloneElement(child, { className: css.cx(child.props.className, styles.invalidChild) });
@@ -5497,7 +5497,7 @@ const borderPriority = [
5497
5497
  "focused"
5498
5498
  // highest priority
5499
5499
  ];
5500
- const getStyles$r = () => ({
5500
+ const getStyles$t = () => ({
5501
5501
  root: css.css({
5502
5502
  display: "flex",
5503
5503
  // Style the direct children of the component
@@ -5580,10 +5580,10 @@ const EditorFieldGroup = ({ children }) => {
5580
5580
  };
5581
5581
 
5582
5582
  const EditorHeader = ({ children }) => {
5583
- const styles = ui.useStyles2(getStyles$q);
5583
+ const styles = ui.useStyles2(getStyles$s);
5584
5584
  return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, children);
5585
5585
  };
5586
- const getStyles$q = (theme) => ({
5586
+ const getStyles$s = (theme) => ({
5587
5587
  root: css.css({
5588
5588
  display: "flex",
5589
5589
  flexWrap: "wrap",
@@ -5596,12 +5596,12 @@ const getStyles$q = (theme) => ({
5596
5596
  const EditorField$1 = (props) => {
5597
5597
  var _a;
5598
5598
  const { label, optional, tooltip, tooltipInteractive, children, width, ...fieldProps } = props;
5599
- const styles = ui.useStyles2(getStyles$p, width);
5599
+ const styles = ui.useStyles2(getStyles$r, width);
5600
5600
  const childInputId = (fieldProps == null ? void 0 : fieldProps.htmlFor) || ((_a = ui.ReactUtils) == null ? void 0 : _a.getChildId(children));
5601
5601
  const labelEl = /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement("label", { className: styles.label, htmlFor: childInputId }, label, optional && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.optional }, " - optional"), tooltip && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { placement: "top", content: tooltip, theme: "info", interactive: tooltipInteractive }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { tabIndex: 0, name: "info-circle", size: "sm", className: styles.icon }))), /* @__PURE__ */ React__default.default.createElement(ui.Space, { v: 0.5 }));
5602
5602
  return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, /* @__PURE__ */ React__default.default.createElement(ui.Field, { className: styles.field, label: labelEl, ...fieldProps }, children));
5603
5603
  };
5604
- const getStyles$p = (theme, width) => {
5604
+ const getStyles$r = (theme, width) => {
5605
5605
  return {
5606
5606
  root: css.css({
5607
5607
  minWidth: theme.spacing(width != null ? width : 0)
@@ -5629,10 +5629,10 @@ const getStyles$p = (theme, width) => {
5629
5629
  };
5630
5630
 
5631
5631
  const EditorRow$1 = ({ children }) => {
5632
- const styles = ui.useStyles2(getStyles$o);
5632
+ const styles = ui.useStyles2(getStyles$q);
5633
5633
  return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, /* @__PURE__ */ React__default.default.createElement(EditorStack, { gap: 2 }, children));
5634
5634
  };
5635
- const getStyles$o = (theme) => {
5635
+ const getStyles$q = (theme) => {
5636
5636
  return {
5637
5637
  root: css.css({
5638
5638
  padding: theme.spacing(1),
@@ -5647,10 +5647,10 @@ const EditorRows$1 = ({ children }) => {
5647
5647
  };
5648
5648
 
5649
5649
  const EditorSwitch = (props) => {
5650
- const styles = getStyles$n();
5650
+ const styles = getStyles$p();
5651
5651
  return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.switch }, /* @__PURE__ */ React__default.default.createElement(ui.Switch, { ...props }));
5652
5652
  };
5653
- const getStyles$n = () => {
5653
+ const getStyles$p = () => {
5654
5654
  return {
5655
5655
  switch: css.css({
5656
5656
  display: "flex",
@@ -5708,10 +5708,10 @@ const getSelectStyles = (theme) => ({
5708
5708
  });
5709
5709
 
5710
5710
  const Space = ({ v = 0, h = 0, layout = "block" }) => {
5711
- const styles = ui.useStyles2(getStyles$m, v, h, layout);
5711
+ const styles = ui.useStyles2(getStyles$o, v, h, layout);
5712
5712
  return /* @__PURE__ */ React__default.default.createElement("span", { className: css.cx(styles.wrapper) });
5713
5713
  };
5714
- const getStyles$m = (theme, v, h, layout) => ({
5714
+ const getStyles$o = (theme, v, h, layout) => ({
5715
5715
  wrapper: css.css([
5716
5716
  {
5717
5717
  paddingRight: theme.spacing(h != null ? h : 0),
@@ -6323,7 +6323,7 @@ function RawEditor({
6323
6323
  language = "sql"
6324
6324
  }) {
6325
6325
  const theme = ui.useTheme2();
6326
- const styles = ui.useStyles2(getStyles$l);
6326
+ const styles = ui.useStyles2(getStyles$n);
6327
6327
  const [isExpanded, setIsExpanded] = React.useState(false);
6328
6328
  const [toolboxRef, toolboxMeasure] = reactUse.useMeasure();
6329
6329
  const [editorRef, editorMeasure] = reactUse.useMeasure();
@@ -6393,7 +6393,7 @@ function RawEditor({
6393
6393
  renderEditor(true)
6394
6394
  ));
6395
6395
  }
6396
- function getStyles$l(theme) {
6396
+ function getStyles$n(theme) {
6397
6397
  return {
6398
6398
  modal: css.css`
6399
6399
  width: 95vw;
@@ -6408,7 +6408,7 @@ function getStyles$l(theme) {
6408
6408
 
6409
6409
  function Preview({ rawSql, language = "sql" }) {
6410
6410
  const [_, copyToClipboard] = reactUse.useCopyToClipboard();
6411
- const styles = ui.useStyles2(getStyles$k);
6411
+ const styles = ui.useStyles2(getStyles$m);
6412
6412
  const labelElement = /* @__PURE__ */ React__default.default.createElement("div", { className: styles.labelWrapper }, /* @__PURE__ */ React__default.default.createElement("label", { className: styles.label }, "Preview"), /* @__PURE__ */ React__default.default.createElement(ui.IconButton, { tooltip: "Copy to clipboard", onClick: () => copyToClipboard(rawSql), name: "copy" }));
6413
6413
  return /* @__PURE__ */ React__default.default.createElement(ui.Field, { label: labelElement, className: styles.grow }, /* @__PURE__ */ React__default.default.createElement(
6414
6414
  ui.CodeEditor,
@@ -6422,7 +6422,7 @@ function Preview({ rawSql, language = "sql" }) {
6422
6422
  }
6423
6423
  ));
6424
6424
  }
6425
- function getStyles$k(theme) {
6425
+ function getStyles$m(theme) {
6426
6426
  return {
6427
6427
  grow: css.css({ flexGrow: 1 }),
6428
6428
  label: css.css({ fontSize: 12, fontWeight: theme.typography.fontWeightMedium }),
@@ -6541,7 +6541,7 @@ function SQLOrderByRow({ fields, query, onQueryChange, db }) {
6541
6541
  const asteriskValue = { label: "*", value: "*" };
6542
6542
  function SelectRow({ sql, columns, onSqlChange, functions }) {
6543
6543
  var _a;
6544
- const styles = ui.useStyles2(getStyles$j);
6544
+ const styles = ui.useStyles2(getStyles$l);
6545
6545
  const columnsWithAsterisk = [asteriskValue, ...columns || []];
6546
6546
  const onColumnChange = React.useCallback(
6547
6547
  (item, index) => (column) => {
@@ -6637,7 +6637,7 @@ function SelectRow({ sql, columns, onSqlChange, functions }) {
6637
6637
  }
6638
6638
  ));
6639
6639
  }
6640
- const getStyles$j = () => {
6640
+ const getStyles$l = () => {
6641
6641
  return { addButton: css.css({ alignSelf: "flex-start" }) };
6642
6642
  };
6643
6643
  function getColumnValue({ parameters }) {
@@ -6983,10 +6983,10 @@ function mapFieldsToTypes(columns) {
6983
6983
  }
6984
6984
 
6985
6985
  const EditorRow = ({ children }) => {
6986
- const styles = ui.useStyles2(getStyles$i);
6986
+ const styles = ui.useStyles2(getStyles$k);
6987
6987
  return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, /* @__PURE__ */ React__default.default.createElement(EditorStack, { gap: 2 }, children));
6988
6988
  };
6989
- const getStyles$i = (theme) => {
6989
+ const getStyles$k = (theme) => {
6990
6990
  return {
6991
6991
  root: css.css({
6992
6992
  padding: theme.spacing(1),
@@ -7000,12 +7000,12 @@ const EditorField = (props) => {
7000
7000
  var _a;
7001
7001
  const { label, optional, tooltip, children, width, ...fieldProps } = props;
7002
7002
  const theme = ui.useTheme2();
7003
- const styles = getStyles$h(theme, width);
7003
+ const styles = getStyles$j(theme, width);
7004
7004
  const childInputId = (fieldProps == null ? void 0 : fieldProps.htmlFor) || ((_a = ui.ReactUtils) == null ? void 0 : _a.getChildId(children));
7005
7005
  const labelEl = /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement("label", { className: styles.label, htmlFor: childInputId }, label, optional && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.optional }, " - optional"), tooltip && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { placement: "top", content: tooltip, theme: "info" }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "sm", className: styles.icon }))), /* @__PURE__ */ React__default.default.createElement(Space, { v: 0.5 }));
7006
7006
  return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, /* @__PURE__ */ React__default.default.createElement(ui.Field, { className: styles.field, label: labelEl, ...fieldProps }, children));
7007
7007
  };
7008
- const getStyles$h = ui.stylesFactory((theme, width) => {
7008
+ const getStyles$j = ui.stylesFactory((theme, width) => {
7009
7009
  return {
7010
7010
  root: css.css({
7011
7011
  minWidth: theme.spacing(width != null ? width : 0)
@@ -7455,7 +7455,7 @@ const ConfigSubSection = ({ children, ...props }) => {
7455
7455
  function ConfigDescriptionLink(props) {
7456
7456
  const { description, suffix, feature } = props;
7457
7457
  const text = `Learn more about ${feature}`;
7458
- const styles = ui.useStyles2(getStyles$g);
7458
+ const styles = ui.useStyles2(getStyles$i);
7459
7459
  return /* @__PURE__ */ React__default.default.createElement("span", { className: styles.container }, description, /* @__PURE__ */ React__default.default.createElement(
7460
7460
  "a",
7461
7461
  {
@@ -7467,7 +7467,7 @@ function ConfigDescriptionLink(props) {
7467
7467
  text
7468
7468
  ));
7469
7469
  }
7470
- const getStyles$g = (theme) => {
7470
+ const getStyles$i = (theme) => {
7471
7471
  return {
7472
7472
  container: css.css({
7473
7473
  color: theme.colors.text.secondary,
@@ -8436,240 +8436,53 @@ const AdvancedHttpSettings = ({
8436
8436
  ));
8437
8437
  };
8438
8438
 
8439
- function resolveGroups(schema) {
8440
- const fieldMap = /* @__PURE__ */ new Map();
8441
- for (const f of schema.fields) {
8442
- fieldMap.set(f.id, f);
8443
- }
8444
- if (schema.groups && schema.groups.length > 0) {
8445
- return schema.groups.slice().sort((a, b) => {
8446
- var _a, _b;
8447
- return ((_a = a.order) != null ? _a : 0) - ((_b = b.order) != null ? _b : 0);
8448
- }).map((g) => ({
8449
- group: g,
8450
- fields: g.fieldRefs.map((ref) => fieldMap.get(ref)).filter((f) => f != null)
8451
- }));
8452
- }
8453
- const allFields = schema.fields.filter((f) => f.kind !== "virtual" && !f.isItemField);
8454
- return [
8455
- {
8456
- group: { id: "default", title: "Configuration", fieldRefs: allFields.map((f) => f.id) },
8457
- fields: allFields
8458
- }
8459
- ];
8439
+ const SECURE_FIELD_CONFIGURED = "__CONFIGURED__";
8440
+ function resolveSecureKeyTemplate(template, item, index) {
8441
+ return template.replace(/\{index1\}/g, String(index + 1)).replace(/\{index\}/g, String(index)).replace(/\{item\.(\w+)\}/g, (_, key) => {
8442
+ var _a;
8443
+ return String((_a = item[key]) != null ? _a : "");
8444
+ });
8460
8445
  }
8461
- function resolveRequiredFieldsGroup(schema) {
8462
- var _a;
8463
- const fieldMap = /* @__PURE__ */ new Map();
8464
- for (const f of schema.fields) {
8465
- fieldMap.set(f.id, f);
8466
- }
8467
- const requiredIds = /* @__PURE__ */ new Set();
8468
- for (const f of schema.fields) {
8469
- if (f.required) {
8470
- requiredIds.add(f.id);
8471
- }
8472
- }
8473
- const authGroup = (_a = schema.groups) == null ? void 0 : _a.find((g) => g.id === "auth");
8474
- if (authGroup) {
8475
- for (const ref of authGroup.fieldRefs) {
8476
- if (fieldMap.has(ref)) {
8477
- requiredIds.add(ref);
8478
- }
8479
- }
8480
- }
8481
- if (requiredIds.size === 0) {
8482
- return null;
8483
- }
8484
- const includeIds = /* @__PURE__ */ new Set();
8485
- for (const id of requiredIds) {
8486
- includeIds.add(id);
8487
- const f = fieldMap.get(id);
8488
- if (f == null ? void 0 : f.dependsOn) {
8489
- const parsed = parseDependsOn(f.dependsOn);
8490
- if (parsed && fieldMap.has(parsed.field)) {
8491
- includeIds.add(parsed.field);
8492
- }
8493
- }
8446
+ function evaluateItemCondition(condition, item) {
8447
+ const trimmed = condition.trim();
8448
+ if (trimmed === "true") {
8449
+ return true;
8494
8450
  }
8495
- for (const f of schema.fields) {
8496
- if (f.dependsOn && !includeIds.has(f.id)) {
8497
- const parsed = parseDependsOn(f.dependsOn);
8498
- if (parsed && requiredIds.has(parsed.field)) {
8499
- includeIds.add(f.id);
8500
- }
8501
- }
8451
+ const match = trimmed.match(/^item\.(\w+)\s*==\s*(.+)$/);
8452
+ if (!match) {
8453
+ return false;
8502
8454
  }
8503
- const virtualFields = schema.fields.filter((f) => includeIds.has(f.id));
8504
- if (virtualFields.length === 0) {
8505
- return null;
8455
+ const [, key, rawValue] = match;
8456
+ const actualValue = item[key];
8457
+ const expected = rawValue.trim();
8458
+ if (expected === "true") {
8459
+ return actualValue === true;
8506
8460
  }
8507
- return {
8508
- group: {
8509
- id: "_required",
8510
- title: "Required",
8511
- fieldRefs: virtualFields.map((f) => f.id)
8512
- },
8513
- fields: virtualFields
8514
- };
8515
- }
8516
- function formKey(field) {
8517
- return field.section ? `${field.section}.${field.key}` : field.key;
8518
- }
8519
- function parseDependsOn(expr) {
8520
- var _a, _b;
8521
- const m = expr.match(/^(.+?)\s*==\s*(?:'([^']*)'|"([^"]*)"|(.+))$/);
8522
- if (!m) {
8523
- return null;
8461
+ if (expected === "false") {
8462
+ return actualValue === false;
8524
8463
  }
8525
- return { field: m[1].trim(), value: ((_b = (_a = m[2]) != null ? _a : m[3]) != null ? _b : m[4]).trim() };
8464
+ const unquoted = expected.replace(/^['"]|['"]$/g, "");
8465
+ return String(actualValue) === unquoted;
8526
8466
  }
8527
- function resolveActiveOverride(field, watchedValues, fieldById) {
8528
- var _a;
8529
- if (!field.overrides || field.overrides.length === 0) {
8530
- return void 0;
8531
- }
8532
- for (const ov of field.overrides) {
8533
- const parsed = parseDependsOn(ov.when);
8534
- if (!parsed) {
8467
+ function findActiveSecureOverride(itemFields, item, index) {
8468
+ for (const field of itemFields) {
8469
+ if (!field.overrides) {
8535
8470
  continue;
8536
8471
  }
8537
- const depField = fieldById.get(parsed.field);
8538
- const depKey = depField ? formKey(depField) : parsed.field;
8539
- if (String((_a = watchedValues[depKey]) != null ? _a : "") === parsed.value) {
8540
- return ov;
8541
- }
8542
- }
8543
- return void 0;
8544
- }
8545
- function resolveFieldValue(ref, values, fields) {
8546
- if (ref in values) {
8547
- return values[ref];
8548
- }
8549
- const field = fields.find((f) => f.id === ref);
8550
- if (field) {
8551
- const fk = formKey(field);
8552
- if (fk in values) {
8553
- return values[fk];
8554
- }
8555
- }
8556
- return void 0;
8557
- }
8558
- function evaluateComputedRead(expr, values, fields) {
8559
- function evalExpr(s) {
8560
- var _a;
8561
- s = s.trim();
8562
- if (s.startsWith("(") && findMatchingParen(s, 0) === s.length - 1) {
8563
- s = s.slice(1, -1).trim();
8564
- }
8565
- const qIdx = findTopLevel(s, "?");
8566
- if (qIdx !== -1) {
8567
- const condition = s.slice(0, qIdx).trim();
8568
- const rest = s.slice(qIdx + 1);
8569
- const cIdx = findTopLevel(rest, ":");
8570
- if (cIdx !== -1) {
8571
- const trueExpr = rest.slice(0, cIdx).trim();
8572
- const falseExpr = rest.slice(cIdx + 1).trim();
8573
- return evalCondition(condition) ? evalExpr(trueExpr) : evalExpr(falseExpr);
8574
- }
8575
- }
8576
- const strMatch = (_a = s.match(/^'([^']*)'$/)) != null ? _a : s.match(/^"([^"]*)"$/);
8577
- if (strMatch) {
8578
- return strMatch[1];
8579
- }
8580
- if (s === "true") {
8581
- return true;
8582
- }
8583
- if (s === "false") {
8584
- return false;
8585
- }
8586
- if (/^-?\d+(\.\d+)?$/.test(s)) {
8587
- return Number(s);
8588
- }
8589
- return resolveFieldValue(s, values, fields);
8590
- }
8591
- function evalCondition(cond) {
8592
- const eqMatch = cond.match(/^(.+?)\s*(==|!=)\s*(.+)$/);
8593
- if (eqMatch) {
8594
- const left = evalExpr(eqMatch[1]);
8595
- const right = evalExpr(eqMatch[3]);
8596
- const eq = String(left) === String(right);
8597
- return eqMatch[2] === "==" ? eq : !eq;
8598
- }
8599
- return !!evalExpr(cond);
8600
- }
8601
- function findMatchingParen(s, start) {
8602
- let depth = 0;
8603
- for (let i = start; i < s.length; i++) {
8604
- if (s[i] === "(") {
8605
- depth++;
8606
- } else if (s[i] === ")") {
8607
- depth--;
8608
- if (depth === 0) {
8609
- return i;
8610
- }
8611
- }
8612
- }
8613
- return -1;
8614
- }
8615
- function findTopLevel(s, char) {
8616
- let depth = 0;
8617
- let inStr = null;
8618
- for (let i = 0; i < s.length; i++) {
8619
- const c = s[i];
8620
- if (inStr) {
8621
- if (c === inStr) {
8622
- inStr = null;
8623
- }
8624
- continue;
8625
- }
8626
- if (c === "'" || c === '"') {
8627
- inStr = c;
8628
- continue;
8629
- }
8630
- if (c === "(") {
8631
- depth++;
8472
+ for (const override of field.overrides) {
8473
+ if (!override.secureKey) {
8632
8474
  continue;
8633
8475
  }
8634
- if (c === ")") {
8635
- depth--;
8636
- continue;
8637
- }
8638
- if (depth === 0 && c === char) {
8639
- return i;
8640
- }
8641
- }
8642
- return -1;
8643
- }
8644
- try {
8645
- return evalExpr(expr);
8646
- } catch (e) {
8647
- return void 0;
8648
- }
8649
- }
8650
- function computeVirtualFieldValues(schema, existingValues) {
8651
- var _a;
8652
- const virtualValues = {};
8653
- for (const field of schema.fields) {
8654
- if (field.kind !== "virtual") {
8655
- continue;
8656
- }
8657
- const fk = formKey(field);
8658
- if (((_a = field.storage) == null ? void 0 : _a.type) === "computed" && field.storage.read) {
8659
- const val = evaluateComputedRead(field.storage.read, existingValues, schema.fields);
8660
- if (val !== void 0) {
8661
- virtualValues[fk] = val;
8662
- } else if (field.defaultValue !== void 0) {
8663
- virtualValues[fk] = field.defaultValue;
8476
+ if (evaluateItemCondition(override.when, item)) {
8477
+ return {
8478
+ fieldKey: field.key,
8479
+ resolvedKey: resolveSecureKeyTemplate(override.secureKey, item, index)
8480
+ };
8664
8481
  }
8665
- } else if (field.defaultValue !== void 0) {
8666
- virtualValues[fk] = field.defaultValue;
8667
8482
  }
8668
8483
  }
8669
- return virtualValues;
8484
+ return null;
8670
8485
  }
8671
-
8672
- const SECURE_FIELD_CONFIGURED = "__CONFIGURED__";
8673
8486
  function patternToRegex(pattern) {
8674
8487
  const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
8675
8488
  return new RegExp("^" + escaped.replace("\\{index\\}", "(\\d+)") + "$");
@@ -8776,7 +8589,7 @@ function resolveRawPath(ref, ds) {
8776
8589
  return void 0;
8777
8590
  }
8778
8591
  async function fetchExistingValues(dsUid, fields) {
8779
- var _a, _b, _c, _d, _e;
8592
+ var _a, _b, _c, _d, _e, _f;
8780
8593
  try {
8781
8594
  const ds = await runtime.getBackendSrv().get(`/api/datasources/uid/${dsUid}`, void 0, void 0, {
8782
8595
  showErrorAlert: false
@@ -8787,7 +8600,7 @@ async function fetchExistingValues(dsUid, fields) {
8787
8600
  values[field.key] = expandIndexedPair(field, ds);
8788
8601
  continue;
8789
8602
  }
8790
- const fk = formKey(field);
8603
+ const fk = useDatasourceSchema.formKey(field);
8791
8604
  switch (field.target) {
8792
8605
  case "root":
8793
8606
  if (ds[field.key] !== void 0) {
@@ -8817,6 +8630,32 @@ async function fetchExistingValues(dsUid, fields) {
8817
8630
  }
8818
8631
  }
8819
8632
  }
8633
+ for (const field of fields) {
8634
+ if (field.valueType !== "array" || !((_f = field.item) == null ? void 0 : _f.fields)) {
8635
+ continue;
8636
+ }
8637
+ const itemFields = field.item.fields;
8638
+ const hasSecureOverride = itemFields.some((f) => {
8639
+ var _a2;
8640
+ return (_a2 = f.overrides) == null ? void 0 : _a2.some((o) => o.secureKey);
8641
+ });
8642
+ if (!hasSecureOverride) {
8643
+ continue;
8644
+ }
8645
+ const fk = useDatasourceSchema.formKey(field);
8646
+ const arr = values[fk];
8647
+ if (!Array.isArray(arr)) {
8648
+ continue;
8649
+ }
8650
+ values[fk] = arr.map((item, idx) => {
8651
+ var _a2;
8652
+ const match = findActiveSecureOverride(itemFields, item, idx);
8653
+ if (match && ((_a2 = ds.secureJsonFields) == null ? void 0 : _a2[match.resolvedKey])) {
8654
+ return { ...item, [match.fieldKey]: SECURE_FIELD_CONFIGURED };
8655
+ }
8656
+ return item;
8657
+ });
8658
+ }
8820
8659
  return { values, readOnly: !!ds.readOnly };
8821
8660
  } catch (err) {
8822
8661
  const message = err instanceof Error ? err.message : "Failed to load datasource configuration";
@@ -8824,7 +8663,7 @@ async function fetchExistingValues(dsUid, fields) {
8824
8663
  }
8825
8664
  }
8826
8665
  function buildDatasourceConfigPayload(data, fields, existing, isFieldVisible) {
8827
- var _a, _b, _c, _d;
8666
+ var _a, _b, _c, _d, _e, _f, _g, _h;
8828
8667
  const rootFields = {};
8829
8668
  const jsonData = { ...(_a = existing.jsonData) != null ? _a : {} };
8830
8669
  const secureJsonData = {};
@@ -8839,7 +8678,7 @@ function buildDatasourceConfigPayload(data, fields, existing, isFieldVisible) {
8839
8678
  if (!isManagedByEffect && !isFieldVisible(field)) {
8840
8679
  continue;
8841
8680
  }
8842
- const fk = formKey(field);
8681
+ const fk = useDatasourceSchema.formKey(field);
8843
8682
  const value = data[fk];
8844
8683
  if (field.target === "secureJsonData") {
8845
8684
  if (value === SECURE_FIELD_CONFIGURED) {
@@ -8873,6 +8712,60 @@ function buildDatasourceConfigPayload(data, fields, existing, isFieldVisible) {
8873
8712
  break;
8874
8713
  }
8875
8714
  }
8715
+ for (const field of fields) {
8716
+ if (field.valueType !== "array" || !((_e = field.item) == null ? void 0 : _e.fields) || field.target !== "jsonData") {
8717
+ continue;
8718
+ }
8719
+ const itemFields = field.item.fields;
8720
+ const hasSecureOverride = itemFields.some((f) => {
8721
+ var _a2;
8722
+ return (_a2 = f.overrides) == null ? void 0 : _a2.some((o) => o.secureKey);
8723
+ });
8724
+ if (!hasSecureOverride) {
8725
+ continue;
8726
+ }
8727
+ const arr = field.section ? (_f = jsonData[field.section]) == null ? void 0 : _f[field.key] : jsonData[field.key];
8728
+ if (!Array.isArray(arr)) {
8729
+ continue;
8730
+ }
8731
+ const secureKeyOverrides = [];
8732
+ for (const f of itemFields) {
8733
+ for (const o of (_g = f.overrides) != null ? _g : []) {
8734
+ if (o.secureKey) {
8735
+ secureKeyOverrides.push({ fieldKey: f.key, override: o });
8736
+ }
8737
+ }
8738
+ }
8739
+ const activeSecureKeys = /* @__PURE__ */ new Set();
8740
+ for (let i = 0; i < arr.length; i++) {
8741
+ const item = arr[i];
8742
+ const match = findActiveSecureOverride(itemFields, item, i);
8743
+ if (!match) {
8744
+ continue;
8745
+ }
8746
+ const resolvedKey = match.resolvedKey;
8747
+ activeSecureKeys.add(resolvedKey);
8748
+ const itemValue = item[match.fieldKey];
8749
+ if (itemValue === SECURE_FIELD_CONFIGURED) {
8750
+ secureJsonFields[resolvedKey] = true;
8751
+ } else if (itemValue && itemValue !== "") {
8752
+ secureJsonData[resolvedKey] = String(itemValue);
8753
+ secureJsonFields[resolvedKey] = false;
8754
+ item[match.fieldKey] = "";
8755
+ }
8756
+ }
8757
+ const existingSecureFields = (_h = existing.secureJsonFields) != null ? _h : {};
8758
+ for (const existingKey of Object.keys(existingSecureFields)) {
8759
+ const couldBeFromThisField = secureKeyOverrides.some((sko) => {
8760
+ const staticPrefix = sko.override.secureKey.split("{")[0];
8761
+ return staticPrefix && existingKey.startsWith(staticPrefix);
8762
+ });
8763
+ if (couldBeFromThisField && !activeSecureKeys.has(existingKey)) {
8764
+ secureJsonFields[existingKey] = false;
8765
+ secureJsonData[existingKey] = "";
8766
+ }
8767
+ }
8768
+ }
8876
8769
  return { rootFields, jsonData, secureJsonData, secureJsonFields };
8877
8770
  }
8878
8771
  async function submitDatasourceConfig(dsUid, data, fields, isFieldVisible) {
@@ -8910,23 +8803,25 @@ function evaluateEffectCondition(when, fieldValue) {
8910
8803
  const eq = String(fieldValue) === String(target);
8911
8804
  return op === "==" ? eq : !eq;
8912
8805
  }
8913
- function isFieldRequired(field, watchedValues, fieldById) {
8914
- var _a;
8806
+ function isFieldRequired(field, watchedValues, fieldById, celContext) {
8915
8807
  if (field.required) {
8916
8808
  return true;
8917
8809
  }
8918
8810
  if (field.requiredWhen) {
8919
- const parsed = parseDependsOn(field.requiredWhen);
8811
+ if (celContext) {
8812
+ return useDatasourceSchema.evaluateCelExpression(field.requiredWhen, celContext);
8813
+ }
8814
+ const parsed = useDatasourceSchema.parseDependsOn(field.requiredWhen);
8920
8815
  if (parsed) {
8921
8816
  const depField = fieldById.get(parsed.field);
8922
- const depKey = depField ? formKey(depField) : parsed.field;
8923
- return String((_a = watchedValues[depKey]) != null ? _a : "") === parsed.value;
8817
+ const depKey = depField ? useDatasourceSchema.formKey(depField) : parsed.field;
8818
+ return useDatasourceSchema.evaluateDependsOn(parsed, useDatasourceSchema.getWatchedValue(watchedValues, depKey));
8924
8819
  }
8925
8820
  }
8926
8821
  return false;
8927
8822
  }
8928
8823
  function buildValidationRules(field, required) {
8929
- var _a, _b, _c, _d, _e, _f;
8824
+ var _a, _b, _c, _d, _e, _f, _g, _h;
8930
8825
  const rules = {};
8931
8826
  const label = (_a = field.label) != null ? _a : field.key;
8932
8827
  if (required) {
@@ -8944,29 +8839,65 @@ function buildValidationRules(field, required) {
8944
8839
  rules.required = `${label} is required`;
8945
8840
  }
8946
8841
  }
8842
+ if (field.valueType === "array" && ((_b = field.item) == null ? void 0 : _b.valueType) === "object" && ((_c = field.item.fields) == null ? void 0 : _c.length)) {
8843
+ const requiredItemFields = field.item.fields.filter((f) => f.required);
8844
+ if (requiredItemFields.length > 0) {
8845
+ const existingValidate = rules.validate;
8846
+ rules.validate = (value) => {
8847
+ var _a2;
8848
+ if (existingValidate) {
8849
+ const r = existingValidate(value);
8850
+ if (r !== true) {
8851
+ return r;
8852
+ }
8853
+ }
8854
+ if (!Array.isArray(value)) {
8855
+ return true;
8856
+ }
8857
+ const itemErrors = {};
8858
+ for (let i = 0; i < value.length; i++) {
8859
+ const item = value[i];
8860
+ const missing = [];
8861
+ for (const rf of requiredItemFields) {
8862
+ const v = item[rf.key];
8863
+ if (v === void 0 || v === null || v === "") {
8864
+ missing.push((_a2 = rf.label) != null ? _a2 : rf.key);
8865
+ }
8866
+ }
8867
+ if (missing.length > 0) {
8868
+ itemErrors[i] = `${missing.join(", ")} required`;
8869
+ }
8870
+ }
8871
+ if (Object.keys(itemErrors).length === 0) {
8872
+ return true;
8873
+ }
8874
+ return `__ITEM_ERRORS__${JSON.stringify(itemErrors)}`;
8875
+ };
8876
+ }
8877
+ }
8947
8878
  if (field.validations) {
8948
8879
  for (const v of field.validations) {
8949
8880
  switch (v.type) {
8950
8881
  case "pattern":
8951
8882
  rules.pattern = {
8952
8883
  value: new RegExp(v.pattern),
8953
- message: (_b = v.message) != null ? _b : `Invalid ${label}`
8884
+ message: (_d = v.message) != null ? _d : `Invalid ${label}`
8954
8885
  };
8955
8886
  break;
8956
8887
  case "range":
8957
8888
  if (v.min !== void 0) {
8958
- rules.min = { value: v.min, message: (_c = v.message) != null ? _c : `Minimum value is ${v.min}` };
8889
+ rules.min = { value: v.min, message: (_e = v.message) != null ? _e : `Minimum value is ${v.min}` };
8959
8890
  }
8960
8891
  if (v.max !== void 0) {
8961
- rules.max = { value: v.max, message: (_d = v.message) != null ? _d : `Maximum value is ${v.max}` };
8892
+ rules.max = { value: v.max, message: (_f = v.message) != null ? _f : `Maximum value is ${v.max}` };
8962
8893
  }
8963
8894
  break;
8964
8895
  case "length":
8965
8896
  if (v.min !== void 0) {
8966
- rules.minLength = { value: v.min, message: (_e = v.message) != null ? _e : `Minimum length is ${v.min}` };
8897
+ rules.minLength = { value: v.min, message: (_g = v.message) != null ? _g : `Minimum length is ${v.min}` };
8967
8898
  }
8968
8899
  if (v.max !== void 0) {
8969
- rules.maxLength = { value: v.max, message: (_f = v.message) != null ? _f : `Maximum length is ${v.max}` };
8900
+ rules.maxLength = { value: v.max, message: (_h = v.message) != null ? _h : `Maximum length is ${v.max}` };
8970
8901
  }
8971
8902
  break;
8972
8903
  }
@@ -8974,16 +8905,24 @@ function buildValidationRules(field, required) {
8974
8905
  }
8975
8906
  return rules;
8976
8907
  }
8908
+ const ITEM_ERRORS_PREFIX = "__ITEM_ERRORS__";
8909
+ function parseItemErrors(errorMessage) {
8910
+ if (!errorMessage || !errorMessage.startsWith(ITEM_ERRORS_PREFIX)) {
8911
+ return null;
8912
+ }
8913
+ try {
8914
+ return JSON.parse(errorMessage.slice(ITEM_ERRORS_PREFIX.length));
8915
+ } catch (e) {
8916
+ return null;
8917
+ }
8918
+ }
8977
8919
 
8978
- function PdcFieldNote({
8979
- enabled,
8980
- description,
8981
- configUrl
8982
- }) {
8983
- const styles = ui.useStyles2(getStyles$f);
8920
+ const PdcFieldNote = (props) => {
8921
+ const { enabled, description, configUrl } = props;
8922
+ const styles = ui.useStyles2(getStyles$h);
8984
8923
  return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.wrapper }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.note }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "shield", size: "xs" }), /* @__PURE__ */ React__default.default.createElement("span", null, "Private data source connect: ", /* @__PURE__ */ React__default.default.createElement("strong", null, enabled ? "Enabled" : "Disabled")), description && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: description }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs" }))), /* @__PURE__ */ React__default.default.createElement(ui.LinkButton, { variant: "secondary", size: "sm", icon: "external-link-alt", href: configUrl }, "Configure in settings"));
8985
- }
8986
- const getStyles$f = (theme) => ({
8924
+ };
8925
+ const getStyles$h = (theme) => ({
8987
8926
  wrapper: css.css({
8988
8927
  display: "flex",
8989
8928
  alignItems: "center",
@@ -9003,18 +8942,14 @@ const getStyles$f = (theme) => ({
9003
8942
  })
9004
8943
  });
9005
8944
 
9006
- function SecureFieldInput({
9007
- formField,
9008
- placeholder,
9009
- disabled,
9010
- label
9011
- }) {
8945
+ function SecureFieldInput(props) {
9012
8946
  var _a;
8947
+ const { formField, placeholder, disabled } = props;
9013
8948
  const isConfigured = formField.value === SECURE_FIELD_CONFIGURED;
9014
8949
  const [revealed, setRevealed] = React.useState(false);
9015
8950
  const styles = ui.useStyles2(getSecureFieldStyles);
9016
8951
  if (isConfigured) {
9017
- return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.configuredRow }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.configuredBadge }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "lock", size: "xs" }), label, " configured"), !disabled && /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "secondary", fill: "text", size: "sm", onClick: () => formField.onChange(""), type: "button" }, "Reset"));
8952
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.configuredRow }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.configuredBadge }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "lock", size: "xs" }), "Configured"), !disabled && /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "secondary", fill: "text", size: "sm", onClick: () => formField.onChange(""), type: "button" }, "Reset"));
9018
8953
  }
9019
8954
  return /* @__PURE__ */ React__default.default.createElement(
9020
8955
  ui.Input,
@@ -9043,7 +8978,8 @@ const getSecureFieldStyles = (theme) => ({
9043
8978
  configuredRow: css.css({
9044
8979
  display: "flex",
9045
8980
  alignItems: "center",
9046
- gap: theme.spacing(1)
8981
+ gap: theme.spacing(1),
8982
+ whiteSpace: "nowrap"
9047
8983
  }),
9048
8984
  configuredBadge: css.css({
9049
8985
  display: "inline-flex",
@@ -9053,108 +8989,180 @@ const getSecureFieldStyles = (theme) => ({
9053
8989
  borderRadius: theme.shape.radius.pill,
9054
8990
  backgroundColor: theme.colors.success.transparent,
9055
8991
  color: theme.colors.success.text,
9056
- fontSize: theme.typography.bodySmall.fontSize
8992
+ fontSize: theme.typography.bodySmall.fontSize,
8993
+ whiteSpace: "nowrap"
9057
8994
  })
9058
8995
  });
9059
8996
 
9060
- function StringArrayInput({
9061
- value,
9062
- onChange,
9063
- placeholder,
9064
- disabled
9065
- }) {
9066
- const [draft, setDraft] = React.useState("");
8997
+ const ComplexFieldNote = (props) => {
8998
+ const { count, label } = props;
8999
+ const styles = ui.useStyles2(getStyles$g);
9000
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.note }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs" }), /* @__PURE__ */ React__default.default.createElement("span", null, count > 0 ? `${count} ${label.toLowerCase()} configured.` : `No ${label.toLowerCase()} configured.`, " Configure in Grafana UI."));
9001
+ };
9002
+ const getStyles$g = (theme) => ({
9003
+ note: css.css({
9004
+ display: "inline-flex",
9005
+ alignItems: "center",
9006
+ gap: theme.spacing(0.5),
9007
+ padding: `${theme.spacing(0.5)} ${theme.spacing(0.75)}`,
9008
+ fontSize: theme.typography.bodySmall.fontSize,
9009
+ color: theme.colors.text.secondary,
9010
+ backgroundColor: theme.colors.background.secondary,
9011
+ borderRadius: theme.shape.radius.default,
9012
+ border: `1px solid ${theme.colors.border.weak}`
9013
+ })
9014
+ });
9015
+
9016
+ function FileUploadField(props) {
9017
+ var _a, _b, _c, _d, _e, _f, _g;
9018
+ const { field, formField, disabled, setValue } = props;
9019
+ const [mode, setModeLocal] = React.useState("upload");
9020
+ const [error, setError] = React.useState(null);
9021
+ const theme = ui.useTheme2();
9022
+ const mapping = (_a = field.ui) == null ? void 0 : _a.fileMapping;
9023
+ const accept = (_c = (_b = field.ui) == null ? void 0 : _b.accept) != null ? _c : [".json"];
9024
+ const setMode = React.useCallback(
9025
+ (next) => {
9026
+ setModeLocal(next);
9027
+ formField.onChange(next);
9028
+ },
9029
+ [formField]
9030
+ );
9031
+ const processJson = React.useCallback(
9032
+ (text) => {
9033
+ const fileMapping = mapping != null ? mapping : {};
9034
+ try {
9035
+ const parsed = JSON.parse(text);
9036
+ if (typeof parsed !== "object" || parsed === null) {
9037
+ setError("Invalid JSON object");
9038
+ return;
9039
+ }
9040
+ const requiredKeys = Object.keys(fileMapping);
9041
+ const missingKeys = requiredKeys.filter((k) => parsed[k] === void 0);
9042
+ if (missingKeys.length > 0) {
9043
+ setError(`Missing keys: ${missingKeys.join(", ")}`);
9044
+ return;
9045
+ }
9046
+ for (const [jsonKey, targetFieldId] of Object.entries(fileMapping)) {
9047
+ if (parsed[jsonKey] !== void 0) {
9048
+ const parts = targetFieldId.split(".");
9049
+ const fk = parts.length === 2 ? parts[1] : targetFieldId;
9050
+ setValue(fk, parsed[jsonKey]);
9051
+ }
9052
+ }
9053
+ setError(null);
9054
+ setModeLocal("manual");
9055
+ formField.onChange("manual");
9056
+ } catch (e) {
9057
+ setError("Invalid JSON");
9058
+ }
9059
+ },
9060
+ [mapping, setValue, formField]
9061
+ );
9062
+ const styles = getStyles$f(theme);
9063
+ if (mode === "manual") {
9064
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.buttonRow }, /* @__PURE__ */ React__default.default.createElement(ui.Button, { type: "button", fill: "outline", size: "sm", onClick: () => setMode("paste"), disabled }, "Paste JWT Token"), /* @__PURE__ */ React__default.default.createElement("span", { className: styles.separator }, "or"), /* @__PURE__ */ React__default.default.createElement(ui.Button, { type: "button", fill: "outline", size: "sm", onClick: () => setMode("upload"), disabled }, "Upload JWT Token"));
9065
+ }
9066
+ if (mode === "paste") {
9067
+ return /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(
9068
+ ui.TextArea,
9069
+ {
9070
+ placeholder: (_e = (_d = field.ui) == null ? void 0 : _d.placeholder) != null ? _e : "Paste Google JWT token here",
9071
+ rows: (_g = (_f = field.ui) == null ? void 0 : _f.rows) != null ? _g : 10,
9072
+ onBlur: (e) => {
9073
+ const val = e.currentTarget.value;
9074
+ if (val.trim()) {
9075
+ processJson(val);
9076
+ }
9077
+ },
9078
+ disabled
9079
+ }
9080
+ ), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.buttonRow }, /* @__PURE__ */ React__default.default.createElement(ui.Button, { type: "button", fill: "outline", size: "sm", onClick: () => setMode("upload"), disabled }, "Upload JWT Token"), /* @__PURE__ */ React__default.default.createElement("span", { className: styles.separator }, "or"), /* @__PURE__ */ React__default.default.createElement(ui.Button, { type: "button", fill: "outline", size: "sm", onClick: () => setMode("manual"), disabled }, "Fill In JWT Token manually")), error && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.error }, error));
9081
+ }
9082
+ return /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(
9083
+ ui.FileDropzone,
9084
+ {
9085
+ options: { multiple: false, accept: accept.join(",") },
9086
+ readAs: "readAsText",
9087
+ onLoad: (result) => {
9088
+ if (typeof result === "string") {
9089
+ processJson(result);
9090
+ }
9091
+ }
9092
+ }
9093
+ ), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.buttonRow }, /* @__PURE__ */ React__default.default.createElement(ui.Button, { type: "button", fill: "outline", size: "sm", onClick: () => setMode("paste"), disabled }, "Paste JWT Token"), /* @__PURE__ */ React__default.default.createElement("span", { className: styles.separator }, "or"), /* @__PURE__ */ React__default.default.createElement(ui.Button, { type: "button", fill: "outline", size: "sm", onClick: () => setMode("manual"), disabled }, "Fill In JWT Token manually")), error && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.error }, error));
9094
+ }
9095
+ function getStyles$f(theme) {
9096
+ return {
9097
+ buttonRow: css.css({
9098
+ marginTop: theme.spacing(1),
9099
+ display: "flex",
9100
+ alignItems: "center",
9101
+ gap: theme.spacing(0.5)
9102
+ }),
9103
+ separator: css.css({
9104
+ padding: `0 ${theme.spacing(0.5)}`,
9105
+ color: theme.colors.text.secondary
9106
+ }),
9107
+ error: css.css({
9108
+ color: theme.colors.error.text,
9109
+ fontSize: theme.typography.bodySmall.fontSize,
9110
+ marginTop: theme.spacing(0.5),
9111
+ display: "block"
9112
+ })
9113
+ };
9114
+ }
9115
+
9116
+ const IndexedPairEditor = (props) => {
9117
+ const { value, onChange, maxItems = 10, disabled, hideControls, itemLabel = "header" } = props;
9067
9118
  const styles = ui.useStyles2(getStyles$e);
9068
- const addTag = () => {
9069
- const trimmed = draft.trim();
9070
- if (trimmed && !value.includes(trimmed)) {
9071
- onChange([...value, trimmed]);
9119
+ const items = Array.isArray(value) ? value : [];
9120
+ const addItem = () => {
9121
+ if (items.length >= maxItems) {
9122
+ return;
9072
9123
  }
9073
- setDraft("");
9124
+ onChange([...items, { index: 0, name: "", value: "" }]);
9125
+ };
9126
+ const removeItem = (index) => {
9127
+ onChange(items.filter((_, i) => i !== index));
9074
9128
  };
9075
- const removeTag = (tag) => {
9076
- onChange(value.filter((v) => v !== tag));
9129
+ const updateItem = (index, key, val) => {
9130
+ const updated = items.map((item, i) => i === index ? { ...item, [key]: val } : item);
9131
+ onChange(updated);
9077
9132
  };
9078
- return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.container }, value.length > 0 && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.tags }, value.map((tag) => /* @__PURE__ */ React__default.default.createElement("span", { key: tag, className: styles.tag }, tag, !disabled && /* @__PURE__ */ React__default.default.createElement(
9079
- "button",
9133
+ return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "column", gap: 0.5 }, items.map((item, i) => /* @__PURE__ */ React__default.default.createElement(
9134
+ IndexedPairRow,
9080
9135
  {
9081
- type: "button",
9082
- className: styles.tagRemove,
9083
- onClick: () => removeTag(tag),
9084
- "aria-label": `Remove ${tag}`
9085
- },
9086
- /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "times", size: "xs" })
9087
- )))), /* @__PURE__ */ React__default.default.createElement(
9136
+ key: item.index || `new-${i}`,
9137
+ item,
9138
+ index: i,
9139
+ disabled,
9140
+ onUpdate: updateItem,
9141
+ onRemove: removeItem,
9142
+ hideControls,
9143
+ itemLabel
9144
+ }
9145
+ )), !hideControls && items.length < maxItems && /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "secondary", size: "sm", icon: "plus", disabled, onClick: addItem, type: "button" }, "Add ", itemLabel)), !hideControls && items.length >= maxItems && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.limitNote }, "Maximum ", maxItems, " ", itemLabel, "s reached"));
9146
+ };
9147
+ const IndexedPairRow = (props) => {
9148
+ const { item, index, disabled, onUpdate, onRemove, hideControls, itemLabel = "header" } = props;
9149
+ const styles = ui.useStyles2(getStyles$e);
9150
+ const secureStyles = ui.useStyles2(getSecureFieldStyles);
9151
+ const isConfigured = item.value === SECURE_FIELD_CONFIGURED;
9152
+ const [editing, setEditing] = React.useState(false);
9153
+ const [revealed, setRevealed] = React.useState(false);
9154
+ return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "row", gap: 1 }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.inputCell }, /* @__PURE__ */ React__default.default.createElement(
9088
9155
  ui.Input,
9089
9156
  {
9090
- value: draft,
9091
- onChange: (e) => setDraft(e.currentTarget.value),
9157
+ value: item.name,
9158
+ placeholder: "key",
9159
+ disabled: disabled || hideControls,
9160
+ onChange: (e) => onUpdate(index, "name", e.currentTarget.value),
9092
9161
  onKeyDown: (e) => {
9093
9162
  if (e.key === "Enter") {
9094
9163
  e.preventDefault();
9095
- addTag();
9096
9164
  }
9097
- },
9098
- onBlur: addTag,
9099
- placeholder,
9100
- disabled
9101
- }
9102
- ));
9103
- }
9104
- const getStyles$e = (theme) => ({
9105
- container: css.css({
9106
- display: "flex",
9107
- flexDirection: "column",
9108
- gap: theme.spacing(0.5)
9109
- }),
9110
- tags: css.css({
9111
- display: "flex",
9112
- flexWrap: "wrap",
9113
- gap: theme.spacing(0.5)
9114
- }),
9115
- tag: css.css({
9116
- display: "inline-flex",
9117
- alignItems: "center",
9118
- gap: theme.spacing(0.25),
9119
- padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,
9120
- borderRadius: theme.shape.radius.pill,
9121
- backgroundColor: theme.colors.background.secondary,
9122
- border: `1px solid ${theme.colors.border.weak}`,
9123
- fontSize: theme.typography.bodySmall.fontSize,
9124
- color: theme.colors.text.primary
9125
- }),
9126
- tagRemove: css.css({
9127
- display: "inline-flex",
9128
- alignItems: "center",
9129
- padding: 0,
9130
- border: "none",
9131
- backgroundColor: "transparent",
9132
- cursor: "pointer",
9133
- color: theme.colors.text.secondary,
9134
- "&:hover": { color: theme.colors.text.primary }
9135
- })
9136
- });
9137
-
9138
- function IndexedPairRow({
9139
- item,
9140
- index,
9141
- disabled,
9142
- onUpdate,
9143
- onRemove,
9144
- hideControls
9145
- }) {
9146
- const styles = ui.useStyles2(getStyles$d);
9147
- const secureStyles = ui.useStyles2(getSecureFieldStyles);
9148
- const isConfigured = item.value === SECURE_FIELD_CONFIGURED;
9149
- const [editing, setEditing] = React.useState(false);
9150
- const [revealed, setRevealed] = React.useState(false);
9151
- return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "row", gap: 1 }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.inputCell }, /* @__PURE__ */ React__default.default.createElement(
9152
- ui.Input,
9153
- {
9154
- value: item.name,
9155
- placeholder: "Header name",
9156
- disabled: disabled || hideControls,
9157
- onChange: (e) => onUpdate(index, "name", e.currentTarget.value)
9165
+ }
9158
9166
  }
9159
9167
  )), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.inputCell }, isConfigured && !editing ? /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "row", gap: 1, alignItems: "center" }, /* @__PURE__ */ React__default.default.createElement("span", { className: secureStyles.configuredBadge }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "lock", size: "xs" }), "Configured"), !disabled && /* @__PURE__ */ React__default.default.createElement(
9160
9168
  ui.Button,
@@ -9173,10 +9181,15 @@ function IndexedPairRow({
9173
9181
  ui.Input,
9174
9182
  {
9175
9183
  value: item.value === SECURE_FIELD_CONFIGURED ? "" : item.value,
9176
- placeholder: "Header value",
9184
+ placeholder: `${itemLabel} value`,
9177
9185
  disabled,
9178
9186
  type: revealed ? "text" : "password",
9179
9187
  onChange: (e) => onUpdate(index, "value", e.currentTarget.value),
9188
+ onKeyDown: (e) => {
9189
+ if (e.key === "Enter") {
9190
+ e.preventDefault();
9191
+ }
9192
+ },
9180
9193
  suffix: /* @__PURE__ */ React__default.default.createElement(
9181
9194
  ui.Button,
9182
9195
  {
@@ -9190,34 +9203,56 @@ function IndexedPairRow({
9190
9203
  }
9191
9204
  )
9192
9205
  }
9193
- )), !hideControls && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: "Remove header" }, /* @__PURE__ */ React__default.default.createElement(
9206
+ )), !hideControls && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: `Remove ${itemLabel}` }, /* @__PURE__ */ React__default.default.createElement(
9194
9207
  ui.Button,
9195
9208
  {
9196
9209
  variant: "secondary",
9197
9210
  fill: "text",
9198
9211
  size: "sm",
9199
9212
  icon: "trash-alt",
9200
- "aria-label": "Remove header",
9213
+ "aria-label": `Remove ${itemLabel}`,
9201
9214
  disabled,
9202
9215
  onClick: () => onRemove(index),
9203
9216
  type: "button"
9204
9217
  }
9205
9218
  )));
9206
- }
9207
- function IndexedPairEditor({
9208
- value,
9209
- onChange,
9210
- maxItems = 10,
9211
- disabled,
9212
- hideControls
9213
- }) {
9219
+ };
9220
+ const getStyles$e = (theme) => ({
9221
+ inputCell: css.css({
9222
+ flex: "1 1 0",
9223
+ minWidth: 0,
9224
+ overflow: "hidden"
9225
+ }),
9226
+ limitNote: css.css({
9227
+ fontSize: theme.typography.bodySmall.fontSize,
9228
+ color: theme.colors.text.secondary
9229
+ })
9230
+ });
9231
+
9232
+ function ObjectArrayEditor(props) {
9233
+ var _a, _b, _c, _d, _e, _f;
9234
+ const { field, value, onChange, disabled, errorMessage } = props;
9214
9235
  const styles = ui.useStyles2(getStyles$d);
9236
+ const itemFields = (_b = (_a = field.item) == null ? void 0 : _a.fields) != null ? _b : [];
9237
+ const layoutRows = computeLayoutRows(itemFields);
9215
9238
  const items = Array.isArray(value) ? value : [];
9239
+ const maxItems = (_e = (_d = (_c = field.validations) == null ? void 0 : _c.find((v) => v.type === "itemCount")) == null ? void 0 : _d.max) != null ? _e : 20;
9240
+ const label = (_f = field.label) != null ? _f : field.key;
9241
+ const itemErrors = parseItemErrors(errorMessage);
9216
9242
  const addItem = () => {
9243
+ var _a2, _b2;
9217
9244
  if (items.length >= maxItems) {
9218
9245
  return;
9219
9246
  }
9220
- onChange([...items, { index: 0, name: "", value: "" }]);
9247
+ const empty = {};
9248
+ for (const f of itemFields) {
9249
+ if (f.valueType === "boolean") {
9250
+ empty[f.key] = (_a2 = f.defaultValue) != null ? _a2 : false;
9251
+ } else {
9252
+ empty[f.key] = (_b2 = f.defaultValue) != null ? _b2 : "";
9253
+ }
9254
+ }
9255
+ onChange([...items, empty]);
9221
9256
  };
9222
9257
  const removeItem = (index) => {
9223
9258
  onChange(items.filter((_, i) => i !== index));
@@ -9226,78 +9261,241 @@ function IndexedPairEditor({
9226
9261
  const updated = items.map((item, i) => i === index ? { ...item, [key]: val } : item);
9227
9262
  onChange(updated);
9228
9263
  };
9229
- return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "column", gap: 0.5 }, items.map((item, i) => /* @__PURE__ */ React__default.default.createElement(
9230
- IndexedPairRow,
9264
+ return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "column", gap: 1 }, items.map((item, i) => /* @__PURE__ */ React__default.default.createElement(
9265
+ ObjectArrayItemRow,
9231
9266
  {
9232
- key: item.index || `new-${i}`,
9267
+ key: i,
9233
9268
  item,
9234
9269
  index: i,
9235
- disabled,
9270
+ itemFields,
9271
+ layoutRows,
9272
+ disabled: !!disabled,
9236
9273
  onUpdate: updateItem,
9237
9274
  onRemove: removeItem,
9238
- hideControls
9275
+ showLabels: true,
9276
+ error: itemErrors == null ? void 0 : itemErrors[i]
9277
+ }
9278
+ )), items.length < maxItems && /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "secondary", size: "sm", icon: "plus", disabled, onClick: addItem, type: "button" }, "Add ", label.toLowerCase())), items.length >= maxItems && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.limitNote }, "Maximum ", maxItems, " items reached"));
9279
+ }
9280
+ function computeLayoutRows(fields) {
9281
+ var _a;
9282
+ const hasExplicitRow = fields.some((f) => {
9283
+ var _a2;
9284
+ return ((_a2 = f.ui) == null ? void 0 : _a2.row) !== void 0;
9285
+ });
9286
+ if (!hasExplicitRow) {
9287
+ if (fields.length <= 3) {
9288
+ return [fields];
9289
+ }
9290
+ return fields.map((f) => [f]);
9291
+ }
9292
+ const rowMap = /* @__PURE__ */ new Map();
9293
+ const noRow = [];
9294
+ for (const f of fields) {
9295
+ if (((_a = f.ui) == null ? void 0 : _a.row) !== void 0) {
9296
+ const existing = rowMap.get(f.ui.row);
9297
+ if (existing) {
9298
+ existing.push(f);
9299
+ } else {
9300
+ rowMap.set(f.ui.row, [f]);
9301
+ }
9302
+ } else {
9303
+ noRow.push(f);
9239
9304
  }
9240
- )), !hideControls && items.length < maxItems && /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "secondary", size: "sm", icon: "plus", disabled, onClick: addItem, type: "button" }, "Add header")), !hideControls && items.length >= maxItems && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.limitNote }, "Maximum ", maxItems, " headers reached"));
9305
+ }
9306
+ const sortedKeys = [...rowMap.keys()].sort((a, b) => a - b);
9307
+ const rows = sortedKeys.map((k) => rowMap.get(k));
9308
+ for (const f of noRow) {
9309
+ rows.push([f]);
9310
+ }
9311
+ return rows;
9312
+ }
9313
+ function makeItemFormField(item, index, fieldKey, onUpdate) {
9314
+ return {
9315
+ name: `item-${index}-${fieldKey}`,
9316
+ value: item[fieldKey],
9317
+ onChange: (eventOrValue) => {
9318
+ if (eventOrValue != null && typeof eventOrValue === "object" && "target" in eventOrValue) {
9319
+ onUpdate(index, fieldKey, eventOrValue.target.value);
9320
+ } else {
9321
+ onUpdate(index, fieldKey, eventOrValue);
9322
+ }
9323
+ },
9324
+ onBlur: () => {
9325
+ }
9326
+ };
9327
+ }
9328
+ function effectiveItemField(field, isSecure) {
9329
+ if (!isSecure) {
9330
+ return field;
9331
+ }
9332
+ return { ...field, semanticType: "password" };
9333
+ }
9334
+ function ObjectArrayItemRow({
9335
+ item,
9336
+ index,
9337
+ itemFields,
9338
+ layoutRows,
9339
+ disabled,
9340
+ onUpdate,
9341
+ onRemove,
9342
+ showLabels,
9343
+ error
9344
+ }) {
9345
+ const styles = ui.useStyles2(getStyles$d);
9346
+ const secureOverride = findActiveSecureOverride(itemFields, item, index);
9347
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.itemRow }, layoutRows.map((row, rowIdx) => /* @__PURE__ */ React__default.default.createElement(ui.Stack, { key: rowIdx, direction: "row", gap: 1, alignItems: "flex-end", wrap: "wrap" }, row.map((field) => {
9348
+ var _a;
9349
+ const isSecureTarget = (secureOverride == null ? void 0 : secureOverride.fieldKey) === field.key;
9350
+ const eff = effectiveItemField(field, !!isSecureTarget);
9351
+ const formField = makeItemFormField(item, index, field.key, onUpdate);
9352
+ if (isSecureTarget && item[field.key] === SECURE_FIELD_CONFIGURED) {
9353
+ formField.value = SECURE_FIELD_CONFIGURED;
9354
+ }
9355
+ return /* @__PURE__ */ React__default.default.createElement("div", { key: field.key, className: field.valueType === "boolean" ? styles.boolCell : styles.inputCell }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.cellLabel }, (_a = field.label) != null ? _a : field.key, field.required && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.required }, " *")), renderFieldInput(eff, formField, disabled));
9356
+ }), rowIdx === 0 && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.removeCellWithLabel }, /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: "Remove" }, /* @__PURE__ */ React__default.default.createElement(
9357
+ ui.Button,
9358
+ {
9359
+ variant: "secondary",
9360
+ fill: "text",
9361
+ size: "sm",
9362
+ icon: "trash-alt",
9363
+ "aria-label": "Remove item",
9364
+ disabled,
9365
+ onClick: () => onRemove(index),
9366
+ type: "button"
9367
+ }
9368
+ ))))), error && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.itemError }, error));
9241
9369
  }
9242
9370
  const getStyles$d = (theme) => ({
9371
+ itemRow: css.css({
9372
+ display: "flex",
9373
+ flexDirection: "column",
9374
+ gap: theme.spacing(0.5),
9375
+ padding: theme.spacing(1),
9376
+ borderRadius: theme.shape.radius.default,
9377
+ border: `1px solid ${theme.colors.border.weak}`
9378
+ }),
9243
9379
  inputCell: css.css({
9244
- flex: "1 1 0",
9245
- minWidth: 0,
9380
+ flex: "1 1 120px",
9381
+ minWidth: 120,
9246
9382
  overflow: "hidden"
9247
9383
  }),
9384
+ boolCell: css.css({
9385
+ flex: "0 0 auto",
9386
+ minWidth: 0
9387
+ }),
9388
+ cellLabel: css.css({
9389
+ fontSize: theme.typography.bodySmall.fontSize,
9390
+ color: theme.colors.text.secondary,
9391
+ marginBottom: theme.spacing(0.25)
9392
+ }),
9393
+ required: css.css({
9394
+ color: theme.colors.error.text
9395
+ }),
9396
+ removeCellWithLabel: css.css({
9397
+ flex: "0 0 auto",
9398
+ display: "flex",
9399
+ alignItems: "flex-end",
9400
+ paddingBottom: theme.spacing(0.25)
9401
+ }),
9402
+ itemError: css.css({
9403
+ fontSize: theme.typography.bodySmall.fontSize,
9404
+ color: theme.colors.error.text
9405
+ }),
9248
9406
  limitNote: css.css({
9249
9407
  fontSize: theme.typography.bodySmall.fontSize,
9250
9408
  color: theme.colors.text.secondary
9251
9409
  })
9252
9410
  });
9253
9411
 
9254
- function ComplexFieldNote({ count, label }) {
9412
+ const StringArrayInput = (props) => {
9413
+ const { value, onChange, placeholder, disabled, itemLabel = "item" } = props;
9255
9414
  const styles = ui.useStyles2(getStyles$c);
9256
- return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.note }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs" }), /* @__PURE__ */ React__default.default.createElement("span", null, count > 0 ? `${count} ${label.toLowerCase()} configured.` : `No ${label.toLowerCase()} configured.`, " Configure in Grafana UI."));
9257
- }
9415
+ const items = Array.isArray(value) ? value : [];
9416
+ const lastInputRef = React.useRef(null);
9417
+ const shouldFocusLastRef = React.useRef(false);
9418
+ React.useEffect(() => {
9419
+ if (shouldFocusLastRef.current && lastInputRef.current) {
9420
+ lastInputRef.current.focus();
9421
+ shouldFocusLastRef.current = false;
9422
+ }
9423
+ }, [items.length]);
9424
+ const addItem = () => {
9425
+ shouldFocusLastRef.current = true;
9426
+ onChange([...items, ""]);
9427
+ };
9428
+ const removeItem = (index) => {
9429
+ onChange(items.filter((_, i) => i !== index));
9430
+ };
9431
+ const updateItem = (index, val) => {
9432
+ onChange(items.map((item, i) => i === index ? val : item));
9433
+ };
9434
+ const isItemValid = (index, val) => {
9435
+ const trimmed = val.trim();
9436
+ if (trimmed === "") {
9437
+ return false;
9438
+ }
9439
+ return !items.some((item, i) => i !== index && item.trim() === trimmed);
9440
+ };
9441
+ const handleEnter = (index, currentValue) => {
9442
+ if (!isItemValid(index, currentValue)) {
9443
+ return;
9444
+ }
9445
+ if (index === items.length - 1) {
9446
+ shouldFocusLastRef.current = true;
9447
+ onChange([...items, ""]);
9448
+ }
9449
+ };
9450
+ return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "column", gap: 0.5 }, items.map((item, i) => /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "row", gap: 1, key: i }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.inputCell }, /* @__PURE__ */ React__default.default.createElement(
9451
+ ui.Input,
9452
+ {
9453
+ ref: i === items.length - 1 ? lastInputRef : void 0,
9454
+ value: item,
9455
+ placeholder: placeholder != null ? placeholder : itemLabel,
9456
+ disabled,
9457
+ onChange: (e) => updateItem(i, e.currentTarget.value),
9458
+ onKeyDown: (e) => {
9459
+ if (e.key === "Enter") {
9460
+ e.preventDefault();
9461
+ handleEnter(i, e.currentTarget.value);
9462
+ }
9463
+ }
9464
+ }
9465
+ )), !disabled && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: `Remove ${itemLabel}` }, /* @__PURE__ */ React__default.default.createElement(
9466
+ ui.Button,
9467
+ {
9468
+ variant: "secondary",
9469
+ fill: "text",
9470
+ size: "sm",
9471
+ icon: "trash-alt",
9472
+ "aria-label": `Remove ${itemLabel}`,
9473
+ onClick: () => removeItem(i),
9474
+ type: "button"
9475
+ }
9476
+ )))), !disabled && /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "secondary", size: "sm", icon: "plus", onClick: addItem, type: "button" }, "Add")));
9477
+ };
9258
9478
  const getStyles$c = (theme) => ({
9259
- note: css.css({
9260
- display: "inline-flex",
9261
- alignItems: "center",
9262
- gap: theme.spacing(0.5),
9263
- padding: `${theme.spacing(0.5)} ${theme.spacing(0.75)}`,
9264
- fontSize: theme.typography.bodySmall.fontSize,
9265
- color: theme.colors.text.secondary,
9266
- backgroundColor: theme.colors.background.secondary,
9267
- borderRadius: theme.shape.radius.default,
9268
- border: `1px solid ${theme.colors.border.weak}`
9479
+ inputCell: css.css({
9480
+ flex: "1 1 0",
9481
+ minWidth: 0,
9482
+ overflow: "hidden"
9269
9483
  })
9270
9484
  });
9271
9485
 
9272
- function renderFieldInput(field, formField, disabled) {
9273
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
9486
+ function renderFieldInput(field, formField, disabled, errorMessage, setValue) {
9487
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w;
9274
9488
  const value = formField.value;
9275
9489
  const placeholder = (_a = field.ui) == null ? void 0 : _a.placeholder;
9276
9490
  const label = (_b = field.label) != null ? _b : field.key;
9491
+ if (((_c = field.ui) == null ? void 0 : _c.component) === "fileUpload" && field.ui.fileMapping && setValue) {
9492
+ return /* @__PURE__ */ React__default.default.createElement(FileUploadField, { field, formField, disabled, setValue });
9493
+ }
9277
9494
  if (field.target === "secureJsonData" || field.semanticType === "password" || field.semanticType === "token") {
9278
9495
  return /* @__PURE__ */ React__default.default.createElement(SecureFieldInput, { formField, placeholder: placeholder != null ? placeholder : label, disabled, label });
9279
9496
  }
9280
- if (field.valueType === "boolean") {
9281
- return /* @__PURE__ */ React__default.default.createElement(ui.Switch, { value: !!value, onChange: (e) => formField.onChange(e.currentTarget.checked), disabled });
9282
- }
9283
- if (field.valueType === "number") {
9284
- return /* @__PURE__ */ React__default.default.createElement(
9285
- ui.Input,
9286
- {
9287
- ...formField,
9288
- value: value !== void 0 && value !== null ? Number(value) : "",
9289
- type: "number",
9290
- placeholder,
9291
- disabled,
9292
- onChange: (e) => {
9293
- const n = e.currentTarget.valueAsNumber;
9294
- formField.onChange(Number.isNaN(n) ? void 0 : n);
9295
- }
9296
- }
9297
- );
9298
- }
9299
- if (((_c = field.ui) == null ? void 0 : _c.component) === "radio") {
9300
- const options = ((_e = (_d = field.ui) == null ? void 0 : _d.options) != null ? _e : []).map((opt) => ({
9497
+ if (((_d = field.ui) == null ? void 0 : _d.component) === "radio") {
9498
+ const options = ((_f = (_e = field.ui) == null ? void 0 : _e.options) != null ? _f : []).map((opt) => ({
9301
9499
  label: opt.label,
9302
9500
  value: String(opt.value),
9303
9501
  description: opt.description
@@ -9307,13 +9505,20 @@ function renderFieldInput(field, formField, disabled) {
9307
9505
  {
9308
9506
  options,
9309
9507
  value: String(value != null ? value : ""),
9310
- onChange: (v) => formField.onChange(v),
9508
+ onChange: (v) => {
9509
+ if (field.valueType === "number") {
9510
+ const n = Number(v);
9511
+ formField.onChange(Number.isNaN(n) ? v : n);
9512
+ } else {
9513
+ formField.onChange(v);
9514
+ }
9515
+ },
9311
9516
  disabled
9312
9517
  }
9313
9518
  ));
9314
9519
  }
9315
- if (((_f = field.ui) == null ? void 0 : _f.component) === "select") {
9316
- const options = ((_h = (_g = field.ui) == null ? void 0 : _g.options) != null ? _h : []).map((opt) => ({
9520
+ if (((_g = field.ui) == null ? void 0 : _g.component) === "select") {
9521
+ const options = ((_i = (_h = field.ui) == null ? void 0 : _h.options) != null ? _i : []).map((opt) => ({
9317
9522
  label: opt.label,
9318
9523
  value: String(opt.value),
9319
9524
  description: opt.description
@@ -9324,260 +9529,88 @@ function renderFieldInput(field, formField, disabled) {
9324
9529
  options,
9325
9530
  value: options.find((o) => o.value === String(value != null ? value : "")),
9326
9531
  onChange: (v) => formField.onChange(v == null ? void 0 : v.value),
9327
- disabled
9328
- }
9329
- );
9330
- }
9331
- if (field.semanticType === "url") {
9332
- return /* @__PURE__ */ React__default.default.createElement(ui.Input, { ...formField, value: String(value != null ? value : ""), type: "url", placeholder, disabled });
9333
- }
9334
- if (((_i = field.ui) == null ? void 0 : _i.component) === "textarea") {
9335
- return /* @__PURE__ */ React__default.default.createElement(
9336
- ui.TextArea,
9337
- {
9338
- ...formField,
9339
- value: String(value != null ? value : ""),
9340
- placeholder,
9341
- disabled,
9342
- rows: (_k = (_j = field.ui) == null ? void 0 : _j.rows) != null ? _k : 3
9343
- }
9344
- );
9345
- }
9346
- if (field.valueType === "array" && ((_l = field.item) == null ? void 0 : _l.valueType) === "string") {
9347
- return /* @__PURE__ */ React__default.default.createElement(
9348
- StringArrayInput,
9349
- {
9350
- value: Array.isArray(value) ? value : [],
9351
- onChange: formField.onChange,
9352
- placeholder: placeholder != null ? placeholder : `Add ${label.toLowerCase()}\u2026`,
9353
- disabled
9354
- }
9355
- );
9356
- }
9357
- if (((_m = field.storage) == null ? void 0 : _m.type) === "indexedPair") {
9358
- const items = Array.isArray(value) ? value : [];
9359
- const maxItems = (_p = (_o = (_n = field.validations) == null ? void 0 : _n.find((v) => v.type === "itemCount")) == null ? void 0 : _o.max) != null ? _p : 10;
9360
- return /* @__PURE__ */ React__default.default.createElement(IndexedPairEditor, { value: items, onChange: formField.onChange, maxItems, disabled });
9361
- }
9362
- if (field.valueType === "object" || field.valueType === "map" || field.valueType === "array" && (((_q = field.item) == null ? void 0 : _q.valueType) === "object" || ((_r = field.item) == null ? void 0 : _r.valueType) === "map")) {
9363
- const count = Array.isArray(value) ? value.length : 0;
9364
- return /* @__PURE__ */ React__default.default.createElement(ComplexFieldNote, { count, label });
9365
- }
9366
- return /* @__PURE__ */ React__default.default.createElement(ui.Input, { ...formField, value: String(value != null ? value : ""), placeholder, disabled });
9367
- }
9368
-
9369
- const getWizardStyles = (theme) => ({
9370
- container: css.css({
9371
- position: "relative",
9372
- display: "flex",
9373
- flexDirection: "column",
9374
- gap: theme.spacing(1),
9375
- padding: theme.spacing(1.5),
9376
- backgroundColor: theme.colors.background.secondary,
9377
- borderRadius: theme.shape.radius.default,
9378
- border: `1px solid ${theme.colors.border.weak}`,
9379
- overflow: "hidden"
9380
- }),
9381
- overlay: css.css({
9382
- position: "absolute",
9383
- inset: 0,
9384
- display: "flex",
9385
- alignItems: "center",
9386
- justifyContent: "center",
9387
- gap: theme.spacing(1),
9388
- background: theme.colors.background.secondary,
9389
- borderRadius: theme.shape.radius.default,
9390
- zIndex: 1,
9391
- fontSize: theme.typography.bodySmall.fontSize,
9392
- color: theme.colors.text.primary,
9393
- opacity: 0.95
9394
- }),
9395
- readOnlyBanner: css.css({
9396
- display: "inline-flex",
9397
- alignItems: "center",
9398
- gap: theme.spacing(0.5),
9399
- padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,
9400
- fontSize: theme.typography.bodySmall.fontSize,
9401
- color: theme.colors.text.secondary,
9402
- backgroundColor: theme.colors.background.secondary,
9403
- borderRadius: theme.shape.radius.default,
9404
- border: `1px solid ${theme.colors.border.weak}`
9405
- }),
9406
- navBar: css.css({
9407
- display: "flex",
9408
- alignItems: "center",
9409
- justifyContent: "space-between"
9410
- }),
9411
- navTitle: css.css({
9412
- display: "inline-flex",
9413
- alignItems: "center",
9414
- gap: theme.spacing(0.5),
9415
- fontSize: theme.typography.body.fontSize,
9416
- fontWeight: theme.typography.fontWeightBold,
9417
- color: theme.colors.text.primary
9418
- }),
9419
- stepCount: css.css({
9420
- fontSize: "11px",
9421
- fontWeight: "normal",
9422
- color: theme.colors.text.secondary
9423
- }),
9424
- navActions: css.css({
9425
- display: "flex",
9426
- alignItems: "center",
9427
- gap: theme.spacing(0.25)
9428
- }),
9429
- form: css.css({
9430
- display: "flex",
9431
- flexDirection: "column",
9432
- gap: theme.spacing(0.75)
9433
- }),
9434
- buttons: css.css({
9435
- display: "flex",
9436
- gap: theme.spacing(1),
9437
- paddingTop: theme.spacing(0.25)
9438
- }),
9439
- fieldRow: css.css({
9440
- display: "grid",
9441
- gridTemplateColumns: "minmax(80px, 1fr) minmax(0, 2fr)",
9442
- gap: theme.spacing(0.75),
9443
- alignItems: "start"
9444
- }),
9445
- fieldRowCenter: css.css({
9446
- display: "grid",
9447
- gridTemplateColumns: "minmax(80px, 1fr) minmax(0, 2fr)",
9448
- gap: theme.spacing(0.75),
9449
- alignItems: "center",
9450
- padding: `${theme.spacing(0.5)} 0`
9451
- }),
9452
- fieldLabelRow: css.css({
9453
- display: "flex",
9454
- alignItems: "center",
9455
- gap: theme.spacing(0.5),
9456
- paddingTop: theme.spacing(0.5)
9457
- }),
9458
- fieldLabelRowCompact: css.css({
9459
- display: "flex",
9460
- alignItems: "center",
9461
- gap: theme.spacing(0.5)
9462
- }),
9463
- fieldLabel: css.css({
9464
- fontSize: theme.typography.bodySmall.fontSize,
9465
- fontWeight: theme.typography.fontWeightMedium,
9466
- color: theme.colors.text.primary
9467
- }),
9468
- fieldRequired: css.css({
9469
- color: theme.colors.error.text,
9470
- marginLeft: 2
9471
- }),
9472
- fieldInfoIcon: css.css({
9473
- color: theme.colors.text.disabled,
9474
- cursor: "help",
9475
- flexShrink: 0
9476
- }),
9477
- fieldInputCol: css.css({
9478
- display: "flex",
9479
- flexDirection: "column",
9480
- gap: theme.spacing(0.25),
9481
- minWidth: 0
9482
- }),
9483
- fieldError: css.css({
9484
- fontSize: "11px",
9485
- color: theme.colors.error.text
9486
- })
9487
- });
9488
-
9489
- function SchemaField({ field, control, errors, disabled, dsUid, watchedValues, fieldById }) {
9490
- const styles = ui.useStyles2(getWizardStyles);
9491
- const activeOverride = resolveActiveOverride(field, watchedValues, fieldById);
9492
- const fk = formKey(field);
9493
- if (field.key === "pdcInjected" && field.target === "jsonData") {
9532
+ disabled
9533
+ }
9534
+ );
9535
+ }
9536
+ if (field.valueType === "boolean") {
9537
+ return /* @__PURE__ */ React__default.default.createElement(ui.Switch, { value: !!value, onChange: (e) => formField.onChange(e.currentTarget.checked), disabled });
9538
+ }
9539
+ if (field.valueType === "number") {
9494
9540
  return /* @__PURE__ */ React__default.default.createElement(
9495
- reactHookForm.Controller,
9541
+ ui.Input,
9496
9542
  {
9497
- name: fk,
9498
- control,
9499
- render: ({ field: formField }) => /* @__PURE__ */ React__default.default.createElement(
9500
- PdcFieldNote,
9501
- {
9502
- enabled: !!formField.value,
9503
- description: field.description,
9504
- configUrl: `/connections/datasources/edit/${dsUid}`
9505
- }
9506
- )
9543
+ ...formField,
9544
+ value: value !== void 0 && value !== null ? Number(value) : "",
9545
+ type: "number",
9546
+ placeholder,
9547
+ disabled,
9548
+ onChange: (e) => {
9549
+ const n = e.currentTarget.valueAsNumber;
9550
+ formField.onChange(Number.isNaN(n) ? void 0 : n);
9551
+ }
9507
9552
  }
9508
9553
  );
9509
9554
  }
9510
- const required = isFieldRequired(field, watchedValues, fieldById);
9511
- const validationRules = buildValidationRules(field, required);
9512
- return /* @__PURE__ */ React__default.default.createElement(
9513
- reactHookForm.Controller,
9514
- {
9515
- name: fk,
9516
- control,
9517
- rules: validationRules,
9518
- render: ({ field: formField }) => {
9519
- var _a, _b, _c, _d, _e;
9520
- const errorMessage = (_a = errors[fk]) == null ? void 0 : _a.message;
9521
- const label = (_b = field.label) != null ? _b : field.key;
9522
- const description = (_c = activeOverride == null ? void 0 : activeOverride.description) != null ? _c : field.description;
9523
- const effectiveField = activeOverride ? {
9524
- ...field,
9525
- ui: {
9526
- ...field.ui,
9527
- placeholder: (_e = activeOverride.placeholder) != null ? _e : (_d = field.ui) == null ? void 0 : _d.placeholder
9528
- }
9529
- } : field;
9530
- const isReadOnly = !!(activeOverride == null ? void 0 : activeOverride.readOnly);
9531
- const isBool = field.valueType === "boolean";
9532
- return /* @__PURE__ */ React__default.default.createElement("div", { className: isBool ? styles.fieldRowCenter : styles.fieldRow }, /* @__PURE__ */ React__default.default.createElement("div", { className: isBool ? styles.fieldLabelRowCompact : styles.fieldLabelRow }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldLabel }, label, required && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldRequired }, "*")), description && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: description }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs", className: styles.fieldInfoIcon }))), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldInputCol }, renderFieldInput(effectiveField, formField, disabled || isReadOnly), errorMessage && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldError }, errorMessage)));
9555
+ if (field.semanticType === "url") {
9556
+ return /* @__PURE__ */ React__default.default.createElement(ui.Input, { ...formField, value: String(value != null ? value : ""), type: "url", placeholder, disabled });
9557
+ }
9558
+ if (((_j = field.ui) == null ? void 0 : _j.component) === "textarea") {
9559
+ return /* @__PURE__ */ React__default.default.createElement(
9560
+ ui.TextArea,
9561
+ {
9562
+ ...formField,
9563
+ value: String(value != null ? value : ""),
9564
+ placeholder,
9565
+ disabled,
9566
+ rows: (_l = (_k = field.ui) == null ? void 0 : _k.rows) != null ? _l : 3
9533
9567
  }
9534
- }
9535
- );
9536
- }
9537
-
9538
- function AuthorizationHeaderField({
9539
- headersFieldKey,
9540
- control,
9541
- disabled,
9542
- watchedValues
9543
- }) {
9544
- const styles = ui.useStyles2(getWizardStyles);
9545
- const items = React.useMemo(
9546
- () => Array.isArray(watchedValues[headersFieldKey]) ? watchedValues[headersFieldKey] : [],
9547
- [watchedValues, headersFieldKey]
9548
- );
9549
- const authEntries = React.useMemo(() => {
9550
- const entries = [];
9551
- for (let i = 0; i < items.length; i++) {
9552
- if (items[i].name.toLowerCase() === "authorization") {
9553
- entries.push({ item: items[i], originalIdx: i });
9568
+ );
9569
+ }
9570
+ if (((_m = field.storage) == null ? void 0 : _m.type) === "indexedPair") {
9571
+ const items = Array.isArray(value) ? value : [];
9572
+ const maxItems = (_p = (_o = (_n = field.validations) == null ? void 0 : _n.find((v) => v.type === "itemCount")) == null ? void 0 : _o.max) != null ? _p : 10;
9573
+ const itemLabel = (_r = (_q = field.label) == null ? void 0 : _q.toLowerCase().replace(/s$/, "")) != null ? _r : "header";
9574
+ return /* @__PURE__ */ React__default.default.createElement(
9575
+ IndexedPairEditor,
9576
+ {
9577
+ value: items,
9578
+ onChange: formField.onChange,
9579
+ maxItems,
9580
+ disabled,
9581
+ itemLabel
9554
9582
  }
9555
- }
9556
- return entries;
9557
- }, [items]);
9558
- if (authEntries.length === 0) {
9559
- return null;
9583
+ );
9560
9584
  }
9561
- const authItems = authEntries.map((e) => e.item);
9562
- return /* @__PURE__ */ React__default.default.createElement(
9563
- reactHookForm.Controller,
9564
- {
9565
- name: headersFieldKey,
9566
- control,
9567
- render: ({ field: formField }) => {
9568
- const handleChange = (updatedAuthItems) => {
9569
- const updated = [...items];
9570
- for (let i = 0; i < authEntries.length; i++) {
9571
- if (i < updatedAuthItems.length) {
9572
- updated[authEntries[i].originalIdx] = updatedAuthItems[i];
9573
- }
9574
- }
9575
- formField.onChange(updated);
9576
- };
9577
- return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldRow }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldLabelRow }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldLabel }, "Custom HTTP Headers"), /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: "Authorization HTTP header(s) sent with every request." }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs", className: styles.fieldInfoIcon }))), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldInputCol }, /* @__PURE__ */ React__default.default.createElement(IndexedPairEditor, { value: authItems, onChange: handleChange, disabled, hideControls: true })));
9585
+ if (field.valueType === "array" && ((_s = field.item) == null ? void 0 : _s.valueType) === "string") {
9586
+ return /* @__PURE__ */ React__default.default.createElement(
9587
+ StringArrayInput,
9588
+ {
9589
+ value: Array.isArray(value) ? value : [],
9590
+ onChange: formField.onChange,
9591
+ placeholder,
9592
+ disabled,
9593
+ itemLabel: label.toLowerCase().replace(/s$/, "")
9578
9594
  }
9579
- }
9580
- );
9595
+ );
9596
+ }
9597
+ if (field.valueType === "array" && ((_t = field.item) == null ? void 0 : _t.valueType) === "object" && ((_u = field.item.fields) == null ? void 0 : _u.length)) {
9598
+ return /* @__PURE__ */ React__default.default.createElement(
9599
+ ObjectArrayEditor,
9600
+ {
9601
+ field,
9602
+ value,
9603
+ onChange: formField.onChange,
9604
+ disabled,
9605
+ errorMessage
9606
+ }
9607
+ );
9608
+ }
9609
+ if (field.valueType === "object" || field.valueType === "map" || field.valueType === "array" && (((_v = field.item) == null ? void 0 : _v.valueType) === "object" || ((_w = field.item) == null ? void 0 : _w.valueType) === "map")) {
9610
+ const count = Array.isArray(value) ? value.length : 0;
9611
+ return /* @__PURE__ */ React__default.default.createElement(ComplexFieldNote, { count, label });
9612
+ }
9613
+ return /* @__PURE__ */ React__default.default.createElement(ui.Input, { ...formField, value: String(value != null ? value : ""), placeholder, disabled });
9581
9614
  }
9582
9615
 
9583
9616
  const getTabStyles = (theme) => ({
@@ -9628,7 +9661,7 @@ const getTabStyles = (theme) => ({
9628
9661
  width: 12,
9629
9662
  flexShrink: 0,
9630
9663
  alignSelf: "flex-start",
9631
- paddingTop: 4
9664
+ paddingTop: theme.spacing(0.5)
9632
9665
  }),
9633
9666
  navDot: css.css({
9634
9667
  width: 10,
@@ -9674,7 +9707,7 @@ const getTabStyles = (theme) => ({
9674
9707
  }),
9675
9708
  navLabel: css.css({
9676
9709
  fontSize: theme.typography.body.fontSize,
9677
- color: "rgba(204, 204, 220, 0.65)",
9710
+ color: theme.colors.text.secondary,
9678
9711
  lineHeight: 1.4
9679
9712
  }),
9680
9713
  navLabelActive: css.css({
@@ -9756,8 +9789,8 @@ const getTabStyles = (theme) => ({
9756
9789
  textAlign: "left"
9757
9790
  }),
9758
9791
  sectionBadge: css.css({
9759
- fontSize: "11px",
9760
- fontWeight: "normal",
9792
+ fontSize: theme.typography.bodySmall.fontSize,
9793
+ fontWeight: theme.typography.fontWeightRegular,
9761
9794
  color: theme.colors.text.disabled,
9762
9795
  border: `1px solid ${theme.colors.border.weak}`,
9763
9796
  borderRadius: theme.shape.radius.pill,
@@ -9816,6 +9849,226 @@ const getTabStyles = (theme) => ({
9816
9849
  marginBottom: theme.spacing(1)
9817
9850
  })
9818
9851
  });
9852
+ const getWizardStyles = (theme) => ({
9853
+ container: css.css({
9854
+ position: "relative",
9855
+ display: "flex",
9856
+ flexDirection: "column",
9857
+ gap: theme.spacing(1),
9858
+ padding: theme.spacing(1.5),
9859
+ backgroundColor: theme.colors.background.secondary,
9860
+ borderRadius: theme.shape.radius.default,
9861
+ border: `1px solid ${theme.colors.border.weak}`,
9862
+ overflow: "hidden"
9863
+ }),
9864
+ overlay: css.css({
9865
+ position: "absolute",
9866
+ inset: 0,
9867
+ display: "flex",
9868
+ alignItems: "center",
9869
+ justifyContent: "center",
9870
+ gap: theme.spacing(1),
9871
+ background: theme.colors.background.secondary,
9872
+ borderRadius: theme.shape.radius.default,
9873
+ zIndex: 1,
9874
+ fontSize: theme.typography.bodySmall.fontSize,
9875
+ color: theme.colors.text.primary,
9876
+ opacity: 0.95
9877
+ }),
9878
+ readOnlyBanner: css.css({
9879
+ display: "inline-flex",
9880
+ alignItems: "center",
9881
+ gap: theme.spacing(0.5),
9882
+ padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,
9883
+ fontSize: theme.typography.bodySmall.fontSize,
9884
+ color: theme.colors.text.secondary,
9885
+ backgroundColor: theme.colors.background.secondary,
9886
+ borderRadius: theme.shape.radius.default,
9887
+ border: `1px solid ${theme.colors.border.weak}`
9888
+ }),
9889
+ navBar: css.css({
9890
+ display: "flex",
9891
+ alignItems: "center",
9892
+ justifyContent: "space-between"
9893
+ }),
9894
+ navTitle: css.css({
9895
+ display: "inline-flex",
9896
+ alignItems: "center",
9897
+ gap: theme.spacing(0.5),
9898
+ fontSize: theme.typography.body.fontSize,
9899
+ fontWeight: theme.typography.fontWeightBold,
9900
+ color: theme.colors.text.primary
9901
+ }),
9902
+ stepCount: css.css({
9903
+ fontSize: theme.typography.bodySmall.fontSize,
9904
+ fontWeight: theme.typography.fontWeightRegular,
9905
+ color: theme.colors.text.secondary
9906
+ }),
9907
+ navActions: css.css({
9908
+ display: "flex",
9909
+ alignItems: "center",
9910
+ gap: theme.spacing(0.25)
9911
+ }),
9912
+ form: css.css({
9913
+ display: "flex",
9914
+ flexDirection: "column",
9915
+ gap: theme.spacing(0.75)
9916
+ }),
9917
+ buttons: css.css({
9918
+ display: "flex",
9919
+ gap: theme.spacing(1),
9920
+ paddingTop: theme.spacing(0.25)
9921
+ }),
9922
+ fieldRow: css.css({
9923
+ display: "grid",
9924
+ gridTemplateColumns: "minmax(80px, 1fr) minmax(0, 2fr)",
9925
+ gap: theme.spacing(0.75),
9926
+ alignItems: "start"
9927
+ }),
9928
+ fieldRowCenter: css.css({
9929
+ display: "grid",
9930
+ gridTemplateColumns: "minmax(80px, 1fr) minmax(0, 2fr)",
9931
+ gap: theme.spacing(0.75),
9932
+ alignItems: "center",
9933
+ padding: `${theme.spacing(0.5)} 0`
9934
+ }),
9935
+ fieldLabelRow: css.css({
9936
+ display: "flex",
9937
+ alignItems: "center",
9938
+ gap: theme.spacing(0.5),
9939
+ paddingTop: theme.spacing(0.5)
9940
+ }),
9941
+ fieldLabelRowCompact: css.css({
9942
+ display: "flex",
9943
+ alignItems: "center",
9944
+ gap: theme.spacing(0.5)
9945
+ }),
9946
+ fieldLabel: css.css({
9947
+ fontSize: theme.typography.bodySmall.fontSize,
9948
+ fontWeight: theme.typography.fontWeightMedium,
9949
+ color: theme.colors.text.primary
9950
+ }),
9951
+ fieldRequired: css.css({
9952
+ color: theme.colors.error.text,
9953
+ marginLeft: 2
9954
+ }),
9955
+ fieldInfoIcon: css.css({
9956
+ color: theme.colors.text.disabled,
9957
+ cursor: "help",
9958
+ flexShrink: 0
9959
+ }),
9960
+ fieldInputCol: css.css({
9961
+ display: "flex",
9962
+ flexDirection: "column",
9963
+ gap: theme.spacing(0.25),
9964
+ minWidth: 0
9965
+ }),
9966
+ fieldError: css.css({
9967
+ fontSize: theme.typography.bodySmall.fontSize,
9968
+ color: theme.colors.error.text
9969
+ })
9970
+ });
9971
+
9972
+ function SchemaField({
9973
+ field,
9974
+ control,
9975
+ errors,
9976
+ disabled,
9977
+ dsUid,
9978
+ watchedValues,
9979
+ fieldById,
9980
+ celContext,
9981
+ setValue
9982
+ }) {
9983
+ const styles = ui.useStyles2(getWizardStyles);
9984
+ const activeOverride = useDatasourceSchema.resolveActiveOverride(field, watchedValues, fieldById);
9985
+ const fk = useDatasourceSchema.formKey(field);
9986
+ if (field.key === "pdcInjected" && field.target === "jsonData") {
9987
+ return /* @__PURE__ */ React__default.default.createElement(
9988
+ reactHookForm.Controller,
9989
+ {
9990
+ name: fk,
9991
+ control,
9992
+ render: ({ field: formField }) => /* @__PURE__ */ React__default.default.createElement(
9993
+ PdcFieldNote,
9994
+ {
9995
+ enabled: !!formField.value,
9996
+ description: field.description,
9997
+ configUrl: `/connections/datasources/edit/${dsUid}`
9998
+ }
9999
+ )
10000
+ }
10001
+ );
10002
+ }
10003
+ const required = isFieldRequired(field, watchedValues, fieldById, celContext);
10004
+ const validationRules = buildValidationRules(field, required);
10005
+ return /* @__PURE__ */ React__default.default.createElement(
10006
+ reactHookForm.Controller,
10007
+ {
10008
+ name: fk,
10009
+ control,
10010
+ rules: validationRules,
10011
+ render: ({ field: formField }) => {
10012
+ var _a, _b, _c, _d, _e;
10013
+ const errorMessage = (_a = errors[fk]) == null ? void 0 : _a.message;
10014
+ const label = (_b = field.label) != null ? _b : field.key;
10015
+ const description = (_c = activeOverride == null ? void 0 : activeOverride.description) != null ? _c : field.description;
10016
+ const effectiveField = activeOverride ? {
10017
+ ...field,
10018
+ description,
10019
+ ui: {
10020
+ ...field.ui,
10021
+ placeholder: (_e = activeOverride.placeholder) != null ? _e : (_d = field.ui) == null ? void 0 : _d.placeholder
10022
+ }
10023
+ } : field;
10024
+ const isReadOnly = !!(activeOverride == null ? void 0 : activeOverride.readOnly);
10025
+ const isBool = field.valueType === "boolean";
10026
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: isBool ? styles.fieldRowCenter : styles.fieldRow }, /* @__PURE__ */ React__default.default.createElement("div", { className: isBool ? styles.fieldLabelRowCompact : styles.fieldLabelRow }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldLabel }, label, required && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldRequired }, "*")), description && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: description }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs", className: styles.fieldInfoIcon }))), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldInputCol }, renderFieldInput(effectiveField, formField, disabled || isReadOnly, errorMessage, setValue), errorMessage && !parseItemErrors(errorMessage) && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldError }, errorMessage)));
10027
+ }
10028
+ }
10029
+ );
10030
+ }
10031
+
10032
+ const AuthorizationHeaderField = (props) => {
10033
+ const { headersFieldKey, control, disabled, watchedValues } = props;
10034
+ const styles = ui.useStyles2(getWizardStyles);
10035
+ const items = React.useMemo(
10036
+ () => Array.isArray(watchedValues[headersFieldKey]) ? watchedValues[headersFieldKey] : [],
10037
+ [watchedValues, headersFieldKey]
10038
+ );
10039
+ const authEntries = React.useMemo(() => {
10040
+ const entries = [];
10041
+ for (let i = 0; i < items.length; i++) {
10042
+ if (items[i].name.toLowerCase() === "authorization") {
10043
+ entries.push({ item: items[i], originalIdx: i });
10044
+ }
10045
+ }
10046
+ return entries;
10047
+ }, [items]);
10048
+ if (authEntries.length === 0) {
10049
+ return null;
10050
+ }
10051
+ const authItems = authEntries.map((e) => e.item);
10052
+ return /* @__PURE__ */ React__default.default.createElement(
10053
+ reactHookForm.Controller,
10054
+ {
10055
+ name: headersFieldKey,
10056
+ control,
10057
+ render: ({ field: formField }) => {
10058
+ const handleChange = (updatedAuthItems) => {
10059
+ const updated = [...items];
10060
+ for (let i = 0; i < authEntries.length; i++) {
10061
+ if (i < updatedAuthItems.length) {
10062
+ updated[authEntries[i].originalIdx] = updatedAuthItems[i];
10063
+ }
10064
+ }
10065
+ formField.onChange(updated);
10066
+ };
10067
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldRow }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldLabelRow }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.fieldLabel }, "Custom HTTP Headers"), /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: "Authorization HTTP header(s) sent with every request." }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "xs", className: styles.fieldInfoIcon }))), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.fieldInputCol }, /* @__PURE__ */ React__default.default.createElement(IndexedPairEditor, { value: authItems, onChange: handleChange, disabled, hideControls: true })));
10068
+ }
10069
+ }
10070
+ );
10071
+ };
9819
10072
 
9820
10073
  function SidebarNav({ groups, activeIndex, sectionStates, onSelect }) {
9821
10074
  const styles = ui.useStyles2(getTabStyles);
@@ -9875,15 +10128,18 @@ function TabLayout({ form, schema, dsUid, dsName, onRetest, healthError, renderA
9875
10128
  handleSubmit,
9876
10129
  errors,
9877
10130
  watchedValues,
10131
+ celContext,
9878
10132
  initializing,
9879
10133
  fetchError,
9880
10134
  submitting,
9881
10135
  submitError,
9882
10136
  readOnly,
9883
10137
  isFieldVisible,
10138
+ isFieldDisabled,
9884
10139
  isGroupValid,
9885
10140
  groupHasData,
9886
- onSubmit
10141
+ onSubmit,
10142
+ setValue
9887
10143
  } = form;
9888
10144
  const displayGroups = React.useMemo(() => resolvedGroups.filter((g) => g.group.id !== "_required"), [resolvedGroups]);
9889
10145
  const [expandedSections, setExpandedSections] = React.useState(() => {
@@ -10007,19 +10263,21 @@ function TabLayout({ form, schema, dsUid, dsName, onRetest, healthError, renderA
10007
10263
  /* @__PURE__ */ React__default.default.createElement("div", { className: styles.sectionBody }, g.group.description && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.sectionDescription }, g.group.description), visibleFields.map((field) => /* @__PURE__ */ React__default.default.createElement(
10008
10264
  SchemaField,
10009
10265
  {
10010
- key: formKey(field),
10266
+ key: useDatasourceSchema.formKey(field),
10011
10267
  field,
10012
10268
  control,
10013
10269
  errors,
10014
- disabled: allDisabled,
10270
+ disabled: allDisabled || isFieldDisabled(field),
10015
10271
  dsUid,
10016
10272
  watchedValues,
10017
- fieldById
10273
+ fieldById,
10274
+ celContext,
10275
+ setValue
10018
10276
  }
10019
10277
  )), showHeaders && /* @__PURE__ */ React__default.default.createElement(
10020
10278
  AuthorizationHeaderField,
10021
10279
  {
10022
- headersFieldKey: formKey(httpHeadersField),
10280
+ headersFieldKey: useDatasourceSchema.formKey(httpHeadersField),
10023
10281
  control,
10024
10282
  disabled: allDisabled,
10025
10283
  watchedValues
@@ -10038,8 +10296,8 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
10038
10296
  const [detectedReadOnly, setDetectedReadOnly] = React.useState(false);
10039
10297
  const readOnly = detectedReadOnly;
10040
10298
  const resolvedGroups = React.useMemo(() => {
10041
- const groups = resolveGroups(schema);
10042
- const requiredGroup = resolveRequiredFieldsGroup(schema);
10299
+ const groups = useDatasourceSchema.resolveGroups(schema);
10300
+ const requiredGroup = useDatasourceSchema.resolveRequiredFieldsGroup(schema);
10043
10301
  if (!requiredGroup) {
10044
10302
  return groups;
10045
10303
  }
@@ -10085,10 +10343,10 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
10085
10343
  when: eff.when,
10086
10344
  targets: Object.entries(eff.set).map(([targetId, val]) => {
10087
10345
  const targetField = fieldById.get(targetId);
10088
- return { key: targetField ? formKey(targetField) : targetId, value: val };
10346
+ return { key: targetField ? useDatasourceSchema.formKey(targetField) : targetId, value: val };
10089
10347
  })
10090
10348
  }));
10091
- result.push({ sourceKey: formKey(field), effects: mapped });
10349
+ result.push({ sourceKey: useDatasourceSchema.formKey(field), effects: mapped });
10092
10350
  }
10093
10351
  return result;
10094
10352
  }, [schema.fields, fieldById]);
@@ -10109,11 +10367,11 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
10109
10367
  const defaults = {};
10110
10368
  for (const field of allStorageFields) {
10111
10369
  if (field.defaultValue !== void 0) {
10112
- defaults[formKey(field)] = field.defaultValue;
10370
+ defaults[useDatasourceSchema.formKey(field)] = field.defaultValue;
10113
10371
  }
10114
10372
  }
10115
10373
  const merged = { ...defaults, ...result.values };
10116
- const virtualValues = computeVirtualFieldValues(schema, merged);
10374
+ const virtualValues = useDatasourceSchema.computeVirtualFieldValues(schema, merged);
10117
10375
  reset({ ...merged, ...virtualValues });
10118
10376
  setInitializing(false);
10119
10377
  });
@@ -10128,7 +10386,7 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
10128
10386
  return;
10129
10387
  }
10130
10388
  for (const { sourceKey, effects } of fieldsWithEffects) {
10131
- const currentVal = watchedValues[sourceKey];
10389
+ const currentVal = useDatasourceSchema.getWatchedValue(watchedValues, sourceKey);
10132
10390
  const prevVal = prevEffectValuesRef.current[sourceKey];
10133
10391
  if (currentVal === prevVal) {
10134
10392
  continue;
@@ -10151,19 +10409,20 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
10151
10409
  continue;
10152
10410
  }
10153
10411
  const ovs = field.overrides.filter((ov) => ov.defaultValue !== void 0).map((ov) => {
10154
- const parsed = parseDependsOn(ov.when);
10412
+ const parsed = useDatasourceSchema.parseDependsOn(ov.when);
10155
10413
  if (!parsed) {
10156
10414
  return null;
10157
10415
  }
10158
10416
  const depField = fieldById.get(parsed.field);
10159
10417
  return {
10160
- depKey: depField ? formKey(depField) : parsed.field,
10418
+ depKey: depField ? useDatasourceSchema.formKey(depField) : parsed.field,
10161
10419
  depValue: parsed.value,
10420
+ negate: parsed.negate,
10162
10421
  defaultValue: ov.defaultValue
10163
10422
  };
10164
10423
  }).filter(Boolean);
10165
10424
  if (ovs.length > 0) {
10166
- result.push({ targetKey: formKey(field), fieldDefault: field.defaultValue, overrides: ovs });
10425
+ result.push({ targetKey: useDatasourceSchema.formKey(field), fieldDefault: field.defaultValue, overrides: ovs });
10167
10426
  }
10168
10427
  }
10169
10428
  return result;
@@ -10176,42 +10435,70 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
10176
10435
  }
10177
10436
  for (const { targetKey, fieldDefault, overrides } of fieldsWithOverrideDefaults) {
10178
10437
  for (const ov of overrides) {
10179
- const currentDepVal = String((_a = watchedValues[ov.depKey]) != null ? _a : "");
10438
+ const currentDepVal = String((_a = useDatasourceSchema.getWatchedValue(watchedValues, ov.depKey)) != null ? _a : "");
10180
10439
  const trackKey = `${targetKey}::${ov.depKey}`;
10181
10440
  const prevDepVal = prevOverrideDepRef.current[trackKey];
10182
10441
  if (currentDepVal === prevDepVal) {
10183
10442
  continue;
10184
10443
  }
10185
10444
  prevOverrideDepRef.current[trackKey] = currentDepVal;
10186
- if (currentDepVal === ov.depValue) {
10445
+ const active = useDatasourceSchema.evaluateDependsOn({ value: ov.depValue, negate: ov.negate }, currentDepVal);
10446
+ const wasActive = prevDepVal !== void 0 && useDatasourceSchema.evaluateDependsOn({ value: ov.depValue, negate: ov.negate }, prevDepVal);
10447
+ if (active) {
10187
10448
  setValue(targetKey, ov.defaultValue);
10188
- } else if (prevDepVal === ov.depValue && fieldDefault !== void 0) {
10449
+ } else if (wasActive && fieldDefault !== void 0) {
10189
10450
  setValue(targetKey, fieldDefault);
10190
10451
  }
10191
10452
  }
10192
10453
  }
10193
10454
  }, [watchedValues, fieldsWithOverrideDefaults, initializing, setValue]);
10455
+ const celContext = React.useMemo(() => {
10456
+ const ctx = {};
10457
+ for (const f of fieldById.values()) {
10458
+ const fk = useDatasourceSchema.formKey(f);
10459
+ const val = useDatasourceSchema.getWatchedValue(watchedValues, fk);
10460
+ if (val !== void 0) {
10461
+ const parts = f.id.split(".");
10462
+ let current = ctx;
10463
+ for (let i = 0; i < parts.length - 1; i++) {
10464
+ if (!(parts[i] in current) || typeof current[parts[i]] !== "object" || current[parts[i]] === null) {
10465
+ current[parts[i]] = {};
10466
+ }
10467
+ current = current[parts[i]];
10468
+ }
10469
+ current[parts[parts.length - 1]] = val;
10470
+ }
10471
+ }
10472
+ return ctx;
10473
+ }, [watchedValues, fieldById]);
10194
10474
  const isFieldVisible = React.useCallback(
10195
10475
  (field) => {
10196
- var _a, _b;
10197
- if (field.kind === "virtual" && !field.ui) {
10198
- return false;
10199
- }
10200
- if ((_a = field.tags) == null ? void 0 : _a.some((t) => t.startsWith("managed-by:"))) {
10201
- return false;
10202
- }
10203
- if (!field.dependsOn) {
10204
- return true;
10205
- }
10206
- const parsed = parseDependsOn(field.dependsOn);
10207
- if (!parsed) {
10208
- return true;
10476
+ function check(f, visited) {
10477
+ var _a;
10478
+ if (f.kind === "virtual" && !f.ui) {
10479
+ return false;
10480
+ }
10481
+ if ((_a = f.tags) == null ? void 0 : _a.some((t) => t.startsWith("managed-by:"))) {
10482
+ return false;
10483
+ }
10484
+ if (!f.dependsOn) {
10485
+ return true;
10486
+ }
10487
+ const refs = useDatasourceSchema.extractFieldRefs(f.dependsOn);
10488
+ for (const ref of refs) {
10489
+ const depField = fieldById.get(ref);
10490
+ if (depField && !visited.has(depField.id)) {
10491
+ visited.add(f.id);
10492
+ if (!check(depField, visited)) {
10493
+ return false;
10494
+ }
10495
+ }
10496
+ }
10497
+ return useDatasourceSchema.evaluateCelExpression(f.dependsOn, celContext);
10209
10498
  }
10210
- const depField = fieldById.get(parsed.field);
10211
- const depKey = depField ? formKey(depField) : parsed.field;
10212
- return String((_b = watchedValues[depKey]) != null ? _b : "") === parsed.value;
10499
+ return check(field, /* @__PURE__ */ new Set());
10213
10500
  },
10214
- [watchedValues, fieldById]
10501
+ [celContext, fieldById]
10215
10502
  );
10216
10503
  const onSubmit = React.useCallback(
10217
10504
  async (data) => {
@@ -10225,11 +10512,11 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
10225
10512
  const defaults = {};
10226
10513
  for (const field of allStorageFields) {
10227
10514
  if (field.defaultValue !== void 0) {
10228
- defaults[formKey(field)] = field.defaultValue;
10515
+ defaults[useDatasourceSchema.formKey(field)] = field.defaultValue;
10229
10516
  }
10230
10517
  }
10231
10518
  const merged = { ...defaults, ...refreshed.values };
10232
- const virtualValues = computeVirtualFieldValues(schema, merged);
10519
+ const virtualValues = useDatasourceSchema.computeVirtualFieldValues(schema, merged);
10233
10520
  reset({ ...merged, ...virtualValues });
10234
10521
  onSuccess("UPDATED", "Configuration saved.");
10235
10522
  } catch (err) {
@@ -10248,11 +10535,11 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
10248
10535
  if (!isFieldVisible(field)) {
10249
10536
  continue;
10250
10537
  }
10251
- if (errors[formKey(field)]) {
10538
+ if (errors[useDatasourceSchema.formKey(field)]) {
10252
10539
  return false;
10253
10540
  }
10254
- if (isFieldRequired(field, watchedValues, fieldById)) {
10255
- const val = watchedValues[formKey(field)];
10541
+ if (isFieldRequired(field, watchedValues, fieldById, celContext)) {
10542
+ const val = useDatasourceSchema.getWatchedValue(watchedValues, useDatasourceSchema.formKey(field));
10256
10543
  if (val === SECURE_FIELD_CONFIGURED) {
10257
10544
  continue;
10258
10545
  }
@@ -10263,12 +10550,21 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
10263
10550
  }
10264
10551
  return true;
10265
10552
  },
10266
- [errors, watchedValues, fieldById, isFieldVisible]
10553
+ [errors, watchedValues, fieldById, celContext, isFieldVisible]
10554
+ );
10555
+ const isFieldDisabled = React.useCallback(
10556
+ (field) => {
10557
+ if (!field.disabledWhen) {
10558
+ return false;
10559
+ }
10560
+ return useDatasourceSchema.evaluateCelExpression(field.disabledWhen, celContext);
10561
+ },
10562
+ [celContext]
10267
10563
  );
10268
10564
  const groupHasData = React.useCallback(
10269
10565
  (group) => {
10270
10566
  for (const field of group.fields) {
10271
- const val = watchedValues[formKey(field)];
10567
+ const val = useDatasourceSchema.getWatchedValue(watchedValues, useDatasourceSchema.formKey(field));
10272
10568
  if (val === void 0 || val === null || val === "" || val === false) {
10273
10569
  continue;
10274
10570
  }
@@ -10292,6 +10588,7 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
10292
10588
  trigger,
10293
10589
  errors,
10294
10590
  watchedValues,
10591
+ celContext,
10295
10592
  // State
10296
10593
  initializing,
10297
10594
  fetchError,
@@ -10300,9 +10597,11 @@ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
10300
10597
  readOnly,
10301
10598
  // Callbacks
10302
10599
  isFieldVisible,
10600
+ isFieldDisabled,
10303
10601
  isGroupValid,
10304
10602
  groupHasData,
10305
- onSubmit
10603
+ onSubmit,
10604
+ setValue
10306
10605
  };
10307
10606
  }
10308
10607
 
@@ -10349,13 +10648,16 @@ function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, rend
10349
10648
  trigger,
10350
10649
  errors,
10351
10650
  watchedValues,
10651
+ celContext,
10352
10652
  initializing,
10353
10653
  fetchError,
10354
10654
  submitting,
10355
10655
  submitError,
10356
10656
  readOnly,
10357
10657
  isFieldVisible,
10358
- onSubmit
10658
+ isFieldDisabled,
10659
+ onSubmit,
10660
+ setValue
10359
10661
  } = form;
10360
10662
  const arrowSteps = React.useMemo(() => {
10361
10663
  const requiredGroup = resolvedGroups.find((g) => g.group.id === "_required");
@@ -10398,11 +10700,11 @@ function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, rend
10398
10700
  return true;
10399
10701
  }
10400
10702
  for (const field of visibleFieldsForStep) {
10401
- if (errors[formKey(field)]) {
10703
+ if (errors[useDatasourceSchema.formKey(field)]) {
10402
10704
  return false;
10403
10705
  }
10404
- if (isFieldRequired(field, watchedValues, fieldById)) {
10405
- const val = watchedValues[formKey(field)];
10706
+ if (isFieldRequired(field, watchedValues, fieldById, celContext)) {
10707
+ const val = useDatasourceSchema.getWatchedValue(watchedValues, useDatasourceSchema.formKey(field));
10406
10708
  if (val === SECURE_FIELD_CONFIGURED) {
10407
10709
  continue;
10408
10710
  }
@@ -10412,13 +10714,13 @@ function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, rend
10412
10714
  }
10413
10715
  }
10414
10716
  return true;
10415
- }, [currentResolved, errors, visibleFieldsForStep, watchedValues, fieldById]);
10717
+ }, [currentResolved, errors, visibleFieldsForStep, watchedValues, fieldById, celContext]);
10416
10718
  const goNext = React.useCallback(async () => {
10417
10719
  if (!currentResolved) {
10418
10720
  return;
10419
10721
  }
10420
10722
  if (!readOnly) {
10421
- const visibleKeys = visibleFieldsForStep.map((f) => formKey(f));
10723
+ const visibleKeys = visibleFieldsForStep.map((f) => useDatasourceSchema.formKey(f));
10422
10724
  const valid = await trigger(visibleKeys);
10423
10725
  if (!valid) {
10424
10726
  return;
@@ -10502,19 +10804,21 @@ function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, rend
10502
10804
  )))), currentResolved && /* @__PURE__ */ React__default.default.createElement("form", { onSubmit: handleSubmit(onSubmit), className: styles.form }, visibleFieldsForStep.map((field) => /* @__PURE__ */ React__default.default.createElement(
10503
10805
  SchemaField,
10504
10806
  {
10505
- key: formKey(field),
10807
+ key: useDatasourceSchema.formKey(field),
10506
10808
  field,
10507
10809
  control,
10508
10810
  errors,
10509
- disabled: allDisabled,
10811
+ disabled: allDisabled || isFieldDisabled(field),
10510
10812
  dsUid,
10511
10813
  watchedValues,
10512
- fieldById
10814
+ fieldById,
10815
+ celContext,
10816
+ setValue
10513
10817
  }
10514
10818
  )), (currentResolved.group.id === "_required" || currentResolved.group.id === "auth") && httpHeadersField && /* @__PURE__ */ React__default.default.createElement(
10515
10819
  AuthorizationHeaderField,
10516
10820
  {
10517
- headersFieldKey: formKey(httpHeadersField),
10821
+ headersFieldKey: useDatasourceSchema.formKey(httpHeadersField),
10518
10822
  control,
10519
10823
  disabled: allDisabled,
10520
10824
  watchedValues
@@ -12124,412 +12428,34 @@ const convertUnits = (queryStats) => {
12124
12428
  return text + suffix;
12125
12429
  };
12126
12430
 
12127
- function generateLLMHint(schema) {
12128
- var _a, _b, _c, _d;
12129
- const hints = [];
12130
- for (const field of schema.fields) {
12131
- if (((_a = field.ui) == null ? void 0 : _a.component) !== "select" || field.target !== "jsonData" || field.kind === "virtual") {
12132
- continue;
12133
- }
12134
- const options = (_c = (_b = field.ui) == null ? void 0 : _b.options) != null ? _c : [];
12135
- const values = options.map((opt) => {
12136
- const isDefault = field.defaultValue != null && String(opt.value) === String(field.defaultValue);
12137
- return isDefault ? `"${opt.value}" (default)` : `"${opt.value}"`;
12138
- }).join(", ");
12139
- if (values) {
12140
- hints.push(`- ${(_d = field.label) != null ? _d : field.key}: jsonData.${field.key} \u2014 values: ${values}`);
12141
- }
12142
- }
12143
- return hints.join("\n");
12144
- }
12145
- function generateTroubleshootingFields(schema) {
12146
- var _a, _b, _c;
12147
- const result = [];
12148
- for (const field of schema.fields) {
12149
- if (field.kind === "virtual" || field.isItemField) {
12150
- continue;
12151
- }
12152
- const entry = {
12153
- label: (_a = field.label) != null ? _a : field.key,
12154
- key: field.target === "root" ? field.key : `${field.target}.${field.key}`,
12155
- target: (_b = field.target) != null ? _b : "jsonData",
12156
- type: field.valueType,
12157
- required: !!field.required
12158
- };
12159
- if (field.description) {
12160
- entry.description = field.description;
12161
- }
12162
- if (field.defaultValue != null) {
12163
- entry.defaultValue = field.defaultValue;
12164
- }
12165
- if (((_c = field.ui) == null ? void 0 : _c.options) && field.ui.options.length > 0) {
12166
- entry.options = field.ui.options.map((o) => String(o.value));
12167
- }
12168
- if (field.section) {
12169
- entry.section = field.section;
12170
- }
12171
- if (field.dependsOn) {
12172
- entry.dependsOn = field.dependsOn;
12173
- }
12174
- result.push(entry);
12175
- }
12176
- return result;
12177
- }
12178
-
12179
- function yamlIndent(depth) {
12180
- return " ".repeat(depth);
12181
- }
12182
- function yamlString(value) {
12183
- if (value === null || value === void 0) {
12184
- return '""';
12185
- }
12186
- const s = String(value);
12187
- if (s === "") {
12188
- return '""';
12189
- }
12190
- return yaml__default.default.dump(s, { lineWidth: -1 }).trimEnd();
12191
- }
12192
- function yamlValue(value, depth) {
12193
- if (value === null || value === void 0) {
12194
- return '""';
12195
- }
12196
- if (typeof value === "boolean") {
12197
- return value ? "true" : "false";
12198
- }
12199
- if (typeof value === "number") {
12200
- return String(value);
12201
- }
12202
- if (typeof value === "string") {
12203
- return yamlString(value);
12204
- }
12205
- if (Array.isArray(value)) {
12206
- if (value.length === 0) {
12207
- return "[]";
12208
- }
12209
- const lines = value.map((item) => {
12210
- if (typeof item === "object" && item !== null && !Array.isArray(item)) {
12211
- const entries = Object.entries(item);
12212
- if (entries.length === 0) {
12213
- return `${yamlIndent(depth)}- {}`;
12214
- }
12215
- const [firstKey, firstVal] = entries[0];
12216
- const firstLine = `${yamlIndent(depth)}- ${yamlString(firstKey)}: ${yamlValue(firstVal, depth + 2)}`;
12217
- const rest = entries.slice(1).map(([k, v]) => `${yamlIndent(depth + 1)}${yamlString(k)}: ${yamlValue(v, depth + 2)}`);
12218
- return [firstLine, ...rest].join("\n");
12219
- }
12220
- return `${yamlIndent(depth)}- ${yamlValue(item, depth + 1)}`;
12221
- });
12222
- return "\n" + lines.join("\n");
12223
- }
12224
- if (typeof value === "object") {
12225
- const entries = Object.entries(value);
12226
- if (entries.length === 0) {
12227
- return "{}";
12228
- }
12229
- const lines = entries.map(([k, v]) => `${yamlIndent(depth)}${yamlString(k)}: ${yamlValue(v, depth + 1)}`);
12230
- return "\n" + lines.join("\n");
12231
- }
12232
- return yamlString(value);
12233
- }
12234
- function isCertField(field) {
12235
- var _a;
12236
- const k = field.key.toLowerCase();
12237
- return field.target === "secureJsonData" && (k.includes("cert") || k.includes("key") || ((_a = field.ui) == null ? void 0 : _a.component) === "textarea");
12238
- }
12239
- function isExcludedFromProvisioning(field) {
12240
- var _a, _b;
12241
- if (field.kind === "virtual") {
12242
- return true;
12243
- }
12244
- if (field.isItemField) {
12245
- return true;
12246
- }
12247
- if (((_a = field.tags) == null ? void 0 : _a.some((t) => t.startsWith("managed-by:"))) && field.target !== "root") {
12248
- return true;
12249
- }
12250
- if (((_b = field.storage) == null ? void 0 : _b.type) === "indexedPair") {
12251
- return true;
12252
- }
12253
- return false;
12254
- }
12255
- function secretPlaceholder(field) {
12256
- if (isCertField(field)) {
12257
- return "|\n xxxxxx";
12258
- }
12259
- return "xxxxxx";
12260
- }
12261
- function templateValue(field) {
12262
- var _a;
12263
- if (field.defaultValue !== void 0) {
12264
- return field.defaultValue;
12265
- }
12266
- if (((_a = field.ui) == null ? void 0 : _a.options) && field.ui.options.length > 0) {
12267
- return field.ui.options[0].value;
12268
- }
12269
- switch (field.valueType) {
12270
- case "string":
12271
- return "";
12272
- case "number":
12273
- return 0;
12274
- case "boolean":
12275
- return false;
12276
- case "array":
12277
- return [];
12278
- case "object":
12279
- case "map":
12280
- return {};
12281
- default:
12282
- return "";
12283
- }
12284
- }
12285
- function fieldComment(field, indent) {
12286
- var _a, _b, _c;
12287
- const parts = [];
12288
- const label = (_a = field.label) != null ? _a : field.key;
12289
- let line = label;
12290
- if (field.required) {
12291
- line += " (REQUIRED)";
12292
- }
12293
- if (field.description) {
12294
- line += ` \u2014 ${field.description}`;
12295
- }
12296
- parts.push(`${indent}# ${line}`);
12297
- const options = (_b = field.ui) == null ? void 0 : _b.options;
12298
- if (options && options.length > 0) {
12299
- const vals = options.map((o) => String(o.value)).join(", ");
12300
- parts.push(`${indent}# Allowed values: ${vals}`);
12301
- }
12302
- const allowedValuesRule = (_c = field.validations) == null ? void 0 : _c.find(
12303
- (v) => v.type === "allowedValues"
12304
- );
12305
- if (allowedValuesRule && !options) {
12306
- const vals = allowedValuesRule.values.map((v) => String(v)).join(", ");
12307
- parts.push(`${indent}# Allowed values: ${vals}`);
12308
- }
12309
- if (field.dependsOn) {
12310
- parts.push(`${indent}# Only when: ${field.dependsOn}`);
12311
- }
12312
- return parts.join("\n");
12313
- }
12314
- function toProvisioningYaml(schema, values, options) {
12315
- var _a, _b, _c, _d, _e, _f;
12316
- const isTemplate = !values;
12317
- const showComments = (_a = options == null ? void 0 : options.comments) != null ? _a : isTemplate;
12318
- const indent2 = " ";
12319
- const indent3 = " ";
12320
- const groups = resolveGroups(schema);
12321
- const rootFields = [];
12322
- const jsonDataFieldsByGroup = [];
12323
- const secureJsonDataFieldsByGroup = [];
12324
- const virtualFieldsWithOptions = [];
12325
- for (const { group, fields } of groups) {
12326
- const jd = [];
12327
- const sd = [];
12328
- for (const field of fields) {
12329
- if (field.kind === "virtual" && ((_b = field.ui) == null ? void 0 : _b.options) && field.ui.options.length > 0) {
12330
- virtualFieldsWithOptions.push(field);
12331
- continue;
12332
- }
12333
- if (isExcludedFromProvisioning(field)) {
12334
- continue;
12335
- }
12336
- switch (field.target) {
12337
- case "root":
12338
- rootFields.push(field);
12339
- break;
12340
- case "jsonData":
12341
- jd.push(field);
12342
- break;
12343
- case "secureJsonData":
12344
- sd.push(field);
12345
- break;
12346
- }
12347
- }
12348
- if (jd.length > 0) {
12349
- jsonDataFieldsByGroup.push({ group, fields: jd });
12350
- }
12351
- if (sd.length > 0) {
12352
- secureJsonDataFieldsByGroup.push({ group, fields: sd });
12353
- }
12354
- }
12355
- const allSecureJsonDataFields = secureJsonDataFieldsByGroup.flatMap((g) => g.fields);
12356
- const groupedFieldIds = new Set(groups.flatMap(({ group }) => group.fieldRefs));
12357
- for (const field of schema.fields) {
12358
- if (field.target === "root" && !groupedFieldIds.has(field.id) && !isExcludedFromProvisioning(field)) {
12359
- rootFields.push(field);
12360
- }
12361
- }
12362
- const lines = [];
12363
- lines.push("apiVersion: 1");
12364
- lines.push("");
12365
- lines.push("datasources:");
12366
- lines.push(`${indent2.slice(2)}- name: ${yamlString((_d = (_c = options == null ? void 0 : options.name) != null ? _c : values == null ? void 0 : values.name) != null ? _d : `my-${schema.pluginType}`)}`);
12367
- lines.push(`${indent2}type: ${schema.pluginType}`);
12368
- if (!isTemplate && (values == null ? void 0 : values.uid)) {
12369
- lines.push(`${indent2}uid: ${yamlString(values.uid)}`);
12370
- }
12371
- const ALREADY_EMITTED_ROOT = /* @__PURE__ */ new Set(["name", "type", "uid"]);
12372
- for (const field of rootFields) {
12373
- if (ALREADY_EMITTED_ROOT.has(field.key)) {
12374
- continue;
12375
- }
12376
- const val = values ? values[field.key] : templateValue(field);
12377
- if (val === void 0 || val === null) {
12378
- continue;
12379
- }
12380
- if (!isTemplate && val === false) {
12381
- continue;
12382
- }
12383
- if (showComments) {
12384
- lines.push(fieldComment(field, indent2));
12385
- }
12386
- lines.push(`${indent2}${field.key}: ${yamlValue(val, 3)}`);
12387
- }
12388
- if (showComments) {
12389
- for (const vf of virtualFieldsWithOptions) {
12390
- const label = (_e = vf.label) != null ? _e : vf.key;
12391
- const opts = vf.ui.options.map((o) => `${String(o.value)} (${o.label})`).join(", ");
12392
- lines.push(`${indent2}# ${label}: ${opts}`);
12393
- if (vf.description) {
12394
- lines.push(`${indent2}# ${vf.description}`);
12395
- }
12396
- }
12397
- }
12398
- const emittedJsonDataKeys = /* @__PURE__ */ new Set();
12399
- const emittedSecureJsonDataKeys = /* @__PURE__ */ new Set();
12400
- const jsonDataValues = values == null ? void 0 : values.jsonData;
12401
- const hasJsonDataFromSchema = jsonDataFieldsByGroup.length > 0;
12402
- const hasJsonDataFromValues = !isTemplate && jsonDataValues && Object.keys(jsonDataValues).length > 0;
12403
- if (hasJsonDataFromSchema || hasJsonDataFromValues) {
12404
- lines.push(`${indent2}jsonData:`);
12405
- for (const { group, fields: groupFields } of jsonDataFieldsByGroup) {
12406
- if (showComments && jsonDataFieldsByGroup.length > 1) {
12407
- lines.push(`${indent3}# --- ${group.title} ---`);
12408
- }
12409
- for (const field of groupFields) {
12410
- const val = values ? getNestedValue(values, "jsonData", field) : templateValue(field);
12411
- if (val === void 0 || val === null) {
12412
- continue;
12413
- }
12414
- if (!isTemplate && field.defaultValue !== void 0 && val === field.defaultValue) {
12415
- continue;
12416
- }
12417
- emittedJsonDataKeys.add(field.key);
12418
- if (showComments) {
12419
- lines.push(fieldComment(field, indent3));
12420
- }
12421
- const rendered = yamlValue(val, 4);
12422
- if (rendered.startsWith("\n")) {
12423
- lines.push(`${indent3}${field.key}:${rendered}`);
12424
- } else {
12425
- lines.push(`${indent3}${field.key}: ${rendered}`);
12426
- }
12427
- }
12428
- }
12429
- if (!isTemplate && jsonDataValues) {
12430
- for (const [key, val] of Object.entries(jsonDataValues)) {
12431
- if (emittedJsonDataKeys.has(key)) {
12432
- continue;
12433
- }
12434
- if (val === void 0 || val === null) {
12435
- continue;
12436
- }
12437
- const rendered = yamlValue(val, 4);
12438
- if (rendered.startsWith("\n")) {
12439
- lines.push(`${indent3}${key}:${rendered}`);
12440
- } else {
12441
- lines.push(`${indent3}${key}: ${rendered}`);
12442
- }
12443
- }
12444
- }
12445
- }
12446
- const secureJsonFields = (_f = values == null ? void 0 : values.secureJsonFields) != null ? _f : {};
12447
- const inferredSecureKeys = !isTemplate ? inferSecureJsonDataKeys(jsonDataValues) : [];
12448
- const activeSecureFields = isTemplate ? allSecureJsonDataFields : allSecureJsonDataFields.filter((f) => secureJsonFields[f.key] === true);
12449
- if (activeSecureFields.length > 0 || inferredSecureKeys.length > 0) {
12450
- lines.push(`${indent2}secureJsonData:`);
12451
- for (const field of activeSecureFields) {
12452
- emittedSecureJsonDataKeys.add(field.key);
12453
- if (showComments) {
12454
- lines.push(fieldComment(field, indent3));
12455
- }
12456
- lines.push(`${indent3}${field.key}: ${secretPlaceholder(field)}`);
12457
- }
12458
- for (const key of inferredSecureKeys) {
12459
- if (emittedSecureJsonDataKeys.has(key)) {
12460
- continue;
12461
- }
12462
- lines.push(`${indent3}${key}: xxxxxx`);
12463
- }
12464
- }
12465
- return lines.join("\n");
12466
- }
12467
- function inferSecureJsonDataKeys(jsonData) {
12468
- if (!jsonData) {
12469
- return [];
12470
- }
12471
- const keys = [];
12472
- for (const key of Object.keys(jsonData)) {
12473
- const match = key.match(/^httpHeaderName(\d+)$/);
12474
- if (match) {
12475
- keys.push(`httpHeaderValue${match[1]}`);
12476
- }
12477
- }
12478
- return keys;
12479
- }
12480
- function getNestedValue(values, target, field) {
12481
- const nested = values[target];
12482
- if (nested && typeof nested === "object") {
12483
- return nested[field.key];
12484
- }
12485
- return void 0;
12486
- }
12487
- function datasourceToProvisioningYaml(ds, schema) {
12488
- if (schema) {
12489
- return toProvisioningYaml(schema, ds, { comments: false });
12490
- }
12491
- const lines = [];
12492
- lines.push("apiVersion: 1");
12493
- lines.push("");
12494
- lines.push("datasources:");
12495
- lines.push(` - name: ${yamlString(ds.name)}`);
12496
- if (ds.uid) {
12497
- lines.push(` uid: ${yamlString(ds.uid)}`);
12498
- }
12499
- lines.push(` type: ${yamlString(ds.type)}`);
12500
- if (ds.url) {
12501
- lines.push(` url: ${yamlString(ds.url)}`);
12502
- }
12503
- if (ds.database) {
12504
- lines.push(` database: ${yamlString(ds.database)}`);
12505
- }
12506
- if (ds.isDefault) {
12507
- lines.push(" isDefault: true");
12508
- }
12509
- if (ds.basicAuth) {
12510
- lines.push(" basicAuth: true");
12511
- if (ds.basicAuthUser) {
12512
- lines.push(` basicAuthUser: ${yamlString(ds.basicAuthUser)}`);
12513
- }
12514
- }
12515
- const jsonData = ds.jsonData;
12516
- if (jsonData && Object.keys(jsonData).length > 0) {
12517
- lines.push(" jsonData:");
12518
- for (const [key, val] of Object.entries(jsonData)) {
12519
- const rendered = yamlValue(val, 4);
12520
- if (rendered.startsWith("\n")) {
12521
- lines.push(` ${key}:${rendered}`);
12522
- } else {
12523
- lines.push(` ${key}: ${rendered}`);
12524
- }
12525
- }
12526
- }
12527
- lines.push(" # secureJsonData: (secrets are not exported \u2014 add manually)");
12528
- lines.push(" # mySecret: xxxxxx");
12529
- return lines.join("\n");
12530
- }
12531
-
12532
- exports.getConfigSchema = schemas.getConfigSchema;
12431
+ exports.ROOT_CONFIG_FIELDS = useDatasourceSchema.ROOT_CONFIG_FIELDS;
12432
+ exports.buildCelContext = useDatasourceSchema.buildCelContext;
12433
+ exports.buildCloneDatasourcePayload = useDatasourceSchema.buildCloneDatasourcePayload;
12434
+ exports.buildCreateDatasourcePayload = useDatasourceSchema.buildCreateDatasourcePayload;
12435
+ exports.buildUpdateDatasourcePayload = useDatasourceSchema.buildUpdateDatasourcePayload;
12436
+ exports.clearExpressionCache = useDatasourceSchema.clearExpressionCache;
12437
+ exports.computeVirtualFieldValues = useDatasourceSchema.computeVirtualFieldValues;
12438
+ exports.configToYaml = useDatasourceSchema.configToYaml;
12439
+ exports.datasourceToProvisioningYaml = useDatasourceSchema.datasourceToProvisioningYaml;
12440
+ exports.evaluateCelDirect = useDatasourceSchema.evaluateCelDirect;
12441
+ exports.evaluateCelExpression = useDatasourceSchema.evaluateCelExpression;
12442
+ exports.evaluateComputedRead = useDatasourceSchema.evaluateComputedRead;
12443
+ exports.evaluateDependsOn = useDatasourceSchema.evaluateDependsOn;
12444
+ exports.extractFieldRefs = useDatasourceSchema.extractFieldRefs;
12445
+ exports.fetchConfigSchema = useDatasourceSchema.fetchConfigSchema;
12446
+ exports.formKey = useDatasourceSchema.formKey;
12447
+ exports.formatYamlDiff = useDatasourceSchema.formatYamlDiff;
12448
+ exports.generateLLMHint = useDatasourceSchema.generateLLMHint;
12449
+ exports.generateTroubleshootingFields = useDatasourceSchema.generateTroubleshootingFields;
12450
+ exports.getConfigSchema = useDatasourceSchema.getConfigSchema;
12451
+ exports.getWatchedValue = useDatasourceSchema.getWatchedValue;
12452
+ exports.isValidCelExpression = useDatasourceSchema.isValidCelExpression;
12453
+ exports.parseDependsOn = useDatasourceSchema.parseDependsOn;
12454
+ exports.resolveActiveOverride = useDatasourceSchema.resolveActiveOverride;
12455
+ exports.resolveGroups = useDatasourceSchema.resolveGroups;
12456
+ exports.resolveRequiredFieldsGroup = useDatasourceSchema.resolveRequiredFieldsGroup;
12457
+ exports.toProvisioningYaml = useDatasourceSchema.toProvisioningYaml;
12458
+ exports.useDatasourceSchema = useDatasourceSchema.useDatasourceSchema;
12533
12459
  exports.AccessoryButton = AccessoryButton;
12534
12460
  exports.AdvancedHttpSettings = AdvancedHttpSettings;
12535
12461
  exports.Auth = Auth;
@@ -12586,7 +12512,6 @@ exports.QueryModellerBase = QueryModellerBase;
12586
12512
  exports.QueryOptionGroup = QueryOptionGroup;
12587
12513
  exports.RawQuery = RawQuery;
12588
12514
  exports.RunQueryButton = RunQueryButton;
12589
- exports.SECURE_FIELD_CONFIGURED = SECURE_FIELD_CONFIGURED;
12590
12515
  exports.SQLEditor = SQLEditor;
12591
12516
  exports.SQLEditorMode = SQLEditorMode;
12592
12517
  exports.SQLEditorTestUtils = SQLEditorTestUtils;
@@ -12600,28 +12525,12 @@ exports.SuggestionKind = SuggestionKind;
12600
12525
  exports.TLSSettings = TLSSettings;
12601
12526
  exports.TableSelector = TableSelector;
12602
12527
  exports.TokenType = TokenType;
12603
- exports.buildDatasourceConfigPayload = buildDatasourceConfigPayload;
12604
- exports.computeVirtualFieldValues = computeVirtualFieldValues;
12605
12528
  exports.convertLegacyAuthProps = convertLegacyAuthProps;
12606
- exports.datasourceToProvisioningYaml = datasourceToProvisioningYaml;
12607
- exports.evaluateComputedRead = evaluateComputedRead;
12608
- exports.expandIndexedPair = expandIndexedPair;
12609
- exports.fetchExistingValues = fetchExistingValues;
12610
- exports.flattenIndexedPair = flattenIndexedPair;
12611
- exports.formKey = formKey;
12612
12529
  exports.formatDate = formatDate;
12613
- exports.generateLLMHint = generateLLMHint;
12614
- exports.generateTroubleshootingFields = generateTroubleshootingFields;
12615
12530
  exports.getStandardSQLCompletionProvider = getStandardSQLCompletionProvider;
12616
12531
  exports.grafanaStandardSQLLanguage = language;
12617
12532
  exports.grafanaStandardSQLLanguageConf = conf;
12618
- exports.parseDependsOn = parseDependsOn;
12619
- exports.resolveActiveOverride = resolveActiveOverride;
12620
- exports.resolveGroups = resolveGroups;
12621
12533
  exports.resolvePluginName = resolvePluginName;
12622
- exports.resolveRequiredFieldsGroup = resolveRequiredFieldsGroup;
12623
- exports.submitDatasourceConfig = submitDatasourceConfig;
12624
12534
  exports.toOption = toOption;
12625
- exports.toProvisioningYaml = toProvisioningYaml;
12626
12535
  exports.useHealthChecks = useHealthChecks;
12627
12536
  //# sourceMappingURL=index.cjs.map