@grafana/plugin-ui 0.13.1 → 0.14.1-dsconfig.032cfc4

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 (440) hide show
  1. package/dist/cjs/index.cjs +2989 -372
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +695 -40
  4. package/dist/cjs/schemas.cjs +25 -0
  5. package/dist/cjs/schemas.cjs.map +1 -0
  6. package/dist/cjs/schemas.d.cts +448 -0
  7. package/dist/cjs/test-utils.cjs +2 -2
  8. package/dist/cjs/test-utils.cjs.map +1 -1
  9. package/dist/cjs/test-utils.d.cts +24 -24
  10. package/dist/cjs/useDatasourceSchema-CxPGD2-b.js +17125 -0
  11. package/dist/cjs/useDatasourceSchema-CxPGD2-b.js.map +1 -0
  12. package/dist/esm/components/ConfigEditor/AdvancedSettings/AdvancedHttpSettings.js.map +1 -1
  13. package/dist/esm/components/ConfigEditor/Auth/Auth.js.map +1 -1
  14. package/dist/esm/components/ConfigEditor/Auth/auth-method/AuthMethodSettings.js +4 -4
  15. package/dist/esm/components/ConfigEditor/Auth/auth-method/AuthMethodSettings.js.map +1 -1
  16. package/dist/esm/components/ConfigEditor/Auth/auth-method/BasicAuth.js.map +1 -1
  17. package/dist/esm/components/ConfigEditor/Auth/custom-headers/CustomHeader.js.map +1 -1
  18. package/dist/esm/components/ConfigEditor/Auth/custom-headers/CustomHeaders.js +1 -1
  19. package/dist/esm/components/ConfigEditor/Auth/custom-headers/CustomHeaders.js.map +1 -1
  20. package/dist/esm/components/ConfigEditor/Auth/styles.js.map +1 -1
  21. package/dist/esm/components/ConfigEditor/Auth/tls/SelfSignedCertificate.js +1 -1
  22. package/dist/esm/components/ConfigEditor/Auth/tls/SelfSignedCertificate.js.map +1 -1
  23. package/dist/esm/components/ConfigEditor/Auth/tls/SkipTLSVerification.js.map +1 -1
  24. package/dist/esm/components/ConfigEditor/Auth/tls/TLSClientAuth.js +3 -3
  25. package/dist/esm/components/ConfigEditor/Auth/tls/TLSClientAuth.js.map +1 -1
  26. package/dist/esm/components/ConfigEditor/Auth/tls/TLSSettings.js.map +1 -1
  27. package/dist/esm/components/ConfigEditor/Auth/tls/TLSSettingsSection.js.map +1 -1
  28. package/dist/esm/components/ConfigEditor/Auth/types.js.map +1 -1
  29. package/dist/esm/components/ConfigEditor/Auth/utils.js +3 -3
  30. package/dist/esm/components/ConfigEditor/Auth/utils.js.map +1 -1
  31. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js +2 -2
  32. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js.map +1 -1
  33. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigSection.js.map +1 -1
  34. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigSubSection.js.map +1 -1
  35. package/dist/esm/components/ConfigEditor/ConfigSection/GenericConfigSection.js.map +1 -1
  36. package/dist/esm/components/ConfigEditor/Connection/ConnectionSettings.js +1 -1
  37. package/dist/esm/components/ConfigEditor/Connection/ConnectionSettings.js.map +1 -1
  38. package/dist/esm/components/ConfigEditor/DataSourceDescription.js.map +1 -1
  39. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js +234 -0
  40. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js.map +1 -0
  41. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js +27 -0
  42. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js.map +1 -0
  43. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js +71 -0
  44. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js.map +1 -0
  45. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js +54 -0
  46. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js.map +1 -0
  47. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js +181 -0
  48. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js.map +1 -0
  49. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js +75 -0
  50. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js.map +1 -0
  51. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/config.js +258 -0
  52. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/config.js.map +1 -0
  53. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/datasource.js +354 -0
  54. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/datasource.js.map +1 -0
  55. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js +138 -0
  56. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js.map +1 -0
  57. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js +326 -0
  58. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js.map +1 -0
  59. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js +106 -0
  60. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js.map +1 -0
  61. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js +51 -0
  62. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js.map +1 -0
  63. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js +26 -0
  64. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js.map +1 -0
  65. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js +106 -0
  66. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js.map +1 -0
  67. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js +124 -0
  68. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js.map +1 -0
  69. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js +190 -0
  70. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js.map +1 -0
  71. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PdcFieldNote.js +31 -0
  72. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PdcFieldNote.js.map +1 -0
  73. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js +59 -0
  74. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js.map +1 -0
  75. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js +80 -0
  76. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js.map +1 -0
  77. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js +141 -0
  78. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js.map +1 -0
  79. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js +30 -0
  80. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js.map +1 -0
  81. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/styles.js +360 -0
  82. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/styles.js.map +1 -0
  83. package/dist/esm/components/ConfigEditor/SecureSocksProxyToggle.js.map +1 -1
  84. package/dist/esm/components/CustomHeadersSettings/CustomHeadersSettings.js +11 -11
  85. package/dist/esm/components/CustomHeadersSettings/CustomHeadersSettings.js.map +1 -1
  86. package/dist/esm/components/DataLinks/DataLink.js +4 -4
  87. package/dist/esm/components/DataLinks/DataLink.js.map +1 -1
  88. package/dist/esm/components/DataLinks/DataLinks.js +3 -3
  89. package/dist/esm/components/DataLinks/DataLinks.js.map +1 -1
  90. package/dist/esm/components/DataSourcePicker/DataSourcePicker.js +8 -8
  91. package/dist/esm/components/DataSourcePicker/DataSourcePicker.js.map +1 -1
  92. package/dist/esm/components/DatePicker/DatePicker.js.map +1 -1
  93. package/dist/esm/components/DatePicker/styles.js +2 -2
  94. package/dist/esm/components/DatePicker/styles.js.map +1 -1
  95. package/dist/esm/components/DatePickerWithInput/DatePickerWithInput.js.map +1 -1
  96. package/dist/esm/components/DatePickerWithInput/styles.js +2 -2
  97. package/dist/esm/components/DatePickerWithInput/styles.js.map +1 -1
  98. package/dist/esm/components/DebounceInput/DebounceInput.js.map +1 -1
  99. package/dist/esm/components/Plugins/PluginSignatureBadge.js.map +1 -1
  100. package/dist/esm/components/QueryEditor/AccessoryButton.js.map +1 -1
  101. package/dist/esm/components/QueryEditor/CatalogSelector.js +1 -1
  102. package/dist/esm/components/QueryEditor/CatalogSelector.js.map +1 -1
  103. package/dist/esm/components/QueryEditor/ConfirmModal.js +1 -1
  104. package/dist/esm/components/QueryEditor/ConfirmModal.js.map +1 -1
  105. package/dist/esm/components/QueryEditor/DatasetSelector.js +1 -1
  106. package/dist/esm/components/QueryEditor/DatasetSelector.js.map +1 -1
  107. package/dist/esm/components/QueryEditor/EditorField.js +5 -5
  108. package/dist/esm/components/QueryEditor/EditorField.js.map +1 -1
  109. package/dist/esm/components/QueryEditor/EditorFieldGroup.js.map +1 -1
  110. package/dist/esm/components/QueryEditor/EditorHeader.js +2 -2
  111. package/dist/esm/components/QueryEditor/EditorHeader.js.map +1 -1
  112. package/dist/esm/components/QueryEditor/EditorList.js.map +1 -1
  113. package/dist/esm/components/QueryEditor/EditorRow.js +4 -4
  114. package/dist/esm/components/QueryEditor/EditorRow.js.map +1 -1
  115. package/dist/esm/components/QueryEditor/EditorRows.js +2 -2
  116. package/dist/esm/components/QueryEditor/EditorRows.js.map +1 -1
  117. package/dist/esm/components/QueryEditor/EditorStack.js +1 -1
  118. package/dist/esm/components/QueryEditor/EditorStack.js.map +1 -1
  119. package/dist/esm/components/QueryEditor/EditorSwitch.js +2 -2
  120. package/dist/esm/components/QueryEditor/EditorSwitch.js.map +1 -1
  121. package/dist/esm/components/QueryEditor/FlexItem.js.map +1 -1
  122. package/dist/esm/components/QueryEditor/InlineSelect.js +1 -1
  123. package/dist/esm/components/QueryEditor/InlineSelect.js.map +1 -1
  124. package/dist/esm/components/QueryEditor/InputGroup.js +2 -2
  125. package/dist/esm/components/QueryEditor/InputGroup.js.map +1 -1
  126. package/dist/esm/components/QueryEditor/QueryEditor.js +10 -8
  127. package/dist/esm/components/QueryEditor/QueryEditor.js.map +1 -1
  128. package/dist/esm/components/QueryEditor/QueryHeader.js +20 -20
  129. package/dist/esm/components/QueryEditor/QueryHeader.js.map +1 -1
  130. package/dist/esm/components/QueryEditor/RunQueryButton.js +1 -1
  131. package/dist/esm/components/QueryEditor/RunQueryButton.js.map +1 -1
  132. package/dist/esm/components/QueryEditor/Space.js +2 -2
  133. package/dist/esm/components/QueryEditor/Space.js.map +1 -1
  134. package/dist/esm/components/QueryEditor/TableSelector.js +0 -1
  135. package/dist/esm/components/QueryEditor/TableSelector.js.map +1 -1
  136. package/dist/esm/components/QueryEditor/defaults.js +7 -7
  137. package/dist/esm/components/QueryEditor/defaults.js.map +1 -1
  138. package/dist/esm/components/QueryEditor/expressions.js.map +1 -1
  139. package/dist/esm/components/QueryEditor/query-editor-raw/QueryEditorRaw.js +10 -2
  140. package/dist/esm/components/QueryEditor/query-editor-raw/QueryEditorRaw.js.map +1 -1
  141. package/dist/esm/components/QueryEditor/query-editor-raw/QueryToolbox.js +7 -2
  142. package/dist/esm/components/QueryEditor/query-editor-raw/QueryToolbox.js.map +1 -1
  143. package/dist/esm/components/QueryEditor/query-editor-raw/QueryValidator.js +4 -4
  144. package/dist/esm/components/QueryEditor/query-editor-raw/QueryValidator.js.map +1 -1
  145. package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js +14 -4
  146. package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js.map +1 -1
  147. package/dist/esm/components/QueryEditor/types.js +0 -1
  148. package/dist/esm/components/QueryEditor/types.js.map +1 -1
  149. package/dist/esm/components/QueryEditor/utils/formatSQL.js +15 -4
  150. package/dist/esm/components/QueryEditor/utils/formatSQL.js.map +1 -1
  151. package/dist/esm/components/QueryEditor/utils/sql.utils.js +8 -8
  152. package/dist/esm/components/QueryEditor/utils/sql.utils.js.map +1 -1
  153. package/dist/esm/components/QueryEditor/utils/useSqlChange.js.map +1 -1
  154. package/dist/esm/components/QueryEditor/visual-query-builder/AwesomeQueryBuilder.js +26 -27
  155. package/dist/esm/components/QueryEditor/visual-query-builder/AwesomeQueryBuilder.js.map +1 -1
  156. package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js +3 -3
  157. package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js.map +1 -1
  158. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js +2 -2
  159. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js.map +1 -1
  160. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRows.js.map +1 -1
  161. package/dist/esm/components/QueryEditor/visual-query-builder/GroupByRow.js +2 -2
  162. package/dist/esm/components/QueryEditor/visual-query-builder/GroupByRow.js.map +1 -1
  163. package/dist/esm/components/QueryEditor/visual-query-builder/OrderByRow.js +4 -4
  164. package/dist/esm/components/QueryEditor/visual-query-builder/OrderByRow.js.map +1 -1
  165. package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js +4 -4
  166. package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js.map +1 -1
  167. package/dist/esm/components/QueryEditor/visual-query-builder/SQLGroupByRow.js +0 -1
  168. package/dist/esm/components/QueryEditor/visual-query-builder/SQLGroupByRow.js.map +1 -1
  169. package/dist/esm/components/QueryEditor/visual-query-builder/SQLOrderByRow.js +2 -3
  170. package/dist/esm/components/QueryEditor/visual-query-builder/SQLOrderByRow.js.map +1 -1
  171. package/dist/esm/components/QueryEditor/visual-query-builder/SQLSelectRow.js +0 -1
  172. package/dist/esm/components/QueryEditor/visual-query-builder/SQLSelectRow.js.map +1 -1
  173. package/dist/esm/components/QueryEditor/visual-query-builder/SQLWhereRow.js +0 -1
  174. package/dist/esm/components/QueryEditor/visual-query-builder/SQLWhereRow.js.map +1 -1
  175. package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js +9 -9
  176. package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js.map +1 -1
  177. package/dist/esm/components/QueryEditor/visual-query-builder/VisualEditor.js +10 -2
  178. package/dist/esm/components/QueryEditor/visual-query-builder/VisualEditor.js.map +1 -1
  179. package/dist/esm/components/QueryEditor/visual-query-builder/WhereRow.js.map +1 -1
  180. package/dist/esm/components/QueryEditorRow/QueryEditorRow.js.map +1 -1
  181. package/dist/esm/components/SQLEditor/components/SQLEditor.js +13 -13
  182. package/dist/esm/components/SQLEditor/components/SQLEditor.js.map +1 -1
  183. package/dist/esm/components/SQLEditor/hooks/useLatestCallback.js +1 -1
  184. package/dist/esm/components/SQLEditor/hooks/useLatestCallback.js.map +1 -1
  185. package/dist/esm/components/SQLEditor/mocks/Monaco.js.map +1 -1
  186. package/dist/esm/components/SQLEditor/mocks/TextModel.js.map +1 -1
  187. package/dist/esm/components/SQLEditor/mocks/queries/multiLineFullQuery.js.map +1 -1
  188. package/dist/esm/components/SQLEditor/mocks/queries/multiLineFullQueryWithAggregation.js.map +1 -1
  189. package/dist/esm/components/SQLEditor/mocks/queries/multiLineMultipleColumns.js.map +1 -1
  190. package/dist/esm/components/SQLEditor/mocks/queries/singleLineEmptyQuery.js.map +1 -1
  191. package/dist/esm/components/SQLEditor/mocks/queries/singleLineFullQuery.js.map +1 -1
  192. package/dist/esm/components/SQLEditor/mocks/queries/singleLineFullQueryWithAggregation.js.map +1 -1
  193. package/dist/esm/components/SQLEditor/mocks/queries/singleLineMultipleColumns.js.map +1 -1
  194. package/dist/esm/components/SQLEditor/mocks/queries/singleLineTwoQueries.js.map +1 -1
  195. package/dist/esm/components/SQLEditor/mocks/queries/singleLineTwoQueriesWithAggregation.js.map +1 -1
  196. package/dist/esm/components/SQLEditor/standardSql/definition.js +0 -6
  197. package/dist/esm/components/SQLEditor/standardSql/definition.js.map +1 -1
  198. package/dist/esm/components/SQLEditor/standardSql/getStandardSuggestions.js +2 -2
  199. package/dist/esm/components/SQLEditor/standardSql/getStandardSuggestions.js.map +1 -1
  200. package/dist/esm/components/SQLEditor/standardSql/getStatementPosition.js +5 -4
  201. package/dist/esm/components/SQLEditor/standardSql/getStatementPosition.js.map +1 -1
  202. package/dist/esm/components/SQLEditor/standardSql/language.js.map +1 -1
  203. package/dist/esm/components/SQLEditor/standardSql/macros.js.map +1 -1
  204. package/dist/esm/components/SQLEditor/standardSql/standardSQLCompletionItemProvider.js +2 -2
  205. package/dist/esm/components/SQLEditor/standardSql/standardSQLCompletionItemProvider.js.map +1 -1
  206. package/dist/esm/components/SQLEditor/standardSql/standardSuggestionsRegistry.js +1 -1
  207. package/dist/esm/components/SQLEditor/standardSql/standardSuggestionsRegistry.js.map +1 -1
  208. package/dist/esm/components/SQLEditor/standardSql/statementPositionResolversRegistry.js +27 -26
  209. package/dist/esm/components/SQLEditor/standardSql/statementPositionResolversRegistry.js.map +1 -1
  210. package/dist/esm/components/SQLEditor/standardSql/suggestionsKindRegistry.js +1 -1
  211. package/dist/esm/components/SQLEditor/standardSql/suggestionsKindRegistry.js.map +1 -1
  212. package/dist/esm/components/SQLEditor/test-utils/index.js.map +1 -1
  213. package/dist/esm/components/SQLEditor/test-utils/statementPosition.js.map +1 -1
  214. package/dist/esm/components/SQLEditor/types.js +1 -17
  215. package/dist/esm/components/SQLEditor/types.js.map +1 -1
  216. package/dist/esm/components/SQLEditor/utils/LinkedToken.js +8 -8
  217. package/dist/esm/components/SQLEditor/utils/LinkedToken.js.map +1 -1
  218. package/dist/esm/components/SQLEditor/utils/commands.js.map +1 -1
  219. package/dist/esm/components/SQLEditor/utils/debugger.js +1 -1
  220. package/dist/esm/components/SQLEditor/utils/debugger.js.map +1 -1
  221. package/dist/esm/components/SQLEditor/utils/getSuggestionKind.js.map +1 -1
  222. package/dist/esm/components/SQLEditor/utils/linkedTokenBuilder.js +3 -3
  223. package/dist/esm/components/SQLEditor/utils/linkedTokenBuilder.js.map +1 -1
  224. package/dist/esm/components/SQLEditor/utils/toCompletionItem.js +1 -1
  225. package/dist/esm/components/SQLEditor/utils/toCompletionItem.js.map +1 -1
  226. package/dist/esm/components/SQLEditor/utils/tokenType.js +18 -0
  227. package/dist/esm/components/SQLEditor/utils/tokenType.js.map +1 -0
  228. package/dist/esm/components/SQLEditor/utils/tokenUtils.js +10 -10
  229. package/dist/esm/components/SQLEditor/utils/tokenUtils.js.map +1 -1
  230. package/dist/esm/components/Segment/Segment.js.map +1 -1
  231. package/dist/esm/components/VisualQueryBuilder/QueryModellerBase.js +2 -2
  232. package/dist/esm/components/VisualQueryBuilder/QueryModellerBase.js.map +1 -1
  233. package/dist/esm/components/VisualQueryBuilder/components/LabelFilterItem.js +11 -11
  234. package/dist/esm/components/VisualQueryBuilder/components/LabelFilterItem.js.map +1 -1
  235. package/dist/esm/components/VisualQueryBuilder/components/LabelFilters.js +1 -1
  236. package/dist/esm/components/VisualQueryBuilder/components/LabelFilters.js.map +1 -1
  237. package/dist/esm/components/VisualQueryBuilder/components/OperationEditor.js +4 -4
  238. package/dist/esm/components/VisualQueryBuilder/components/OperationEditor.js.map +1 -1
  239. package/dist/esm/components/VisualQueryBuilder/components/OperationEditorBody.js +3 -3
  240. package/dist/esm/components/VisualQueryBuilder/components/OperationEditorBody.js.map +1 -1
  241. package/dist/esm/components/VisualQueryBuilder/components/OperationExplainedBox.js +3 -3
  242. package/dist/esm/components/VisualQueryBuilder/components/OperationExplainedBox.js.map +1 -1
  243. package/dist/esm/components/VisualQueryBuilder/components/OperationHeader.js +2 -2
  244. package/dist/esm/components/VisualQueryBuilder/components/OperationHeader.js.map +1 -1
  245. package/dist/esm/components/VisualQueryBuilder/components/OperationInfoButton.js +2 -2
  246. package/dist/esm/components/VisualQueryBuilder/components/OperationInfoButton.js.map +1 -1
  247. package/dist/esm/components/VisualQueryBuilder/components/OperationList.js +4 -4
  248. package/dist/esm/components/VisualQueryBuilder/components/OperationList.js.map +1 -1
  249. package/dist/esm/components/VisualQueryBuilder/components/OperationListExplained.js +2 -2
  250. package/dist/esm/components/VisualQueryBuilder/components/OperationListExplained.js.map +1 -1
  251. package/dist/esm/components/VisualQueryBuilder/components/OperationParamEditor.js +6 -6
  252. package/dist/esm/components/VisualQueryBuilder/components/OperationParamEditor.js.map +1 -1
  253. package/dist/esm/components/VisualQueryBuilder/components/OperationsEditorRow.js +3 -3
  254. package/dist/esm/components/VisualQueryBuilder/components/OperationsEditorRow.js.map +1 -1
  255. package/dist/esm/components/VisualQueryBuilder/components/QueryBuilderHints.js +8 -8
  256. package/dist/esm/components/VisualQueryBuilder/components/QueryBuilderHints.js.map +1 -1
  257. package/dist/esm/components/VisualQueryBuilder/components/QueryEditorModeToggle.js.map +1 -1
  258. package/dist/esm/components/VisualQueryBuilder/components/QueryHeaderSwitch.js +3 -3
  259. package/dist/esm/components/VisualQueryBuilder/components/QueryHeaderSwitch.js.map +1 -1
  260. package/dist/esm/components/VisualQueryBuilder/components/QueryOptionGroup.js +1 -1
  261. package/dist/esm/components/VisualQueryBuilder/components/QueryOptionGroup.js.map +1 -1
  262. package/dist/esm/components/VisualQueryBuilder/components/RawQuery.js +2 -2
  263. package/dist/esm/components/VisualQueryBuilder/components/RawQuery.js.map +1 -1
  264. package/dist/esm/components/VisualQueryBuilder/types.js.map +1 -1
  265. package/dist/esm/datasource/SqlDatasource.js +14 -14
  266. package/dist/esm/datasource/SqlDatasource.js.map +1 -1
  267. package/dist/esm/datasource/constants.js.map +1 -1
  268. package/dist/esm/hooks/useDebounce.js.map +1 -1
  269. package/dist/esm/index.d.ts +695 -40
  270. package/dist/esm/index.js +13 -1
  271. package/dist/esm/index.js.map +1 -1
  272. package/dist/esm/schema/registry/alertmanager.schema.json.js +77 -0
  273. package/dist/esm/schema/registry/alertmanager.schema.json.js.map +1 -0
  274. package/dist/esm/schema/registry/cloudwatch.schema.json.js +384 -0
  275. package/dist/esm/schema/registry/cloudwatch.schema.json.js.map +1 -0
  276. package/dist/esm/schema/registry/elasticsearch.schema.json.js +597 -0
  277. package/dist/esm/schema/registry/elasticsearch.schema.json.js.map +1 -0
  278. package/dist/esm/schema/registry/grafana-adobeanalytics-datasource.schema.json.js +95 -0
  279. package/dist/esm/schema/registry/grafana-adobeanalytics-datasource.schema.json.js.map +1 -0
  280. package/dist/esm/schema/registry/grafana-amazonprometheus-datasource.schema.json.js +166 -0
  281. package/dist/esm/schema/registry/grafana-amazonprometheus-datasource.schema.json.js.map +1 -0
  282. package/dist/esm/schema/registry/grafana-appdynamics-datasource.schema.json.js +145 -0
  283. package/dist/esm/schema/registry/grafana-appdynamics-datasource.schema.json.js.map +1 -0
  284. package/dist/esm/schema/registry/grafana-astradb-datasource.schema.json.js +123 -0
  285. package/dist/esm/schema/registry/grafana-astradb-datasource.schema.json.js.map +1 -0
  286. package/dist/esm/schema/registry/grafana-athena-datasource.schema.json.js +158 -0
  287. package/dist/esm/schema/registry/grafana-athena-datasource.schema.json.js.map +1 -0
  288. package/dist/esm/schema/registry/grafana-atlassianstatuspage-datasource.schema.json.js +43 -0
  289. package/dist/esm/schema/registry/grafana-atlassianstatuspage-datasource.schema.json.js.map +1 -0
  290. package/dist/esm/schema/registry/grafana-azure-data-explorer-datasource.schema.json.js +204 -0
  291. package/dist/esm/schema/registry/grafana-azure-data-explorer-datasource.schema.json.js.map +1 -0
  292. package/dist/esm/schema/registry/grafana-azure-monitor-datasource.schema.json.js +300 -0
  293. package/dist/esm/schema/registry/grafana-azure-monitor-datasource.schema.json.js.map +1 -0
  294. package/dist/esm/schema/registry/grafana-azuredevops-datasource.schema.json.js +101 -0
  295. package/dist/esm/schema/registry/grafana-azuredevops-datasource.schema.json.js.map +1 -0
  296. package/dist/esm/schema/registry/grafana-azureprometheus-datasource.schema.json.js +125 -0
  297. package/dist/esm/schema/registry/grafana-azureprometheus-datasource.schema.json.js.map +1 -0
  298. package/dist/esm/schema/registry/grafana-bigquery-datasource.schema.json.js +508 -0
  299. package/dist/esm/schema/registry/grafana-bigquery-datasource.schema.json.js.map +1 -0
  300. package/dist/esm/schema/registry/grafana-catchpoint-datasource.schema.json.js +42 -0
  301. package/dist/esm/schema/registry/grafana-catchpoint-datasource.schema.json.js.map +1 -0
  302. package/dist/esm/schema/registry/grafana-clickhouse-datasource.schema.json.js +1400 -0
  303. package/dist/esm/schema/registry/grafana-clickhouse-datasource.schema.json.js.map +1 -0
  304. package/dist/esm/schema/registry/grafana-cloudflare-datasource.schema.json.js +42 -0
  305. package/dist/esm/schema/registry/grafana-cloudflare-datasource.schema.json.js.map +1 -0
  306. package/dist/esm/schema/registry/grafana-cockroachdb-datasource.schema.json.js +302 -0
  307. package/dist/esm/schema/registry/grafana-cockroachdb-datasource.schema.json.js.map +1 -0
  308. package/dist/esm/schema/registry/grafana-databricks-datasource.schema.json.js +291 -0
  309. package/dist/esm/schema/registry/grafana-databricks-datasource.schema.json.js.map +1 -0
  310. package/dist/esm/schema/registry/grafana-datadog-datasource.schema.json.js +155 -0
  311. package/dist/esm/schema/registry/grafana-datadog-datasource.schema.json.js.map +1 -0
  312. package/dist/esm/schema/registry/grafana-drone-datasource.schema.json.js +64 -0
  313. package/dist/esm/schema/registry/grafana-drone-datasource.schema.json.js.map +1 -0
  314. package/dist/esm/schema/registry/grafana-dynatrace-datasource.schema.json.js +179 -0
  315. package/dist/esm/schema/registry/grafana-dynatrace-datasource.schema.json.js.map +1 -0
  316. package/dist/esm/schema/registry/grafana-falconlogscale-datasource.schema.json.js +134 -0
  317. package/dist/esm/schema/registry/grafana-falconlogscale-datasource.schema.json.js.map +1 -0
  318. package/dist/esm/schema/registry/grafana-github-datasource.schema.json.js +156 -0
  319. package/dist/esm/schema/registry/grafana-github-datasource.schema.json.js.map +1 -0
  320. package/dist/esm/schema/registry/grafana-gitlab-datasource.schema.json.js +84 -0
  321. package/dist/esm/schema/registry/grafana-gitlab-datasource.schema.json.js.map +1 -0
  322. package/dist/esm/schema/registry/grafana-googlesheets-datasource.schema.json.js +231 -0
  323. package/dist/esm/schema/registry/grafana-googlesheets-datasource.schema.json.js.map +1 -0
  324. package/dist/esm/schema/registry/grafana-honeycomb-datasource.schema.json.js +87 -0
  325. package/dist/esm/schema/registry/grafana-honeycomb-datasource.schema.json.js.map +1 -0
  326. package/dist/esm/schema/registry/grafana-iot-sitewise-datasource.schema.json.js +159 -0
  327. package/dist/esm/schema/registry/grafana-iot-sitewise-datasource.schema.json.js.map +1 -0
  328. package/dist/esm/schema/registry/grafana-jira-datasource.schema.json.js +188 -0
  329. package/dist/esm/schema/registry/grafana-jira-datasource.schema.json.js.map +1 -0
  330. package/dist/esm/schema/registry/grafana-logicmonitor-datasource.schema.json.js +63 -0
  331. package/dist/esm/schema/registry/grafana-logicmonitor-datasource.schema.json.js.map +1 -0
  332. package/dist/esm/schema/registry/grafana-looker-datasource.schema.json.js +82 -0
  333. package/dist/esm/schema/registry/grafana-looker-datasource.schema.json.js.map +1 -0
  334. package/dist/esm/schema/registry/grafana-mongodb-datasource.schema.json.js +278 -0
  335. package/dist/esm/schema/registry/grafana-mongodb-datasource.schema.json.js.map +1 -0
  336. package/dist/esm/schema/registry/grafana-mqtt-datasource.schema.json.js +168 -0
  337. package/dist/esm/schema/registry/grafana-mqtt-datasource.schema.json.js.map +1 -0
  338. package/dist/esm/schema/registry/grafana-netlify-datasource.schema.json.js +42 -0
  339. package/dist/esm/schema/registry/grafana-netlify-datasource.schema.json.js.map +1 -0
  340. package/dist/esm/schema/registry/grafana-newrelic-datasource.schema.json.js +129 -0
  341. package/dist/esm/schema/registry/grafana-newrelic-datasource.schema.json.js.map +1 -0
  342. package/dist/esm/schema/registry/grafana-odbc-datasource.schema.json.js +56 -0
  343. package/dist/esm/schema/registry/grafana-odbc-datasource.schema.json.js.map +1 -0
  344. package/dist/esm/schema/registry/grafana-opensearch-datasource.schema.json.js +212 -0
  345. package/dist/esm/schema/registry/grafana-opensearch-datasource.schema.json.js.map +1 -0
  346. package/dist/esm/schema/registry/grafana-oracle-datasource.schema.json.js +186 -0
  347. package/dist/esm/schema/registry/grafana-oracle-datasource.schema.json.js.map +1 -0
  348. package/dist/esm/schema/registry/grafana-pagerduty-datasource.schema.json.js +85 -0
  349. package/dist/esm/schema/registry/grafana-pagerduty-datasource.schema.json.js.map +1 -0
  350. package/dist/esm/schema/registry/grafana-postgresql-datasource.schema.json.js +411 -0
  351. package/dist/esm/schema/registry/grafana-postgresql-datasource.schema.json.js.map +1 -0
  352. package/dist/esm/schema/registry/grafana-pyroscope-datasource.schema.json.js +41 -0
  353. package/dist/esm/schema/registry/grafana-pyroscope-datasource.schema.json.js.map +1 -0
  354. package/dist/esm/schema/registry/grafana-redshift-datasource.schema.json.js +201 -0
  355. package/dist/esm/schema/registry/grafana-redshift-datasource.schema.json.js.map +1 -0
  356. package/dist/esm/schema/registry/grafana-salesforce-datasource.schema.json.js +248 -0
  357. package/dist/esm/schema/registry/grafana-salesforce-datasource.schema.json.js.map +1 -0
  358. package/dist/esm/schema/registry/grafana-saphana-datasource.schema.json.js +208 -0
  359. package/dist/esm/schema/registry/grafana-saphana-datasource.schema.json.js.map +1 -0
  360. package/dist/esm/schema/registry/grafana-sentry-datasource.schema.json.js +94 -0
  361. package/dist/esm/schema/registry/grafana-sentry-datasource.schema.json.js.map +1 -0
  362. package/dist/esm/schema/registry/grafana-servicenow-datasource.schema.json.js +179 -0
  363. package/dist/esm/schema/registry/grafana-servicenow-datasource.schema.json.js.map +1 -0
  364. package/dist/esm/schema/registry/grafana-snowflake-datasource.schema.json.js +304 -0
  365. package/dist/esm/schema/registry/grafana-snowflake-datasource.schema.json.js.map +1 -0
  366. package/dist/esm/schema/registry/grafana-solarwinds-datasource.schema.json.js +77 -0
  367. package/dist/esm/schema/registry/grafana-solarwinds-datasource.schema.json.js.map +1 -0
  368. package/dist/esm/schema/registry/grafana-splunk-datasource.schema.json.js +690 -0
  369. package/dist/esm/schema/registry/grafana-splunk-datasource.schema.json.js.map +1 -0
  370. package/dist/esm/schema/registry/grafana-splunkobservability-datasource.schema.json.js +90 -0
  371. package/dist/esm/schema/registry/grafana-splunkobservability-datasource.schema.json.js.map +1 -0
  372. package/dist/esm/schema/registry/grafana-strava-datasource.schema.json.js +74 -0
  373. package/dist/esm/schema/registry/grafana-strava-datasource.schema.json.js.map +1 -0
  374. package/dist/esm/schema/registry/grafana-sumologic-datasource.schema.json.js +102 -0
  375. package/dist/esm/schema/registry/grafana-sumologic-datasource.schema.json.js.map +1 -0
  376. package/dist/esm/schema/registry/grafana-surrealdb-datasource.schema.json.js +92 -0
  377. package/dist/esm/schema/registry/grafana-surrealdb-datasource.schema.json.js.map +1 -0
  378. package/dist/esm/schema/registry/grafana-timestream-datasource.schema.json.js +145 -0
  379. package/dist/esm/schema/registry/grafana-timestream-datasource.schema.json.js.map +1 -0
  380. package/dist/esm/schema/registry/grafana-vercel-datasource.schema.json.js +62 -0
  381. package/dist/esm/schema/registry/grafana-vercel-datasource.schema.json.js.map +1 -0
  382. package/dist/esm/schema/registry/grafana-wavefront-datasource.schema.json.js +80 -0
  383. package/dist/esm/schema/registry/grafana-wavefront-datasource.schema.json.js.map +1 -0
  384. package/dist/esm/schema/registry/grafana-x-ray-datasource.schema.json.js +112 -0
  385. package/dist/esm/schema/registry/grafana-x-ray-datasource.schema.json.js.map +1 -0
  386. package/dist/esm/schema/registry/grafana-yugabyte-datasource.schema.json.js +114 -0
  387. package/dist/esm/schema/registry/grafana-yugabyte-datasource.schema.json.js.map +1 -0
  388. package/dist/esm/schema/registry/grafana-zendesk-datasource.schema.json.js +76 -0
  389. package/dist/esm/schema/registry/grafana-zendesk-datasource.schema.json.js.map +1 -0
  390. package/dist/esm/schema/registry/graphite.schema.json.js +104 -0
  391. package/dist/esm/schema/registry/graphite.schema.json.js.map +1 -0
  392. package/dist/esm/schema/registry/index.js +157 -0
  393. package/dist/esm/schema/registry/index.js.map +1 -0
  394. package/dist/esm/schema/registry/influxdb.schema.json.js +717 -0
  395. package/dist/esm/schema/registry/influxdb.schema.json.js.map +1 -0
  396. package/dist/esm/schema/registry/jaeger.schema.json.js +59 -0
  397. package/dist/esm/schema/registry/jaeger.schema.json.js.map +1 -0
  398. package/dist/esm/schema/registry/loki.schema.json.js +545 -0
  399. package/dist/esm/schema/registry/loki.schema.json.js.map +1 -0
  400. package/dist/esm/schema/registry/marcusolsson-csv-datasource.schema.json.js +45 -0
  401. package/dist/esm/schema/registry/marcusolsson-csv-datasource.schema.json.js.map +1 -0
  402. package/dist/esm/schema/registry/marcusolsson-json-datasource.schema.json.js +36 -0
  403. package/dist/esm/schema/registry/marcusolsson-json-datasource.schema.json.js.map +1 -0
  404. package/dist/esm/schema/registry/mssql.schema.json.js +292 -0
  405. package/dist/esm/schema/registry/mssql.schema.json.js.map +1 -0
  406. package/dist/esm/schema/registry/mysql.schema.json.js +304 -0
  407. package/dist/esm/schema/registry/mysql.schema.json.js.map +1 -0
  408. package/dist/esm/schema/registry/opentsdb.schema.json.js +113 -0
  409. package/dist/esm/schema/registry/opentsdb.schema.json.js.map +1 -0
  410. package/dist/esm/schema/registry/prometheus.schema.json.js +783 -0
  411. package/dist/esm/schema/registry/prometheus.schema.json.js.map +1 -0
  412. package/dist/esm/schema/registry/stackdriver.schema.json.js +224 -0
  413. package/dist/esm/schema/registry/stackdriver.schema.json.js.map +1 -0
  414. package/dist/esm/schema/registry/tempo.schema.json.js +664 -0
  415. package/dist/esm/schema/registry/tempo.schema.json.js.map +1 -0
  416. package/dist/esm/schema/registry/yesoreyeram-infinity-datasource.schema.json.js +1073 -0
  417. package/dist/esm/schema/registry/yesoreyeram-infinity-datasource.schema.json.js.map +1 -0
  418. package/dist/esm/schema/registry/zipkin.schema.json.js +40 -0
  419. package/dist/esm/schema/registry/zipkin.schema.json.js.map +1 -0
  420. package/dist/esm/schema/utils/dsconfig.js +97 -0
  421. package/dist/esm/schema/utils/dsconfig.js.map +1 -0
  422. package/dist/esm/schema/utils/llm.js +54 -0
  423. package/dist/esm/schema/utils/llm.js.map +1 -0
  424. package/dist/esm/schema/utils/provisioning.js +434 -0
  425. package/dist/esm/schema/utils/provisioning.js.map +1 -0
  426. package/dist/esm/schema/utils/useDatasourceSchema.js +16 -0
  427. package/dist/esm/schema/utils/useDatasourceSchema.js.map +1 -0
  428. package/dist/esm/schemas.d.ts +448 -0
  429. package/dist/esm/schemas.js +6 -0
  430. package/dist/esm/schemas.js.map +1 -0
  431. package/dist/esm/test/mocks/DataQuery.js.map +1 -1
  432. package/dist/esm/test/mocks/Datasource.js +1 -1
  433. package/dist/esm/test/mocks/Datasource.js.map +1 -1
  434. package/dist/esm/test/mocks/Plugin.js +1 -1
  435. package/dist/esm/test/mocks/Plugin.js.map +1 -1
  436. package/dist/esm/test/mocks/QueryEditorProps.js.map +1 -1
  437. package/dist/esm/test/mocks/utils.js +2 -2
  438. package/dist/esm/test/mocks/utils.js.map +1 -1
  439. package/dist/esm/test-utils.d.ts +24 -24
  440. package/package.json +40 -20
@@ -11,22 +11,25 @@ var e2eSelectors = require('@grafana/e2e-selectors');
11
11
  var runtime = require('@grafana/runtime');
12
12
  var reactUse = require('react-use');
13
13
  var ui$1 = require('@react-awesome-query-builder/ui');
14
- var lodash = require('lodash');
15
14
  var uuid = require('uuid');
15
+ var lodash = require('lodash');
16
16
  var AutoSizer = require('react-virtualized-auto-sizer');
17
- var sqlFormatter = require('sql-formatter-plus');
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-CxPGD2-b.js');
21
+ var reactHookForm = require('react-hook-form');
22
+ require('@marcbachmann/cel-js');
20
23
  var dnd = require('@hello-pangea/dnd');
21
24
  var reactPopperTooltip = require('react-popper-tooltip');
22
25
  var Prism = require('prismjs');
26
+ require('js-yaml');
23
27
 
24
28
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
25
29
 
26
30
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
27
31
  var Calendar__default = /*#__PURE__*/_interopDefaultCompat(Calendar);
28
32
  var AutoSizer__default = /*#__PURE__*/_interopDefaultCompat(AutoSizer);
29
- var sqlFormatter__default = /*#__PURE__*/_interopDefaultCompat(sqlFormatter);
30
33
  var Prism__default = /*#__PURE__*/_interopDefaultCompat(Prism);
31
34
 
32
35
  const QueryEditorRow = (props) => {
@@ -76,7 +79,7 @@ function Segment(props) {
76
79
  );
77
80
  }
78
81
 
79
- const getStyles$r = (theme) => {
82
+ const getStyles$x = (theme) => {
80
83
  const containerBorder = theme.isDark ? theme.v1.palette.dark9 : theme.v1.palette.gray5;
81
84
  return {
82
85
  container: css.css`
@@ -226,7 +229,7 @@ const getBodyStyles = (theme) => {
226
229
 
227
230
  const DatePicker = React.memo((props) => {
228
231
  const theme = ui.useTheme2();
229
- const styles = getStyles$r(theme);
232
+ const styles = getStyles$x(theme);
230
233
  const { isOpen, onClose } = props;
231
234
  if (!isOpen) {
232
235
  return null;
@@ -256,7 +259,7 @@ const Body = React.memo(({ value, onChange }) => {
256
259
  });
257
260
  Body.displayName = "Body";
258
261
 
259
- function getStyles$q() {
262
+ function getStyles$w() {
260
263
  return {
261
264
  input: css.css({
262
265
  /* hides the native Calendar picker icon given when using type=date */
@@ -272,7 +275,7 @@ const formatDate = (date) => date.toISOString().split("T")[0];
272
275
  const DatePickerWithInput = (props) => {
273
276
  const { value, onChange, className, ...rest } = props;
274
277
  const [open, setOpen] = React.useState(false);
275
- const styles = getStyles$q();
278
+ const styles = getStyles$w();
276
279
  return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement(
277
280
  ui.Input,
278
281
  {
@@ -339,19 +342,19 @@ function getSignatureDisplayModel(signature) {
339
342
  }
340
343
  PluginSignatureBadge.displayName = "PluginSignatureBadge";
341
344
 
342
- var __defProp$3 = Object.defineProperty;
343
- var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
344
- var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
345
+ var __defProp$4 = Object.defineProperty;
346
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
347
+ var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
345
348
  class DataSourcePicker extends React.PureComponent {
346
349
  constructor(props) {
347
350
  super(props);
348
- __publicField$3(this, "dataSourceSrv", runtime.getDataSourceSrv());
349
- __publicField$3(this, "state", {});
350
- __publicField$3(this, "onChange", (item) => {
351
+ __publicField$4(this, "dataSourceSrv", runtime.getDataSourceSrv());
352
+ __publicField$4(this, "state", {});
353
+ __publicField$4(this, "onChange", (item) => {
351
354
  const dsSettings = this.dataSourceSrv.getInstanceSettings(item.value);
352
355
  if (dsSettings) {
353
356
  this.props.onChange(dsSettings);
354
- this.setState({ error: undefined });
357
+ this.setState({ error: void 0 });
355
358
  }
356
359
  });
357
360
  }
@@ -427,14 +430,14 @@ class DataSourcePicker extends React.PureComponent {
427
430
  ));
428
431
  }
429
432
  }
430
- __publicField$3(DataSourcePicker, "defaultProps", {
433
+ __publicField$4(DataSourcePicker, "defaultProps", {
431
434
  autoFocus: false,
432
435
  openMenuOnFocus: false,
433
436
  placeholder: "Select datasource"
434
437
  });
435
438
 
436
439
  const { FormField, Switch } = ui.LegacyForms;
437
- const getStyles$p = ui.stylesFactory(() => ({
440
+ const getStyles$v = ui.stylesFactory(() => ({
438
441
  firstRow: css.css`
439
442
  display: flex;
440
443
  `,
@@ -451,7 +454,7 @@ const getStyles$p = ui.stylesFactory(() => ({
451
454
  }));
452
455
  const DataLink = (props) => {
453
456
  const { value, onChange, onDelete, suggestions, className } = props;
454
- const styles = getStyles$p();
457
+ const styles = getStyles$v();
455
458
  const [showInternalLink, setShowInternalLink] = useInternalLink(value.datasourceUid);
456
459
  const handleChange = (field) => (event) => {
457
460
  onChange({
@@ -535,7 +538,7 @@ const DataLink = (props) => {
535
538
  if (showInternalLink) {
536
539
  onChange({
537
540
  ...value,
538
- datasourceUid: undefined
541
+ datasourceUid: void 0
539
542
  });
540
543
  }
541
544
  setShowInternalLink(!showInternalLink);
@@ -568,7 +571,7 @@ function useInternalLink(datasourceUid) {
568
571
  return [showInternalLink, setShowInternalLink];
569
572
  }
570
573
 
571
- const getStyles$o = (theme) => ({
574
+ const getStyles$u = (theme) => ({
572
575
  infoText: css.css`
573
576
  padding-bottom: ${theme.v1.spacing.md};
574
577
  color: ${theme.v1.colors.textWeak};
@@ -580,7 +583,7 @@ const getStyles$o = (theme) => ({
580
583
  const DataLinks = (props) => {
581
584
  const { value, onChange } = props;
582
585
  const theme = ui.useTheme2();
583
- const styles = getStyles$o(theme);
586
+ const styles = getStyles$u(theme);
584
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) => {
585
588
  return /* @__PURE__ */ React__default.default.createElement(
586
589
  DataLink,
@@ -641,110 +644,21 @@ var QueryEditorExpressionType = /* @__PURE__ */ ((QueryEditorExpressionType2) =>
641
644
  return QueryEditorExpressionType2;
642
645
  })(QueryEditorExpressionType || {});
643
646
 
644
- function getRawSqlFn(db) {
645
- return db.toRawSql ? db.toRawSql : (query) => toRawSql(query, Boolean(db.disableDatasets));
646
- }
647
- function toRawSql({ sql, dataset, catalog, table }, disableDatasets) {
648
- var _a, _b, _c, _d;
649
- let rawQuery = "";
650
- if (!sql || !haveColumns(sql.columns)) {
651
- return rawQuery;
652
- }
653
- rawQuery += createSelectClause(sql.columns);
654
- if (catalog && dataset && table) {
655
- rawQuery += `FROM ${catalog}.${dataset}.${table} `;
656
- } else if (!disableDatasets && dataset && table) {
657
- rawQuery += `FROM ${dataset}.${table} `;
658
- } else if (table) {
659
- rawQuery += `FROM ${table} `;
660
- }
661
- if (sql.whereString) {
662
- rawQuery += `WHERE ${sql.whereString} `;
663
- }
664
- if ((_b = (_a = sql.groupBy) == null ? undefined : _a[0]) == null ? undefined : _b.property.name) {
665
- const groupBy = sql.groupBy.map((g) => g.property.name).filter((g) => !lodash.isEmpty(g));
666
- rawQuery += `GROUP BY ${groupBy.join(", ")} `;
667
- }
668
- if ((_c = sql.orderBy) == null ? undefined : _c.property.name) {
669
- rawQuery += `ORDER BY ${sql.orderBy.property.name} `;
670
- }
671
- if (((_d = sql.orderBy) == null ? undefined : _d.property.name) && sql.orderByDirection) {
672
- rawQuery += `${sql.orderByDirection} `;
673
- }
674
- if (sql.limit !== undefined && sql.limit >= 0) {
675
- rawQuery += `LIMIT ${sql.limit} `;
676
- }
677
- return rawQuery;
678
- }
679
- function createSelectClause(sqlColumns) {
680
- const columns = sqlColumns.map((c) => {
681
- var _a, _b;
682
- let rawColumn = "";
683
- if (c.name) {
684
- rawColumn += `${c.name}(${(_a = c.parameters) == null ? undefined : _a.map((p) => `${p.name}`)})`;
685
- } else {
686
- rawColumn += `${(_b = c.parameters) == null ? undefined : _b.map((p) => `${p.name}`)}`;
687
- }
688
- return rawColumn;
689
- });
690
- return `SELECT ${columns.join(", ")} `;
691
- }
692
- function haveColumns(columns) {
693
- if (!columns) {
694
- return false;
695
- }
696
- const haveColumn = columns.some((c) => {
697
- var _a, _b;
698
- return ((_a = c.parameters) == null ? undefined : _a.length) || ((_b = c.parameters) == null ? undefined : _b.some((p) => p.name));
699
- });
700
- const haveFunction = columns.some((c) => c.name);
701
- return haveColumn || haveFunction;
702
- }
703
- function setGroupByField(field) {
704
- return {
705
- type: QueryEditorExpressionType.GroupBy,
706
- property: {
707
- type: QueryEditorPropertyType.String,
708
- name: field
709
- }
710
- };
711
- }
712
- function setPropertyField(field) {
713
- return {
714
- type: QueryEditorExpressionType.Property,
715
- property: {
716
- type: QueryEditorPropertyType.String,
717
- name: field
718
- }
719
- };
720
- }
721
- function createFunctionField(functionName) {
722
- return {
723
- type: QueryEditorExpressionType.Function,
724
- name: functionName,
725
- parameters: []
726
- };
727
- }
728
-
729
- function applyQueryDefaults(q) {
730
- let editorMode = (q == null ? undefined : q.editorMode) || EditorMode.Builder;
731
- if ((q == null ? undefined : q.editorMode) === undefined && (q == null ? undefined : q.rawSql) !== undefined) {
732
- editorMode = EditorMode.Code;
733
- }
734
- const result = {
735
- ...q,
736
- refId: (q == null ? undefined : q.refId) || "A",
737
- format: (q == null ? undefined : q.format) !== undefined ? q.format : QueryFormat.Table,
738
- rawSql: (q == null ? undefined : q.rawSql) || "",
739
- editorMode,
740
- sql: (q == null ? undefined : q.sql) || {
741
- columns: [createFunctionField()],
742
- groupBy: [setGroupByField()],
743
- limit: 50
744
- }
745
- };
746
- return result;
747
- }
647
+ var TokenType = /* @__PURE__ */ ((TokenType2) => {
648
+ TokenType2["Parenthesis"] = "delimiter.parenthesis.sql";
649
+ TokenType2["Whitespace"] = "white.sql";
650
+ TokenType2["Keyword"] = "keyword.sql";
651
+ TokenType2["Delimiter"] = "delimiter.sql";
652
+ TokenType2["Operator"] = "operator.sql";
653
+ TokenType2["Identifier"] = "identifier.sql";
654
+ TokenType2["IdentifierQuote"] = "identifier.quote.sql";
655
+ TokenType2["Type"] = "type.sql";
656
+ TokenType2["Function"] = "predefined.sql";
657
+ TokenType2["Number"] = "number.sql";
658
+ TokenType2["String"] = "string.sql";
659
+ TokenType2["Variable"] = "variable.sql";
660
+ return TokenType2;
661
+ })(TokenType || {});
748
662
 
749
663
  class LinkedToken {
750
664
  constructor(type, value, range, previous, next) {
@@ -789,7 +703,7 @@ class LinkedToken {
789
703
  }
790
704
  is(type, value) {
791
705
  const isType = this.type === type;
792
- return value !== undefined ? isType && compareTokenWithValue(type, this, value) : isType;
706
+ return value !== void 0 ? isType && compareTokenWithValue(type, this, value) : isType;
793
707
  }
794
708
  getPreviousNonWhiteSpaceToken() {
795
709
  let curr = this.previous;
@@ -805,7 +719,7 @@ class LinkedToken {
805
719
  let curr = this.previous;
806
720
  while (curr != null) {
807
721
  const isType = curr.type === type;
808
- if (value !== undefined ? isType && compareTokenWithValue(type, curr, value) : isType) {
722
+ if (value !== void 0 ? isType && compareTokenWithValue(type, curr, value) : isType) {
809
723
  return curr;
810
724
  }
811
725
  curr = curr.previous;
@@ -816,12 +730,12 @@ class LinkedToken {
816
730
  let tokens = [];
817
731
  let curr = this.previous;
818
732
  while (curr != null) {
819
- if (ignoreTypes.some((t) => t === (curr == null ? undefined : curr.type))) {
733
+ if (ignoreTypes.some((t) => t === (curr == null ? void 0 : curr.type))) {
820
734
  curr = curr.previous;
821
735
  continue;
822
736
  }
823
737
  const isType = curr.type === type;
824
- if (value !== undefined ? isType && compareTokenWithValue(type, curr, value) : isType) {
738
+ if (value !== void 0 ? isType && compareTokenWithValue(type, curr, value) : isType) {
825
739
  return tokens;
826
740
  }
827
741
  if (!curr.isWhiteSpace()) {
@@ -835,12 +749,12 @@ class LinkedToken {
835
749
  let tokens = [];
836
750
  let curr = this.next;
837
751
  while (curr != null) {
838
- if (ignoreTypes.some((t) => t === (curr == null ? undefined : curr.type))) {
752
+ if (ignoreTypes.some((t) => t === (curr == null ? void 0 : curr.type))) {
839
753
  curr = curr.next;
840
754
  continue;
841
755
  }
842
756
  const isType = curr.type === type;
843
- if (value !== undefined ? isType && compareTokenWithValue(type, curr, value) : isType) {
757
+ if (value !== void 0 ? isType && compareTokenWithValue(type, curr, value) : isType) {
844
758
  return tokens;
845
759
  }
846
760
  if (!curr.isWhiteSpace()) {
@@ -874,7 +788,7 @@ class LinkedToken {
874
788
  let curr = this.next;
875
789
  while (curr != null) {
876
790
  const isType = curr.type === type;
877
- if (value !== undefined ? isType && compareTokenWithValue(type, curr, value) : isType) {
791
+ if (value !== void 0 ? isType && compareTokenWithValue(type, curr, value) : isType) {
878
792
  return curr;
879
793
  }
880
794
  curr = curr.next;
@@ -899,21 +813,6 @@ var MacroType = /* @__PURE__ */ ((MacroType2) => {
899
813
  MacroType2[MacroType2["Table"] = 4] = "Table";
900
814
  return MacroType2;
901
815
  })(MacroType || {});
902
- var TokenType = /* @__PURE__ */ ((TokenType2) => {
903
- TokenType2["Parenthesis"] = "delimiter.parenthesis.sql";
904
- TokenType2["Whitespace"] = "white.sql";
905
- TokenType2["Keyword"] = "keyword.sql";
906
- TokenType2["Delimiter"] = "delimiter.sql";
907
- TokenType2["Operator"] = "operator.sql";
908
- TokenType2["Identifier"] = "identifier.sql";
909
- TokenType2["IdentifierQuote"] = "identifier.quote.sql";
910
- TokenType2["Type"] = "type.sql";
911
- TokenType2["Function"] = "predefined.sql";
912
- TokenType2["Number"] = "number.sql";
913
- TokenType2["String"] = "string.sql";
914
- TokenType2["Variable"] = "variable.sql";
915
- return TokenType2;
916
- })(TokenType || {});
917
816
  var StatementPosition = /* @__PURE__ */ ((StatementPosition2) => {
918
817
  StatementPosition2["Unknown"] = "unknown";
919
818
  StatementPosition2["SelectKeyword"] = "selectKeyword";
@@ -1023,9 +922,9 @@ var SQLEditorMode = /* @__PURE__ */ ((SQLEditorMode2) => {
1023
922
 
1024
923
  function getStatementPosition(currentToken, statementPositionResolversRegistry) {
1025
924
  var _a;
1026
- const previousNonWhiteSpace = currentToken == null ? undefined : currentToken.getPreviousNonWhiteSpaceToken();
1027
- const previousKeyword = currentToken == null ? undefined : currentToken.getPreviousKeyword();
1028
- const previousIsSlash = (_a = currentToken == null ? undefined : currentToken.getPreviousNonWhiteSpaceToken()) == null ? undefined : _a.is(TokenType.Operator, "/");
925
+ const previousNonWhiteSpace = currentToken == null ? void 0 : currentToken.getPreviousNonWhiteSpaceToken();
926
+ const previousKeyword = currentToken == null ? void 0 : currentToken.getPreviousKeyword();
927
+ const previousIsSlash = (_a = currentToken == null ? void 0 : currentToken.getPreviousNonWhiteSpaceToken()) == null ? void 0 : _a.is(TokenType.Operator, "/");
1029
928
  const resolvers = statementPositionResolversRegistry.list();
1030
929
  const positions = [];
1031
930
  for (const resolver of resolvers) {
@@ -1053,8 +952,8 @@ const toCompletionItem = (value, range, rest = {}) => {
1053
952
 
1054
953
  const getStandardSuggestions = async (monaco, currentToken, suggestionKinds, positionContext, suggestionsRegistry) => {
1055
954
  let suggestions = [];
1056
- const invalidRangeToken = (currentToken == null ? undefined : currentToken.isWhiteSpace()) || (currentToken == null ? undefined : currentToken.isParenthesis()) || (currentToken == null ? undefined : currentToken.isIdentifier()) && currentToken.value.endsWith(".");
1057
- const range = invalidRangeToken || !(currentToken == null ? undefined : currentToken.range) ? monaco.Range.fromPositions(positionContext.position) : currentToken == null ? undefined : currentToken.range;
955
+ const invalidRangeToken = (currentToken == null ? void 0 : currentToken.isWhiteSpace()) || (currentToken == null ? void 0 : currentToken.isParenthesis()) || (currentToken == null ? void 0 : currentToken.isIdentifier()) && currentToken.value.endsWith(".");
956
+ const range = invalidRangeToken || !(currentToken == null ? void 0 : currentToken.range) ? monaco.Range.fromPositions(positionContext.position) : currentToken == null ? void 0 : currentToken.range;
1058
957
  for (const suggestion of [...new Set(suggestionKinds)]) {
1059
958
  const registeredSuggestions = suggestionsRegistry.getIfExists(suggestion);
1060
959
  if (registeredSuggestions) {
@@ -1235,7 +1134,7 @@ function linkedTokenBuilder(monaco, model, position, languageId = "sql") {
1235
1134
  offset: 0,
1236
1135
  type: TokenType.Whitespace,
1237
1136
  language: languageId,
1238
- _tokenBrand: undefined
1137
+ _tokenBrand: void 0
1239
1138
  };
1240
1139
  tokens.push(token);
1241
1140
  }
@@ -2159,31 +2058,31 @@ var language$1 = /*#__PURE__*/Object.freeze({
2159
2058
 
2160
2059
  const getSelectToken = (currentToken) => {
2161
2060
  var _a;
2162
- return (_a = currentToken == null ? undefined : currentToken.getPreviousOfType(TokenType.Keyword, SELECT)) != null ? _a : null;
2061
+ return (_a = currentToken == null ? void 0 : currentToken.getPreviousOfType(TokenType.Keyword, SELECT)) != null ? _a : null;
2163
2062
  };
2164
2063
  const getFromKeywordToken = (currentToken) => {
2165
2064
  const selectToken = getSelectToken(currentToken);
2166
- return selectToken == null ? undefined : selectToken.getNextOfType(TokenType.Keyword, FROM);
2065
+ return selectToken == null ? void 0 : selectToken.getNextOfType(TokenType.Keyword, FROM);
2167
2066
  };
2168
2067
  const getTableToken = (currentToken) => {
2169
2068
  var _a;
2170
2069
  const fromToken = getFromKeywordToken(currentToken);
2171
- const nextNonWhiteSpace = fromToken == null ? undefined : fromToken.getNextNonWhiteSpaceToken();
2172
- if (nextNonWhiteSpace == null ? undefined : nextNonWhiteSpace.isVariable()) {
2070
+ const nextNonWhiteSpace = fromToken == null ? void 0 : fromToken.getNextNonWhiteSpaceToken();
2071
+ if (nextNonWhiteSpace == null ? void 0 : nextNonWhiteSpace.isVariable()) {
2173
2072
  return null;
2174
- } else if ((nextNonWhiteSpace == null ? undefined : nextNonWhiteSpace.isKeyword()) && ((_a = nextNonWhiteSpace.next) == null ? undefined : _a.is(TokenType.Parenthesis, "("))) {
2073
+ } else if ((nextNonWhiteSpace == null ? void 0 : nextNonWhiteSpace.isKeyword()) && ((_a = nextNonWhiteSpace.next) == null ? void 0 : _a.is(TokenType.Parenthesis, "("))) {
2175
2074
  return null;
2176
2075
  } else {
2177
2076
  return nextNonWhiteSpace;
2178
2077
  }
2179
2078
  };
2180
2079
  const defaultTableNameParser = (token) => {
2181
- const parts = token == null ? undefined : token.value.split(".");
2182
- if ((parts == null ? undefined : parts.length) === 1) {
2080
+ const parts = token == null ? void 0 : token.value.split(".");
2081
+ if ((parts == null ? void 0 : parts.length) === 1) {
2183
2082
  return { table: parts[0] };
2184
- } else if ((parts == null ? undefined : parts.length) === 2) {
2083
+ } else if ((parts == null ? void 0 : parts.length) === 2) {
2185
2084
  return { schema: parts[0], table: parts[1] };
2186
- } else if ((parts == null ? undefined : parts.length) === 3) {
2085
+ } else if ((parts == null ? void 0 : parts.length) === 3) {
2187
2086
  return { catalog: parts[0], schema: parts[1], table: parts[2] };
2188
2087
  }
2189
2088
  return null;
@@ -2558,7 +2457,7 @@ function initStatementPositionResolvers() {
2558
2457
  id: StatementPosition.SelectKeyword,
2559
2458
  name: StatementPosition.SelectKeyword,
2560
2459
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => Boolean(
2561
- currentToken === null || currentToken.isWhiteSpace() && currentToken.previous === null || currentToken.is(TokenType.Keyword, SELECT) || currentToken.is(TokenType.Keyword, SELECT) && currentToken.previous === null || previousIsSlash || currentToken.isIdentifier() && (previousIsSlash || (currentToken == null ? undefined : currentToken.previous) === null) || currentToken.isIdentifier() && SELECT.startsWith(currentToken.value.toLowerCase())
2460
+ currentToken === null || currentToken.isWhiteSpace() && currentToken.previous === null || currentToken.is(TokenType.Keyword, SELECT) || currentToken.is(TokenType.Keyword, SELECT) && currentToken.previous === null || previousIsSlash || currentToken.isIdentifier() && (previousIsSlash || (currentToken == null ? void 0 : currentToken.previous) === null) || currentToken.isIdentifier() && SELECT.startsWith(currentToken.value.toLowerCase())
2562
2461
  )
2563
2462
  },
2564
2463
  {
@@ -2571,13 +2470,13 @@ function initStatementPositionResolvers() {
2571
2470
  {
2572
2471
  id: StatementPosition.AfterSelectKeyword,
2573
2472
  name: StatementPosition.AfterSelectKeyword,
2574
- resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => Boolean((previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.value.toLowerCase()) === SELECT)
2473
+ resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => Boolean((previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.value.toLowerCase()) === SELECT)
2575
2474
  },
2576
2475
  {
2577
2476
  id: StatementPosition.AfterSelectArguments,
2578
2477
  name: StatementPosition.AfterSelectArguments,
2579
2478
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2580
- return Boolean((previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === SELECT && (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.value) === ",");
2479
+ return Boolean((previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === SELECT && (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.value) === ",");
2581
2480
  }
2582
2481
  },
2583
2482
  {
@@ -2585,7 +2484,7 @@ function initStatementPositionResolvers() {
2585
2484
  name: StatementPosition.AfterSelectFuncFirstArgument,
2586
2485
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2587
2486
  return Boolean(
2588
- ((previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === SELECT || (previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === AS) && ((previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Parenthesis, "(")) || (currentToken == null ? undefined : currentToken.is(TokenType.Parenthesis, "()")))
2487
+ ((previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === SELECT || (previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === AS) && ((previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Parenthesis, "(")) || (currentToken == null ? void 0 : currentToken.is(TokenType.Parenthesis, "()")))
2589
2488
  );
2590
2489
  }
2591
2490
  },
@@ -2594,7 +2493,7 @@ function initStatementPositionResolvers() {
2594
2493
  name: StatementPosition.AfterWhereFunctionArgument,
2595
2494
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2596
2495
  return Boolean(
2597
- (previousKeyword == null ? undefined : previousKeyword.is(TokenType.Keyword, WHERE)) && ((previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Parenthesis, "(")) || (currentToken == null ? undefined : currentToken.is(TokenType.Parenthesis, "()")))
2496
+ (previousKeyword == null ? void 0 : previousKeyword.is(TokenType.Keyword, WHERE)) && ((previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Parenthesis, "(")) || (currentToken == null ? void 0 : currentToken.is(TokenType.Parenthesis, "()")))
2598
2497
  );
2599
2498
  }
2600
2499
  },
@@ -2604,7 +2503,7 @@ function initStatementPositionResolvers() {
2604
2503
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2605
2504
  var _a;
2606
2505
  return Boolean(
2607
- (previousKeyword == null ? undefined : previousKeyword.is(TokenType.Keyword, BY)) && ((_a = previousKeyword == null ? undefined : previousKeyword.getPreviousKeyword()) == null ? undefined : _a.is(TokenType.Keyword, GROUP)) && ((previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isIdentifier()) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isDoubleQuotedString()) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Parenthesis, ")")) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Parenthesis, "()")))
2506
+ (previousKeyword == null ? void 0 : previousKeyword.is(TokenType.Keyword, BY)) && ((_a = previousKeyword == null ? void 0 : previousKeyword.getPreviousKeyword()) == null ? void 0 : _a.is(TokenType.Keyword, GROUP)) && ((previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isIdentifier()) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isDoubleQuotedString()) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Parenthesis, ")")) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Parenthesis, "()")))
2608
2507
  );
2609
2508
  }
2610
2509
  },
@@ -2612,7 +2511,7 @@ function initStatementPositionResolvers() {
2612
2511
  id: StatementPosition.SelectAlias,
2613
2512
  name: StatementPosition.SelectAlias,
2614
2513
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2615
- if ((previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.value) === "," && (previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === AS) {
2514
+ if ((previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.value) === "," && (previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === AS) {
2616
2515
  return true;
2617
2516
  }
2618
2517
  return false;
@@ -2623,25 +2522,25 @@ function initStatementPositionResolvers() {
2623
2522
  name: StatementPosition.FromKeyword,
2624
2523
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2625
2524
  return Boolean(
2626
- (previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === SELECT && (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.value) !== "," || ((currentToken == null ? undefined : currentToken.isKeyword()) || (currentToken == null ? undefined : currentToken.isIdentifier())) && FROM.toLowerCase().startsWith(currentToken.value.toLowerCase())
2525
+ (previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === SELECT && (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.value) !== "," || ((currentToken == null ? void 0 : currentToken.isKeyword()) || (currentToken == null ? void 0 : currentToken.isIdentifier())) && FROM.toLowerCase().startsWith(currentToken.value.toLowerCase())
2627
2526
  );
2628
2527
  }
2629
2528
  },
2630
2529
  {
2631
2530
  id: StatementPosition.AfterFromKeyword,
2632
2531
  name: StatementPosition.AfterFromKeyword,
2633
- resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => Boolean(!(currentToken == null ? undefined : currentToken.value.includes(".")) && (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.value.toLowerCase()) === FROM)
2532
+ resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => Boolean(!(currentToken == null ? void 0 : currentToken.value.includes(".")) && (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.value.toLowerCase()) === FROM)
2634
2533
  },
2635
2534
  {
2636
2535
  id: StatementPosition.AfterSchema,
2637
2536
  name: StatementPosition.AfterSchema,
2638
2537
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2639
- if ((currentToken == null ? undefined : currentToken.isWhiteSpace()) && (currentToken == null ? undefined : currentToken.next)) {
2640
- currentToken = currentToken == null ? undefined : currentToken.previous;
2538
+ if ((currentToken == null ? void 0 : currentToken.isWhiteSpace()) && (currentToken == null ? void 0 : currentToken.next)) {
2539
+ currentToken = currentToken == null ? void 0 : currentToken.previous;
2641
2540
  previousNonWhiteSpace = currentToken.getPreviousNonWhiteSpaceToken();
2642
2541
  }
2643
2542
  return Boolean(
2644
- (currentToken == null ? undefined : currentToken.isIdentifier()) && (currentToken == null ? undefined : currentToken.value.endsWith(".")) && (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.value.toLowerCase()) === FROM
2543
+ (currentToken == null ? void 0 : currentToken.isIdentifier()) && (currentToken == null ? void 0 : currentToken.value.endsWith(".")) && (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.value.toLowerCase()) === FROM
2645
2544
  );
2646
2545
  }
2647
2546
  },
@@ -2649,7 +2548,7 @@ function initStatementPositionResolvers() {
2649
2548
  id: StatementPosition.AfterFrom,
2650
2549
  name: StatementPosition.AfterFrom,
2651
2550
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => Boolean(
2652
- (previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === FROM && (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isDoubleQuotedString()) || (previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === FROM && (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isIdentifier()) || (previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === FROM && (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isVariable())
2551
+ (previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === FROM && (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isDoubleQuotedString()) || (previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === FROM && (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isIdentifier()) || (previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === FROM && (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isVariable())
2653
2552
  // cloudwatch specific
2654
2553
  // (previousKeyword?.value === SCHEMA && previousNonWhiteSpace?.is(TokenType.Parenthesis, ')'))
2655
2554
  )
@@ -2659,7 +2558,7 @@ function initStatementPositionResolvers() {
2659
2558
  name: StatementPosition.AfterTable,
2660
2559
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2661
2560
  return Boolean(
2662
- (previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === FROM && ((previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isVariable()) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.value) !== "" && (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.value.toLowerCase()) !== FROM)
2561
+ (previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === FROM && ((previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isVariable()) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.value) !== "" && (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.value.toLowerCase()) !== FROM)
2663
2562
  );
2664
2563
  }
2665
2564
  },
@@ -2667,7 +2566,7 @@ function initStatementPositionResolvers() {
2667
2566
  id: StatementPosition.WhereKeyword,
2668
2567
  name: StatementPosition.WhereKeyword,
2669
2568
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => Boolean(
2670
- (previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === WHERE && ((previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isKeyword()) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Parenthesis, "(")) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Operator, AND)))
2569
+ (previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === WHERE && ((previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isKeyword()) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Parenthesis, "(")) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Operator, AND)))
2671
2570
  )
2672
2571
  },
2673
2572
  {
@@ -2676,14 +2575,14 @@ function initStatementPositionResolvers() {
2676
2575
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2677
2576
  var _a;
2678
2577
  return Boolean(
2679
- (previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === WHERE && !((_a = previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.getPreviousNonWhiteSpaceToken()) == null ? undefined : _a.isOperator()) && !(currentToken == null ? undefined : currentToken.is(TokenType.Delimiter, ".")) && !(currentToken == null ? undefined : currentToken.isParenthesis()) && ((previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isIdentifier()) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isDoubleQuotedString()))
2578
+ (previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === WHERE && !((_a = previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.getPreviousNonWhiteSpaceToken()) == null ? void 0 : _a.isOperator()) && !(currentToken == null ? void 0 : currentToken.is(TokenType.Delimiter, ".")) && !(currentToken == null ? void 0 : currentToken.isParenthesis()) && ((previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isIdentifier()) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isDoubleQuotedString()))
2680
2579
  );
2681
2580
  }
2682
2581
  },
2683
2582
  {
2684
2583
  id: StatementPosition.WhereValue,
2685
2584
  name: StatementPosition.WhereValue,
2686
- resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => Boolean((previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === WHERE && (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isOperator()))
2585
+ resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => Boolean((previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === WHERE && (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isOperator()))
2687
2586
  },
2688
2587
  {
2689
2588
  id: StatementPosition.AfterWhereValue,
@@ -2691,7 +2590,7 @@ function initStatementPositionResolvers() {
2691
2590
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2692
2591
  var _a, _b, _c;
2693
2592
  return Boolean(
2694
- (previousKeyword == null ? undefined : previousKeyword.value.toLowerCase()) === WHERE && ((previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Operator, "and")) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Operator, "or")) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isString()) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isNumber()) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Parenthesis, ")")) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Parenthesis, "()")) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.isTemplateVariable()) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.IdentifierQuote)) && ((_a = previousNonWhiteSpace.getPreviousNonWhiteSpaceToken()) == null ? undefined : _a.is(TokenType.Identifier)) && ((_c = (_b = previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.getPreviousNonWhiteSpaceToken()) == null ? undefined : _b.getPreviousNonWhiteSpaceToken()) == null ? undefined : _c.is(TokenType.IdentifierQuote)))
2593
+ (previousKeyword == null ? void 0 : previousKeyword.value.toLowerCase()) === WHERE && ((previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Operator, "and")) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Operator, "or")) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isString()) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isNumber()) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Parenthesis, ")")) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Parenthesis, "()")) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.isTemplateVariable()) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.IdentifierQuote)) && ((_a = previousNonWhiteSpace.getPreviousNonWhiteSpaceToken()) == null ? void 0 : _a.is(TokenType.Identifier)) && ((_c = (_b = previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.getPreviousNonWhiteSpaceToken()) == null ? void 0 : _b.getPreviousNonWhiteSpaceToken()) == null ? void 0 : _c.is(TokenType.IdentifierQuote)))
2695
2594
  );
2696
2595
  }
2697
2596
  },
@@ -2701,7 +2600,7 @@ function initStatementPositionResolvers() {
2701
2600
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2702
2601
  var _a;
2703
2602
  return Boolean(
2704
- (previousKeyword == null ? undefined : previousKeyword.is(TokenType.Keyword, BY)) && ((_a = previousKeyword == null ? undefined : previousKeyword.getPreviousKeyword()) == null ? undefined : _a.is(TokenType.Keyword, GROUP)) && ((previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Keyword, BY)) || (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Delimiter, ",")))
2603
+ (previousKeyword == null ? void 0 : previousKeyword.is(TokenType.Keyword, BY)) && ((_a = previousKeyword == null ? void 0 : previousKeyword.getPreviousKeyword()) == null ? void 0 : _a.is(TokenType.Keyword, GROUP)) && ((previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Keyword, BY)) || (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Delimiter, ",")))
2705
2604
  );
2706
2605
  }
2707
2606
  },
@@ -2711,7 +2610,7 @@ function initStatementPositionResolvers() {
2711
2610
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2712
2611
  var _a;
2713
2612
  return Boolean(
2714
- (previousKeyword == null ? undefined : previousKeyword.is(TokenType.Keyword, BY)) && ((_a = previousKeyword == null ? undefined : previousKeyword.getPreviousKeyword()) == null ? undefined : _a.is(TokenType.Keyword, GROUP)) && ((previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Parenthesis, "(")) || (currentToken == null ? undefined : currentToken.is(TokenType.Parenthesis, "()")))
2613
+ (previousKeyword == null ? void 0 : previousKeyword.is(TokenType.Keyword, BY)) && ((_a = previousKeyword == null ? void 0 : previousKeyword.getPreviousKeyword()) == null ? void 0 : _a.is(TokenType.Keyword, GROUP)) && ((previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Parenthesis, "(")) || (currentToken == null ? void 0 : currentToken.is(TokenType.Parenthesis, "()")))
2715
2614
  );
2716
2615
  }
2717
2616
  },
@@ -2721,7 +2620,7 @@ function initStatementPositionResolvers() {
2721
2620
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2722
2621
  var _a;
2723
2622
  return Boolean(
2724
- (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Keyword, BY)) && ((_a = previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.getPreviousKeyword()) == null ? undefined : _a.is(TokenType.Keyword, ORDER))
2623
+ (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Keyword, BY)) && ((_a = previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.getPreviousKeyword()) == null ? void 0 : _a.is(TokenType.Keyword, ORDER))
2725
2624
  );
2726
2625
  }
2727
2626
  },
@@ -2731,20 +2630,20 @@ function initStatementPositionResolvers() {
2731
2630
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2732
2631
  var _a, _b;
2733
2632
  return Boolean(
2734
- (previousKeyword == null ? undefined : previousKeyword.is(TokenType.Keyword, BY)) && ((_a = previousKeyword == null ? undefined : previousKeyword.getPreviousKeyword()) == null ? undefined : _a.is(TokenType.Keyword, ORDER)) && (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Parenthesis)) && ((_b = previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.getPreviousNonWhiteSpaceToken()) == null ? undefined : _b.is(TokenType.Function))
2633
+ (previousKeyword == null ? void 0 : previousKeyword.is(TokenType.Keyword, BY)) && ((_a = previousKeyword == null ? void 0 : previousKeyword.getPreviousKeyword()) == null ? void 0 : _a.is(TokenType.Keyword, ORDER)) && (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Parenthesis)) && ((_b = previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.getPreviousNonWhiteSpaceToken()) == null ? void 0 : _b.is(TokenType.Function))
2735
2634
  );
2736
2635
  }
2737
2636
  },
2738
2637
  {
2739
2638
  id: StatementPosition.AfterOrderByDirection,
2740
2639
  name: StatementPosition.AfterOrderByDirection,
2741
- resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => Boolean((previousKeyword == null ? undefined : previousKeyword.is(TokenType.Keyword, DESC)) || (previousKeyword == null ? undefined : previousKeyword.is(TokenType.Keyword, ASC)))
2640
+ resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => Boolean((previousKeyword == null ? void 0 : previousKeyword.is(TokenType.Keyword, DESC)) || (previousKeyword == null ? void 0 : previousKeyword.is(TokenType.Keyword, ASC)))
2742
2641
  },
2743
2642
  {
2744
2643
  id: StatementPosition.AfterIsOperator,
2745
2644
  name: StatementPosition.AfterIsOperator,
2746
2645
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2747
- return Boolean(previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Operator, "IS"));
2646
+ return Boolean(previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Operator, "IS"));
2748
2647
  }
2749
2648
  },
2750
2649
  {
@@ -2753,7 +2652,7 @@ function initStatementPositionResolvers() {
2753
2652
  resolve: (currentToken, previousKeyword, previousNonWhiteSpace, previousIsSlash) => {
2754
2653
  var _a;
2755
2654
  return Boolean(
2756
- (previousNonWhiteSpace == null ? undefined : previousNonWhiteSpace.is(TokenType.Operator, "NOT")) && ((_a = previousNonWhiteSpace.getPreviousNonWhiteSpaceToken()) == null ? undefined : _a.is(TokenType.Operator, "IS"))
2655
+ (previousNonWhiteSpace == null ? void 0 : previousNonWhiteSpace.is(TokenType.Operator, "NOT")) && ((_a = previousNonWhiteSpace.getPreviousNonWhiteSpaceToken()) == null ? void 0 : _a.is(TokenType.Operator, "IS"))
2757
2656
  );
2758
2657
  }
2759
2658
  }
@@ -2767,7 +2666,7 @@ let sqlEditorLog = () => {
2767
2666
  if (ui.attachDebugger && ui.createLogger) {
2768
2667
  sqlEditorLogger = ui.createLogger("SQLEditor");
2769
2668
  sqlEditorLog = sqlEditorLogger.logger;
2770
- ui.attachDebugger("sqleditor", undefined, sqlEditorLogger);
2669
+ ui.attachDebugger("sqleditor", void 0, sqlEditorLogger);
2771
2670
  }
2772
2671
 
2773
2672
  const COLUMN = "column", RELATIVE_TIME_STRING = "'5m'";
@@ -2829,7 +2728,7 @@ function getStandardSQLCompletionProvider(monaco, language) {
2829
2728
  provider.supportedFunctions = () => language.builtinFunctions.map((f) => ({ id: f, name: f }));
2830
2729
  }
2831
2730
  const operators = [];
2832
- if ((_a = language == null ? undefined : language.comparisonOperators) == null ? undefined : _a.length) {
2731
+ if ((_a = language == null ? void 0 : language.comparisonOperators) == null ? void 0 : _a.length) {
2833
2732
  operators.push(
2834
2733
  ...language.comparisonOperators.map((f) => ({
2835
2734
  id: f.toLocaleLowerCase(),
@@ -2839,7 +2738,7 @@ function getStandardSQLCompletionProvider(monaco, language) {
2839
2738
  );
2840
2739
  }
2841
2740
  language.logicalOperators = (_b = language.logicalOperators) != null ? _b : language.operators;
2842
- if ((_c = language == null ? undefined : language.logicalOperators) == null ? undefined : _c.length) {
2741
+ if ((_c = language == null ? void 0 : language.logicalOperators) == null ? void 0 : _c.length) {
2843
2742
  operators.push(
2844
2743
  ...language.logicalOperators.map((f) => ({ id: f.toLocaleLowerCase(), operator: f, type: OperatorType.Logical }))
2845
2744
  );
@@ -2865,7 +2764,7 @@ function useLatestCallback(callback) {
2865
2764
  });
2866
2765
  const hasCallback = Boolean(callback);
2867
2766
  return React.useMemo(
2868
- () => hasCallback ? ((...args) => ref.current(...args)) : undefined,
2767
+ () => hasCallback ? ((...args) => ref.current(...args)) : void 0,
2869
2768
  [hasCallback]
2870
2769
  );
2871
2770
  }
@@ -2912,7 +2811,7 @@ const SQLEditor = ({
2912
2811
  ui.CodeEditor,
2913
2812
  {
2914
2813
  height: height || "240px",
2915
- width: width ? `${width - 2}px` : undefined,
2814
+ width: width ? `${width - 2}px` : void 0,
2916
2815
  language: id,
2917
2816
  value: query,
2918
2817
  onBlur: onSqlBlur,
@@ -2943,12 +2842,12 @@ const SQLEditor = ({
2943
2842
  ), children && children({ formatQuery }));
2944
2843
  };
2945
2844
  const resolveLanguage = (monaco, languageDefinitionProp) => {
2946
- if ((languageDefinitionProp == null ? undefined : languageDefinitionProp.id) !== STANDARD_SQL_LANGUAGE && !languageDefinitionProp.loader) {
2947
- sqlEditorLog(`Loading language '${languageDefinitionProp == null ? undefined : languageDefinitionProp.id}' from Monaco registry`, false);
2845
+ if ((languageDefinitionProp == null ? void 0 : languageDefinitionProp.id) !== STANDARD_SQL_LANGUAGE && !languageDefinitionProp.loader) {
2846
+ sqlEditorLog(`Loading language '${languageDefinitionProp == null ? void 0 : languageDefinitionProp.id}' from Monaco registry`, false);
2948
2847
  const allLangs = monaco.languages.getLanguages();
2949
- const custom = allLangs.find(({ id }) => id === (languageDefinitionProp == null ? undefined : languageDefinitionProp.id));
2848
+ const custom = allLangs.find(({ id }) => id === (languageDefinitionProp == null ? void 0 : languageDefinitionProp.id));
2950
2849
  if (!custom) {
2951
- throw Error(`Unknown Monaco language ${languageDefinitionProp == null ? undefined : languageDefinitionProp.id}`);
2850
+ throw Error(`Unknown Monaco language ${languageDefinitionProp == null ? void 0 : languageDefinitionProp.id}`);
2952
2851
  }
2953
2852
  return { completionProvider: getStandardSQLCompletionProvider, ...custom, ...languageDefinitionProp };
2954
2853
  }
@@ -2970,7 +2869,7 @@ const registerLanguageAndSuggestions = async (monaco, l, lid) => {
2970
2869
  monaco.languages.registerDocumentFormattingEditProvider(lid, {
2971
2870
  provideDocumentFormattingEdits: (model) => {
2972
2871
  var _a;
2973
- const formatted = (_a = l.formatter) == null ? undefined : _a.call(l, model.getValue());
2872
+ const formatted = (_a = l.formatter) == null ? void 0 : _a.call(l, model.getValue());
2974
2873
  return [
2975
2874
  {
2976
2875
  range: model.getFullModelRange(),
@@ -3077,7 +2976,7 @@ function extendStandardRegistries(id, lid, customProvider) {
3077
2976
  }
3078
2977
  if (customProvider.customSuggestionKinds) {
3079
2978
  for (const kind of customProvider.customSuggestionKinds()) {
3080
- (_a = kind.applyTo) == null ? undefined : _a.forEach((applyTo) => {
2979
+ (_a = kind.applyTo) == null ? void 0 : _a.forEach((applyTo) => {
3081
2980
  const exists = languageRegistries.suggestionKinds.getIfExists(applyTo);
3082
2981
  if (exists) {
3083
2982
  if (exists.kind.indexOf(kind.id) === -1) {
@@ -3087,7 +2986,7 @@ function extendStandardRegistries(id, lid, customProvider) {
3087
2986
  });
3088
2987
  if (kind.overrideDefault) {
3089
2988
  const stbBehavior = instanceSuggestionsRegistry.get(kind.id);
3090
- if (stbBehavior !== undefined) {
2989
+ if (stbBehavior !== void 0) {
3091
2990
  stbBehavior.suggestions = kind.suggestionsResolver;
3092
2991
  continue;
3093
2992
  }
@@ -3129,9 +3028,9 @@ function extendStandardRegistries(id, lid, customProvider) {
3129
3028
  var _a2, _b, _c, _d, _e;
3130
3029
  const o = await s(ctx, m);
3131
3030
  const tableToken = getTableToken(ctx.currentToken);
3132
- const tableNameParser = (_b = (_a2 = customProvider.tables) == null ? undefined : _a2.parseName) != null ? _b : defaultTableNameParser;
3031
+ const tableNameParser = (_b = (_a2 = customProvider.tables) == null ? void 0 : _a2.parseName) != null ? _b : defaultTableNameParser;
3133
3032
  const tableIdentifier = tableNameParser(tableToken);
3134
- const oo = ((_e = await ((_d = (_c = customProvider.tables) == null ? undefined : _c.resolve) == null ? undefined : _d.call(_c, tableIdentifier))) != null ? _e : []).map((x) => {
3033
+ const oo = ((_e = await ((_d = (_c = customProvider.tables) == null ? void 0 : _c.resolve) == null ? void 0 : _d.call(_c, tableIdentifier))) != null ? _e : []).map((x) => {
3135
3034
  var _a3;
3136
3035
  return {
3137
3036
  label: x.name,
@@ -3154,13 +3053,13 @@ function extendStandardRegistries(id, lid, customProvider) {
3154
3053
  const o = await s(ctx, m);
3155
3054
  const tableToken = getTableToken(ctx.currentToken);
3156
3055
  let tableIdentifier;
3157
- const tableNameParser = (_b = (_a2 = customProvider.tables) == null ? undefined : _a2.parseName) != null ? _b : defaultTableNameParser;
3056
+ const tableNameParser = (_b = (_a2 = customProvider.tables) == null ? void 0 : _a2.parseName) != null ? _b : defaultTableNameParser;
3158
3057
  if (tableToken && tableToken.value) {
3159
3058
  tableIdentifier = tableNameParser(tableToken);
3160
3059
  }
3161
3060
  let oo = [];
3162
3061
  if (tableIdentifier) {
3163
- const columns = await ((_c = customProvider.columns) == null ? undefined : _c.resolve(tableIdentifier));
3062
+ const columns = await ((_c = customProvider.columns) == null ? void 0 : _c.resolve(tableIdentifier));
3164
3063
  oo = columns ? columns.map((x) => {
3165
3064
  var _a3;
3166
3065
  return {
@@ -5456,9 +5355,94 @@ const QUERY_FORMAT_OPTIONS = [
5456
5355
  const backWardToOption = (value) => ({ label: value, value });
5457
5356
  const toOption = (_a = data.toOption) != null ? _a : backWardToOption;
5458
5357
 
5358
+ function getRawSqlFn(db) {
5359
+ return db.toRawSql ? db.toRawSql : (query) => toRawSql(query, Boolean(db.disableDatasets));
5360
+ }
5361
+ function toRawSql({ sql, dataset, catalog, table }, disableDatasets) {
5362
+ var _a, _b, _c, _d;
5363
+ let rawQuery = "";
5364
+ if (!sql || !haveColumns(sql.columns)) {
5365
+ return rawQuery;
5366
+ }
5367
+ rawQuery += createSelectClause(sql.columns);
5368
+ if (catalog && dataset && table) {
5369
+ rawQuery += `FROM ${catalog}.${dataset}.${table} `;
5370
+ } else if (!disableDatasets && dataset && table) {
5371
+ rawQuery += `FROM ${dataset}.${table} `;
5372
+ } else if (table) {
5373
+ rawQuery += `FROM ${table} `;
5374
+ }
5375
+ if (sql.whereString) {
5376
+ rawQuery += `WHERE ${sql.whereString} `;
5377
+ }
5378
+ if ((_b = (_a = sql.groupBy) == null ? void 0 : _a[0]) == null ? void 0 : _b.property.name) {
5379
+ const groupBy = sql.groupBy.map((g) => g.property.name).filter((g) => !lodash.isEmpty(g));
5380
+ rawQuery += `GROUP BY ${groupBy.join(", ")} `;
5381
+ }
5382
+ if ((_c = sql.orderBy) == null ? void 0 : _c.property.name) {
5383
+ rawQuery += `ORDER BY ${sql.orderBy.property.name} `;
5384
+ }
5385
+ if (((_d = sql.orderBy) == null ? void 0 : _d.property.name) && sql.orderByDirection) {
5386
+ rawQuery += `${sql.orderByDirection} `;
5387
+ }
5388
+ if (sql.limit !== void 0 && sql.limit >= 0) {
5389
+ rawQuery += `LIMIT ${sql.limit} `;
5390
+ }
5391
+ return rawQuery;
5392
+ }
5393
+ function createSelectClause(sqlColumns) {
5394
+ const columns = sqlColumns.map((c) => {
5395
+ var _a, _b;
5396
+ let rawColumn = "";
5397
+ if (c.name) {
5398
+ rawColumn += `${c.name}(${(_a = c.parameters) == null ? void 0 : _a.map((p) => `${p.name}`)})`;
5399
+ } else {
5400
+ rawColumn += `${(_b = c.parameters) == null ? void 0 : _b.map((p) => `${p.name}`)}`;
5401
+ }
5402
+ return rawColumn;
5403
+ });
5404
+ return `SELECT ${columns.join(", ")} `;
5405
+ }
5406
+ function haveColumns(columns) {
5407
+ if (!columns) {
5408
+ return false;
5409
+ }
5410
+ const haveColumn = columns.some((c) => {
5411
+ var _a, _b;
5412
+ return ((_a = c.parameters) == null ? void 0 : _a.length) || ((_b = c.parameters) == null ? void 0 : _b.some((p) => p.name));
5413
+ });
5414
+ const haveFunction = columns.some((c) => c.name);
5415
+ return haveColumn || haveFunction;
5416
+ }
5417
+ function setGroupByField(field) {
5418
+ return {
5419
+ type: QueryEditorExpressionType.GroupBy,
5420
+ property: {
5421
+ type: QueryEditorPropertyType.String,
5422
+ name: field
5423
+ }
5424
+ };
5425
+ }
5426
+ function setPropertyField(field) {
5427
+ return {
5428
+ type: QueryEditorExpressionType.Property,
5429
+ property: {
5430
+ type: QueryEditorPropertyType.String,
5431
+ name: field
5432
+ }
5433
+ };
5434
+ }
5435
+ function createFunctionField(functionName) {
5436
+ return {
5437
+ type: QueryEditorExpressionType.Function,
5438
+ name: functionName,
5439
+ parameters: []
5440
+ };
5441
+ }
5442
+
5459
5443
  const EditorStack = ({ children, wrap: wrapItems = true, ...props }) => {
5460
5444
  var _a, _b;
5461
- return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { wrap: wrapItems ? "wrap" : undefined, direction: (_a = props.direction) != null ? _a : "row", gap: (_b = props.gap) != null ? _b : 2, ...props }, children);
5445
+ return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { wrap: wrapItems ? "wrap" : void 0, direction: (_a = props.direction) != null ? _a : "row", gap: (_b = props.gap) != null ? _b : 2, ...props }, children);
5462
5446
  };
5463
5447
 
5464
5448
  const EditorList = React.forwardRef(function EditorList2({ items, renderItem, onChange }, ref) {
@@ -5495,7 +5479,7 @@ const getButtonStyles = (theme) => ({
5495
5479
  });
5496
5480
 
5497
5481
  const InputGroup = ({ children }) => {
5498
- const styles = ui.useStyles2(getStyles$n);
5482
+ const styles = ui.useStyles2(getStyles$t);
5499
5483
  const modifiedChildren = React.Children.map(children, (child) => {
5500
5484
  if (React.isValidElement(child) && child.props.invalid) {
5501
5485
  return React.cloneElement(child, { className: css.cx(child.props.className, styles.invalidChild) });
@@ -5513,7 +5497,7 @@ const borderPriority = [
5513
5497
  "focused"
5514
5498
  // highest priority
5515
5499
  ];
5516
- const getStyles$n = () => ({
5500
+ const getStyles$t = () => ({
5517
5501
  root: css.css({
5518
5502
  display: "flex",
5519
5503
  // Style the direct children of the component
@@ -5556,7 +5540,7 @@ function GroupByRow({ sql, columns, onSqlChange }) {
5556
5540
  (item) => {
5557
5541
  const cleaned = item.map((v) => {
5558
5542
  var _a;
5559
- return setGroupByField((_a = v.property) == null ? undefined : _a.name);
5543
+ return setGroupByField((_a = v.property) == null ? void 0 : _a.name);
5560
5544
  });
5561
5545
  const newSql = { ...sql, groupBy: cleaned };
5562
5546
  onSqlChange(newSql);
@@ -5580,7 +5564,7 @@ function makeRenderColumn({ options }) {
5580
5564
  return /* @__PURE__ */ React__default.default.createElement(InputGroup, null, /* @__PURE__ */ React__default.default.createElement(
5581
5565
  ui.Select,
5582
5566
  {
5583
- value: ((_a = item.property) == null ? undefined : _a.name) ? data.toOption(item.property.name) : null,
5567
+ value: ((_a = item.property) == null ? void 0 : _a.name) ? data.toOption(item.property.name) : null,
5584
5568
  "aria-label": "Group by",
5585
5569
  options,
5586
5570
  menuShouldPortal: true,
@@ -5596,10 +5580,10 @@ const EditorFieldGroup = ({ children }) => {
5596
5580
  };
5597
5581
 
5598
5582
  const EditorHeader = ({ children }) => {
5599
- const styles = ui.useStyles2(getStyles$m);
5583
+ const styles = ui.useStyles2(getStyles$s);
5600
5584
  return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, children);
5601
5585
  };
5602
- const getStyles$m = (theme) => ({
5586
+ const getStyles$s = (theme) => ({
5603
5587
  root: css.css({
5604
5588
  display: "flex",
5605
5589
  flexWrap: "wrap",
@@ -5612,12 +5596,12 @@ const getStyles$m = (theme) => ({
5612
5596
  const EditorField$1 = (props) => {
5613
5597
  var _a;
5614
5598
  const { label, optional, tooltip, tooltipInteractive, children, width, ...fieldProps } = props;
5615
- const styles = ui.useStyles2(getStyles$l, width);
5616
- const childInputId = (fieldProps == null ? undefined : fieldProps.htmlFor) || ((_a = ui.ReactUtils) == null ? undefined : _a.getChildId(children));
5599
+ const styles = ui.useStyles2(getStyles$r, width);
5600
+ const childInputId = (fieldProps == null ? void 0 : fieldProps.htmlFor) || ((_a = ui.ReactUtils) == null ? void 0 : _a.getChildId(children));
5617
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 }));
5618
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));
5619
5603
  };
5620
- const getStyles$l = (theme, width) => {
5604
+ const getStyles$r = (theme, width) => {
5621
5605
  return {
5622
5606
  root: css.css({
5623
5607
  minWidth: theme.spacing(width != null ? width : 0)
@@ -5645,10 +5629,10 @@ const getStyles$l = (theme, width) => {
5645
5629
  };
5646
5630
 
5647
5631
  const EditorRow$1 = ({ children }) => {
5648
- const styles = ui.useStyles2(getStyles$k);
5632
+ const styles = ui.useStyles2(getStyles$q);
5649
5633
  return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, /* @__PURE__ */ React__default.default.createElement(EditorStack, { gap: 2 }, children));
5650
5634
  };
5651
- const getStyles$k = (theme) => {
5635
+ const getStyles$q = (theme) => {
5652
5636
  return {
5653
5637
  root: css.css({
5654
5638
  padding: theme.spacing(1),
@@ -5663,10 +5647,10 @@ const EditorRows$1 = ({ children }) => {
5663
5647
  };
5664
5648
 
5665
5649
  const EditorSwitch = (props) => {
5666
- const styles = getStyles$j();
5650
+ const styles = getStyles$p();
5667
5651
  return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.switch }, /* @__PURE__ */ React__default.default.createElement(ui.Switch, { ...props }));
5668
5652
  };
5669
- const getStyles$j = () => {
5653
+ const getStyles$p = () => {
5670
5654
  return {
5671
5655
  switch: css.css({
5672
5656
  display: "flex",
@@ -5688,7 +5672,7 @@ function InlineSelect({ label: labelProp, ...props }) {
5688
5672
  ValueContainer,
5689
5673
  SingleValue: ValueContainer
5690
5674
  };
5691
- return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, labelProp && /* @__PURE__ */ React__default.default.createElement("label", { className: styles.label, htmlFor: id }, labelProp, ":", "\xA0"), /* @__PURE__ */ React__default.default.createElement(ui.Select, { openMenuOnFocus: true, inputId: id, ...props, components }));
5675
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, labelProp && /* @__PURE__ */ React__default.default.createElement("label", { className: styles.label, htmlFor: id }, labelProp, ":", "\xA0"), /* @__PURE__ */ React__default.default.createElement(ui.Select, { inputId: id, ...props, components }));
5692
5676
  }
5693
5677
  const SelectContainer = (props) => {
5694
5678
  const { children } = props;
@@ -5724,10 +5708,10 @@ const getSelectStyles = (theme) => ({
5724
5708
  });
5725
5709
 
5726
5710
  const Space = ({ v = 0, h = 0, layout = "block" }) => {
5727
- const styles = ui.useStyles2(getStyles$i, v, h, layout);
5711
+ const styles = ui.useStyles2(getStyles$o, v, h, layout);
5728
5712
  return /* @__PURE__ */ React__default.default.createElement("span", { className: css.cx(styles.wrapper) });
5729
5713
  };
5730
- const getStyles$i = (theme, v, h, layout) => ({
5714
+ const getStyles$o = (theme, v, h, layout) => ({
5731
5715
  wrapper: css.css([
5732
5716
  {
5733
5717
  paddingRight: theme.spacing(h != null ? h : 0),
@@ -5742,12 +5726,32 @@ const getStyles$i = (theme, v, h, layout) => ({
5742
5726
  ])
5743
5727
  });
5744
5728
 
5729
+ function applyQueryDefaults(q) {
5730
+ let editorMode = (q == null ? void 0 : q.editorMode) || EditorMode.Builder;
5731
+ if ((q == null ? void 0 : q.editorMode) === void 0 && (q == null ? void 0 : q.rawSql) !== void 0) {
5732
+ editorMode = EditorMode.Code;
5733
+ }
5734
+ const result = {
5735
+ ...q,
5736
+ refId: (q == null ? void 0 : q.refId) || "A",
5737
+ format: (q == null ? void 0 : q.format) !== void 0 ? q.format : QueryFormat.Table,
5738
+ rawSql: (q == null ? void 0 : q.rawSql) || "",
5739
+ editorMode,
5740
+ sql: (q == null ? void 0 : q.sql) || {
5741
+ columns: [createFunctionField()],
5742
+ groupBy: [setGroupByField()],
5743
+ limit: 50
5744
+ }
5745
+ };
5746
+ return result;
5747
+ }
5748
+
5745
5749
  function ConfirmModal({ isOpen, onCancel, onDiscard, onCopy }) {
5746
5750
  const buttonRef = React.useRef(null);
5747
5751
  React.useEffect(() => {
5748
5752
  var _a;
5749
5753
  if (isOpen) {
5750
- (_a = buttonRef.current) == null ? undefined : _a.focus();
5754
+ (_a = buttonRef.current) == null ? void 0 : _a.focus();
5751
5755
  }
5752
5756
  }, [isOpen]);
5753
5757
  return /* @__PURE__ */ React__default.default.createElement(
@@ -5793,7 +5797,7 @@ const DatasetSelector = ({
5793
5797
  onChange(state.value[0]);
5794
5798
  }
5795
5799
  } else {
5796
- if (state.value && state.value.find((v) => v.value === value) === undefined) {
5800
+ if (state.value && state.value.find((v) => v.value === value) === void 0) {
5797
5801
  if (state.value.length > 0) {
5798
5802
  onChange(state.value[0]);
5799
5803
  }
@@ -5844,7 +5848,7 @@ const CatalogSelector = ({ db, inputId, value, onChange }) => {
5844
5848
  loadCatalogs();
5845
5849
  }, [db, loadCatalogs]);
5846
5850
  const handleChange = (selectable) => {
5847
- onChange((selectable == null ? undefined : selectable.value) || null);
5851
+ onChange((selectable == null ? void 0 : selectable.value) || null);
5848
5852
  };
5849
5853
  const selectedValue = catalogs.find((catalog) => catalog.value === value) || null;
5850
5854
  return /* @__PURE__ */ React__default.default.createElement(
@@ -5908,7 +5912,7 @@ const RunQueryButton = ({
5908
5912
  onClick,
5909
5913
  dataTestId
5910
5914
  }) => {
5911
- let icon = queryInvalid ? "exclamation-triangle" : undefined;
5915
+ let icon = queryInvalid ? "exclamation-triangle" : void 0;
5912
5916
  if (queryRunning) {
5913
5917
  icon = "fa fa-spinner";
5914
5918
  }
@@ -5971,35 +5975,35 @@ function QueryHeader({
5971
5975
  [editorMode, onChange, query]
5972
5976
  );
5973
5977
  const onFormatChange = (e) => {
5974
- const next = { ...query, format: e.value !== undefined ? e.value : QueryFormat.Table };
5978
+ const next = { ...query, format: e.value !== void 0 ? e.value : QueryFormat.Table };
5975
5979
  onChange(next);
5976
5980
  };
5977
5981
  const onDatasetChange = (e) => {
5978
- const datasetValue = e.value || undefined;
5982
+ const datasetValue = e.value || void 0;
5979
5983
  if (datasetValue === query.dataset) {
5980
5984
  return;
5981
5985
  }
5982
5986
  const next = {
5983
5987
  ...query,
5984
5988
  dataset: datasetValue,
5985
- table: undefined,
5986
- sql: undefined,
5989
+ table: void 0,
5990
+ sql: void 0,
5987
5991
  rawSql: ""
5988
5992
  };
5989
5993
  onChange(next);
5990
5994
  };
5991
5995
  const onCatalogChange = (catalog) => {
5992
- const catalogValue = catalog || undefined;
5996
+ const catalogValue = catalog || void 0;
5993
5997
  if (catalogValue === query.catalog) {
5994
5998
  return;
5995
5999
  }
5996
6000
  const next = {
5997
6001
  ...query,
5998
6002
  catalog: catalogValue,
5999
- dataset: undefined,
6003
+ dataset: void 0,
6000
6004
  // Reset dataset (which acts as schema when catalog is present)
6001
- table: undefined,
6002
- sql: undefined,
6005
+ table: void 0,
6006
+ sql: void 0,
6003
6007
  rawSql: ""
6004
6008
  };
6005
6009
  onChange(next);
@@ -6011,7 +6015,7 @@ function QueryHeader({
6011
6015
  const next = {
6012
6016
  ...query,
6013
6017
  table: e.value,
6014
- sql: undefined,
6018
+ sql: void 0,
6015
6019
  rawSql: ""
6016
6020
  };
6017
6021
  onChange(next);
@@ -6094,7 +6098,7 @@ function QueryHeader({
6094
6098
  {
6095
6099
  db,
6096
6100
  inputId: `sql-catalog-${htmlId}`,
6097
- value: query.catalog === undefined ? null : query.catalog,
6101
+ value: query.catalog === void 0 ? null : query.catalog,
6098
6102
  onChange: onCatalogChange
6099
6103
  }
6100
6104
  )), effectiveEnableDatasets && /* @__PURE__ */ React__default.default.createElement(
@@ -6109,10 +6113,10 @@ function QueryHeader({
6109
6113
  db,
6110
6114
  inputId: catalogsEnabled ? `sql-schema-${htmlId}` : `sql-dataset-${htmlId}`,
6111
6115
  "data-testid": catalogsEnabled ? "schema-selector" : "dataset-selector",
6112
- dataset: catalogsEnabled ? undefined : defaultDataset,
6113
- value: query.dataset === undefined ? null : query.dataset,
6116
+ dataset: catalogsEnabled ? void 0 : defaultDataset,
6117
+ value: query.dataset === void 0 ? null : query.dataset,
6114
6118
  onChange: onDatasetChange,
6115
- catalog: catalogsEnabled ? query.catalog : undefined
6119
+ catalog: catalogsEnabled ? query.catalog : void 0
6116
6120
  }
6117
6121
  )
6118
6122
  ), /* @__PURE__ */ React__default.default.createElement(EditorField$1, { label: labels.get("table") || "Table", width: 25 }, /* @__PURE__ */ React__default.default.createElement(
@@ -6120,10 +6124,10 @@ function QueryHeader({
6120
6124
  {
6121
6125
  db,
6122
6126
  inputId: `sql-table-${htmlId}`,
6123
- dataset: query.dataset || (catalogsEnabled ? undefined : defaultDataset),
6124
- catalog: catalogsEnabled ? query.catalog : undefined,
6127
+ dataset: query.dataset || (catalogsEnabled ? void 0 : defaultDataset),
6128
+ catalog: catalogsEnabled ? query.catalog : void 0,
6125
6129
  query,
6126
- value: query.table === undefined ? null : query.table,
6130
+ value: query.table === void 0 ? null : query.table,
6127
6131
  onChange: onTableChange,
6128
6132
  enableCatalogs: catalogsEnabled,
6129
6133
  applyDefault: true
@@ -6131,13 +6135,32 @@ function QueryHeader({
6131
6135
  )))));
6132
6136
  }
6133
6137
 
6134
- function formatSQL(q) {
6135
- return sqlFormatter__default.default.format(q).replace(/(\$ \{ .* \})|(\$ __)|(\$ \w+)/g, (m) => {
6136
- return m.replace(/\s/g, "");
6138
+ function formatSQL(q, language = "sql") {
6139
+ const formatted = sqlFormatter.format(q, {
6140
+ language,
6141
+ paramTypes: {
6142
+ custom: [
6143
+ {
6144
+ regex: "\\$\\s*\\{[^}]*\\}|\\$\\s*__\\w+(?:\\([^)]*\\))?|\\$\\s*\\w+"
6145
+ }
6146
+ ]
6147
+ }
6137
6148
  });
6149
+ return formatted.replace(
6150
+ /(\$\s*\{[^}]*\})|(\$\s*__\w+(?:\([^)]*\))?)|(\$\s*\w+)/g,
6151
+ (m) => m.replace(/\s/g, "")
6152
+ );
6138
6153
  }
6139
6154
 
6140
- function QueryEditorRaw({ children, onChange, query, width, height, completionProvider }) {
6155
+ function QueryEditorRaw({
6156
+ children,
6157
+ onChange,
6158
+ query,
6159
+ width,
6160
+ height,
6161
+ completionProvider,
6162
+ language = "sql"
6163
+ }) {
6141
6164
  const queryRef = React.useRef(query);
6142
6165
  React.useEffect(() => {
6143
6166
  queryRef.current = query;
@@ -6160,7 +6183,7 @@ function QueryEditorRaw({ children, onChange, query, width, height, completionPr
6160
6183
  height,
6161
6184
  query: query.rawSql,
6162
6185
  onChange: onRawQueryChange,
6163
- language: { id: "sql", completionProvider, formatter: formatSQL }
6186
+ language: { id: "sql", completionProvider, formatter: (q) => formatSQL(q, language) }
6164
6187
  },
6165
6188
  children
6166
6189
  );
@@ -6189,7 +6212,7 @@ function QueryValidator({ db, query, onValidate, range }) {
6189
6212
  const [state, validateQuery] = reactUse.useAsyncFn(
6190
6213
  async (q) => {
6191
6214
  var _a2;
6192
- if (((_a2 = q.rawSql) == null ? undefined : _a2.trim()) === "") {
6215
+ if (((_a2 = q.rawSql) == null ? void 0 : _a2.trim()) === "") {
6193
6216
  return null;
6194
6217
  }
6195
6218
  return await db.validateQuery(q, range);
@@ -6208,17 +6231,17 @@ function QueryValidator({ db, query, onValidate, range }) {
6208
6231
  [query, validateQuery]
6209
6232
  );
6210
6233
  React.useEffect(() => {
6211
- if (validationResult == null ? undefined : validationResult.isError) {
6234
+ if (validationResult == null ? void 0 : validationResult.isError) {
6212
6235
  onValidate(false);
6213
6236
  }
6214
- if (validationResult == null ? undefined : validationResult.isValid) {
6237
+ if (validationResult == null ? void 0 : validationResult.isValid) {
6215
6238
  onValidate(true);
6216
6239
  }
6217
6240
  }, [validationResult, onValidate]);
6218
6241
  if (!state.value && !state.loading) {
6219
6242
  return null;
6220
6243
  }
6221
- const error = ((_a = state.value) == null ? undefined : _a.error) ? processErrorMessage(state.value.error) : "";
6244
+ const error = ((_a = state.value) == null ? void 0 : _a.error) ? processErrorMessage(state.value.error) : "";
6222
6245
  return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, state.loading && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.info }, /* @__PURE__ */ React__default.default.createElement(ui.Spinner, { inline: true, size: 12 }), " Validating query..."), !state.loading && state.value && /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, state.value.isValid && state.value.statistics && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.valid }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "check" }), " This query will process", " ", /* @__PURE__ */ React__default.default.createElement("strong", null, data.formattedValueToString(valueFormatter(state.value.statistics.TotalBytesProcessed))), " ", "when run.")), /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, state.value.isError && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.error }, error))));
6223
6246
  }
6224
6247
  function processErrorMessage(error) {
@@ -6262,9 +6285,13 @@ function QueryToolbox({ showTools, onFormatCode, onExpand, isExpanded, ...valida
6262
6285
  };
6263
6286
  }, [theme]);
6264
6287
  let style = {};
6265
- if (!showTools && validationResult === undefined) {
6288
+ if (!showTools && validationResult === void 0) {
6266
6289
  style = { height: 0, padding: 0, visibility: "hidden" };
6267
6290
  }
6291
+ const onFormatClick = () => {
6292
+ runtime.reportInteraction("grafana_sql_query_editor_format_click");
6293
+ onFormatCode == null ? void 0 : onFormatCode();
6294
+ };
6268
6295
  return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.container, style }, /* @__PURE__ */ React__default.default.createElement("div", null, validatorProps.onValidate && /* @__PURE__ */ React__default.default.createElement(
6269
6296
  QueryValidator,
6270
6297
  {
@@ -6274,7 +6301,7 @@ function QueryToolbox({ showTools, onFormatCode, onExpand, isExpanded, ...valida
6274
6301
  validatorProps.onValidate(result);
6275
6302
  }
6276
6303
  }
6277
- )), showTools && /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(ui.HorizontalGroup, { spacing: "sm" }, onFormatCode && /* @__PURE__ */ React__default.default.createElement(ui.IconButton, { onClick: onFormatCode, name: "brackets-curly", size: "xs", tooltip: "Format query" }), onExpand && /* @__PURE__ */ React__default.default.createElement(
6304
+ )), showTools && /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(ui.HorizontalGroup, { spacing: "sm" }, onFormatCode && /* @__PURE__ */ React__default.default.createElement(ui.IconButton, { onClick: onFormatClick, name: "brackets-curly", size: "xs", tooltip: "Format query" }), onExpand && /* @__PURE__ */ React__default.default.createElement(
6278
6305
  ui.IconButton,
6279
6306
  {
6280
6307
  onClick: () => onExpand(!isExpanded),
@@ -6285,9 +6312,18 @@ function QueryToolbox({ showTools, onFormatCode, onExpand, isExpanded, ...valida
6285
6312
  ), /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: "Hit CTRL/CMD+Return to run query" }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { className: styles.hint, name: "keyboard" })))));
6286
6313
  }
6287
6314
 
6288
- function RawEditor({ db, query, onChange, onRunQuery, onValidate, queryToValidate, range }) {
6315
+ function RawEditor({
6316
+ db,
6317
+ query,
6318
+ onChange,
6319
+ onRunQuery,
6320
+ onValidate,
6321
+ queryToValidate,
6322
+ range,
6323
+ language = "sql"
6324
+ }) {
6289
6325
  const theme = ui.useTheme2();
6290
- const styles = ui.useStyles2(getStyles$h);
6326
+ const styles = ui.useStyles2(getStyles$n);
6291
6327
  const [isExpanded, setIsExpanded] = React.useState(false);
6292
6328
  const [toolboxRef, toolboxMeasure] = reactUse.useMeasure();
6293
6329
  const [editorRef, editorMeasure] = reactUse.useMeasure();
@@ -6299,7 +6335,8 @@ function RawEditor({ db, query, onChange, onRunQuery, onValidate, queryToValidat
6299
6335
  completionProvider,
6300
6336
  query,
6301
6337
  width,
6302
- height: height ? height - toolboxMeasure.height : undefined,
6338
+ language,
6339
+ height: height ? height - toolboxMeasure.height : void 0,
6303
6340
  onChange
6304
6341
  },
6305
6342
  ({ formatQuery }) => {
@@ -6356,7 +6393,7 @@ function RawEditor({ db, query, onChange, onRunQuery, onValidate, queryToValidat
6356
6393
  renderEditor(true)
6357
6394
  ));
6358
6395
  }
6359
- function getStyles$h(theme) {
6396
+ function getStyles$n(theme) {
6360
6397
  return {
6361
6398
  modal: css.css`
6362
6399
  width: 95vw;
@@ -6369,23 +6406,23 @@ function getStyles$h(theme) {
6369
6406
  };
6370
6407
  }
6371
6408
 
6372
- function Preview({ rawSql }) {
6409
+ function Preview({ rawSql, language = "sql" }) {
6373
6410
  const [_, copyToClipboard] = reactUse.useCopyToClipboard();
6374
- const styles = ui.useStyles2(getStyles$g);
6411
+ const styles = ui.useStyles2(getStyles$m);
6375
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" }));
6376
6413
  return /* @__PURE__ */ React__default.default.createElement(ui.Field, { label: labelElement, className: styles.grow }, /* @__PURE__ */ React__default.default.createElement(
6377
6414
  ui.CodeEditor,
6378
6415
  {
6379
6416
  language: "sql",
6380
6417
  height: 80,
6381
- value: formatSQL(rawSql),
6418
+ value: formatSQL(rawSql, language),
6382
6419
  monacoOptions: { scrollbar: { vertical: "hidden" }, scrollBeyondLastLine: false },
6383
6420
  readOnly: true,
6384
6421
  showMiniMap: false
6385
6422
  }
6386
6423
  ));
6387
6424
  }
6388
- function getStyles$g(theme) {
6425
+ function getStyles$m(theme) {
6389
6426
  return {
6390
6427
  grow: css.css({ flexGrow: 1 }),
6391
6428
  label: css.css({ fontSize: 12, fontWeight: theme.typography.fontWeightMedium }),
@@ -6446,9 +6483,9 @@ function OrderByRow({ sql, onSqlChange, columns, showOffset }) {
6446
6483
  );
6447
6484
  const onOrderByChange = React.useCallback(
6448
6485
  (item) => {
6449
- const newSql = { ...sql, orderBy: setPropertyField(item == null ? undefined : item.value) };
6486
+ const newSql = { ...sql, orderBy: setPropertyField(item == null ? void 0 : item.value) };
6450
6487
  if (item === null) {
6451
- newSql.orderByDirection = undefined;
6488
+ newSql.orderByDirection = void 0;
6452
6489
  }
6453
6490
  onSqlChange(newSql);
6454
6491
  },
@@ -6459,7 +6496,7 @@ function OrderByRow({ sql, onSqlChange, columns, showOffset }) {
6459
6496
  {
6460
6497
  "aria-label": "Order by",
6461
6498
  options: columns,
6462
- value: ((_a = sql.orderBy) == null ? undefined : _a.property.name) ? data.toOption(sql.orderBy.property.name) : null,
6499
+ value: ((_a = sql.orderBy) == null ? void 0 : _a.property.name) ? data.toOption(sql.orderBy.property.name) : null,
6463
6500
  isClearable: true,
6464
6501
  menuShouldPortal: true,
6465
6502
  onChange: onOrderByChange
@@ -6468,7 +6505,7 @@ function OrderByRow({ sql, onSqlChange, columns, showOffset }) {
6468
6505
  ui.RadioButtonGroup,
6469
6506
  {
6470
6507
  options: sortOrderOptions,
6471
- disabled: !((_b = sql == null ? undefined : sql.orderBy) == null ? undefined : _b.property.name),
6508
+ disabled: !((_b = sql == null ? void 0 : sql.orderBy) == null ? void 0 : _b.property.name),
6472
6509
  value: sql.orderByDirection,
6473
6510
  onChange: onSortOrderChange
6474
6511
  }
@@ -6480,9 +6517,9 @@ function SQLOrderByRow({ fields, query, onQueryChange, db }) {
6480
6517
  const { onSqlChange } = useSqlChange({ query, onQueryChange, db });
6481
6518
  let columnsWithIndices = [];
6482
6519
  if (fields) {
6483
- const options = (_b = (_a = query.sql) == null ? undefined : _a.columns) == null ? undefined : _b.map((c, i) => {
6520
+ const options = (_b = (_a = query.sql) == null ? void 0 : _a.columns) == null ? void 0 : _b.map((c, i) => {
6484
6521
  var _a2, _b2;
6485
- const value = c.name ? `${c.name}(${(_a2 = c.parameters) == null ? undefined : _a2.map((p) => p.name)})` : (_b2 = c.parameters) == null ? undefined : _b2.map((p) => p.name);
6522
+ const value = c.name ? `${c.name}(${(_a2 = c.parameters) == null ? void 0 : _a2.map((p) => p.name)})` : (_b2 = c.parameters) == null ? void 0 : _b2.map((p) => p.name);
6486
6523
  return {
6487
6524
  value,
6488
6525
  label: `${i + 1} - ${value}`
@@ -6504,13 +6541,13 @@ function SQLOrderByRow({ fields, query, onQueryChange, db }) {
6504
6541
  const asteriskValue = { label: "*", value: "*" };
6505
6542
  function SelectRow({ sql, columns, onSqlChange, functions }) {
6506
6543
  var _a;
6507
- const styles = ui.useStyles2(getStyles$f);
6544
+ const styles = ui.useStyles2(getStyles$l);
6508
6545
  const columnsWithAsterisk = [asteriskValue, ...columns || []];
6509
6546
  const onColumnChange = React.useCallback(
6510
6547
  (item, index) => (column) => {
6511
6548
  var _a2, _b;
6512
6549
  let modifiedItem = { ...item };
6513
- if (!((_a2 = item.parameters) == null ? undefined : _a2.length)) {
6550
+ if (!((_a2 = item.parameters) == null ? void 0 : _a2.length)) {
6514
6551
  modifiedItem.parameters = [{ type: QueryEditorExpressionType.FunctionParameter, name: column.value }];
6515
6552
  } else {
6516
6553
  modifiedItem.parameters = item.parameters.map(
@@ -6519,7 +6556,7 @@ function SelectRow({ sql, columns, onSqlChange, functions }) {
6519
6556
  }
6520
6557
  const newSql = {
6521
6558
  ...sql,
6522
- columns: (_b = sql.columns) == null ? undefined : _b.map((c, i) => i === index ? modifiedItem : c)
6559
+ columns: (_b = sql.columns) == null ? void 0 : _b.map((c, i) => i === index ? modifiedItem : c)
6523
6560
  };
6524
6561
  onSqlChange(newSql);
6525
6562
  },
@@ -6530,11 +6567,11 @@ function SelectRow({ sql, columns, onSqlChange, functions }) {
6530
6567
  var _a2;
6531
6568
  const newItem = {
6532
6569
  ...item,
6533
- name: aggregation == null ? undefined : aggregation.value
6570
+ name: aggregation == null ? void 0 : aggregation.value
6534
6571
  };
6535
6572
  const newSql = {
6536
6573
  ...sql,
6537
- columns: (_a2 = sql.columns) == null ? undefined : _a2.map((c, i) => i === index ? newItem : c)
6574
+ columns: (_a2 = sql.columns) == null ? void 0 : _a2.map((c, i) => i === index ? newItem : c)
6538
6575
  };
6539
6576
  onSqlChange(newSql);
6540
6577
  },
@@ -6556,7 +6593,7 @@ function SelectRow({ sql, columns, onSqlChange, functions }) {
6556
6593
  const newSql = { ...sql, columns: [...sql.columns, createFunctionField()] };
6557
6594
  onSqlChange(newSql);
6558
6595
  }, [onSqlChange, sql]);
6559
- return /* @__PURE__ */ React__default.default.createElement(EditorStack, { gap: 2, alignItems: "end", direction: "column" }, (_a = sql.columns) == null ? undefined : _a.map((item, index) => /* @__PURE__ */ React__default.default.createElement("div", { key: index }, /* @__PURE__ */ React__default.default.createElement(EditorStack, { gap: 2, alignItems: "end" }, /* @__PURE__ */ React__default.default.createElement(EditorField$1, { label: "Column", width: 25 }, /* @__PURE__ */ React__default.default.createElement(
6596
+ return /* @__PURE__ */ React__default.default.createElement(EditorStack, { gap: 2, alignItems: "end", direction: "column" }, (_a = sql.columns) == null ? void 0 : _a.map((item, index) => /* @__PURE__ */ React__default.default.createElement("div", { key: index }, /* @__PURE__ */ React__default.default.createElement(EditorStack, { gap: 2, alignItems: "end" }, /* @__PURE__ */ React__default.default.createElement(EditorField$1, { label: "Column", width: 25 }, /* @__PURE__ */ React__default.default.createElement(
6560
6597
  ui.Select,
6561
6598
  {
6562
6599
  value: getColumnValue(item),
@@ -6600,12 +6637,12 @@ function SelectRow({ sql, columns, onSqlChange, functions }) {
6600
6637
  }
6601
6638
  ));
6602
6639
  }
6603
- const getStyles$f = () => {
6640
+ const getStyles$l = () => {
6604
6641
  return { addButton: css.css({ alignSelf: "flex-start" }) };
6605
6642
  };
6606
6643
  function getColumnValue({ parameters }) {
6607
- const column = parameters == null ? undefined : parameters.find((p) => p.type === QueryEditorExpressionType.FunctionParameter);
6608
- if (column == null ? undefined : column.name) {
6644
+ const column = parameters == null ? void 0 : parameters.find((p) => p.type === QueryEditorExpressionType.FunctionParameter);
6645
+ if (column == null ? void 0 : column.name) {
6609
6646
  return data.toOption(column.name);
6610
6647
  }
6611
6648
  return null;
@@ -6626,7 +6663,6 @@ const buttonLabels = {
6626
6663
  };
6627
6664
  ({
6628
6665
  id: ui$1.Utils.uuid(),
6629
- type: "group",
6630
6666
  children1: [
6631
6667
  {
6632
6668
  id: ui$1.Utils.uuid(),
@@ -6664,9 +6700,9 @@ const widgets = {
6664
6700
  return /* @__PURE__ */ React__default.default.createElement(
6665
6701
  ui.Input,
6666
6702
  {
6667
- value: (props == null ? undefined : props.value) || "",
6668
- placeholder: props == null ? undefined : props.placeholder,
6669
- onChange: (e) => props == null ? undefined : props.setValue(e.currentTarget.value)
6703
+ value: (props == null ? void 0 : props.value) || "",
6704
+ placeholder: props == null ? void 0 : props.placeholder,
6705
+ onChange: (e) => props == null ? void 0 : props.setValue(e.currentTarget.value)
6670
6706
  }
6671
6707
  );
6672
6708
  }
@@ -6677,10 +6713,10 @@ const widgets = {
6677
6713
  return /* @__PURE__ */ React__default.default.createElement(
6678
6714
  ui.Input,
6679
6715
  {
6680
- value: props == null ? undefined : props.value,
6681
- placeholder: props == null ? undefined : props.placeholder,
6716
+ value: props == null ? void 0 : props.value,
6717
+ placeholder: props == null ? void 0 : props.placeholder,
6682
6718
  type: "number",
6683
- onChange: (e) => props == null ? undefined : props.setValue(Number.parseInt(e.currentTarget.value, 10))
6719
+ onChange: (e) => props == null ? void 0 : props.setValue(Number.parseInt(e.currentTarget.value, 10))
6684
6720
  }
6685
6721
  );
6686
6722
  }
@@ -6692,9 +6728,9 @@ const widgets = {
6692
6728
  ui.DateTimePicker,
6693
6729
  {
6694
6730
  onChange: (e) => {
6695
- props == null ? undefined : props.setValue(e == null ? undefined : e.format(ui$1.BasicConfig.widgets.datetime.valueFormat));
6731
+ props == null ? void 0 : props.setValue(e == null ? void 0 : e.format(ui$1.BasicConfig.widgets.datetime.valueFormat));
6696
6732
  },
6697
- date: data.dateTime(props == null ? undefined : props.value).utc()
6733
+ date: data.dateTime(props == null ? void 0 : props.value).utc()
6698
6734
  }
6699
6735
  );
6700
6736
  }
@@ -6712,37 +6748,37 @@ const settings = {
6712
6748
  return /* @__PURE__ */ React__default.default.createElement(
6713
6749
  ui.Select,
6714
6750
  {
6715
- id: conjProps == null ? undefined : conjProps.id,
6751
+ id: conjProps == null ? void 0 : conjProps.id,
6716
6752
  "aria-label": "Conjunction",
6717
6753
  menuShouldPortal: true,
6718
- options: (conjProps == null ? undefined : conjProps.conjunctionOptions) ? Object.keys(conjProps == null ? undefined : conjProps.conjunctionOptions).map(data.toOption) : undefined,
6719
- value: conjProps == null ? undefined : conjProps.selectedConjunction,
6720
- onChange: (val) => conjProps == null ? undefined : conjProps.setConjunction(val.value)
6754
+ options: (conjProps == null ? void 0 : conjProps.conjunctionOptions) ? Object.keys(conjProps == null ? void 0 : conjProps.conjunctionOptions).map(data.toOption) : void 0,
6755
+ value: conjProps == null ? void 0 : conjProps.selectedConjunction,
6756
+ onChange: (val) => conjProps == null ? void 0 : conjProps.setConjunction(val.value)
6721
6757
  }
6722
6758
  );
6723
6759
  },
6724
6760
  renderField: function Field(fieldProps) {
6725
6761
  var _a;
6726
- const fields = ((_a = fieldProps == null ? undefined : fieldProps.config) == null ? undefined : _a.fields) || {};
6762
+ const fields = ((_a = fieldProps == null ? void 0 : fieldProps.config) == null ? void 0 : _a.fields) || {};
6727
6763
  return /* @__PURE__ */ React__default.default.createElement(
6728
6764
  ui.Select,
6729
6765
  {
6730
- id: fieldProps == null ? undefined : fieldProps.id,
6766
+ id: fieldProps == null ? void 0 : fieldProps.id,
6731
6767
  width: 25,
6732
6768
  "aria-label": "Field",
6733
6769
  menuShouldPortal: true,
6734
- options: fieldProps == null ? undefined : fieldProps.items.map((f) => {
6770
+ options: fieldProps == null ? void 0 : fieldProps.items.map((f) => {
6735
6771
  var _a2, _b;
6736
- const icon = (_b = (_a2 = fields[f.key].mainWidgetProps) == null ? undefined : _a2.customProps) == null ? undefined : _b.icon;
6772
+ const icon = (_b = (_a2 = fields[f.key].mainWidgetProps) == null ? void 0 : _a2.customProps) == null ? void 0 : _b.icon;
6737
6773
  return {
6738
6774
  label: f.label,
6739
6775
  value: f.key,
6740
6776
  icon
6741
6777
  };
6742
6778
  }),
6743
- value: fieldProps == null ? undefined : fieldProps.selectedKey,
6779
+ value: fieldProps == null ? void 0 : fieldProps.selectedKey,
6744
6780
  onChange: (val) => {
6745
- fieldProps == null ? undefined : fieldProps.setField(val.label);
6781
+ fieldProps == null ? void 0 : fieldProps.setField(val.label);
6746
6782
  }
6747
6783
  }
6748
6784
  );
@@ -6752,11 +6788,11 @@ const settings = {
6752
6788
  ui.Button,
6753
6789
  {
6754
6790
  type: "button",
6755
- title: `${buttonProps == null ? undefined : buttonProps.label} filter`,
6756
- onClick: buttonProps == null ? undefined : buttonProps.onClick,
6791
+ title: `${buttonProps == null ? void 0 : buttonProps.label} filter`,
6792
+ onClick: buttonProps == null ? void 0 : buttonProps.onClick,
6757
6793
  variant: "secondary",
6758
6794
  size: "md",
6759
- icon: (buttonProps == null ? undefined : buttonProps.label) === buttonLabels.add ? "plus" : "times"
6795
+ icon: (buttonProps == null ? void 0 : buttonProps.label) === buttonLabels.add ? "plus" : "times"
6760
6796
  }
6761
6797
  );
6762
6798
  },
@@ -6764,12 +6800,12 @@ const settings = {
6764
6800
  return /* @__PURE__ */ React__default.default.createElement(
6765
6801
  ui.Select,
6766
6802
  {
6767
- options: operatorProps == null ? undefined : operatorProps.items.map((op) => ({ label: op.label, value: op.key })),
6803
+ options: operatorProps == null ? void 0 : operatorProps.items.map((op) => ({ label: op.label, value: op.key })),
6768
6804
  "aria-label": "Operator",
6769
6805
  menuShouldPortal: true,
6770
- value: operatorProps == null ? undefined : operatorProps.selectedKey,
6806
+ value: operatorProps == null ? void 0 : operatorProps.selectedKey,
6771
6807
  onChange: (val) => {
6772
- operatorProps == null ? undefined : operatorProps.setField(val.value || "");
6808
+ operatorProps == null ? void 0 : operatorProps.setField(val.value || "");
6773
6809
  }
6774
6810
  }
6775
6811
  );
@@ -6947,10 +6983,10 @@ function mapFieldsToTypes(columns) {
6947
6983
  }
6948
6984
 
6949
6985
  const EditorRow = ({ children }) => {
6950
- const styles = ui.useStyles2(getStyles$e);
6986
+ const styles = ui.useStyles2(getStyles$k);
6951
6987
  return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, /* @__PURE__ */ React__default.default.createElement(EditorStack, { gap: 2 }, children));
6952
6988
  };
6953
- const getStyles$e = (theme) => {
6989
+ const getStyles$k = (theme) => {
6954
6990
  return {
6955
6991
  root: css.css({
6956
6992
  padding: theme.spacing(1),
@@ -6964,12 +7000,12 @@ const EditorField = (props) => {
6964
7000
  var _a;
6965
7001
  const { label, optional, tooltip, children, width, ...fieldProps } = props;
6966
7002
  const theme = ui.useTheme2();
6967
- const styles = getStyles$d(theme, width);
6968
- const childInputId = (fieldProps == null ? undefined : fieldProps.htmlFor) || ((_a = ui.ReactUtils) == null ? undefined : _a.getChildId(children));
7003
+ const styles = getStyles$j(theme, width);
7004
+ const childInputId = (fieldProps == null ? void 0 : fieldProps.htmlFor) || ((_a = ui.ReactUtils) == null ? void 0 : _a.getChildId(children));
6969
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 }));
6970
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));
6971
7007
  };
6972
- const getStyles$d = ui.stylesFactory((theme, width) => {
7008
+ const getStyles$j = ui.stylesFactory((theme, width) => {
6973
7009
  return {
6974
7010
  root: css.css({
6975
7011
  minWidth: theme.spacing(width != null ? width : 0)
@@ -7000,12 +7036,20 @@ const EditorRows = ({ children }) => {
7000
7036
  return /* @__PURE__ */ React__default.default.createElement(EditorStack, { gap: 0.5, direction: "column" }, children);
7001
7037
  };
7002
7038
 
7003
- const VisualEditor = ({ query, db, queryRowFilter, onChange, onValidate, range }) => {
7039
+ const VisualEditor = ({
7040
+ query,
7041
+ db,
7042
+ queryRowFilter,
7043
+ onChange,
7044
+ onValidate,
7045
+ language = "sql",
7046
+ range
7047
+ }) => {
7004
7048
  const state = reactUse.useAsync(async () => {
7005
7049
  const fields = await db.fields(query);
7006
7050
  return fields;
7007
7051
  }, [db, query.dataset, query.table]);
7008
- return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement(EditorRows, null, /* @__PURE__ */ React__default.default.createElement(EditorRow, null, /* @__PURE__ */ React__default.default.createElement(SQLSelectRow, { fields: state.value || [], query, onQueryChange: onChange, db })), queryRowFilter.filter && /* @__PURE__ */ React__default.default.createElement(EditorRow, null, /* @__PURE__ */ React__default.default.createElement(EditorField, { label: "Filter by column value", optional: true }, /* @__PURE__ */ React__default.default.createElement(SQLWhereRow, { fields: state.value || [], query, onQueryChange: onChange, db }))), queryRowFilter.group && /* @__PURE__ */ React__default.default.createElement(EditorRow, null, /* @__PURE__ */ React__default.default.createElement(EditorField, { label: "Group by column" }, /* @__PURE__ */ React__default.default.createElement(SQLGroupByRow, { fields: state.value || [], query, onQueryChange: onChange, db }))), queryRowFilter.order && /* @__PURE__ */ React__default.default.createElement(EditorRow, null, /* @__PURE__ */ React__default.default.createElement(SQLOrderByRow, { fields: state.value || [], query, onQueryChange: onChange, db })), queryRowFilter.preview && query.rawSql && /* @__PURE__ */ React__default.default.createElement(EditorRow, null, /* @__PURE__ */ React__default.default.createElement(Preview, { rawSql: query.rawSql }))), /* @__PURE__ */ React__default.default.createElement(QueryToolbox, { db, query, onValidate, range }));
7052
+ return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement(EditorRows, null, /* @__PURE__ */ React__default.default.createElement(EditorRow, null, /* @__PURE__ */ React__default.default.createElement(SQLSelectRow, { fields: state.value || [], query, onQueryChange: onChange, db })), queryRowFilter.filter && /* @__PURE__ */ React__default.default.createElement(EditorRow, null, /* @__PURE__ */ React__default.default.createElement(EditorField, { label: "Filter by column value", optional: true }, /* @__PURE__ */ React__default.default.createElement(SQLWhereRow, { fields: state.value || [], query, onQueryChange: onChange, db }))), queryRowFilter.group && /* @__PURE__ */ React__default.default.createElement(EditorRow, null, /* @__PURE__ */ React__default.default.createElement(EditorField, { label: "Group by column" }, /* @__PURE__ */ React__default.default.createElement(SQLGroupByRow, { fields: state.value || [], query, onQueryChange: onChange, db }))), queryRowFilter.order && /* @__PURE__ */ React__default.default.createElement(EditorRow, null, /* @__PURE__ */ React__default.default.createElement(SQLOrderByRow, { fields: state.value || [], query, onQueryChange: onChange, db })), queryRowFilter.preview && query.rawSql && /* @__PURE__ */ React__default.default.createElement(EditorRow, null, /* @__PURE__ */ React__default.default.createElement(Preview, { rawSql: query.rawSql, language }))), /* @__PURE__ */ React__default.default.createElement(QueryToolbox, { db, query, onValidate, range }));
7009
7053
  };
7010
7054
 
7011
7055
  const MACRO_NAMES = [
@@ -7024,20 +7068,20 @@ const MACRO_NAMES = [
7024
7068
  "$__unixEpochGroupAlias"
7025
7069
  ];
7026
7070
 
7027
- var __defProp$2 = Object.defineProperty;
7028
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7029
- var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
7030
- class SqlDatasource extends runtime.DataSourceWithBackend {
7071
+ var __defProp$3 = Object.defineProperty;
7072
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7073
+ var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
7074
+ class SqlDatasource extends runtime.DataSourceWithBackend {
7031
7075
  constructor(instanceSettings, templateSrv = runtime.getTemplateSrv()) {
7032
7076
  super(instanceSettings);
7033
7077
  this.templateSrv = templateSrv;
7034
- __publicField$2(this, "id");
7035
- __publicField$2(this, "name");
7036
- __publicField$2(this, "interval");
7037
- __publicField$2(this, "db");
7038
- __publicField$2(this, "dataset");
7039
- __publicField$2(this, "annotations", {});
7040
- __publicField$2(this, "interpolateVariable", (value, variable) => {
7078
+ __publicField$3(this, "id");
7079
+ __publicField$3(this, "name");
7080
+ __publicField$3(this, "interval");
7081
+ __publicField$3(this, "db");
7082
+ __publicField$3(this, "dataset");
7083
+ __publicField$3(this, "annotations", {});
7084
+ __publicField$3(this, "interpolateVariable", (value, variable) => {
7041
7085
  if (typeof value === "string") {
7042
7086
  if (variable.multi || variable.includeAll) {
7043
7087
  const result = this.getQueryModel().quoteLiteral(value);
@@ -7108,7 +7152,7 @@ class SqlDatasource extends runtime.DataSourceWithBackend {
7108
7152
  return this.getResponseParser().transformMetricFindResponse(response);
7109
7153
  }
7110
7154
  async runSql(query, options) {
7111
- const frame = await this.runMetaQuery({ rawSql: query, format: QueryFormat.Table, refId: options == null ? undefined : options.refId }, options);
7155
+ const frame = await this.runMetaQuery({ rawSql: query, format: QueryFormat.Table, refId: options == null ? void 0 : options.refId }, options);
7112
7156
  return new data.DataFrameView(frame);
7113
7157
  }
7114
7158
  runMetaQuery(request, options) {
@@ -7120,8 +7164,8 @@ class SqlDatasource extends runtime.DataSourceWithBackend {
7120
7164
  url: "/api/ds/query",
7121
7165
  method: "POST",
7122
7166
  data: {
7123
- from: (_a = options == null ? undefined : options.range) == null ? undefined : _a.from.valueOf().toString(),
7124
- to: (_b = options == null ? undefined : options.range) == null ? undefined : _b.to.valueOf().toString(),
7167
+ from: (_a = options == null ? void 0 : options.range) == null ? void 0 : _a.from.valueOf().toString(),
7168
+ to: (_b = options == null ? void 0 : options.range) == null ? void 0 : _b.to.valueOf().toString(),
7125
7169
  queries
7126
7170
  },
7127
7171
  requestId: refId
@@ -7164,7 +7208,7 @@ class SqlDatasource extends runtime.DataSourceWithBackend {
7164
7208
  targetContainsTemplate(target) {
7165
7209
  let queryWithoutMacros = target.rawSql;
7166
7210
  MACRO_NAMES.forEach((value) => {
7167
- queryWithoutMacros = (queryWithoutMacros == null ? undefined : queryWithoutMacros.replace(value, "")) || "";
7211
+ queryWithoutMacros = (queryWithoutMacros == null ? void 0 : queryWithoutMacros.replace(value, "")) || "";
7168
7212
  });
7169
7213
  return this.templateSrv.containsTemplate(queryWithoutMacros);
7170
7214
  }
@@ -7187,29 +7231,29 @@ const getSearchFilterScopedVar = (args) => {
7187
7231
  };
7188
7232
  };
7189
7233
 
7190
- function SqlQueryEditor({ datasource, query, onChange, onRunQuery, range }) {
7234
+ function SqlQueryEditor({ datasource, query, onChange, onRunQuery, range, language = "sql" }) {
7191
7235
  var _a, _b, _c, _d, _e, _f, _g;
7192
7236
  const [isQueryRunnable, setIsQueryRunnable] = React.useState(true);
7193
7237
  const db = datasource.getDB();
7194
7238
  const defaultDataset = datasource.dataset;
7195
7239
  const { loading, error } = reactUse.useAsync(async () => {
7196
7240
  return () => {
7197
- if (datasource.getDB(datasource.id).init !== undefined) {
7241
+ if (datasource.getDB(datasource.id).init !== void 0) {
7198
7242
  datasource.getDB(datasource.id).init();
7199
7243
  }
7200
7244
  };
7201
7245
  }, [datasource]);
7202
7246
  const queryWithDefaults = applyQueryDefaults(query);
7203
7247
  const [queryRowFilter, setQueryRowFilter] = React.useState({
7204
- filter: !!((_a = queryWithDefaults.sql) == null ? undefined : _a.whereString),
7205
- group: !!((_d = (_c = (_b = queryWithDefaults.sql) == null ? undefined : _b.groupBy) == null ? undefined : _c[0]) == null ? undefined : _d.property.name),
7206
- order: !!((_f = (_e = queryWithDefaults.sql) == null ? undefined : _e.orderBy) == null ? undefined : _f.property.name),
7248
+ filter: !!((_a = queryWithDefaults.sql) == null ? void 0 : _a.whereString),
7249
+ group: !!((_d = (_c = (_b = queryWithDefaults.sql) == null ? void 0 : _b.groupBy) == null ? void 0 : _c[0]) == null ? void 0 : _d.property.name),
7250
+ order: !!((_f = (_e = queryWithDefaults.sql) == null ? void 0 : _e.orderBy) == null ? void 0 : _f.property.name),
7207
7251
  preview: true
7208
7252
  });
7209
7253
  const [queryToValidate, setQueryToValidate] = React.useState(queryWithDefaults);
7210
7254
  React.useEffect(() => {
7211
7255
  return () => {
7212
- if (datasource.getDB(datasource.id).dispose !== undefined) {
7256
+ if (datasource.getDB(datasource.id).dispose !== void 0) {
7213
7257
  datasource.getDB(datasource.id).dispose();
7214
7258
  }
7215
7259
  };
@@ -7226,7 +7270,7 @@ function SqlQueryEditor({ datasource, query, onChange, onRunQuery, range }) {
7226
7270
  var _a2, _b2;
7227
7271
  setQueryToValidate(q);
7228
7272
  onChange(q);
7229
- if (haveColumns((_a2 = q.sql) == null ? undefined : _a2.columns) && ((_b2 = q.sql) == null ? undefined : _b2.columns.some((c) => c.name)) && !queryRowFilter.group) {
7273
+ if (haveColumns((_a2 = q.sql) == null ? void 0 : _a2.columns) && ((_b2 = q.sql) == null ? void 0 : _b2.columns.some((c) => c.name)) && !queryRowFilter.group) {
7230
7274
  setQueryRowFilter({ ...queryRowFilter, group: true });
7231
7275
  }
7232
7276
  if (process) {
@@ -7256,13 +7300,14 @@ function SqlQueryEditor({ datasource, query, onChange, onRunQuery, range }) {
7256
7300
  queryRowFilter,
7257
7301
  query: queryWithDefaults,
7258
7302
  isQueryRunnable,
7259
- labels: (_g = datasource.getDB(datasource.id)) == null ? undefined : _g.labels
7303
+ labels: (_g = datasource.getDB(datasource.id)) == null ? void 0 : _g.labels
7260
7304
  }
7261
7305
  ), /* @__PURE__ */ React__default.default.createElement(Space, { v: 0.5 }), queryWithDefaults.editorMode !== EditorMode.Code && /* @__PURE__ */ React__default.default.createElement(
7262
7306
  VisualEditor,
7263
7307
  {
7264
7308
  db,
7265
7309
  query: queryWithDefaults,
7310
+ language,
7266
7311
  onChange: (q) => onQueryChange(q, false),
7267
7312
  queryRowFilter,
7268
7313
  onValidate: setIsQueryRunnable,
@@ -7272,6 +7317,7 @@ function SqlQueryEditor({ datasource, query, onChange, onRunQuery, range }) {
7272
7317
  RawEditor,
7273
7318
  {
7274
7319
  db,
7320
+ language,
7275
7321
  query: queryWithDefaults,
7276
7322
  queryToValidate,
7277
7323
  onChange: onQueryChange,
@@ -7409,7 +7455,7 @@ const ConfigSubSection = ({ children, ...props }) => {
7409
7455
  function ConfigDescriptionLink(props) {
7410
7456
  const { description, suffix, feature } = props;
7411
7457
  const text = `Learn more about ${feature}`;
7412
- const styles = ui.useStyles2(getStyles$c);
7458
+ const styles = ui.useStyles2(getStyles$i);
7413
7459
  return /* @__PURE__ */ React__default.default.createElement("span", { className: styles.container }, description, /* @__PURE__ */ React__default.default.createElement(
7414
7460
  "a",
7415
7461
  {
@@ -7421,7 +7467,7 @@ function ConfigDescriptionLink(props) {
7421
7467
  text
7422
7468
  ));
7423
7469
  }
7424
- const getStyles$c = (theme) => {
7470
+ const getStyles$i = (theme) => {
7425
7471
  return {
7426
7472
  container: css.css({
7427
7473
  color: theme.colors.text.secondary,
@@ -7576,7 +7622,7 @@ const AuthMethodSettings = ({
7576
7622
  AuthMethod.BasicAuth,
7577
7623
  AuthMethod.OAuthForward,
7578
7624
  AuthMethod.NoAuth,
7579
- ...(_a2 = customMethods == null ? undefined : customMethods.map((m) => m.id)) != null ? _a2 : []
7625
+ ...(_a2 = customMethods == null ? void 0 : customMethods.map((m) => m.id)) != null ? _a2 : []
7580
7626
  ];
7581
7627
  },
7582
7628
  [customMethods, visibleMethodsFromProps]
@@ -7584,7 +7630,7 @@ const AuthMethodSettings = ({
7584
7630
  const hasSelect = visibleMethods.length > 1;
7585
7631
  const preparedOptions = React.useMemo(() => {
7586
7632
  var _a2;
7587
- const customOptions = (_a2 = customMethods == null ? undefined : customMethods.reduce((acc, method) => {
7633
+ const customOptions = (_a2 = customMethods == null ? void 0 : customMethods.reduce((acc, method) => {
7588
7634
  acc[method.id] = {
7589
7635
  label: method.label,
7590
7636
  value: method.id,
@@ -7597,7 +7643,7 @@ const AuthMethodSettings = ({
7597
7643
  for (k in defaultOptions) {
7598
7644
  preparedDefaultOptions[k] = {
7599
7645
  ...defaultOptions[k],
7600
- ...defaultOptionsOverrides == null ? undefined : defaultOptionsOverrides[k]
7646
+ ...defaultOptionsOverrides == null ? void 0 : defaultOptionsOverrides[k]
7601
7647
  };
7602
7648
  }
7603
7649
  const allOptions = {
@@ -7625,7 +7671,7 @@ const AuthMethodSettings = ({
7625
7671
  if (selected === AuthMethod.BasicAuth && basicAuth) {
7626
7672
  AuthFieldsComponent = /* @__PURE__ */ React__default.default.createElement(BasicAuth, { ...basicAuth, readOnly });
7627
7673
  } else if (selected.startsWith("custom-")) {
7628
- AuthFieldsComponent = (_b = (_a = customMethods == null ? undefined : customMethods.find((m) => m.id === selected)) == null ? undefined : _a.component) != null ? _b : null;
7674
+ AuthFieldsComponent = (_b = (_a = customMethods == null ? void 0 : customMethods.find((m) => m.id === selected)) == null ? void 0 : _a.component) != null ? _b : null;
7629
7675
  }
7630
7676
  const title = hasSelect ? "Authentication methods" : (_c = preparedOptions[0].label) != null ? _c : "";
7631
7677
  const description = hasSelect ? "Choose an authentication method to access the data source" : (_d = preparedOptions[0].description) != null ? _d : "";
@@ -7710,7 +7756,7 @@ const SelfSignedCertificate = ({
7710
7756
  {
7711
7757
  label: "CA Certificate",
7712
7758
  labelWidth: 24,
7713
- tooltip: (_a = tooltips == null ? undefined : tooltips.certificateLabel) != null ? _a : "Your self-signed certificate",
7759
+ tooltip: (_a = tooltips == null ? void 0 : tooltips.certificateLabel) != null ? _a : "Your self-signed certificate",
7714
7760
  required: true,
7715
7761
  htmlFor: "self-signed-certificate-input",
7716
7762
  interactive: true,
@@ -7765,7 +7811,7 @@ const TLSClientAuth = ({
7765
7811
  {
7766
7812
  label: "ServerName",
7767
7813
  labelWidth: 24,
7768
- tooltip: (_a = tooltips == null ? undefined : tooltips.serverNameLabel) != null ? _a : "A Servername is used to verify the hostname on the returned certificate",
7814
+ tooltip: (_a = tooltips == null ? void 0 : tooltips.serverNameLabel) != null ? _a : "A Servername is used to verify the hostname on the returned certificate",
7769
7815
  required: true,
7770
7816
  htmlFor: "client-auth-servername-input",
7771
7817
  interactive: true,
@@ -7789,7 +7835,7 @@ const TLSClientAuth = ({
7789
7835
  {
7790
7836
  label: "Client Certificate",
7791
7837
  labelWidth: 24,
7792
- tooltip: (_b = tooltips == null ? undefined : tooltips.certificateLabel) != null ? _b : "The client certificate can be generated from a Certificate Authority or be self-signed",
7838
+ tooltip: (_b = tooltips == null ? void 0 : tooltips.certificateLabel) != null ? _b : "The client certificate can be generated from a Certificate Authority or be self-signed",
7793
7839
  required: true,
7794
7840
  htmlFor: "client-auth-client-certificate-input",
7795
7841
  interactive: true,
@@ -7816,7 +7862,7 @@ const TLSClientAuth = ({
7816
7862
  {
7817
7863
  label: "Client Key",
7818
7864
  labelWidth: 24,
7819
- tooltip: (_c = tooltips == null ? undefined : tooltips.keyLabel) != null ? _c : "The client key can be generated from a Certificate Authority or be self-signed",
7865
+ tooltip: (_c = tooltips == null ? void 0 : tooltips.keyLabel) != null ? _c : "The client key can be generated from a Certificate Authority or be self-signed",
7820
7866
  required: true,
7821
7867
  htmlFor: "client-auth-client-key-input",
7822
7868
  interactive: true,
@@ -7972,7 +8018,7 @@ const CustomHeaders = ({ headers: headersFromProps, onChange, readOnly }) => {
7972
8018
  let changed = false;
7973
8019
  const newHeaders = headers2.map((header) => {
7974
8020
  var _a;
7975
- const configured = (_a = headersFromProps.find((h) => h.name === header.name)) == null ? undefined : _a.configured;
8021
+ const configured = (_a = headersFromProps.find((h) => h.name === header.name)) == null ? void 0 : _a.configured;
7976
8022
  if (typeof configured !== "undefined" && header.configured !== configured) {
7977
8023
  changed = true;
7978
8024
  return { ...header, configured };
@@ -8150,7 +8196,7 @@ function getTLSProps(config, onChange) {
8150
8196
  return {
8151
8197
  selfSignedCertificate: {
8152
8198
  enabled: Boolean(config.jsonData.tlsAuthWithCACert),
8153
- certificateConfigured: !!((_a = config.secureJsonFields) == null ? undefined : _a.tlsCACert),
8199
+ certificateConfigured: !!((_a = config.secureJsonFields) == null ? void 0 : _a.tlsCACert),
8154
8200
  onToggle: (enabled) => enabled ? onChange({
8155
8201
  ...config,
8156
8202
  jsonData: { ...config.jsonData, tlsAuthWithCACert: enabled }
@@ -8173,8 +8219,8 @@ function getTLSProps(config, onChange) {
8173
8219
  TLSClientAuth: {
8174
8220
  enabled: config.jsonData.tlsAuth,
8175
8221
  serverName: config.jsonData.serverName,
8176
- clientCertificateConfigured: !!((_b = config.secureJsonFields) == null ? undefined : _b.tlsClientCert),
8177
- clientKeyConfigured: !!((_c = config.secureJsonFields) == null ? undefined : _c.tlsClientKey),
8222
+ clientCertificateConfigured: !!((_b = config.secureJsonFields) == null ? void 0 : _b.tlsClientCert),
8223
+ clientKeyConfigured: !!((_c = config.secureJsonFields) == null ? void 0 : _c.tlsClientKey),
8178
8224
  onToggle: (enabled) => enabled ? onChange({
8179
8225
  ...config,
8180
8226
  jsonData: { ...config.jsonData, tlsAuth: enabled }
@@ -8282,7 +8328,7 @@ const ConnectionSettings = ({
8282
8328
  urlLabel,
8283
8329
  className
8284
8330
  }) => {
8285
- const isValidUrl = config.url !== undefined && /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/.test(config.url);
8331
+ const isValidUrl = config.url !== void 0 && /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/.test(config.url);
8286
8332
  const styles = {
8287
8333
  container: css.css({
8288
8334
  maxWidth: 578
@@ -8390,6 +8436,2545 @@ const AdvancedHttpSettings = ({
8390
8436
  ));
8391
8437
  };
8392
8438
 
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
+ });
8445
+ }
8446
+ function evaluateItemCondition(condition, item) {
8447
+ const trimmed = condition.trim();
8448
+ if (trimmed === "true") {
8449
+ return true;
8450
+ }
8451
+ const match = trimmed.match(/^item\.(\w+)\s*==\s*(.+)$/);
8452
+ if (!match) {
8453
+ return false;
8454
+ }
8455
+ const [, key, rawValue] = match;
8456
+ const actualValue = item[key];
8457
+ const expected = rawValue.trim();
8458
+ if (expected === "true") {
8459
+ return actualValue === true;
8460
+ }
8461
+ if (expected === "false") {
8462
+ return actualValue === false;
8463
+ }
8464
+ const unquoted = expected.replace(/^['"]|['"]$/g, "");
8465
+ return String(actualValue) === unquoted;
8466
+ }
8467
+ function findActiveSecureOverride(itemFields, item, index) {
8468
+ for (const field of itemFields) {
8469
+ if (!field.overrides) {
8470
+ continue;
8471
+ }
8472
+ for (const override of field.overrides) {
8473
+ if (!override.secureKey) {
8474
+ continue;
8475
+ }
8476
+ if (evaluateItemCondition(override.when, item)) {
8477
+ return {
8478
+ fieldKey: field.key,
8479
+ resolvedKey: resolveSecureKeyTemplate(override.secureKey, item, index)
8480
+ };
8481
+ }
8482
+ }
8483
+ }
8484
+ return null;
8485
+ }
8486
+ function patternToRegex(pattern) {
8487
+ const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
8488
+ return new RegExp("^" + escaped.replace("\\{index\\}", "(\\d+)") + "$");
8489
+ }
8490
+ function findIndicesForPattern(record, pattern) {
8491
+ const re = patternToRegex(pattern);
8492
+ const indices = [];
8493
+ for (const key of Object.keys(record)) {
8494
+ const m = key.match(re);
8495
+ if (m) {
8496
+ const n = Number(m[1]);
8497
+ if (!Number.isNaN(n)) {
8498
+ indices.push(n);
8499
+ }
8500
+ }
8501
+ }
8502
+ return indices.sort((a, b) => a - b);
8503
+ }
8504
+ function expandIndexedPair(field, ds) {
8505
+ var _a, _b, _c;
8506
+ const storage = field.storage;
8507
+ if ((storage == null ? void 0 : storage.type) !== "indexedPair" || !storage.key || !storage.value) {
8508
+ return [];
8509
+ }
8510
+ const source = storage.key.target === "jsonData" ? (_a = ds.jsonData) != null ? _a : {} : ds;
8511
+ const indices = findIndicesForPattern(source, storage.key.pattern);
8512
+ const items = [];
8513
+ for (const i of indices) {
8514
+ const nameKey = storage.key.pattern.replace("{index}", String(i));
8515
+ const valueKey = storage.value.pattern.replace("{index}", String(i));
8516
+ const nameVal = source[nameKey];
8517
+ if (nameVal === void 0 || nameVal === null) {
8518
+ continue;
8519
+ }
8520
+ const hasValue = storage.value.target === "secureJsonData" ? !!((_b = ds.secureJsonFields) == null ? void 0 : _b[valueKey]) : !!((_c = ds.jsonData) == null ? void 0 : _c[valueKey]);
8521
+ items.push({
8522
+ index: i,
8523
+ name: String(nameVal),
8524
+ value: hasValue ? SECURE_FIELD_CONFIGURED : ""
8525
+ });
8526
+ }
8527
+ return items;
8528
+ }
8529
+ function flattenIndexedPair(field, items, jsonData, secureJsonData, secureJsonFields) {
8530
+ var _a;
8531
+ const storage = field.storage;
8532
+ if ((storage == null ? void 0 : storage.type) !== "indexedPair" || !storage.key || !storage.value) {
8533
+ return;
8534
+ }
8535
+ const existingIndices = new Set(
8536
+ storage.key.target === "jsonData" ? findIndicesForPattern(jsonData, storage.key.pattern) : []
8537
+ );
8538
+ const usedIndices = /* @__PURE__ */ new Set();
8539
+ const startIdx = (_a = storage.startIndex) != null ? _a : 1;
8540
+ let nextIndex = existingIndices.size > 0 ? Math.max(...existingIndices) + 1 : startIdx;
8541
+ for (const item of items) {
8542
+ let idx = item.index;
8543
+ if (idx === 0) {
8544
+ idx = nextIndex++;
8545
+ }
8546
+ usedIndices.add(idx);
8547
+ const nameKey = storage.key.pattern.replace("{index}", String(idx));
8548
+ const valueKey = storage.value.pattern.replace("{index}", String(idx));
8549
+ if (storage.key.target === "jsonData") {
8550
+ jsonData[nameKey] = item.name;
8551
+ }
8552
+ if (storage.value.target === "secureJsonData") {
8553
+ if (item.value === SECURE_FIELD_CONFIGURED) {
8554
+ secureJsonFields[valueKey] = true;
8555
+ } else if (item.value) {
8556
+ secureJsonData[valueKey] = item.value;
8557
+ secureJsonFields[valueKey] = false;
8558
+ }
8559
+ } else if (storage.value.target === "jsonData") {
8560
+ jsonData[valueKey] = item.value;
8561
+ }
8562
+ }
8563
+ for (const idx of existingIndices) {
8564
+ if (usedIndices.has(idx)) {
8565
+ continue;
8566
+ }
8567
+ const nameKey = storage.key.pattern.replace("{index}", String(idx));
8568
+ const valueKey = storage.value.pattern.replace("{index}", String(idx));
8569
+ if (storage.key.target === "jsonData") {
8570
+ delete jsonData[nameKey];
8571
+ }
8572
+ if (storage.value.target === "secureJsonData") {
8573
+ delete secureJsonFields[valueKey];
8574
+ delete secureJsonData[valueKey];
8575
+ } else if (storage.value.target === "jsonData") {
8576
+ delete jsonData[valueKey];
8577
+ }
8578
+ }
8579
+ }
8580
+ function resolveRawPath(ref, ds) {
8581
+ var _a;
8582
+ const trimmed = ref.trim();
8583
+ if (trimmed.startsWith("jsonData.")) {
8584
+ return (_a = ds.jsonData) == null ? void 0 : _a[trimmed.slice(9)];
8585
+ }
8586
+ if (trimmed.startsWith("root.")) {
8587
+ return ds[trimmed.slice(5)];
8588
+ }
8589
+ return void 0;
8590
+ }
8591
+ async function fetchExistingValues(dsUid, fields) {
8592
+ var _a, _b, _c, _d, _e, _f;
8593
+ try {
8594
+ const ds = await runtime.getBackendSrv().get(`/api/datasources/uid/${dsUid}`, void 0, void 0, {
8595
+ showErrorAlert: false
8596
+ });
8597
+ const values = {};
8598
+ for (const field of fields) {
8599
+ if (((_a = field.storage) == null ? void 0 : _a.type) === "indexedPair") {
8600
+ values[field.key] = expandIndexedPair(field, ds);
8601
+ continue;
8602
+ }
8603
+ const fk = useDatasourceSchema.formKey(field);
8604
+ switch (field.target) {
8605
+ case "root":
8606
+ if (ds[field.key] !== void 0) {
8607
+ values[fk] = ds[field.key];
8608
+ }
8609
+ break;
8610
+ case "jsonData":
8611
+ if (field.section) {
8612
+ const sectionObj = (_b = ds.jsonData) == null ? void 0 : _b[field.section];
8613
+ if ((sectionObj == null ? void 0 : sectionObj[field.key]) !== void 0) {
8614
+ values[fk] = sectionObj[field.key];
8615
+ }
8616
+ } else if (((_c = ds.jsonData) == null ? void 0 : _c[field.key]) !== void 0) {
8617
+ values[fk] = ds.jsonData[field.key];
8618
+ }
8619
+ break;
8620
+ case "secureJsonData":
8621
+ if ((_d = ds.secureJsonFields) == null ? void 0 : _d[field.key]) {
8622
+ values[fk] = SECURE_FIELD_CONFIGURED;
8623
+ }
8624
+ break;
8625
+ }
8626
+ if (values[fk] === void 0 && ((_e = field.storage) == null ? void 0 : _e.type) === "computed" && field.storage.read) {
8627
+ const fallback = resolveRawPath(field.storage.read, ds);
8628
+ if (fallback !== void 0) {
8629
+ values[fk] = fallback;
8630
+ }
8631
+ }
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
+ }
8659
+ return { values, readOnly: !!ds.readOnly };
8660
+ } catch (err) {
8661
+ const message = err instanceof Error ? err.message : "Failed to load datasource configuration";
8662
+ return { values: {}, readOnly: false, error: message };
8663
+ }
8664
+ }
8665
+ function buildDatasourceConfigPayload(data, fields, existing, isFieldVisible) {
8666
+ var _a, _b, _c, _d, _e, _f, _g, _h;
8667
+ const rootFields = {};
8668
+ const jsonData = { ...(_a = existing.jsonData) != null ? _a : {} };
8669
+ const secureJsonData = {};
8670
+ const secureJsonFields = { ...(_b = existing.secureJsonFields) != null ? _b : {} };
8671
+ for (const field of fields) {
8672
+ if (((_c = field.storage) == null ? void 0 : _c.type) === "indexedPair") {
8673
+ const items = Array.isArray(data[field.key]) ? data[field.key] : [];
8674
+ flattenIndexedPair(field, items, jsonData, secureJsonData, secureJsonFields);
8675
+ continue;
8676
+ }
8677
+ const isManagedByEffect = (_d = field.tags) == null ? void 0 : _d.some((t) => t.startsWith("managed-by:"));
8678
+ if (!isManagedByEffect && !isFieldVisible(field)) {
8679
+ continue;
8680
+ }
8681
+ const fk = useDatasourceSchema.formKey(field);
8682
+ const value = data[fk];
8683
+ if (field.target === "secureJsonData") {
8684
+ if (value === SECURE_FIELD_CONFIGURED) {
8685
+ secureJsonFields[field.key] = true;
8686
+ continue;
8687
+ }
8688
+ if (value && value !== "") {
8689
+ secureJsonData[field.key] = String(value);
8690
+ secureJsonFields[field.key] = false;
8691
+ } else {
8692
+ secureJsonFields[field.key] = false;
8693
+ }
8694
+ continue;
8695
+ }
8696
+ if (value === void 0 || value === "") {
8697
+ continue;
8698
+ }
8699
+ switch (field.target) {
8700
+ case "root":
8701
+ rootFields[field.key] = value;
8702
+ break;
8703
+ case "jsonData":
8704
+ if (field.section) {
8705
+ if (!jsonData[field.section] || typeof jsonData[field.section] !== "object") {
8706
+ jsonData[field.section] = {};
8707
+ }
8708
+ jsonData[field.section][field.key] = value;
8709
+ } else {
8710
+ jsonData[field.key] = value;
8711
+ }
8712
+ break;
8713
+ }
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
+ }
8769
+ return { rootFields, jsonData, secureJsonData, secureJsonFields };
8770
+ }
8771
+ async function submitDatasourceConfig(dsUid, data, fields, isFieldVisible) {
8772
+ const existing = await runtime.getBackendSrv().get(`/api/datasources/uid/${dsUid}`);
8773
+ const { rootFields, jsonData, secureJsonData, secureJsonFields } = buildDatasourceConfigPayload(
8774
+ data,
8775
+ fields,
8776
+ existing,
8777
+ isFieldVisible
8778
+ );
8779
+ await runtime.getBackendSrv().put(`/api/datasources/uid/${dsUid}`, {
8780
+ ...existing,
8781
+ ...rootFields,
8782
+ jsonData,
8783
+ secureJsonData,
8784
+ secureJsonFields
8785
+ });
8786
+ }
8787
+
8788
+ function evaluateEffectCondition(when, fieldValue) {
8789
+ var _a, _b;
8790
+ const m = when.match(/^value\s*(==|!=)\s*(?:'([^']*)'|"([^"]*)"|(.+))$/);
8791
+ if (!m) {
8792
+ return false;
8793
+ }
8794
+ const op = m[1];
8795
+ let target = (_b = (_a = m[2]) != null ? _a : m[3]) != null ? _b : m[4];
8796
+ if (target === "true") {
8797
+ target = true;
8798
+ } else if (target === "false") {
8799
+ target = false;
8800
+ } else if (typeof target === "string" && /^-?\d+(\.\d+)?$/.test(target)) {
8801
+ target = Number(target);
8802
+ }
8803
+ const eq = String(fieldValue) === String(target);
8804
+ return op === "==" ? eq : !eq;
8805
+ }
8806
+ function isFieldRequired(field, watchedValues, fieldById, celContext) {
8807
+ if (field.required) {
8808
+ return true;
8809
+ }
8810
+ if (field.requiredWhen) {
8811
+ if (celContext) {
8812
+ return useDatasourceSchema.evaluateCelExpression(field.requiredWhen, celContext);
8813
+ }
8814
+ const parsed = useDatasourceSchema.parseDependsOn(field.requiredWhen);
8815
+ if (parsed) {
8816
+ const depField = fieldById.get(parsed.field);
8817
+ const depKey = depField ? useDatasourceSchema.formKey(depField) : parsed.field;
8818
+ return useDatasourceSchema.evaluateDependsOn(parsed, useDatasourceSchema.getWatchedValue(watchedValues, depKey));
8819
+ }
8820
+ }
8821
+ return false;
8822
+ }
8823
+ function buildValidationRules(field, required) {
8824
+ var _a, _b, _c, _d, _e, _f, _g, _h;
8825
+ const rules = {};
8826
+ const label = (_a = field.label) != null ? _a : field.key;
8827
+ if (required) {
8828
+ if (field.target === "secureJsonData") {
8829
+ rules.validate = (value) => {
8830
+ if (value === SECURE_FIELD_CONFIGURED) {
8831
+ return true;
8832
+ }
8833
+ if (!value || value === "") {
8834
+ return `${label} is required`;
8835
+ }
8836
+ return true;
8837
+ };
8838
+ } else {
8839
+ rules.required = `${label} is required`;
8840
+ }
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
+ }
8878
+ if (field.validations) {
8879
+ for (const v of field.validations) {
8880
+ switch (v.type) {
8881
+ case "pattern":
8882
+ rules.pattern = {
8883
+ value: new RegExp(v.pattern),
8884
+ message: (_d = v.message) != null ? _d : `Invalid ${label}`
8885
+ };
8886
+ break;
8887
+ case "range":
8888
+ if (v.min !== void 0) {
8889
+ rules.min = { value: v.min, message: (_e = v.message) != null ? _e : `Minimum value is ${v.min}` };
8890
+ }
8891
+ if (v.max !== void 0) {
8892
+ rules.max = { value: v.max, message: (_f = v.message) != null ? _f : `Maximum value is ${v.max}` };
8893
+ }
8894
+ break;
8895
+ case "length":
8896
+ if (v.min !== void 0) {
8897
+ rules.minLength = { value: v.min, message: (_g = v.message) != null ? _g : `Minimum length is ${v.min}` };
8898
+ }
8899
+ if (v.max !== void 0) {
8900
+ rules.maxLength = { value: v.max, message: (_h = v.message) != null ? _h : `Maximum length is ${v.max}` };
8901
+ }
8902
+ break;
8903
+ }
8904
+ }
8905
+ }
8906
+ return rules;
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
+ }
8919
+
8920
+ const PdcFieldNote = (props) => {
8921
+ const { enabled, description, configUrl } = props;
8922
+ const styles = ui.useStyles2(getStyles$h);
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"));
8924
+ };
8925
+ const getStyles$h = (theme) => ({
8926
+ wrapper: css.css({
8927
+ display: "flex",
8928
+ alignItems: "center",
8929
+ justifyContent: "space-between",
8930
+ gap: theme.spacing(1),
8931
+ padding: `${theme.spacing(0.5)} ${theme.spacing(0.75)}`,
8932
+ fontSize: theme.typography.bodySmall.fontSize,
8933
+ color: theme.colors.text.secondary,
8934
+ backgroundColor: theme.colors.background.secondary,
8935
+ borderRadius: theme.shape.radius.default,
8936
+ border: `1px solid ${theme.colors.border.weak}`
8937
+ }),
8938
+ note: css.css({
8939
+ display: "inline-flex",
8940
+ alignItems: "center",
8941
+ gap: theme.spacing(0.5)
8942
+ })
8943
+ });
8944
+
8945
+ function SecureFieldInput(props) {
8946
+ var _a;
8947
+ const { formField, placeholder, disabled } = props;
8948
+ const isConfigured = formField.value === SECURE_FIELD_CONFIGURED;
8949
+ const [revealed, setRevealed] = React.useState(false);
8950
+ const styles = ui.useStyles2(getSecureFieldStyles);
8951
+ if (isConfigured) {
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"));
8953
+ }
8954
+ return /* @__PURE__ */ React__default.default.createElement(
8955
+ ui.Input,
8956
+ {
8957
+ ...formField,
8958
+ value: String((_a = formField.value) != null ? _a : ""),
8959
+ type: revealed ? "text" : "password",
8960
+ placeholder,
8961
+ disabled,
8962
+ suffix: /* @__PURE__ */ React__default.default.createElement(
8963
+ ui.Button,
8964
+ {
8965
+ variant: "secondary",
8966
+ fill: "text",
8967
+ size: "sm",
8968
+ icon: revealed ? "eye-slash" : "eye",
8969
+ "aria-label": revealed ? "Hide" : "Reveal",
8970
+ onClick: () => setRevealed((r) => !r),
8971
+ type: "button"
8972
+ }
8973
+ )
8974
+ }
8975
+ );
8976
+ }
8977
+ const getSecureFieldStyles = (theme) => ({
8978
+ configuredRow: css.css({
8979
+ display: "flex",
8980
+ alignItems: "center",
8981
+ gap: theme.spacing(1),
8982
+ whiteSpace: "nowrap"
8983
+ }),
8984
+ configuredBadge: css.css({
8985
+ display: "inline-flex",
8986
+ alignItems: "center",
8987
+ gap: theme.spacing(0.5),
8988
+ padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,
8989
+ borderRadius: theme.shape.radius.pill,
8990
+ backgroundColor: theme.colors.success.transparent,
8991
+ color: theme.colors.success.text,
8992
+ fontSize: theme.typography.bodySmall.fontSize,
8993
+ whiteSpace: "nowrap"
8994
+ })
8995
+ });
8996
+
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;
9118
+ const styles = ui.useStyles2(getStyles$e);
9119
+ const items = Array.isArray(value) ? value : [];
9120
+ const addItem = () => {
9121
+ if (items.length >= maxItems) {
9122
+ return;
9123
+ }
9124
+ onChange([...items, { index: 0, name: "", value: "" }]);
9125
+ };
9126
+ const removeItem = (index) => {
9127
+ onChange(items.filter((_, i) => i !== index));
9128
+ };
9129
+ const updateItem = (index, key, val) => {
9130
+ const updated = items.map((item, i) => i === index ? { ...item, [key]: val } : item);
9131
+ onChange(updated);
9132
+ };
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,
9135
+ {
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(
9155
+ ui.Input,
9156
+ {
9157
+ value: item.name,
9158
+ placeholder: "key",
9159
+ disabled: disabled || hideControls,
9160
+ onChange: (e) => onUpdate(index, "name", e.currentTarget.value),
9161
+ onKeyDown: (e) => {
9162
+ if (e.key === "Enter") {
9163
+ e.preventDefault();
9164
+ }
9165
+ }
9166
+ }
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(
9168
+ ui.Button,
9169
+ {
9170
+ variant: "secondary",
9171
+ fill: "text",
9172
+ size: "sm",
9173
+ onClick: () => {
9174
+ setEditing(true);
9175
+ onUpdate(index, "value", "");
9176
+ },
9177
+ type: "button"
9178
+ },
9179
+ "Reset"
9180
+ )) : /* @__PURE__ */ React__default.default.createElement(
9181
+ ui.Input,
9182
+ {
9183
+ value: item.value === SECURE_FIELD_CONFIGURED ? "" : item.value,
9184
+ placeholder: `${itemLabel} value`,
9185
+ disabled,
9186
+ type: revealed ? "text" : "password",
9187
+ onChange: (e) => onUpdate(index, "value", e.currentTarget.value),
9188
+ onKeyDown: (e) => {
9189
+ if (e.key === "Enter") {
9190
+ e.preventDefault();
9191
+ }
9192
+ },
9193
+ suffix: /* @__PURE__ */ React__default.default.createElement(
9194
+ ui.Button,
9195
+ {
9196
+ variant: "secondary",
9197
+ fill: "text",
9198
+ size: "sm",
9199
+ icon: revealed ? "eye-slash" : "eye",
9200
+ "aria-label": revealed ? "Hide" : "Reveal",
9201
+ onClick: () => setRevealed((r) => !r),
9202
+ type: "button"
9203
+ }
9204
+ )
9205
+ }
9206
+ )), !hideControls && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: `Remove ${itemLabel}` }, /* @__PURE__ */ React__default.default.createElement(
9207
+ ui.Button,
9208
+ {
9209
+ variant: "secondary",
9210
+ fill: "text",
9211
+ size: "sm",
9212
+ icon: "trash-alt",
9213
+ "aria-label": `Remove ${itemLabel}`,
9214
+ disabled,
9215
+ onClick: () => onRemove(index),
9216
+ type: "button"
9217
+ }
9218
+ )));
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;
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);
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);
9242
+ const addItem = () => {
9243
+ var _a2, _b2;
9244
+ if (items.length >= maxItems) {
9245
+ return;
9246
+ }
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]);
9256
+ };
9257
+ const removeItem = (index) => {
9258
+ onChange(items.filter((_, i) => i !== index));
9259
+ };
9260
+ const updateItem = (index, key, val) => {
9261
+ const updated = items.map((item, i) => i === index ? { ...item, [key]: val } : item);
9262
+ onChange(updated);
9263
+ };
9264
+ return /* @__PURE__ */ React__default.default.createElement(ui.Stack, { direction: "column", gap: 1 }, items.map((item, i) => /* @__PURE__ */ React__default.default.createElement(
9265
+ ObjectArrayItemRow,
9266
+ {
9267
+ key: i,
9268
+ item,
9269
+ index: i,
9270
+ itemFields,
9271
+ layoutRows,
9272
+ disabled: !!disabled,
9273
+ onUpdate: updateItem,
9274
+ onRemove: removeItem,
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);
9304
+ }
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));
9369
+ }
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
+ }),
9379
+ inputCell: css.css({
9380
+ flex: "1 1 120px",
9381
+ minWidth: 120,
9382
+ overflow: "hidden"
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
+ }),
9406
+ limitNote: css.css({
9407
+ fontSize: theme.typography.bodySmall.fontSize,
9408
+ color: theme.colors.text.secondary
9409
+ })
9410
+ });
9411
+
9412
+ const StringArrayInput = (props) => {
9413
+ const { value, onChange, placeholder, disabled, itemLabel = "item" } = props;
9414
+ const styles = ui.useStyles2(getStyles$c);
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
+ };
9478
+ const getStyles$c = (theme) => ({
9479
+ inputCell: css.css({
9480
+ flex: "1 1 0",
9481
+ minWidth: 0,
9482
+ overflow: "hidden"
9483
+ })
9484
+ });
9485
+
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;
9488
+ const value = formField.value;
9489
+ const placeholder = (_a = field.ui) == null ? void 0 : _a.placeholder;
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
+ }
9494
+ if (field.target === "secureJsonData" || field.semanticType === "password" || field.semanticType === "token") {
9495
+ return /* @__PURE__ */ React__default.default.createElement(SecureFieldInput, { formField, placeholder: placeholder != null ? placeholder : label, disabled, label });
9496
+ }
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) => ({
9499
+ label: opt.label,
9500
+ value: String(opt.value),
9501
+ description: opt.description
9502
+ }));
9503
+ return /* @__PURE__ */ React__default.default.createElement("div", { style: { display: "flex" } }, /* @__PURE__ */ React__default.default.createElement(
9504
+ ui.RadioButtonGroup,
9505
+ {
9506
+ options,
9507
+ value: String(value != null ? value : ""),
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
+ },
9516
+ disabled
9517
+ }
9518
+ ));
9519
+ }
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) => ({
9522
+ label: opt.label,
9523
+ value: String(opt.value),
9524
+ description: opt.description
9525
+ }));
9526
+ return /* @__PURE__ */ React__default.default.createElement(
9527
+ ui.Select,
9528
+ {
9529
+ options,
9530
+ value: options.find((o) => o.value === String(value != null ? value : "")),
9531
+ onChange: (v) => formField.onChange(v == null ? void 0 : v.value),
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") {
9540
+ return /* @__PURE__ */ React__default.default.createElement(
9541
+ ui.Input,
9542
+ {
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
+ }
9552
+ }
9553
+ );
9554
+ }
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
9567
+ }
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
9582
+ }
9583
+ );
9584
+ }
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$/, "")
9594
+ }
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 });
9614
+ }
9615
+
9616
+ const getTabStyles = (theme) => ({
9617
+ root: css.css({
9618
+ display: "flex",
9619
+ gap: theme.spacing(3),
9620
+ position: "relative",
9621
+ background: theme.colors.background.canvas,
9622
+ padding: theme.spacing(2)
9623
+ }),
9624
+ // Sidebar
9625
+ sidebar: css.css({
9626
+ width: 250,
9627
+ flexShrink: 0,
9628
+ position: "sticky",
9629
+ top: theme.spacing(2),
9630
+ alignSelf: "flex-start",
9631
+ [theme.breakpoints.down("sm")]: { display: "none" }
9632
+ }),
9633
+ sidebarTitle: css.css({
9634
+ fontSize: theme.typography.body.fontSize,
9635
+ fontWeight: theme.typography.fontWeightMedium,
9636
+ color: theme.colors.text.primary,
9637
+ padding: `${theme.spacing(1)} 0`,
9638
+ marginBottom: theme.spacing(1)
9639
+ }),
9640
+ navList: css.css({
9641
+ listStyle: "none",
9642
+ margin: 0,
9643
+ padding: 0,
9644
+ position: "relative"
9645
+ }),
9646
+ navItem: css.css({
9647
+ display: "flex",
9648
+ alignItems: "flex-start",
9649
+ gap: theme.spacing(1.5),
9650
+ padding: `${theme.spacing(1)} 0`,
9651
+ cursor: "pointer",
9652
+ position: "relative"
9653
+ }),
9654
+ navItemActive: css.css({}),
9655
+ // Dot container: positions the dot and the connector line
9656
+ navDotWrap: css.css({
9657
+ position: "relative",
9658
+ display: "flex",
9659
+ alignItems: "center",
9660
+ justifyContent: "center",
9661
+ width: 12,
9662
+ flexShrink: 0,
9663
+ alignSelf: "flex-start",
9664
+ paddingTop: theme.spacing(0.5)
9665
+ }),
9666
+ navDot: css.css({
9667
+ width: 10,
9668
+ height: 10,
9669
+ borderRadius: "50%",
9670
+ border: `2px solid ${theme.colors.text.disabled}`,
9671
+ background: theme.colors.background.canvas,
9672
+ position: "relative",
9673
+ zIndex: 1
9674
+ }),
9675
+ navDotOptional: css.css({
9676
+ borderStyle: "dashed"
9677
+ }),
9678
+ navDotActive: css.css({
9679
+ background: theme.colors.primary.main,
9680
+ borderColor: theme.colors.primary.main,
9681
+ borderStyle: "solid"
9682
+ }),
9683
+ navDotValidated: css.css({
9684
+ background: theme.colors.success.main,
9685
+ borderColor: theme.colors.success.main,
9686
+ borderStyle: "solid"
9687
+ }),
9688
+ navDotError: css.css({
9689
+ background: theme.colors.error.main,
9690
+ borderColor: theme.colors.error.main,
9691
+ borderStyle: "solid"
9692
+ }),
9693
+ // Connector line running from dot center downward to next item
9694
+ navConnector: css.css({
9695
+ position: "absolute",
9696
+ left: 5,
9697
+ top: 16,
9698
+ bottom: -16,
9699
+ width: 2,
9700
+ background: theme.colors.border.medium,
9701
+ zIndex: 0
9702
+ }),
9703
+ navConnectorDashed: css.css({
9704
+ background: "none",
9705
+ borderLeft: `2px dashed ${theme.colors.border.weak}`,
9706
+ width: 0
9707
+ }),
9708
+ navLabel: css.css({
9709
+ fontSize: theme.typography.body.fontSize,
9710
+ color: theme.colors.text.secondary,
9711
+ lineHeight: 1.4
9712
+ }),
9713
+ navLabelActive: css.css({
9714
+ fontWeight: theme.typography.fontWeightMedium,
9715
+ color: theme.colors.text.primary
9716
+ }),
9717
+ // Main content
9718
+ main: css.css({
9719
+ flex: 1,
9720
+ minWidth: 0,
9721
+ width: 0,
9722
+ // forces flex child to respect flex-grow and fill remaining space
9723
+ display: "flex",
9724
+ flexDirection: "column",
9725
+ gap: theme.spacing(2)
9726
+ }),
9727
+ form: css.css({
9728
+ display: "flex",
9729
+ flexDirection: "column",
9730
+ gap: theme.spacing(2)
9731
+ }),
9732
+ requiredNotice: css.css({
9733
+ fontSize: theme.typography.bodySmall.fontSize,
9734
+ color: theme.colors.text.secondary,
9735
+ marginBottom: theme.spacing(0.5)
9736
+ }),
9737
+ // Section wrapper — card container around CollapsableSection
9738
+ section: css.css({
9739
+ border: `1px solid ${theme.colors.border.weak}`,
9740
+ borderRadius: theme.shape.radius.default,
9741
+ background: theme.colors.background.secondary,
9742
+ overflow: "hidden"
9743
+ }),
9744
+ // Override Collapse component styling
9745
+ collapseHeader: css.css({
9746
+ borderRadius: theme.shape.radius.default,
9747
+ background: "none",
9748
+ border: "none",
9749
+ marginBottom: 0,
9750
+ // Collapse header button: make label fill remaining space
9751
+ "& > button": {
9752
+ padding: `${theme.spacing(1.5)} ${theme.spacing(2)}`,
9753
+ width: "100%",
9754
+ justifyContent: "flex-start"
9755
+ },
9756
+ "& > button > div": {
9757
+ flex: 1,
9758
+ fontSize: theme.typography.h4.fontSize,
9759
+ fontWeight: theme.typography.fontWeightMedium,
9760
+ textAlign: "left"
9761
+ }
9762
+ }),
9763
+ sectionLabel: css.css({
9764
+ display: "flex",
9765
+ alignItems: "center",
9766
+ flex: 1
9767
+ }),
9768
+ sectionLabelText: css.css({
9769
+ flex: 1
9770
+ }),
9771
+ sectionHeader: css.css({
9772
+ display: "flex",
9773
+ alignItems: "center",
9774
+ gap: theme.spacing(1),
9775
+ padding: `${theme.spacing(1.5)} ${theme.spacing(2)}`,
9776
+ cursor: "pointer",
9777
+ userSelect: "none"
9778
+ }),
9779
+ sectionChevron: css.css({
9780
+ transition: "transform 0.2s ease"
9781
+ }),
9782
+ sectionChevronOpen: css.css({
9783
+ transform: "rotate(90deg)"
9784
+ }),
9785
+ sectionTitle: css.css({
9786
+ fontSize: theme.typography.h4.fontSize,
9787
+ fontWeight: theme.typography.fontWeightMedium,
9788
+ flex: 1,
9789
+ textAlign: "left"
9790
+ }),
9791
+ sectionBadge: css.css({
9792
+ fontSize: theme.typography.bodySmall.fontSize,
9793
+ fontWeight: theme.typography.fontWeightRegular,
9794
+ color: theme.colors.text.disabled,
9795
+ border: `1px solid ${theme.colors.border.weak}`,
9796
+ borderRadius: theme.shape.radius.pill,
9797
+ padding: `1px ${theme.spacing(0.75)}`,
9798
+ whiteSpace: "nowrap"
9799
+ }),
9800
+ sectionDescription: css.css({
9801
+ fontSize: theme.typography.bodySmall.fontSize,
9802
+ color: theme.colors.text.secondary,
9803
+ marginBottom: theme.spacing(1.5)
9804
+ }),
9805
+ sectionBody: css.css({
9806
+ padding: `0 ${theme.spacing(2)} ${theme.spacing(2)}`,
9807
+ display: "flex",
9808
+ flexDirection: "column",
9809
+ gap: theme.spacing(0.75)
9810
+ }),
9811
+ // Form bottom
9812
+ formButtons: css.css({
9813
+ display: "flex",
9814
+ gap: theme.spacing(1),
9815
+ paddingTop: theme.spacing(0.5)
9816
+ }),
9817
+ // Loading / error states
9818
+ loadingContainer: css.css({
9819
+ display: "flex",
9820
+ alignItems: "center",
9821
+ gap: theme.spacing(1),
9822
+ padding: theme.spacing(3),
9823
+ color: theme.colors.text.secondary
9824
+ }),
9825
+ overlay: css.css({
9826
+ position: "absolute",
9827
+ inset: 0,
9828
+ display: "flex",
9829
+ alignItems: "center",
9830
+ justifyContent: "center",
9831
+ gap: theme.spacing(1),
9832
+ background: theme.colors.background.secondary,
9833
+ borderRadius: theme.shape.radius.default,
9834
+ zIndex: 1,
9835
+ fontSize: theme.typography.bodySmall.fontSize,
9836
+ color: theme.colors.text.primary,
9837
+ opacity: 0.95
9838
+ }),
9839
+ readOnlyBanner: css.css({
9840
+ display: "inline-flex",
9841
+ alignItems: "center",
9842
+ gap: theme.spacing(0.5),
9843
+ padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,
9844
+ fontSize: theme.typography.bodySmall.fontSize,
9845
+ color: theme.colors.text.secondary,
9846
+ backgroundColor: theme.colors.background.secondary,
9847
+ borderRadius: theme.shape.radius.default,
9848
+ border: `1px solid ${theme.colors.border.weak}`,
9849
+ marginBottom: theme.spacing(1)
9850
+ })
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
+ };
10072
+
10073
+ function SidebarNav({ groups, activeIndex, sectionStates, onSelect }) {
10074
+ const styles = ui.useStyles2(getTabStyles);
10075
+ const visibleGroups = groups.filter((g) => g.group.id !== "_required");
10076
+ return /* @__PURE__ */ React__default.default.createElement("nav", { className: styles.sidebar }, /* @__PURE__ */ React__default.default.createElement("div", { className: styles.sidebarTitle }, "Connect data source"), /* @__PURE__ */ React__default.default.createElement("ul", { className: styles.navList }, visibleGroups.map((g, vi) => {
10077
+ var _a, _b;
10078
+ const origIndex = groups.indexOf(g);
10079
+ const state = (_a = sectionStates[origIndex]) != null ? _a : "draft";
10080
+ const isActive = origIndex === activeIndex;
10081
+ const isOptional = g.group.optional === true;
10082
+ const isLast = vi === visibleGroups.length - 1;
10083
+ const nextIsOptional = !isLast && ((_b = visibleGroups[vi + 1]) == null ? void 0 : _b.group.optional) === true;
10084
+ return /* @__PURE__ */ React__default.default.createElement("li", { key: g.group.id }, /* @__PURE__ */ React__default.default.createElement(
10085
+ "div",
10086
+ {
10087
+ className: css.cx(styles.navItem, isActive && styles.navItemActive),
10088
+ onClick: () => onSelect(origIndex),
10089
+ role: "button",
10090
+ tabIndex: 0,
10091
+ onKeyDown: (e) => {
10092
+ if (e.key === "Enter" || e.key === " ") {
10093
+ e.preventDefault();
10094
+ onSelect(origIndex);
10095
+ }
10096
+ }
10097
+ },
10098
+ /* @__PURE__ */ React__default.default.createElement("div", { className: styles.navDotWrap }, /* @__PURE__ */ React__default.default.createElement(
10099
+ "span",
10100
+ {
10101
+ className: css.cx(
10102
+ styles.navDot,
10103
+ isOptional && styles.navDotOptional,
10104
+ isActive && styles.navDotActive,
10105
+ state === "validated" && !isActive && styles.navDotValidated,
10106
+ state === "error" && !isActive && styles.navDotError
10107
+ )
10108
+ }
10109
+ ), !isLast && /* @__PURE__ */ React__default.default.createElement(
10110
+ "div",
10111
+ {
10112
+ className: css.cx(styles.navConnector, (isOptional || nextIsOptional) && styles.navConnectorDashed)
10113
+ }
10114
+ )),
10115
+ /* @__PURE__ */ React__default.default.createElement("span", { className: css.cx(styles.navLabel, isActive && styles.navLabelActive) }, g.group.title)
10116
+ ));
10117
+ })));
10118
+ }
10119
+
10120
+ function TabLayout({ form, schema, dsUid, dsName, onRetest, healthError, renderActions }) {
10121
+ const styles = ui.useStyles2(getTabStyles);
10122
+ const sectionRefs = React.useRef(/* @__PURE__ */ new Map());
10123
+ const {
10124
+ resolvedGroups,
10125
+ fieldById,
10126
+ httpHeadersField,
10127
+ control,
10128
+ handleSubmit,
10129
+ errors,
10130
+ watchedValues,
10131
+ celContext,
10132
+ initializing,
10133
+ fetchError,
10134
+ submitting,
10135
+ submitError,
10136
+ readOnly,
10137
+ isFieldVisible,
10138
+ isFieldDisabled,
10139
+ isGroupValid,
10140
+ groupHasData,
10141
+ onSubmit,
10142
+ setValue
10143
+ } = form;
10144
+ const displayGroups = React.useMemo(() => resolvedGroups.filter((g) => g.group.id !== "_required"), [resolvedGroups]);
10145
+ const [expandedSections, setExpandedSections] = React.useState(() => {
10146
+ const expanded = /* @__PURE__ */ new Set();
10147
+ for (let i = 0; i < displayGroups.length; i++) {
10148
+ if (!displayGroups[i].group.optional) {
10149
+ expanded.add(i);
10150
+ }
10151
+ }
10152
+ return expanded;
10153
+ });
10154
+ const hasExpandedForData = React.useRef(false);
10155
+ React.useMemo(() => {
10156
+ if (initializing || hasExpandedForData.current) {
10157
+ return;
10158
+ }
10159
+ hasExpandedForData.current = true;
10160
+ setExpandedSections((prev) => {
10161
+ const next = new Set(prev);
10162
+ for (let i = 0; i < displayGroups.length; i++) {
10163
+ if (groupHasData(displayGroups[i])) {
10164
+ next.add(i);
10165
+ }
10166
+ }
10167
+ return next;
10168
+ });
10169
+ }, [initializing, displayGroups, groupHasData]);
10170
+ const [activeSection, setActiveSection] = React.useState(0);
10171
+ const toggleSection = React.useCallback((index) => {
10172
+ setExpandedSections((prev) => {
10173
+ const next = new Set(prev);
10174
+ if (next.has(index)) {
10175
+ next.delete(index);
10176
+ } else {
10177
+ next.add(index);
10178
+ }
10179
+ return next;
10180
+ });
10181
+ }, []);
10182
+ const scrollToSection = React.useCallback(
10183
+ (index) => {
10184
+ setActiveSection(index);
10185
+ if (!expandedSections.has(index)) {
10186
+ setExpandedSections((prev) => new Set(prev).add(index));
10187
+ }
10188
+ const el = sectionRefs.current.get(index);
10189
+ if (el) {
10190
+ el.scrollIntoView({ behavior: "smooth", block: "start" });
10191
+ }
10192
+ },
10193
+ [expandedSections]
10194
+ );
10195
+ const sectionStates = React.useMemo(() => {
10196
+ return displayGroups.map((g, i) => {
10197
+ if (i === activeSection) {
10198
+ return "active";
10199
+ }
10200
+ if (!isGroupValid(g)) {
10201
+ return "error";
10202
+ }
10203
+ if (groupHasData(g)) {
10204
+ return "validated";
10205
+ }
10206
+ return "draft";
10207
+ });
10208
+ }, [displayGroups, activeSection, isGroupValid, groupHasData]);
10209
+ if (initializing) {
10210
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.loadingContainer }, /* @__PURE__ */ React__default.default.createElement(ui.Spinner, { size: "sm", inline: true }), " Loading configuration\u2026");
10211
+ }
10212
+ if (fetchError) {
10213
+ return /* @__PURE__ */ React__default.default.createElement("div", null, /* @__PURE__ */ React__default.default.createElement(ui.Alert, { severity: "error", title: "Failed to load configuration" }, fetchError), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.formButtons }, /* @__PURE__ */ React__default.default.createElement(
10214
+ ui.LinkButton,
10215
+ {
10216
+ variant: "secondary",
10217
+ size: "sm",
10218
+ icon: "external-link-alt",
10219
+ href: `/connections/datasources/edit/${dsUid}`
10220
+ },
10221
+ "Open datasource settings"
10222
+ )));
10223
+ }
10224
+ const allDisabled = submitting || readOnly;
10225
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.root }, submitting && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.overlay }, /* @__PURE__ */ React__default.default.createElement(ui.Spinner, { size: "sm" }), /* @__PURE__ */ React__default.default.createElement("span", null, "Saving & testing\u2026")), /* @__PURE__ */ React__default.default.createElement(
10226
+ SidebarNav,
10227
+ {
10228
+ groups: displayGroups,
10229
+ activeIndex: activeSection,
10230
+ sectionStates,
10231
+ onSelect: scrollToSection
10232
+ }
10233
+ ), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.main }, readOnly && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.readOnlyBanner }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "lock", size: "xs" }), /* @__PURE__ */ React__default.default.createElement("span", null, "Read-only \u2014 managed externally")), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.requiredNotice }, "Fields marked with * are required"), /* @__PURE__ */ React__default.default.createElement("form", { onSubmit: handleSubmit(onSubmit), className: styles.form }, displayGroups.map((g, i) => {
10234
+ const visibleFields = g.fields.filter(isFieldVisible);
10235
+ if (visibleFields.length === 0 && !httpHeadersField) {
10236
+ return null;
10237
+ }
10238
+ const showHeaders = httpHeadersField && (g.group.id === "auth" || g.group.id === "url-and-auth" || g.group.id === "_required" || g.group.fieldRefs.includes("httpHeaders"));
10239
+ const sectionLabel = /* @__PURE__ */ React__default.default.createElement("span", { className: styles.sectionLabel }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.sectionLabelText }, g.group.title), g.group.optional && /* @__PURE__ */ React__default.default.createElement("span", { className: styles.sectionBadge }, "Optional"));
10240
+ return /* @__PURE__ */ React__default.default.createElement(
10241
+ "div",
10242
+ {
10243
+ key: g.group.id,
10244
+ ref: (el) => {
10245
+ if (el) {
10246
+ sectionRefs.current.set(i, el);
10247
+ }
10248
+ },
10249
+ className: styles.section
10250
+ },
10251
+ /* @__PURE__ */ React__default.default.createElement(
10252
+ ui.Collapse,
10253
+ {
10254
+ label: sectionLabel,
10255
+ isOpen: expandedSections.has(i),
10256
+ collapsible: true,
10257
+ onToggle: () => {
10258
+ toggleSection(i);
10259
+ setActiveSection(i);
10260
+ },
10261
+ className: styles.collapseHeader
10262
+ },
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(
10264
+ SchemaField,
10265
+ {
10266
+ key: useDatasourceSchema.formKey(field),
10267
+ field,
10268
+ control,
10269
+ errors,
10270
+ disabled: allDisabled || isFieldDisabled(field),
10271
+ dsUid,
10272
+ watchedValues,
10273
+ fieldById,
10274
+ celContext,
10275
+ setValue
10276
+ }
10277
+ )), showHeaders && /* @__PURE__ */ React__default.default.createElement(
10278
+ AuthorizationHeaderField,
10279
+ {
10280
+ headersFieldKey: useDatasourceSchema.formKey(httpHeadersField),
10281
+ control,
10282
+ disabled: allDisabled,
10283
+ watchedValues
10284
+ }
10285
+ ))
10286
+ )
10287
+ );
10288
+ }), submitError && /* @__PURE__ */ React__default.default.createElement(ui.Alert, { severity: "error", title: "Error" }, submitError), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.formButtons }, readOnly ? /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "primary", size: "sm", icon: "sync", onClick: onRetest, type: "button" }, "Test") : /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "primary", size: "sm", disabled: submitting, type: "submit" }, submitting ? "Saving\u2026" : "Save & Test"), healthError && (renderActions == null ? void 0 : renderActions({ dsUid, dsName, dsType: schema.pluginType, healthError }))))));
10289
+ }
10290
+
10291
+ function useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving }) {
10292
+ const [submitting, setSubmitting] = React.useState(false);
10293
+ const [submitError, setSubmitError] = React.useState(null);
10294
+ const [initializing, setInitializing] = React.useState(true);
10295
+ const [fetchError, setFetchError] = React.useState(null);
10296
+ const [detectedReadOnly, setDetectedReadOnly] = React.useState(false);
10297
+ const readOnly = detectedReadOnly;
10298
+ const resolvedGroups = React.useMemo(() => {
10299
+ const groups = useDatasourceSchema.resolveGroups(schema);
10300
+ const requiredGroup = useDatasourceSchema.resolveRequiredFieldsGroup(schema);
10301
+ if (!requiredGroup) {
10302
+ return groups;
10303
+ }
10304
+ return [requiredGroup, ...groups];
10305
+ }, [schema]);
10306
+ const fieldById = React.useMemo(() => {
10307
+ const m = /* @__PURE__ */ new Map();
10308
+ for (const f of schema.fields) {
10309
+ m.set(f.id, f);
10310
+ }
10311
+ return m;
10312
+ }, [schema.fields]);
10313
+ const httpHeadersField = React.useMemo(
10314
+ () => {
10315
+ var _a;
10316
+ return (_a = schema.fields.find((f) => {
10317
+ var _a2;
10318
+ return f.key === "httpHeaders" && ((_a2 = f.storage) == null ? void 0 : _a2.type) === "indexedPair";
10319
+ })) != null ? _a : null;
10320
+ },
10321
+ [schema.fields]
10322
+ );
10323
+ const allStorageFields = React.useMemo(
10324
+ () => schema.fields.filter((f) => f.kind !== "virtual" && !f.isItemField && f.target),
10325
+ [schema.fields]
10326
+ );
10327
+ const {
10328
+ control,
10329
+ handleSubmit,
10330
+ watch,
10331
+ reset,
10332
+ trigger,
10333
+ setValue,
10334
+ formState: { errors }
10335
+ } = reactHookForm.useForm({ mode: "onChange" });
10336
+ const fieldsWithEffects = React.useMemo(() => {
10337
+ const result = [];
10338
+ for (const field of schema.fields) {
10339
+ if (!field.effects || field.effects.length === 0) {
10340
+ continue;
10341
+ }
10342
+ const mapped = field.effects.map((eff) => ({
10343
+ when: eff.when,
10344
+ targets: Object.entries(eff.set).map(([targetId, val]) => {
10345
+ const targetField = fieldById.get(targetId);
10346
+ return { key: targetField ? useDatasourceSchema.formKey(targetField) : targetId, value: val };
10347
+ })
10348
+ }));
10349
+ result.push({ sourceKey: useDatasourceSchema.formKey(field), effects: mapped });
10350
+ }
10351
+ return result;
10352
+ }, [schema.fields, fieldById]);
10353
+ React.useEffect(() => {
10354
+ let cancelled = false;
10355
+ fetchExistingValues(dsUid, allStorageFields).then((result) => {
10356
+ if (cancelled) {
10357
+ return;
10358
+ }
10359
+ if (result.error) {
10360
+ setFetchError(result.error);
10361
+ setInitializing(false);
10362
+ return;
10363
+ }
10364
+ if (result.readOnly) {
10365
+ setDetectedReadOnly(true);
10366
+ }
10367
+ const defaults = {};
10368
+ for (const field of allStorageFields) {
10369
+ if (field.defaultValue !== void 0) {
10370
+ defaults[useDatasourceSchema.formKey(field)] = field.defaultValue;
10371
+ }
10372
+ }
10373
+ const merged = { ...defaults, ...result.values };
10374
+ const virtualValues = useDatasourceSchema.computeVirtualFieldValues(schema, merged);
10375
+ reset({ ...merged, ...virtualValues });
10376
+ setInitializing(false);
10377
+ });
10378
+ return () => {
10379
+ cancelled = true;
10380
+ };
10381
+ }, [dsUid, allStorageFields, schema, reset]);
10382
+ const watchedValues = watch();
10383
+ const prevEffectValuesRef = React.useRef({});
10384
+ React.useEffect(() => {
10385
+ if (initializing) {
10386
+ return;
10387
+ }
10388
+ for (const { sourceKey, effects } of fieldsWithEffects) {
10389
+ const currentVal = useDatasourceSchema.getWatchedValue(watchedValues, sourceKey);
10390
+ const prevVal = prevEffectValuesRef.current[sourceKey];
10391
+ if (currentVal === prevVal) {
10392
+ continue;
10393
+ }
10394
+ prevEffectValuesRef.current[sourceKey] = currentVal;
10395
+ for (const eff of effects) {
10396
+ if (evaluateEffectCondition(eff.when, currentVal)) {
10397
+ for (const { key, value } of eff.targets) {
10398
+ setValue(key, value);
10399
+ }
10400
+ break;
10401
+ }
10402
+ }
10403
+ }
10404
+ }, [watchedValues, fieldsWithEffects, initializing, setValue]);
10405
+ const fieldsWithOverrideDefaults = React.useMemo(() => {
10406
+ const result = [];
10407
+ for (const field of schema.fields) {
10408
+ if (!field.overrides || field.overrides.length === 0) {
10409
+ continue;
10410
+ }
10411
+ const ovs = field.overrides.filter((ov) => ov.defaultValue !== void 0).map((ov) => {
10412
+ const parsed = useDatasourceSchema.parseDependsOn(ov.when);
10413
+ if (!parsed) {
10414
+ return null;
10415
+ }
10416
+ const depField = fieldById.get(parsed.field);
10417
+ return {
10418
+ depKey: depField ? useDatasourceSchema.formKey(depField) : parsed.field,
10419
+ depValue: parsed.value,
10420
+ negate: parsed.negate,
10421
+ defaultValue: ov.defaultValue
10422
+ };
10423
+ }).filter(Boolean);
10424
+ if (ovs.length > 0) {
10425
+ result.push({ targetKey: useDatasourceSchema.formKey(field), fieldDefault: field.defaultValue, overrides: ovs });
10426
+ }
10427
+ }
10428
+ return result;
10429
+ }, [schema.fields, fieldById]);
10430
+ const prevOverrideDepRef = React.useRef({});
10431
+ React.useEffect(() => {
10432
+ var _a;
10433
+ if (initializing) {
10434
+ return;
10435
+ }
10436
+ for (const { targetKey, fieldDefault, overrides } of fieldsWithOverrideDefaults) {
10437
+ for (const ov of overrides) {
10438
+ const currentDepVal = String((_a = useDatasourceSchema.getWatchedValue(watchedValues, ov.depKey)) != null ? _a : "");
10439
+ const trackKey = `${targetKey}::${ov.depKey}`;
10440
+ const prevDepVal = prevOverrideDepRef.current[trackKey];
10441
+ if (currentDepVal === prevDepVal) {
10442
+ continue;
10443
+ }
10444
+ prevOverrideDepRef.current[trackKey] = currentDepVal;
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) {
10448
+ setValue(targetKey, ov.defaultValue);
10449
+ } else if (wasActive && fieldDefault !== void 0) {
10450
+ setValue(targetKey, fieldDefault);
10451
+ }
10452
+ }
10453
+ }
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]);
10474
+ const isFieldVisible = React.useCallback(
10475
+ (field) => {
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);
10498
+ }
10499
+ return check(field, /* @__PURE__ */ new Set());
10500
+ },
10501
+ [celContext, fieldById]
10502
+ );
10503
+ const onSubmit = React.useCallback(
10504
+ async (data) => {
10505
+ setSubmitting(true);
10506
+ setSubmitError(null);
10507
+ onSaving == null ? void 0 : onSaving(true);
10508
+ const minDelay = new Promise((r) => setTimeout(r, 2e3));
10509
+ try {
10510
+ await submitDatasourceConfig(dsUid, data, allStorageFields, isFieldVisible);
10511
+ const [refreshed] = await Promise.all([fetchExistingValues(dsUid, allStorageFields), minDelay]);
10512
+ const defaults = {};
10513
+ for (const field of allStorageFields) {
10514
+ if (field.defaultValue !== void 0) {
10515
+ defaults[useDatasourceSchema.formKey(field)] = field.defaultValue;
10516
+ }
10517
+ }
10518
+ const merged = { ...defaults, ...refreshed.values };
10519
+ const virtualValues = useDatasourceSchema.computeVirtualFieldValues(schema, merged);
10520
+ reset({ ...merged, ...virtualValues });
10521
+ onSuccess("UPDATED", "Configuration saved.");
10522
+ } catch (err) {
10523
+ await minDelay;
10524
+ setSubmitError(err instanceof Error ? err.message : "Failed to update datasource");
10525
+ } finally {
10526
+ setSubmitting(false);
10527
+ onSaving == null ? void 0 : onSaving(false);
10528
+ }
10529
+ },
10530
+ [dsUid, allStorageFields, isFieldVisible, schema, reset, onSuccess, onSaving]
10531
+ );
10532
+ const isGroupValid = React.useCallback(
10533
+ (group) => {
10534
+ for (const field of group.fields) {
10535
+ if (!isFieldVisible(field)) {
10536
+ continue;
10537
+ }
10538
+ if (errors[useDatasourceSchema.formKey(field)]) {
10539
+ return false;
10540
+ }
10541
+ if (isFieldRequired(field, watchedValues, fieldById, celContext)) {
10542
+ const val = useDatasourceSchema.getWatchedValue(watchedValues, useDatasourceSchema.formKey(field));
10543
+ if (val === SECURE_FIELD_CONFIGURED) {
10544
+ continue;
10545
+ }
10546
+ if (val === void 0 || val === null || val === "") {
10547
+ return false;
10548
+ }
10549
+ }
10550
+ }
10551
+ return true;
10552
+ },
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]
10563
+ );
10564
+ const groupHasData = React.useCallback(
10565
+ (group) => {
10566
+ for (const field of group.fields) {
10567
+ const val = useDatasourceSchema.getWatchedValue(watchedValues, useDatasourceSchema.formKey(field));
10568
+ if (val === void 0 || val === null || val === "" || val === false) {
10569
+ continue;
10570
+ }
10571
+ if (val === field.defaultValue) {
10572
+ continue;
10573
+ }
10574
+ return true;
10575
+ }
10576
+ return false;
10577
+ },
10578
+ [watchedValues]
10579
+ );
10580
+ return {
10581
+ // Schema
10582
+ resolvedGroups,
10583
+ fieldById,
10584
+ httpHeadersField,
10585
+ // Form
10586
+ control,
10587
+ handleSubmit,
10588
+ trigger,
10589
+ errors,
10590
+ watchedValues,
10591
+ celContext,
10592
+ // State
10593
+ initializing,
10594
+ fetchError,
10595
+ submitting,
10596
+ submitError,
10597
+ readOnly,
10598
+ // Callbacks
10599
+ isFieldVisible,
10600
+ isFieldDisabled,
10601
+ isGroupValid,
10602
+ groupHasData,
10603
+ onSubmit,
10604
+ setValue
10605
+ };
10606
+ }
10607
+
10608
+ function DatasourceConfigWizard(props) {
10609
+ const { schema, dsUid, dsName, onSuccess, onSaving, onRetest, healthError, renderActions, mode = "tab" } = props;
10610
+ const form = useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving });
10611
+ if (mode === "tab") {
10612
+ return /* @__PURE__ */ React__default.default.createElement(
10613
+ TabLayout,
10614
+ {
10615
+ form,
10616
+ schema,
10617
+ dsUid,
10618
+ dsName,
10619
+ onRetest,
10620
+ healthError,
10621
+ renderActions
10622
+ }
10623
+ );
10624
+ }
10625
+ return /* @__PURE__ */ React__default.default.createElement(
10626
+ WizardLayout,
10627
+ {
10628
+ form,
10629
+ schema,
10630
+ dsUid,
10631
+ dsName,
10632
+ onRetest,
10633
+ healthError,
10634
+ renderActions
10635
+ }
10636
+ );
10637
+ }
10638
+ function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, renderActions }) {
10639
+ var _a, _b, _c;
10640
+ const styles = ui.useStyles2(getWizardStyles);
10641
+ const [currentStep, setCurrentStep] = React.useState(0);
10642
+ const {
10643
+ resolvedGroups,
10644
+ fieldById,
10645
+ httpHeadersField,
10646
+ control,
10647
+ handleSubmit,
10648
+ trigger,
10649
+ errors,
10650
+ watchedValues,
10651
+ celContext,
10652
+ initializing,
10653
+ fetchError,
10654
+ submitting,
10655
+ submitError,
10656
+ readOnly,
10657
+ isFieldVisible,
10658
+ isFieldDisabled,
10659
+ onSubmit,
10660
+ setValue
10661
+ } = form;
10662
+ const arrowSteps = React.useMemo(() => {
10663
+ const requiredGroup = resolvedGroups.find((g) => g.group.id === "_required");
10664
+ if (!requiredGroup) {
10665
+ return new Set(resolvedGroups.map((_, i) => i));
10666
+ }
10667
+ const requiredFieldIds = new Set(requiredGroup.fields.map((f) => f.id));
10668
+ const steps = /* @__PURE__ */ new Set();
10669
+ for (let i = 0; i < resolvedGroups.length; i++) {
10670
+ const g = resolvedGroups[i];
10671
+ if (g.group.id === "_required" || g.fields.some((f) => !requiredFieldIds.has(f.id))) {
10672
+ steps.add(i);
10673
+ }
10674
+ }
10675
+ return steps;
10676
+ }, [resolvedGroups]);
10677
+ const currentResolved = resolvedGroups[currentStep];
10678
+ const isFirstStep = React.useMemo(() => {
10679
+ for (let i = 0; i < currentStep; i++) {
10680
+ if (arrowSteps.has(i)) {
10681
+ return false;
10682
+ }
10683
+ }
10684
+ return true;
10685
+ }, [currentStep, arrowSteps]);
10686
+ const isLastStep = React.useMemo(() => {
10687
+ for (let i = currentStep + 1; i < resolvedGroups.length; i++) {
10688
+ if (arrowSteps.has(i)) {
10689
+ return false;
10690
+ }
10691
+ }
10692
+ return true;
10693
+ }, [currentStep, arrowSteps, resolvedGroups.length]);
10694
+ const visibleFieldsForStep = React.useMemo(
10695
+ () => currentResolved ? currentResolved.fields.filter(isFieldVisible) : [],
10696
+ [currentResolved, isFieldVisible]
10697
+ );
10698
+ const currentGroupValid = React.useMemo(() => {
10699
+ if (!currentResolved) {
10700
+ return true;
10701
+ }
10702
+ for (const field of visibleFieldsForStep) {
10703
+ if (errors[useDatasourceSchema.formKey(field)]) {
10704
+ return false;
10705
+ }
10706
+ if (isFieldRequired(field, watchedValues, fieldById, celContext)) {
10707
+ const val = useDatasourceSchema.getWatchedValue(watchedValues, useDatasourceSchema.formKey(field));
10708
+ if (val === SECURE_FIELD_CONFIGURED) {
10709
+ continue;
10710
+ }
10711
+ if (val === void 0 || val === null || val === "") {
10712
+ return false;
10713
+ }
10714
+ }
10715
+ }
10716
+ return true;
10717
+ }, [currentResolved, errors, visibleFieldsForStep, watchedValues, fieldById, celContext]);
10718
+ const goNext = React.useCallback(async () => {
10719
+ if (!currentResolved) {
10720
+ return;
10721
+ }
10722
+ if (!readOnly) {
10723
+ const visibleKeys = visibleFieldsForStep.map((f) => useDatasourceSchema.formKey(f));
10724
+ const valid = await trigger(visibleKeys);
10725
+ if (!valid) {
10726
+ return;
10727
+ }
10728
+ }
10729
+ setCurrentStep((s) => {
10730
+ for (let i = s + 1; i < resolvedGroups.length; i++) {
10731
+ if (arrowSteps.has(i)) {
10732
+ return i;
10733
+ }
10734
+ }
10735
+ return s;
10736
+ });
10737
+ }, [currentResolved, visibleFieldsForStep, trigger, resolvedGroups.length, arrowSteps, readOnly]);
10738
+ const goPrev = React.useCallback(() => {
10739
+ setCurrentStep((s) => {
10740
+ for (let i = s - 1; i >= 0; i--) {
10741
+ if (arrowSteps.has(i)) {
10742
+ return i;
10743
+ }
10744
+ }
10745
+ return s;
10746
+ });
10747
+ }, [arrowSteps]);
10748
+ if (initializing) {
10749
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.container }, /* @__PURE__ */ React__default.default.createElement(ui.Spinner, { size: "sm", inline: true }), " Loading configuration...");
10750
+ }
10751
+ if (fetchError) {
10752
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.container }, /* @__PURE__ */ React__default.default.createElement(ui.Alert, { severity: "error", title: "Failed to load configuration" }, fetchError), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.buttons }, /* @__PURE__ */ React__default.default.createElement(
10753
+ ui.LinkButton,
10754
+ {
10755
+ variant: "secondary",
10756
+ size: "sm",
10757
+ icon: "external-link-alt",
10758
+ href: `/connections/datasources/edit/${dsUid}`
10759
+ },
10760
+ "Open datasource settings"
10761
+ )));
10762
+ }
10763
+ const allDisabled = submitting || readOnly;
10764
+ if (resolvedGroups.length === 0) {
10765
+ return null;
10766
+ }
10767
+ const currentGroup = currentResolved == null ? void 0 : currentResolved.group;
10768
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.container }, submitting && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.overlay }, /* @__PURE__ */ React__default.default.createElement(ui.Spinner, { size: "sm" }), /* @__PURE__ */ React__default.default.createElement("span", null, "Saving & testing\u2026")), readOnly && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.readOnlyBanner }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "lock", size: "xs" }), /* @__PURE__ */ React__default.default.createElement("span", null, "Read-only \u2014 managed externally")), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.navBar }, currentGroup && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: (_a = currentGroup.description) != null ? _a : currentGroup.title }, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.navTitle }, currentGroup.title, /* @__PURE__ */ React__default.default.createElement("span", { className: styles.stepCount }, currentStep + 1, "/", resolvedGroups.length))), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.navActions }, /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: isFirstStep ? "First step" : `Previous: ${(_b = resolvedGroups[currentStep - 1]) == null ? void 0 : _b.group.title}` }, /* @__PURE__ */ React__default.default.createElement(
10769
+ ui.Button,
10770
+ {
10771
+ variant: "secondary",
10772
+ fill: "text",
10773
+ size: "sm",
10774
+ icon: "angle-left",
10775
+ "aria-label": "Previous",
10776
+ onClick: goPrev,
10777
+ disabled: isFirstStep || submitting,
10778
+ type: "button"
10779
+ }
10780
+ )), /* @__PURE__ */ React__default.default.createElement(
10781
+ ui.Select,
10782
+ {
10783
+ options: resolvedGroups.map((g, i) => ({ label: g.group.title, value: i })),
10784
+ value: currentStep,
10785
+ onChange: (v) => {
10786
+ if (v) {
10787
+ setCurrentStep(v.value);
10788
+ }
10789
+ },
10790
+ disabled: submitting,
10791
+ width: 18
10792
+ }
10793
+ ), /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: isLastStep ? "Last step" : `Next: ${(_c = resolvedGroups[currentStep + 1]) == null ? void 0 : _c.group.title}` }, /* @__PURE__ */ React__default.default.createElement(
10794
+ ui.Button,
10795
+ {
10796
+ variant: isLastStep || !readOnly && !currentGroupValid ? "secondary" : "primary",
10797
+ size: "sm",
10798
+ icon: "angle-right",
10799
+ "aria-label": "Next",
10800
+ onClick: goNext,
10801
+ disabled: isLastStep || submitting,
10802
+ type: "button"
10803
+ }
10804
+ )))), currentResolved && /* @__PURE__ */ React__default.default.createElement("form", { onSubmit: handleSubmit(onSubmit), className: styles.form }, visibleFieldsForStep.map((field) => /* @__PURE__ */ React__default.default.createElement(
10805
+ SchemaField,
10806
+ {
10807
+ key: useDatasourceSchema.formKey(field),
10808
+ field,
10809
+ control,
10810
+ errors,
10811
+ disabled: allDisabled || isFieldDisabled(field),
10812
+ dsUid,
10813
+ watchedValues,
10814
+ fieldById,
10815
+ celContext,
10816
+ setValue
10817
+ }
10818
+ )), (currentResolved.group.id === "_required" || currentResolved.group.id === "auth") && httpHeadersField && /* @__PURE__ */ React__default.default.createElement(
10819
+ AuthorizationHeaderField,
10820
+ {
10821
+ headersFieldKey: useDatasourceSchema.formKey(httpHeadersField),
10822
+ control,
10823
+ disabled: allDisabled,
10824
+ watchedValues
10825
+ }
10826
+ ), submitError && /* @__PURE__ */ React__default.default.createElement(ui.Alert, { severity: "error", title: "Error" }, submitError), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.buttons }, readOnly ? /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "primary", size: "sm", icon: "sync", onClick: onRetest, type: "button" }, "Test") : /* @__PURE__ */ React__default.default.createElement(ui.Button, { variant: "primary", size: "sm", disabled: submitting || !currentGroupValid, type: "submit" }, submitting ? "Saving..." : "Save & Test"), healthError && (renderActions == null ? void 0 : renderActions({ dsUid, dsName, dsType: schema.pluginType, healthError })))));
10827
+ }
10828
+
10829
+ var __defProp$2 = Object.defineProperty;
10830
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10831
+ var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, key + "" , value);
10832
+ class DatasourceErrorBoundary extends React.Component {
10833
+ constructor() {
10834
+ super(...arguments);
10835
+ __publicField$2(this, "state", { error: null });
10836
+ }
10837
+ static getDerivedStateFromError(error) {
10838
+ return { error };
10839
+ }
10840
+ componentDidCatch(error, info) {
10841
+ console.error("[DatasourceConfigWizard] Caught error:", error, info.componentStack);
10842
+ }
10843
+ render() {
10844
+ if (this.state.error) {
10845
+ return /* @__PURE__ */ React__default.default.createElement(ui.Alert, { severity: "warning", title: "Configuration wizard unavailable" }, "Could not load the configuration wizard", this.props.dsName ? ` for ${this.props.dsName}` : "", ". Use the Settings link to configure this datasource manually.");
10846
+ }
10847
+ return this.props.children;
10848
+ }
10849
+ }
10850
+
10851
+ const MAX_CONCURRENCY = 5;
10852
+ function useHealthChecks() {
10853
+ const [healthMap, setHealthMap] = React.useState({});
10854
+ const queueRef = React.useRef([]);
10855
+ const activeRef = React.useRef(0);
10856
+ const mountedRef = React.useRef(true);
10857
+ const everQueuedRef = React.useRef(/* @__PURE__ */ new Set());
10858
+ const checkOne = React.useCallback(async (uid) => {
10859
+ if (!mountedRef.current) {
10860
+ return;
10861
+ }
10862
+ setHealthMap((prev) => ({ ...prev, [uid]: { state: "checking" } }));
10863
+ try {
10864
+ const result = await runtime.getBackendSrv().get(
10865
+ `/api/datasources/uid/${uid}/health`,
10866
+ void 0,
10867
+ void 0,
10868
+ { showErrorAlert: false }
10869
+ );
10870
+ if (!mountedRef.current) {
10871
+ return;
10872
+ }
10873
+ setHealthMap((prev) => {
10874
+ var _a;
10875
+ return {
10876
+ ...prev,
10877
+ [uid]: { state: "done", status: (_a = result.status) != null ? _a : "OK", message: result.message }
10878
+ };
10879
+ });
10880
+ } catch (error) {
10881
+ if (!mountedRef.current) {
10882
+ return;
10883
+ }
10884
+ let status = "ERROR";
10885
+ let message = "";
10886
+ if (error && typeof error === "object" && "data" in error) {
10887
+ const data = error.data;
10888
+ if (data == null ? void 0 : data.status) {
10889
+ status = data.status;
10890
+ }
10891
+ if (data == null ? void 0 : data.message) {
10892
+ message = data.message;
10893
+ }
10894
+ }
10895
+ if (!message) {
10896
+ message = error instanceof Error ? error.message : String(error);
10897
+ }
10898
+ setHealthMap((prev) => ({
10899
+ ...prev,
10900
+ [uid]: { state: "done", status, message }
10901
+ }));
10902
+ }
10903
+ }, []);
10904
+ const processQueue = React.useCallback(() => {
10905
+ while (activeRef.current < MAX_CONCURRENCY && queueRef.current.length > 0) {
10906
+ const uid = queueRef.current.shift();
10907
+ activeRef.current++;
10908
+ checkOne(uid).finally(() => {
10909
+ activeRef.current--;
10910
+ processQueue();
10911
+ });
10912
+ }
10913
+ }, [checkOne]);
10914
+ const checkUids = React.useCallback(
10915
+ (uids) => {
10916
+ const toCheck = [];
10917
+ for (const uid of uids) {
10918
+ if (everQueuedRef.current.has(uid)) {
10919
+ continue;
10920
+ }
10921
+ everQueuedRef.current.add(uid);
10922
+ toCheck.push(uid);
10923
+ }
10924
+ if (toCheck.length === 0) {
10925
+ return;
10926
+ }
10927
+ setHealthMap((prev) => {
10928
+ const next = { ...prev };
10929
+ for (const uid of toCheck) {
10930
+ next[uid] = { state: "pending" };
10931
+ }
10932
+ return next;
10933
+ });
10934
+ queueRef.current.push(...toCheck);
10935
+ processQueue();
10936
+ },
10937
+ [processQueue]
10938
+ );
10939
+ const retry = React.useCallback(
10940
+ (uid) => {
10941
+ everQueuedRef.current.delete(uid);
10942
+ everQueuedRef.current.add(uid);
10943
+ setHealthMap((prev) => ({ ...prev, [uid]: { state: "pending" } }));
10944
+ queueRef.current.push(uid);
10945
+ processQueue();
10946
+ },
10947
+ [processQueue]
10948
+ );
10949
+ return { healthMap, checkUids, retry };
10950
+ }
10951
+
10952
+ let pluginNameCache = null;
10953
+ function buildPluginNameCache() {
10954
+ var _a;
10955
+ if (pluginNameCache) {
10956
+ return pluginNameCache;
10957
+ }
10958
+ const map = /* @__PURE__ */ new Map();
10959
+ try {
10960
+ const list = runtime.getDataSourceSrv().getList();
10961
+ for (const ds of list) {
10962
+ if (((_a = ds.meta) == null ? void 0 : _a.name) && ds.type && !map.has(ds.type)) {
10963
+ map.set(ds.type, ds.meta.name);
10964
+ }
10965
+ }
10966
+ } catch (ex) {
10967
+ console.error(ex);
10968
+ }
10969
+ pluginNameCache = map;
10970
+ return map;
10971
+ }
10972
+ function resolvePluginName(pluginType) {
10973
+ var _a;
10974
+ const cache = buildPluginNameCache();
10975
+ return (_a = cache.get(pluginType)) != null ? _a : pluginType;
10976
+ }
10977
+
8393
10978
  var __defProp$1 = Object.defineProperty;
8394
10979
  var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8395
10980
  var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -8529,7 +11114,7 @@ class CustomHeadersSettings extends React.PureComponent {
8529
11114
  return {
8530
11115
  id: lodash.uniqueId(),
8531
11116
  name: jsonData[key],
8532
- value: secureJsonData !== undefined ? secureJsonData[key] : "",
11117
+ value: secureJsonData !== void 0 ? secureJsonData[key] : "",
8533
11118
  configured: secureJsonFields && secureJsonFields[`httpHeaderValue${index + 1}`] || false
8534
11119
  };
8535
11120
  })
@@ -8600,8 +11185,8 @@ class QueryModellerBase {
8600
11185
  hasBinaryOp(query) {
8601
11186
  return query.operations.find((op) => {
8602
11187
  const def = this.getOperationDefinition(op.id);
8603
- return (def == null ? undefined : def.category) === BINARY_OPERATIONS_KEY;
8604
- }) !== undefined;
11188
+ return (def == null ? void 0 : def.category) === BINARY_OPERATIONS_KEY;
11189
+ }) !== void 0;
8605
11190
  }
8606
11191
  }
8607
11192
 
@@ -8624,7 +11209,7 @@ function LabelFilterItem({
8624
11209
  const [labelValuesMenuOpen, setLabelValuesMenuOpen] = React.useState(false);
8625
11210
  const isMultiSelect = (operator = item.op) => {
8626
11211
  var _a2;
8627
- return (_a2 = operators.find((op) => op.label === operator)) == null ? undefined : _a2.isMultiValue;
11212
+ return (_a2 = operators.find((op) => op.label === operator)) == null ? void 0 : _a2.isMultiValue;
8628
11213
  };
8629
11214
  const getSelectOptionsFromString = (item2) => {
8630
11215
  if (item2) {
@@ -8637,12 +11222,12 @@ function LabelFilterItem({
8637
11222
  };
8638
11223
  const getOptions = () => {
8639
11224
  const labelValues = state.labelValues ? [...state.labelValues] : [];
8640
- const selectedOptions = getSelectOptionsFromString(item == null ? undefined : item.value).map(data.toOption);
11225
+ const selectedOptions = getSelectOptionsFromString(item == null ? void 0 : item.value).map(data.toOption);
8641
11226
  return lodash.uniqBy([...selectedOptions, ...labelValues], "value");
8642
11227
  };
8643
11228
  const isConflicting = isConflictingLabelFilter(item, items);
8644
11229
  const { current: id } = React.useRef(uuid.v4());
8645
- return /* @__PURE__ */ React__default.default.createElement("div", { "data-testid": "visual-query-builder-dimensions-filter-item" }, /* @__PURE__ */ React__default.default.createElement(ui.InlineField, { error: CONFLICTING_LABEL_FILTER_ERROR_MESSAGE, invalid: isConflicting ? true : undefined }, /* @__PURE__ */ React__default.default.createElement(InputGroup, null, /* @__PURE__ */ React__default.default.createElement(
11230
+ return /* @__PURE__ */ React__default.default.createElement("div", { "data-testid": "visual-query-builder-dimensions-filter-item" }, /* @__PURE__ */ React__default.default.createElement(ui.InlineField, { error: CONFLICTING_LABEL_FILTER_ERROR_MESSAGE, invalid: isConflicting ? true : void 0 }, /* @__PURE__ */ React__default.default.createElement(InputGroup, null, /* @__PURE__ */ React__default.default.createElement(
8646
11231
  ui.Select,
8647
11232
  {
8648
11233
  placeholder: "Select label",
@@ -8655,7 +11240,7 @@ function LabelFilterItem({
8655
11240
  setState({ isLoadingLabelNames: true });
8656
11241
  const labelNames = await onGetLabelNames(item);
8657
11242
  setLabelNamesMenuOpen(true);
8658
- setState({ labelNames, isLoadingLabelNames: undefined });
11243
+ setState({ labelNames, isLoadingLabelNames: void 0 });
8659
11244
  },
8660
11245
  onCloseMenu: () => {
8661
11246
  setLabelNamesMenuOpen(false);
@@ -8687,7 +11272,7 @@ function LabelFilterItem({
8687
11272
  onChange({
8688
11273
  ...item,
8689
11274
  op: change.value,
8690
- value: isMultiSelect(change.value) ? item.value : getSelectOptionsFromString(item == null ? undefined : item.value)[0]
11275
+ value: isMultiSelect(change.value) ? item.value : getSelectOptionsFromString(item == null ? void 0 : item.value)[0]
8691
11276
  });
8692
11277
  }
8693
11278
  },
@@ -8700,7 +11285,7 @@ function LabelFilterItem({
8700
11285
  "data-testid": e2eSelectors.selectors.components.QueryBuilder.valueSelect,
8701
11286
  inputId: `visual-query-builder-dimensions-filter-item-value-${id}`,
8702
11287
  width: "auto",
8703
- value: isMultiSelect() ? getSelectOptionsFromString(item == null ? undefined : item.value).map(data.toOption) : getSelectOptionsFromString(item == null ? undefined : item.value).map(data.toOption)[0],
11288
+ value: isMultiSelect() ? getSelectOptionsFromString(item == null ? void 0 : item.value).map(data.toOption) : getSelectOptionsFromString(item == null ? void 0 : item.value).map(data.toOption)[0],
8704
11289
  allowCustomValue: true,
8705
11290
  onOpenMenu: async () => {
8706
11291
  setState({ isLoadingLabelValues: true });
@@ -8708,7 +11293,7 @@ function LabelFilterItem({
8708
11293
  setState({
8709
11294
  ...state,
8710
11295
  labelValues,
8711
- isLoadingLabelValues: undefined
11296
+ isLoadingLabelValues: void 0
8712
11297
  });
8713
11298
  setLabelValuesMenuOpen(true);
8714
11299
  },
@@ -8732,9 +11317,9 @@ function LabelFilterItem({
8732
11317
  if (change2.value) {
8733
11318
  return change2.value;
8734
11319
  } else {
8735
- return undefined;
11320
+ return void 0;
8736
11321
  }
8737
- }).filter((val) => val !== undefined).join(multiValueSeparator);
11322
+ }).filter((val) => val !== void 0).join(multiValueSeparator);
8738
11323
  onChange({ ...item, value: changes, op: (_b = item.op) != null ? _b : defaultOp });
8739
11324
  }
8740
11325
  },
@@ -8761,10 +11346,10 @@ function isConflictingLabelFilter(newLabel, labels) {
8761
11346
  );
8762
11347
  const conflict = candidates.some((candidate) => {
8763
11348
  var _a, _b;
8764
- if (operationIsNegative && ((_a = candidate == null ? undefined : candidate.op) == null ? undefined : _a.toString().startsWith("!")) === false) {
11349
+ if (operationIsNegative && ((_a = candidate == null ? void 0 : candidate.op) == null ? void 0 : _a.toString().startsWith("!")) === false) {
8765
11350
  return true;
8766
11351
  }
8767
- if (operationIsNegative === false && ((_b = candidate == null ? undefined : candidate.op) == null ? undefined : _b.toString().startsWith("!"))) {
11352
+ if (operationIsNegative === false && ((_b = candidate == null ? void 0 : candidate.op) == null ? void 0 : _b.toString().startsWith("!"))) {
8768
11353
  return true;
8769
11354
  }
8770
11355
  return false;
@@ -8793,7 +11378,7 @@ function LabelFilters({
8793
11378
  const onLabelsChange = (newItems) => {
8794
11379
  setItems(newItems);
8795
11380
  const newLabels = newItems.filter(
8796
- (item) => item.label !== undefined && item.value !== undefined
11381
+ (item) => item.label !== void 0 && item.value !== void 0
8797
11382
  );
8798
11383
  if (!lodash.isEqual(newLabels, labelsFilters)) {
8799
11384
  onChange(newLabels);
@@ -8834,7 +11419,7 @@ function LabelFilters({
8834
11419
 
8835
11420
  function OperationExplainedBox({ title, stepNumber, markdown, children }) {
8836
11421
  const styles = ui.useStyles2(getStyles$b);
8837
- return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.box }, stepNumber !== undefined && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.stepNumber }, stepNumber), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.boxInner }, title && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.header }, /* @__PURE__ */ React__default.default.createElement("span", null, title)), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.body }, markdown && /* @__PURE__ */ React__default.default.createElement("div", { dangerouslySetInnerHTML: { __html: data.renderMarkdown(markdown) } }), children)));
11422
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.box }, stepNumber !== void 0 && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.stepNumber }, stepNumber), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.boxInner }, title && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.header }, /* @__PURE__ */ React__default.default.createElement("span", null, title)), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.body }, markdown && /* @__PURE__ */ React__default.default.createElement("div", { dangerouslySetInnerHTML: { __html: data.renderMarkdown(markdown) } }), children)));
8838
11423
  }
8839
11424
  const getStyles$b = (theme) => {
8840
11425
  return {
@@ -9077,7 +11662,7 @@ function SimpleInputParamEditor(props) {
9077
11662
  ui.AutoSizeInput,
9078
11663
  {
9079
11664
  id: getOperationParamId(props.operationId, props.index),
9080
- defaultValue: (_a = props.value) == null ? undefined : _a.toString(),
11665
+ defaultValue: (_a = props.value) == null ? void 0 : _a.toString(),
9081
11666
  minWidth: props.paramDef.minWidth,
9082
11667
  placeholder: props.paramDef.placeholder,
9083
11668
  title: props.paramDef.description,
@@ -9111,7 +11696,7 @@ function SelectInputParamEditor({
9111
11696
  var _a, _b;
9112
11697
  const styles = ui.useStyles2(getStyles$8);
9113
11698
  let selectOptions = paramDef.options;
9114
- if (!((_a = selectOptions[0]) == null ? undefined : _a.label)) {
11699
+ if (!((_a = selectOptions[0]) == null ? void 0 : _a.label)) {
9115
11700
  selectOptions = paramDef.options.map((option) => ({
9116
11701
  label: option.toString(),
9117
11702
  value: option
@@ -9416,9 +12001,9 @@ function OperationEditor({
9416
12001
  }
9417
12002
  const isInvalid = (isDragging) => {
9418
12003
  if (isDragging) {
9419
- return undefined;
12004
+ return void 0;
9420
12005
  }
9421
- return isConflicting ? true : undefined;
12006
+ return isConflicting ? true : void 0;
9422
12007
  };
9423
12008
  return /* @__PURE__ */ React__default.default.createElement(dnd.Draggable, { draggableId: `operation-${index}`, index }, (provided, snapshot) => /* @__PURE__ */ React__default.default.createElement(
9424
12009
  ui.InlineField,
@@ -9572,7 +12157,7 @@ function useOperationsHighlight(operations) {
9572
12157
  } else {
9573
12158
  newOps = operations.map((op, index) => {
9574
12159
  var _a;
9575
- return !isSameOp(op.id, (_a = prevOperations[index]) == null ? undefined : _a.id);
12160
+ return !isSameOp(op.id, (_a = prevOperations[index]) == null ? void 0 : _a.id);
9576
12161
  });
9577
12162
  }
9578
12163
  return newOps;
@@ -9644,8 +12229,8 @@ function OperationListExplained({
9644
12229
  "div",
9645
12230
  {
9646
12231
  key: index,
9647
- onMouseEnter: () => onMouseEnter == null ? undefined : onMouseEnter(op, index),
9648
- onMouseLeave: () => onMouseLeave == null ? undefined : onMouseLeave(op, index)
12232
+ onMouseEnter: () => onMouseEnter == null ? void 0 : onMouseEnter(op, index),
12233
+ onMouseLeave: () => onMouseLeave == null ? void 0 : onMouseLeave(op, index)
9649
12234
  },
9650
12235
  /* @__PURE__ */ React__default.default.createElement(
9651
12236
  OperationExplainedBox,
@@ -9687,15 +12272,15 @@ const QueryBuilderHints = ({
9687
12272
  const hints = React.useMemo(() => {
9688
12273
  var _a;
9689
12274
  const dataQuery = buildDataQueryFromQueryString(queryModeller.renderQuery(visualQuery));
9690
- const hints2 = (_a = datasource.getQueryHints) == null ? undefined : _a.call(datasource, dataQuery, (data == null ? undefined : data.series) || []).filter((hint) => {
12275
+ const hints2 = (_a = datasource.getQueryHints) == null ? void 0 : _a.call(datasource, dataQuery, (data == null ? void 0 : data.series) || []).filter((hint) => {
9691
12276
  var _a2;
9692
- return (_a2 = hint.fix) == null ? undefined : _a2.action;
12277
+ return (_a2 = hint.fix) == null ? void 0 : _a2.action;
9693
12278
  });
9694
12279
  return hints2 != null ? hints2 : [];
9695
12280
  }, [datasource, visualQuery, data, queryModeller, buildDataQueryFromQueryString]);
9696
12281
  return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, hints.length > 0 && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.container }, hints.map((hint) => {
9697
12282
  var _a, _b, _c, _d;
9698
- return /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: `${hint.label} ${(_a = hint.fix) == null ? undefined : _a.label}`, key: hint.type }, /* @__PURE__ */ React__default.default.createElement(
12283
+ return /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: `${hint.label} ${(_a = hint.fix) == null ? void 0 : _a.label}`, key: hint.type }, /* @__PURE__ */ React__default.default.createElement(
9699
12284
  ui.Button,
9700
12285
  {
9701
12286
  onClick: () => {
@@ -9704,9 +12289,9 @@ const QueryBuilderHints = ({
9704
12289
  hint: hint.type,
9705
12290
  datasourceType: datasource.type
9706
12291
  });
9707
- if ((_a2 = hint == null ? undefined : hint.fix) == null ? undefined : _a2.action) {
12292
+ if ((_a2 = hint == null ? void 0 : hint.fix) == null ? void 0 : _a2.action) {
9708
12293
  const dataQuery = buildDataQueryFromQueryString(queryModeller.renderQuery(visualQuery));
9709
- const newQuery = (_b2 = datasource.modifyQuery) == null ? undefined : _b2.call(datasource, dataQuery, hint.fix.action);
12294
+ const newQuery = (_b2 = datasource.modifyQuery) == null ? void 0 : _b2.call(datasource, dataQuery, hint.fix.action);
9710
12295
  if (newQuery) {
9711
12296
  const newVisualQuery = buildVisualQueryFromString(
9712
12297
  (_c2 = buildQueryStringFromDataQuery(newQuery)) != null ? _c2 : ""
@@ -9720,7 +12305,7 @@ const QueryBuilderHints = ({
9720
12305
  className: styles.hint
9721
12306
  },
9722
12307
  "hint: ",
9723
- ((_b = hint.fix) == null ? undefined : _b.title) || ((_d = (_c = hint.fix) == null ? undefined : _c.action) == null ? undefined : _d.type.toLowerCase().replace("_", " "))
12308
+ ((_b = hint.fix) == null ? void 0 : _b.title) || ((_d = (_c = hint.fix) == null ? void 0 : _c.action) == null ? void 0 : _d.type.toLowerCase().replace("_", " "))
9724
12309
  ));
9725
12310
  })));
9726
12311
  };
@@ -9843,6 +12428,34 @@ const convertUnits = (queryStats) => {
9843
12428
  return text + suffix;
9844
12429
  };
9845
12430
 
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;
9846
12459
  exports.AccessoryButton = AccessoryButton;
9847
12460
  exports.AdvancedHttpSettings = AdvancedHttpSettings;
9848
12461
  exports.Auth = Auth;
@@ -9862,6 +12475,8 @@ exports.DataLinks = DataLinks;
9862
12475
  exports.DataSourceDescription = DataSourceDescription;
9863
12476
  exports.DataSourcePicker = DataSourcePicker;
9864
12477
  exports.DatasetSelector = DatasetSelector;
12478
+ exports.DatasourceConfigWizard = DatasourceConfigWizard;
12479
+ exports.DatasourceErrorBoundary = DatasourceErrorBoundary;
9865
12480
  exports.DatePicker = DatePicker;
9866
12481
  exports.DatePickerWithInput = DatePickerWithInput;
9867
12482
  exports.DebounceInput = DebounceInput;
@@ -9915,5 +12530,7 @@ exports.formatDate = formatDate;
9915
12530
  exports.getStandardSQLCompletionProvider = getStandardSQLCompletionProvider;
9916
12531
  exports.grafanaStandardSQLLanguage = language;
9917
12532
  exports.grafanaStandardSQLLanguageConf = conf;
12533
+ exports.resolvePluginName = resolvePluginName;
9918
12534
  exports.toOption = toOption;
12535
+ exports.useHealthChecks = useHealthChecks;
9919
12536
  //# sourceMappingURL=index.cjs.map