@grafana/plugin-ui 0.13.1 → 0.14.1-dsconfig.b962e11

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 (270) hide show
  1. package/dist/cjs/index.cjs +2918 -364
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +553 -39
  4. package/dist/cjs/test-utils.cjs +2 -2
  5. package/dist/cjs/test-utils.cjs.map +1 -1
  6. package/dist/cjs/test-utils.d.cts +1 -1
  7. package/dist/esm/components/ConfigEditor/AdvancedSettings/AdvancedHttpSettings.js.map +1 -1
  8. package/dist/esm/components/ConfigEditor/Auth/Auth.js.map +1 -1
  9. package/dist/esm/components/ConfigEditor/Auth/auth-method/AuthMethodSettings.js +4 -4
  10. package/dist/esm/components/ConfigEditor/Auth/auth-method/AuthMethodSettings.js.map +1 -1
  11. package/dist/esm/components/ConfigEditor/Auth/auth-method/BasicAuth.js.map +1 -1
  12. package/dist/esm/components/ConfigEditor/Auth/custom-headers/CustomHeader.js.map +1 -1
  13. package/dist/esm/components/ConfigEditor/Auth/custom-headers/CustomHeaders.js +1 -1
  14. package/dist/esm/components/ConfigEditor/Auth/custom-headers/CustomHeaders.js.map +1 -1
  15. package/dist/esm/components/ConfigEditor/Auth/styles.js.map +1 -1
  16. package/dist/esm/components/ConfigEditor/Auth/tls/SelfSignedCertificate.js +1 -1
  17. package/dist/esm/components/ConfigEditor/Auth/tls/SelfSignedCertificate.js.map +1 -1
  18. package/dist/esm/components/ConfigEditor/Auth/tls/SkipTLSVerification.js.map +1 -1
  19. package/dist/esm/components/ConfigEditor/Auth/tls/TLSClientAuth.js +3 -3
  20. package/dist/esm/components/ConfigEditor/Auth/tls/TLSClientAuth.js.map +1 -1
  21. package/dist/esm/components/ConfigEditor/Auth/tls/TLSSettings.js.map +1 -1
  22. package/dist/esm/components/ConfigEditor/Auth/tls/TLSSettingsSection.js.map +1 -1
  23. package/dist/esm/components/ConfigEditor/Auth/types.js.map +1 -1
  24. package/dist/esm/components/ConfigEditor/Auth/utils.js +3 -3
  25. package/dist/esm/components/ConfigEditor/Auth/utils.js.map +1 -1
  26. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js +2 -2
  27. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js.map +1 -1
  28. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigSection.js.map +1 -1
  29. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigSubSection.js.map +1 -1
  30. package/dist/esm/components/ConfigEditor/ConfigSection/GenericConfigSection.js.map +1 -1
  31. package/dist/esm/components/ConfigEditor/Connection/ConnectionSettings.js +1 -1
  32. package/dist/esm/components/ConfigEditor/Connection/ConnectionSettings.js.map +1 -1
  33. package/dist/esm/components/ConfigEditor/DataSourceDescription.js.map +1 -1
  34. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/AuthorizationHeaderField.js +53 -0
  35. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/AuthorizationHeaderField.js.map +1 -0
  36. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/ComplexFieldNote.js +24 -0
  37. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/ComplexFieldNote.js.map +1 -0
  38. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js +229 -0
  39. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js.map +1 -0
  40. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/IndexedPairEditor.js +124 -0
  41. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/IndexedPairEditor.js.map +1 -0
  42. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/PdcFieldNote.js +34 -0
  43. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/PdcFieldNote.js.map +1 -0
  44. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js +60 -0
  45. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js.map +1 -0
  46. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SecureFieldInput.js +61 -0
  47. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SecureFieldInput.js.map +1 -0
  48. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js +54 -0
  49. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js.map +1 -0
  50. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/StringArrayInput.js +84 -0
  51. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/StringArrayInput.js.map +1 -0
  52. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js +176 -0
  53. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js.map +1 -0
  54. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js +88 -0
  55. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js.map +1 -0
  56. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js +106 -0
  57. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js.map +1 -0
  58. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/tabStyles.js +241 -0
  59. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/tabStyles.js.map +1 -0
  60. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/useDatasourceConfigForm.js +284 -0
  61. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/useDatasourceConfigForm.js.map +1 -0
  62. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/wizardStyles.js +124 -0
  63. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/wizardStyles.js.map +1 -0
  64. package/dist/esm/components/ConfigEditor/SecureSocksProxyToggle.js.map +1 -1
  65. package/dist/esm/components/CustomHeadersSettings/CustomHeadersSettings.js +11 -11
  66. package/dist/esm/components/CustomHeadersSettings/CustomHeadersSettings.js.map +1 -1
  67. package/dist/esm/components/DataLinks/DataLink.js +4 -4
  68. package/dist/esm/components/DataLinks/DataLink.js.map +1 -1
  69. package/dist/esm/components/DataLinks/DataLinks.js +3 -3
  70. package/dist/esm/components/DataLinks/DataLinks.js.map +1 -1
  71. package/dist/esm/components/DataSourcePicker/DataSourcePicker.js +8 -8
  72. package/dist/esm/components/DataSourcePicker/DataSourcePicker.js.map +1 -1
  73. package/dist/esm/components/DatePicker/DatePicker.js.map +1 -1
  74. package/dist/esm/components/DatePicker/styles.js +2 -2
  75. package/dist/esm/components/DatePicker/styles.js.map +1 -1
  76. package/dist/esm/components/DatePickerWithInput/DatePickerWithInput.js.map +1 -1
  77. package/dist/esm/components/DatePickerWithInput/styles.js +2 -2
  78. package/dist/esm/components/DatePickerWithInput/styles.js.map +1 -1
  79. package/dist/esm/components/DebounceInput/DebounceInput.js.map +1 -1
  80. package/dist/esm/components/Plugins/PluginSignatureBadge.js.map +1 -1
  81. package/dist/esm/components/QueryEditor/AccessoryButton.js.map +1 -1
  82. package/dist/esm/components/QueryEditor/CatalogSelector.js +1 -1
  83. package/dist/esm/components/QueryEditor/CatalogSelector.js.map +1 -1
  84. package/dist/esm/components/QueryEditor/ConfirmModal.js +1 -1
  85. package/dist/esm/components/QueryEditor/ConfirmModal.js.map +1 -1
  86. package/dist/esm/components/QueryEditor/DatasetSelector.js +1 -1
  87. package/dist/esm/components/QueryEditor/DatasetSelector.js.map +1 -1
  88. package/dist/esm/components/QueryEditor/EditorField.js +5 -5
  89. package/dist/esm/components/QueryEditor/EditorField.js.map +1 -1
  90. package/dist/esm/components/QueryEditor/EditorFieldGroup.js.map +1 -1
  91. package/dist/esm/components/QueryEditor/EditorHeader.js +2 -2
  92. package/dist/esm/components/QueryEditor/EditorHeader.js.map +1 -1
  93. package/dist/esm/components/QueryEditor/EditorList.js.map +1 -1
  94. package/dist/esm/components/QueryEditor/EditorRow.js +4 -4
  95. package/dist/esm/components/QueryEditor/EditorRow.js.map +1 -1
  96. package/dist/esm/components/QueryEditor/EditorRows.js +2 -2
  97. package/dist/esm/components/QueryEditor/EditorRows.js.map +1 -1
  98. package/dist/esm/components/QueryEditor/EditorStack.js +1 -1
  99. package/dist/esm/components/QueryEditor/EditorStack.js.map +1 -1
  100. package/dist/esm/components/QueryEditor/EditorSwitch.js +2 -2
  101. package/dist/esm/components/QueryEditor/EditorSwitch.js.map +1 -1
  102. package/dist/esm/components/QueryEditor/FlexItem.js.map +1 -1
  103. package/dist/esm/components/QueryEditor/InlineSelect.js +1 -1
  104. package/dist/esm/components/QueryEditor/InlineSelect.js.map +1 -1
  105. package/dist/esm/components/QueryEditor/InputGroup.js +2 -2
  106. package/dist/esm/components/QueryEditor/InputGroup.js.map +1 -1
  107. package/dist/esm/components/QueryEditor/QueryEditor.js +10 -8
  108. package/dist/esm/components/QueryEditor/QueryEditor.js.map +1 -1
  109. package/dist/esm/components/QueryEditor/QueryHeader.js +20 -20
  110. package/dist/esm/components/QueryEditor/QueryHeader.js.map +1 -1
  111. package/dist/esm/components/QueryEditor/RunQueryButton.js +1 -1
  112. package/dist/esm/components/QueryEditor/RunQueryButton.js.map +1 -1
  113. package/dist/esm/components/QueryEditor/Space.js +2 -2
  114. package/dist/esm/components/QueryEditor/Space.js.map +1 -1
  115. package/dist/esm/components/QueryEditor/TableSelector.js +0 -1
  116. package/dist/esm/components/QueryEditor/TableSelector.js.map +1 -1
  117. package/dist/esm/components/QueryEditor/defaults.js +7 -7
  118. package/dist/esm/components/QueryEditor/defaults.js.map +1 -1
  119. package/dist/esm/components/QueryEditor/expressions.js.map +1 -1
  120. package/dist/esm/components/QueryEditor/query-editor-raw/QueryEditorRaw.js +10 -2
  121. package/dist/esm/components/QueryEditor/query-editor-raw/QueryEditorRaw.js.map +1 -1
  122. package/dist/esm/components/QueryEditor/query-editor-raw/QueryToolbox.js +7 -2
  123. package/dist/esm/components/QueryEditor/query-editor-raw/QueryToolbox.js.map +1 -1
  124. package/dist/esm/components/QueryEditor/query-editor-raw/QueryValidator.js +4 -4
  125. package/dist/esm/components/QueryEditor/query-editor-raw/QueryValidator.js.map +1 -1
  126. package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js +14 -4
  127. package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js.map +1 -1
  128. package/dist/esm/components/QueryEditor/types.js +0 -1
  129. package/dist/esm/components/QueryEditor/types.js.map +1 -1
  130. package/dist/esm/components/QueryEditor/utils/formatSQL.js +15 -4
  131. package/dist/esm/components/QueryEditor/utils/formatSQL.js.map +1 -1
  132. package/dist/esm/components/QueryEditor/utils/sql.utils.js +8 -8
  133. package/dist/esm/components/QueryEditor/utils/sql.utils.js.map +1 -1
  134. package/dist/esm/components/QueryEditor/utils/useSqlChange.js.map +1 -1
  135. package/dist/esm/components/QueryEditor/visual-query-builder/AwesomeQueryBuilder.js +26 -27
  136. package/dist/esm/components/QueryEditor/visual-query-builder/AwesomeQueryBuilder.js.map +1 -1
  137. package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js +3 -3
  138. package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js.map +1 -1
  139. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js +2 -2
  140. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js.map +1 -1
  141. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRows.js.map +1 -1
  142. package/dist/esm/components/QueryEditor/visual-query-builder/GroupByRow.js +2 -2
  143. package/dist/esm/components/QueryEditor/visual-query-builder/GroupByRow.js.map +1 -1
  144. package/dist/esm/components/QueryEditor/visual-query-builder/OrderByRow.js +4 -4
  145. package/dist/esm/components/QueryEditor/visual-query-builder/OrderByRow.js.map +1 -1
  146. package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js +4 -4
  147. package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js.map +1 -1
  148. package/dist/esm/components/QueryEditor/visual-query-builder/SQLGroupByRow.js +0 -1
  149. package/dist/esm/components/QueryEditor/visual-query-builder/SQLGroupByRow.js.map +1 -1
  150. package/dist/esm/components/QueryEditor/visual-query-builder/SQLOrderByRow.js +2 -3
  151. package/dist/esm/components/QueryEditor/visual-query-builder/SQLOrderByRow.js.map +1 -1
  152. package/dist/esm/components/QueryEditor/visual-query-builder/SQLSelectRow.js +0 -1
  153. package/dist/esm/components/QueryEditor/visual-query-builder/SQLSelectRow.js.map +1 -1
  154. package/dist/esm/components/QueryEditor/visual-query-builder/SQLWhereRow.js +0 -1
  155. package/dist/esm/components/QueryEditor/visual-query-builder/SQLWhereRow.js.map +1 -1
  156. package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js +9 -9
  157. package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js.map +1 -1
  158. package/dist/esm/components/QueryEditor/visual-query-builder/VisualEditor.js +10 -2
  159. package/dist/esm/components/QueryEditor/visual-query-builder/VisualEditor.js.map +1 -1
  160. package/dist/esm/components/QueryEditor/visual-query-builder/WhereRow.js.map +1 -1
  161. package/dist/esm/components/QueryEditorRow/QueryEditorRow.js.map +1 -1
  162. package/dist/esm/components/SQLEditor/components/SQLEditor.js +13 -13
  163. package/dist/esm/components/SQLEditor/components/SQLEditor.js.map +1 -1
  164. package/dist/esm/components/SQLEditor/hooks/useLatestCallback.js +1 -1
  165. package/dist/esm/components/SQLEditor/hooks/useLatestCallback.js.map +1 -1
  166. package/dist/esm/components/SQLEditor/mocks/Monaco.js.map +1 -1
  167. package/dist/esm/components/SQLEditor/mocks/TextModel.js.map +1 -1
  168. package/dist/esm/components/SQLEditor/mocks/queries/multiLineFullQuery.js.map +1 -1
  169. package/dist/esm/components/SQLEditor/mocks/queries/multiLineFullQueryWithAggregation.js.map +1 -1
  170. package/dist/esm/components/SQLEditor/mocks/queries/multiLineMultipleColumns.js.map +1 -1
  171. package/dist/esm/components/SQLEditor/mocks/queries/singleLineEmptyQuery.js.map +1 -1
  172. package/dist/esm/components/SQLEditor/mocks/queries/singleLineFullQuery.js.map +1 -1
  173. package/dist/esm/components/SQLEditor/mocks/queries/singleLineFullQueryWithAggregation.js.map +1 -1
  174. package/dist/esm/components/SQLEditor/mocks/queries/singleLineMultipleColumns.js.map +1 -1
  175. package/dist/esm/components/SQLEditor/mocks/queries/singleLineTwoQueries.js.map +1 -1
  176. package/dist/esm/components/SQLEditor/mocks/queries/singleLineTwoQueriesWithAggregation.js.map +1 -1
  177. package/dist/esm/components/SQLEditor/standardSql/definition.js +0 -6
  178. package/dist/esm/components/SQLEditor/standardSql/definition.js.map +1 -1
  179. package/dist/esm/components/SQLEditor/standardSql/getStandardSuggestions.js +2 -2
  180. package/dist/esm/components/SQLEditor/standardSql/getStandardSuggestions.js.map +1 -1
  181. package/dist/esm/components/SQLEditor/standardSql/getStatementPosition.js +5 -4
  182. package/dist/esm/components/SQLEditor/standardSql/getStatementPosition.js.map +1 -1
  183. package/dist/esm/components/SQLEditor/standardSql/language.js.map +1 -1
  184. package/dist/esm/components/SQLEditor/standardSql/macros.js.map +1 -1
  185. package/dist/esm/components/SQLEditor/standardSql/standardSQLCompletionItemProvider.js +2 -2
  186. package/dist/esm/components/SQLEditor/standardSql/standardSQLCompletionItemProvider.js.map +1 -1
  187. package/dist/esm/components/SQLEditor/standardSql/standardSuggestionsRegistry.js +1 -1
  188. package/dist/esm/components/SQLEditor/standardSql/standardSuggestionsRegistry.js.map +1 -1
  189. package/dist/esm/components/SQLEditor/standardSql/statementPositionResolversRegistry.js +27 -26
  190. package/dist/esm/components/SQLEditor/standardSql/statementPositionResolversRegistry.js.map +1 -1
  191. package/dist/esm/components/SQLEditor/standardSql/suggestionsKindRegistry.js +1 -1
  192. package/dist/esm/components/SQLEditor/standardSql/suggestionsKindRegistry.js.map +1 -1
  193. package/dist/esm/components/SQLEditor/test-utils/index.js.map +1 -1
  194. package/dist/esm/components/SQLEditor/test-utils/statementPosition.js.map +1 -1
  195. package/dist/esm/components/SQLEditor/types.js +1 -17
  196. package/dist/esm/components/SQLEditor/types.js.map +1 -1
  197. package/dist/esm/components/SQLEditor/utils/LinkedToken.js +8 -8
  198. package/dist/esm/components/SQLEditor/utils/LinkedToken.js.map +1 -1
  199. package/dist/esm/components/SQLEditor/utils/commands.js.map +1 -1
  200. package/dist/esm/components/SQLEditor/utils/debugger.js +1 -1
  201. package/dist/esm/components/SQLEditor/utils/debugger.js.map +1 -1
  202. package/dist/esm/components/SQLEditor/utils/getSuggestionKind.js.map +1 -1
  203. package/dist/esm/components/SQLEditor/utils/linkedTokenBuilder.js +3 -3
  204. package/dist/esm/components/SQLEditor/utils/linkedTokenBuilder.js.map +1 -1
  205. package/dist/esm/components/SQLEditor/utils/toCompletionItem.js +1 -1
  206. package/dist/esm/components/SQLEditor/utils/toCompletionItem.js.map +1 -1
  207. package/dist/esm/components/SQLEditor/utils/tokenType.js +18 -0
  208. package/dist/esm/components/SQLEditor/utils/tokenType.js.map +1 -0
  209. package/dist/esm/components/SQLEditor/utils/tokenUtils.js +10 -10
  210. package/dist/esm/components/SQLEditor/utils/tokenUtils.js.map +1 -1
  211. package/dist/esm/components/Segment/Segment.js.map +1 -1
  212. package/dist/esm/components/VisualQueryBuilder/QueryModellerBase.js +2 -2
  213. package/dist/esm/components/VisualQueryBuilder/QueryModellerBase.js.map +1 -1
  214. package/dist/esm/components/VisualQueryBuilder/components/LabelFilterItem.js +11 -11
  215. package/dist/esm/components/VisualQueryBuilder/components/LabelFilterItem.js.map +1 -1
  216. package/dist/esm/components/VisualQueryBuilder/components/LabelFilters.js +1 -1
  217. package/dist/esm/components/VisualQueryBuilder/components/LabelFilters.js.map +1 -1
  218. package/dist/esm/components/VisualQueryBuilder/components/OperationEditor.js +4 -4
  219. package/dist/esm/components/VisualQueryBuilder/components/OperationEditor.js.map +1 -1
  220. package/dist/esm/components/VisualQueryBuilder/components/OperationEditorBody.js +3 -3
  221. package/dist/esm/components/VisualQueryBuilder/components/OperationEditorBody.js.map +1 -1
  222. package/dist/esm/components/VisualQueryBuilder/components/OperationExplainedBox.js +3 -3
  223. package/dist/esm/components/VisualQueryBuilder/components/OperationExplainedBox.js.map +1 -1
  224. package/dist/esm/components/VisualQueryBuilder/components/OperationHeader.js +2 -2
  225. package/dist/esm/components/VisualQueryBuilder/components/OperationHeader.js.map +1 -1
  226. package/dist/esm/components/VisualQueryBuilder/components/OperationInfoButton.js +2 -2
  227. package/dist/esm/components/VisualQueryBuilder/components/OperationInfoButton.js.map +1 -1
  228. package/dist/esm/components/VisualQueryBuilder/components/OperationList.js +4 -4
  229. package/dist/esm/components/VisualQueryBuilder/components/OperationList.js.map +1 -1
  230. package/dist/esm/components/VisualQueryBuilder/components/OperationListExplained.js +2 -2
  231. package/dist/esm/components/VisualQueryBuilder/components/OperationListExplained.js.map +1 -1
  232. package/dist/esm/components/VisualQueryBuilder/components/OperationParamEditor.js +6 -6
  233. package/dist/esm/components/VisualQueryBuilder/components/OperationParamEditor.js.map +1 -1
  234. package/dist/esm/components/VisualQueryBuilder/components/OperationsEditorRow.js +3 -3
  235. package/dist/esm/components/VisualQueryBuilder/components/OperationsEditorRow.js.map +1 -1
  236. package/dist/esm/components/VisualQueryBuilder/components/QueryBuilderHints.js +8 -8
  237. package/dist/esm/components/VisualQueryBuilder/components/QueryBuilderHints.js.map +1 -1
  238. package/dist/esm/components/VisualQueryBuilder/components/QueryEditorModeToggle.js.map +1 -1
  239. package/dist/esm/components/VisualQueryBuilder/components/QueryHeaderSwitch.js +3 -3
  240. package/dist/esm/components/VisualQueryBuilder/components/QueryHeaderSwitch.js.map +1 -1
  241. package/dist/esm/components/VisualQueryBuilder/components/QueryOptionGroup.js +1 -1
  242. package/dist/esm/components/VisualQueryBuilder/components/QueryOptionGroup.js.map +1 -1
  243. package/dist/esm/components/VisualQueryBuilder/components/RawQuery.js +2 -2
  244. package/dist/esm/components/VisualQueryBuilder/components/RawQuery.js.map +1 -1
  245. package/dist/esm/components/VisualQueryBuilder/types.js.map +1 -1
  246. package/dist/esm/datasource/SqlDatasource.js +14 -14
  247. package/dist/esm/datasource/SqlDatasource.js.map +1 -1
  248. package/dist/esm/datasource/constants.js.map +1 -1
  249. package/dist/esm/datasource/schema/config.js +235 -0
  250. package/dist/esm/datasource/schema/config.js.map +1 -0
  251. package/dist/esm/datasource/schema/datasource.js +228 -0
  252. package/dist/esm/datasource/schema/datasource.js.map +1 -0
  253. package/dist/esm/datasource/schema/llmHints.js +54 -0
  254. package/dist/esm/datasource/schema/llmHints.js.map +1 -0
  255. package/dist/esm/datasource/schema/provisioningYaml.js +358 -0
  256. package/dist/esm/datasource/schema/provisioningYaml.js.map +1 -0
  257. package/dist/esm/hooks/useDebounce.js.map +1 -1
  258. package/dist/esm/index.d.ts +553 -39
  259. package/dist/esm/index.js +7 -1
  260. package/dist/esm/index.js.map +1 -1
  261. package/dist/esm/test/mocks/DataQuery.js.map +1 -1
  262. package/dist/esm/test/mocks/Datasource.js +1 -1
  263. package/dist/esm/test/mocks/Datasource.js.map +1 -1
  264. package/dist/esm/test/mocks/Plugin.js +1 -1
  265. package/dist/esm/test/mocks/Plugin.js.map +1 -1
  266. package/dist/esm/test/mocks/QueryEditorProps.js.map +1 -1
  267. package/dist/esm/test/mocks/utils.js +2 -2
  268. package/dist/esm/test/mocks/utils.js.map +1 -1
  269. package/dist/esm/test-utils.d.ts +1 -1
  270. package/package.json +23 -20
@@ -0,0 +1,235 @@
1
+ function resolveGroups(schema) {
2
+ const fieldMap = /* @__PURE__ */ new Map();
3
+ for (const f of schema.fields) {
4
+ fieldMap.set(f.id, f);
5
+ }
6
+ if (schema.groups && schema.groups.length > 0) {
7
+ return schema.groups.slice().sort((a, b) => {
8
+ var _a, _b;
9
+ return ((_a = a.order) != null ? _a : 0) - ((_b = b.order) != null ? _b : 0);
10
+ }).map((g) => ({
11
+ group: g,
12
+ fields: g.fieldRefs.map((ref) => fieldMap.get(ref)).filter((f) => f != null)
13
+ }));
14
+ }
15
+ const allFields = schema.fields.filter((f) => f.kind !== "virtual" && !f.isItemField);
16
+ return [
17
+ {
18
+ group: { id: "default", title: "Configuration", fieldRefs: allFields.map((f) => f.id) },
19
+ fields: allFields
20
+ }
21
+ ];
22
+ }
23
+ function resolveRequiredFieldsGroup(schema) {
24
+ var _a;
25
+ const fieldMap = /* @__PURE__ */ new Map();
26
+ for (const f of schema.fields) {
27
+ fieldMap.set(f.id, f);
28
+ }
29
+ const requiredIds = /* @__PURE__ */ new Set();
30
+ for (const f of schema.fields) {
31
+ if (f.required) {
32
+ requiredIds.add(f.id);
33
+ }
34
+ }
35
+ const authGroup = (_a = schema.groups) == null ? void 0 : _a.find((g) => g.id === "auth");
36
+ if (authGroup) {
37
+ for (const ref of authGroup.fieldRefs) {
38
+ if (fieldMap.has(ref)) {
39
+ requiredIds.add(ref);
40
+ }
41
+ }
42
+ }
43
+ if (requiredIds.size === 0) {
44
+ return null;
45
+ }
46
+ const includeIds = /* @__PURE__ */ new Set();
47
+ for (const id of requiredIds) {
48
+ includeIds.add(id);
49
+ const f = fieldMap.get(id);
50
+ if (f == null ? void 0 : f.dependsOn) {
51
+ const parsed = parseDependsOn(f.dependsOn);
52
+ if (parsed && fieldMap.has(parsed.field)) {
53
+ includeIds.add(parsed.field);
54
+ }
55
+ }
56
+ }
57
+ for (const f of schema.fields) {
58
+ if (f.dependsOn && !includeIds.has(f.id)) {
59
+ const parsed = parseDependsOn(f.dependsOn);
60
+ if (parsed && requiredIds.has(parsed.field)) {
61
+ includeIds.add(f.id);
62
+ }
63
+ }
64
+ }
65
+ const virtualFields = schema.fields.filter((f) => includeIds.has(f.id));
66
+ if (virtualFields.length === 0) {
67
+ return null;
68
+ }
69
+ return {
70
+ group: {
71
+ id: "_required",
72
+ title: "Required",
73
+ fieldRefs: virtualFields.map((f) => f.id)
74
+ },
75
+ fields: virtualFields
76
+ };
77
+ }
78
+ function formKey(field) {
79
+ return field.section ? `${field.section}.${field.key}` : field.key;
80
+ }
81
+ function parseDependsOn(expr) {
82
+ var _a, _b;
83
+ const m = expr.match(/^(.+?)\s*==\s*(?:'([^']*)'|"([^"]*)"|(.+))$/);
84
+ if (!m) {
85
+ return null;
86
+ }
87
+ return { field: m[1].trim(), value: ((_b = (_a = m[2]) != null ? _a : m[3]) != null ? _b : m[4]).trim() };
88
+ }
89
+ function resolveActiveOverride(field, watchedValues, fieldById) {
90
+ var _a;
91
+ if (!field.overrides || field.overrides.length === 0) {
92
+ return void 0;
93
+ }
94
+ for (const ov of field.overrides) {
95
+ const parsed = parseDependsOn(ov.when);
96
+ if (!parsed) {
97
+ continue;
98
+ }
99
+ const depField = fieldById.get(parsed.field);
100
+ const depKey = depField ? formKey(depField) : parsed.field;
101
+ if (String((_a = watchedValues[depKey]) != null ? _a : "") === parsed.value) {
102
+ return ov;
103
+ }
104
+ }
105
+ return void 0;
106
+ }
107
+ function resolveFieldValue(ref, values, fields) {
108
+ if (ref in values) {
109
+ return values[ref];
110
+ }
111
+ const field = fields.find((f) => f.id === ref);
112
+ if (field) {
113
+ const fk = formKey(field);
114
+ if (fk in values) {
115
+ return values[fk];
116
+ }
117
+ }
118
+ return void 0;
119
+ }
120
+ function evaluateComputedRead(expr, values, fields) {
121
+ function evalExpr(s) {
122
+ var _a;
123
+ s = s.trim();
124
+ if (s.startsWith("(") && findMatchingParen(s, 0) === s.length - 1) {
125
+ s = s.slice(1, -1).trim();
126
+ }
127
+ const qIdx = findTopLevel(s, "?");
128
+ if (qIdx !== -1) {
129
+ const condition = s.slice(0, qIdx).trim();
130
+ const rest = s.slice(qIdx + 1);
131
+ const cIdx = findTopLevel(rest, ":");
132
+ if (cIdx !== -1) {
133
+ const trueExpr = rest.slice(0, cIdx).trim();
134
+ const falseExpr = rest.slice(cIdx + 1).trim();
135
+ return evalCondition(condition) ? evalExpr(trueExpr) : evalExpr(falseExpr);
136
+ }
137
+ }
138
+ const strMatch = (_a = s.match(/^'([^']*)'$/)) != null ? _a : s.match(/^"([^"]*)"$/);
139
+ if (strMatch) {
140
+ return strMatch[1];
141
+ }
142
+ if (s === "true") {
143
+ return true;
144
+ }
145
+ if (s === "false") {
146
+ return false;
147
+ }
148
+ if (/^-?\d+(\.\d+)?$/.test(s)) {
149
+ return Number(s);
150
+ }
151
+ return resolveFieldValue(s, values, fields);
152
+ }
153
+ function evalCondition(cond) {
154
+ const eqMatch = cond.match(/^(.+?)\s*(==|!=)\s*(.+)$/);
155
+ if (eqMatch) {
156
+ const left = evalExpr(eqMatch[1]);
157
+ const right = evalExpr(eqMatch[3]);
158
+ const eq = String(left) === String(right);
159
+ return eqMatch[2] === "==" ? eq : !eq;
160
+ }
161
+ return !!evalExpr(cond);
162
+ }
163
+ function findMatchingParen(s, start) {
164
+ let depth = 0;
165
+ for (let i = start; i < s.length; i++) {
166
+ if (s[i] === "(") {
167
+ depth++;
168
+ } else if (s[i] === ")") {
169
+ depth--;
170
+ if (depth === 0) {
171
+ return i;
172
+ }
173
+ }
174
+ }
175
+ return -1;
176
+ }
177
+ function findTopLevel(s, char) {
178
+ let depth = 0;
179
+ let inStr = null;
180
+ for (let i = 0; i < s.length; i++) {
181
+ const c = s[i];
182
+ if (inStr) {
183
+ if (c === inStr) {
184
+ inStr = null;
185
+ }
186
+ continue;
187
+ }
188
+ if (c === "'" || c === '"') {
189
+ inStr = c;
190
+ continue;
191
+ }
192
+ if (c === "(") {
193
+ depth++;
194
+ continue;
195
+ }
196
+ if (c === ")") {
197
+ depth--;
198
+ continue;
199
+ }
200
+ if (depth === 0 && c === char) {
201
+ return i;
202
+ }
203
+ }
204
+ return -1;
205
+ }
206
+ try {
207
+ return evalExpr(expr);
208
+ } catch (e) {
209
+ return void 0;
210
+ }
211
+ }
212
+ function computeVirtualFieldValues(schema, existingValues) {
213
+ var _a;
214
+ const virtualValues = {};
215
+ for (const field of schema.fields) {
216
+ if (field.kind !== "virtual") {
217
+ continue;
218
+ }
219
+ const fk = formKey(field);
220
+ if (((_a = field.storage) == null ? void 0 : _a.type) === "computed" && field.storage.read) {
221
+ const val = evaluateComputedRead(field.storage.read, existingValues, schema.fields);
222
+ if (val !== void 0) {
223
+ virtualValues[fk] = val;
224
+ } else if (field.defaultValue !== void 0) {
225
+ virtualValues[fk] = field.defaultValue;
226
+ }
227
+ } else if (field.defaultValue !== void 0) {
228
+ virtualValues[fk] = field.defaultValue;
229
+ }
230
+ }
231
+ return virtualValues;
232
+ }
233
+
234
+ export { computeVirtualFieldValues, evaluateComputedRead, formKey, parseDependsOn, resolveActiveOverride, resolveGroups, resolveRequiredFieldsGroup };
235
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sources":["../../../../src/datasource/schema/config.ts"],"sourcesContent":["/**\n * Pure helper functions for working with DatasourceConfigSchema.\n *\n * Types are defined in schema.ts — import them from there directly.\n */\n\nimport type { DatasourceConfigSchema, ConfigField, ConfigGroup, FieldOverride } from './schema';\n\n/**\n * Resolve a schema's groups into arrays of ConfigField objects.\n * If the schema has no groups, returns a single group containing all non-virtual fields.\n */\nexport function resolveGroups(schema: DatasourceConfigSchema): Array<{ group: ConfigGroup; fields: ConfigField[] }> {\n const fieldMap = new Map<string, ConfigField>();\n for (const f of schema.fields) {\n fieldMap.set(f.id, f);\n }\n\n if (schema.groups && schema.groups.length > 0) {\n return schema.groups\n .slice()\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n .map((g) => ({\n group: g,\n fields: g.fieldRefs.map((ref) => fieldMap.get(ref)).filter((f): f is ConfigField => f != null),\n }));\n }\n\n // No groups: single step with all storage fields\n const allFields = schema.fields.filter((f) => f.kind !== 'virtual' && !f.isItemField);\n return [\n {\n group: { id: 'default', title: 'Configuration', fieldRefs: allFields.map((f) => f.id) },\n fields: allFields,\n },\n ];\n}\n\n/**\n * Build a virtual \"Required\" group containing all required fields, any parent\n * fields they depend on (via `dependsOn`), and any child fields that depend on\n * required fields. When the schema contains an \"auth\" group, its fields are\n * also pulled in (auth is effectively required for Prometheus/Loki/Tempo style\n * datasources). Fields are returned in schema order and de-duplicated.\n * Returns `null` when the virtual group would be empty.\n */\nexport function resolveRequiredFieldsGroup(\n schema: DatasourceConfigSchema\n): { group: ConfigGroup; fields: ConfigField[] } | null {\n const fieldMap = new Map<string, ConfigField>();\n for (const f of schema.fields) {\n fieldMap.set(f.id, f);\n }\n\n const requiredIds = new Set<string>();\n for (const f of schema.fields) {\n if (f.required) {\n requiredIds.add(f.id);\n }\n }\n\n // Include all fields from the \"auth\" group as effectively required\n const authGroup = schema.groups?.find((g) => g.id === 'auth');\n if (authGroup) {\n for (const ref of authGroup.fieldRefs) {\n if (fieldMap.has(ref)) {\n requiredIds.add(ref);\n }\n }\n }\n\n if (requiredIds.size === 0) {\n return null;\n }\n\n const includeIds = new Set<string>();\n\n // Required fields + parent fields they depend on\n for (const id of requiredIds) {\n includeIds.add(id);\n const f = fieldMap.get(id);\n if (f?.dependsOn) {\n const parsed = parseDependsOn(f.dependsOn);\n if (parsed && fieldMap.has(parsed.field)) {\n includeIds.add(parsed.field);\n }\n }\n }\n\n // Child fields that depend on any required field\n for (const f of schema.fields) {\n if (f.dependsOn && !includeIds.has(f.id)) {\n const parsed = parseDependsOn(f.dependsOn);\n if (parsed && requiredIds.has(parsed.field)) {\n includeIds.add(f.id);\n }\n }\n }\n\n const virtualFields = schema.fields.filter((f) => includeIds.has(f.id));\n if (virtualFields.length === 0) {\n return null;\n }\n\n return {\n group: {\n id: '_required',\n title: 'Required',\n fieldRefs: virtualFields.map((f) => f.id),\n },\n fields: virtualFields,\n };\n}\n\n/**\n * Unique form key for a field. Section-scoped fields (e.g. section:\"logs\", key:\"defaultTable\")\n * get a prefixed key (\"logs.defaultTable\") so they don't collide with top-level fields that\n * share the same key name.\n */\nexport function formKey(field: ConfigField): string {\n return field.section ? `${field.section}.${field.key}` : field.key;\n}\n\n/**\n * Parse a simple CEL-like dependsOn expression: \"fieldId == 'value'\" or \"fieldId == true\".\n * Returns { field, value } or null if unparseable.\n */\nexport function parseDependsOn(expr: string): { field: string; value: string } | null {\n const m = expr.match(/^(.+?)\\s*==\\s*(?:'([^']*)'|\"([^\"]*)\"|(.+))$/);\n if (!m) {\n return null;\n }\n return { field: m[1].trim(), value: (m[2] ?? m[3] ?? m[4]).trim() };\n}\n\n/**\n * Resolve the first matching override for a field given current form values.\n * Override `when` uses the same \"fieldId == 'value'\" syntax as dependsOn.\n * Returns the matching override or undefined if none match.\n */\nexport function resolveActiveOverride(\n field: ConfigField,\n watchedValues: Record<string, unknown>,\n fieldById: Map<string, ConfigField>\n): FieldOverride | undefined {\n if (!field.overrides || field.overrides.length === 0) {\n return undefined;\n }\n for (const ov of field.overrides) {\n const parsed = parseDependsOn(ov.when);\n if (!parsed) {\n continue;\n }\n const depField = fieldById.get(parsed.field);\n const depKey = depField ? formKey(depField) : parsed.field;\n if (String(watchedValues[depKey] ?? '') === parsed.value) {\n return ov;\n }\n }\n return undefined;\n}\n\n/**\n * Resolve a field reference like \"root.basicAuth\" or \"jsonData.oauthPassThru\"\n * to its current value from a flat form values map, using the schema's field definitions.\n */\nfunction resolveFieldValue(ref: string, values: Record<string, unknown>, fields: ConfigField[]): unknown {\n // Try direct match on formKey first\n if (ref in values) {\n return values[ref];\n }\n // Try matching by field ID → formKey\n const field = fields.find((f) => f.id === ref);\n if (field) {\n const fk = formKey(field);\n if (fk in values) {\n return values[fk];\n }\n }\n return undefined;\n}\n\n/**\n * Evaluate a simple computed.read expression against form values.\n * Supports patterns used in dsconfig schemas:\n * - \"fieldRef == true ? 'a' : (fieldRef == true ? 'b' : 'c')\"\n * - Simple ternary chains with equality checks\n * Falls back to the field's defaultValue if the expression can't be evaluated.\n */\nexport function evaluateComputedRead(expr: string, values: Record<string, unknown>, fields: ConfigField[]): unknown {\n // Recursively evaluate ternary: condition ? trueVal : falseVal\n function evalExpr(s: string): unknown {\n s = s.trim();\n\n // Strip outer parens\n if (s.startsWith('(') && findMatchingParen(s, 0) === s.length - 1) {\n s = s.slice(1, -1).trim();\n }\n\n // Ternary: find top-level \"?\"\n const qIdx = findTopLevel(s, '?');\n if (qIdx !== -1) {\n const condition = s.slice(0, qIdx).trim();\n const rest = s.slice(qIdx + 1);\n const cIdx = findTopLevel(rest, ':');\n if (cIdx !== -1) {\n const trueExpr = rest.slice(0, cIdx).trim();\n const falseExpr = rest.slice(cIdx + 1).trim();\n return evalCondition(condition) ? evalExpr(trueExpr) : evalExpr(falseExpr);\n }\n }\n\n // String literal\n const strMatch = s.match(/^'([^']*)'$/) ?? s.match(/^\"([^\"]*)\"$/);\n if (strMatch) {\n return strMatch[1];\n }\n // Boolean/number literals\n if (s === 'true') {\n return true;\n }\n if (s === 'false') {\n return false;\n }\n if (/^-?\\d+(\\.\\d+)?$/.test(s)) {\n return Number(s);\n }\n\n // Field reference\n return resolveFieldValue(s, values, fields);\n }\n\n function evalCondition(cond: string): boolean {\n // \"ref == value\" or \"ref != value\"\n const eqMatch = cond.match(/^(.+?)\\s*(==|!=)\\s*(.+)$/);\n if (eqMatch) {\n const left = evalExpr(eqMatch[1]);\n const right = evalExpr(eqMatch[3]);\n const eq = String(left) === String(right);\n return eqMatch[2] === '==' ? eq : !eq;\n }\n // Truthy check\n return !!evalExpr(cond);\n }\n\n function findMatchingParen(s: string, start: number): number {\n let depth = 0;\n for (let i = start; i < s.length; i++) {\n if (s[i] === '(') {\n depth++;\n } else if (s[i] === ')') {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n return -1;\n }\n\n function findTopLevel(s: string, char: string): number {\n let depth = 0;\n let inStr: string | null = null;\n for (let i = 0; i < s.length; i++) {\n const c = s[i];\n if (inStr) {\n if (c === inStr) {\n inStr = null;\n }\n continue;\n }\n if (c === \"'\" || c === '\"') {\n inStr = c;\n continue;\n }\n if (c === '(') {\n depth++;\n continue;\n }\n if (c === ')') {\n depth--;\n continue;\n }\n if (depth === 0 && c === char) {\n return i;\n }\n }\n return -1;\n }\n\n try {\n return evalExpr(expr);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Compute initial values for all virtual fields that have storage.computed.read expressions.\n * Call after loading existing storage field values.\n */\nexport function computeVirtualFieldValues(\n schema: DatasourceConfigSchema,\n existingValues: Record<string, unknown>\n): Record<string, unknown> {\n const virtualValues: Record<string, unknown> = {};\n for (const field of schema.fields) {\n if (field.kind !== 'virtual') {\n continue;\n }\n const fk = formKey(field);\n if (field.storage?.type === 'computed' && field.storage.read) {\n const val = evaluateComputedRead(field.storage.read, existingValues, schema.fields);\n if (val !== undefined) {\n virtualValues[fk] = val;\n } else if (field.defaultValue !== undefined) {\n virtualValues[fk] = field.defaultValue;\n }\n } else if (field.defaultValue !== undefined) {\n virtualValues[fk] = field.defaultValue;\n }\n }\n return virtualValues;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,228 @@
1
+ import { getBackendSrv } from '@grafana/runtime';
2
+ import { formKey } from './config.js';
3
+
4
+ const SECURE_FIELD_CONFIGURED = "__CONFIGURED__";
5
+ function patternToRegex(pattern) {
6
+ const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
7
+ return new RegExp("^" + escaped.replace("\\{index\\}", "(\\d+)") + "$");
8
+ }
9
+ function findIndicesForPattern(record, pattern) {
10
+ const re = patternToRegex(pattern);
11
+ const indices = [];
12
+ for (const key of Object.keys(record)) {
13
+ const m = key.match(re);
14
+ if (m) {
15
+ const n = Number(m[1]);
16
+ if (!Number.isNaN(n)) {
17
+ indices.push(n);
18
+ }
19
+ }
20
+ }
21
+ return indices.sort((a, b) => a - b);
22
+ }
23
+ function expandIndexedPair(field, ds) {
24
+ var _a, _b, _c;
25
+ const storage = field.storage;
26
+ if ((storage == null ? void 0 : storage.type) !== "indexedPair" || !storage.key || !storage.value) {
27
+ return [];
28
+ }
29
+ const source = storage.key.target === "jsonData" ? (_a = ds.jsonData) != null ? _a : {} : ds;
30
+ const indices = findIndicesForPattern(source, storage.key.pattern);
31
+ const items = [];
32
+ for (const i of indices) {
33
+ const nameKey = storage.key.pattern.replace("{index}", String(i));
34
+ const valueKey = storage.value.pattern.replace("{index}", String(i));
35
+ const nameVal = source[nameKey];
36
+ if (nameVal === void 0 || nameVal === null) {
37
+ continue;
38
+ }
39
+ const hasValue = storage.value.target === "secureJsonData" ? !!((_b = ds.secureJsonFields) == null ? void 0 : _b[valueKey]) : !!((_c = ds.jsonData) == null ? void 0 : _c[valueKey]);
40
+ items.push({
41
+ index: i,
42
+ name: String(nameVal),
43
+ value: hasValue ? SECURE_FIELD_CONFIGURED : ""
44
+ });
45
+ }
46
+ return items;
47
+ }
48
+ function flattenIndexedPair(field, items, jsonData, secureJsonData, secureJsonFields) {
49
+ var _a;
50
+ const storage = field.storage;
51
+ if ((storage == null ? void 0 : storage.type) !== "indexedPair" || !storage.key || !storage.value) {
52
+ return;
53
+ }
54
+ const existingIndices = new Set(
55
+ storage.key.target === "jsonData" ? findIndicesForPattern(jsonData, storage.key.pattern) : []
56
+ );
57
+ const usedIndices = /* @__PURE__ */ new Set();
58
+ const startIdx = (_a = storage.startIndex) != null ? _a : 1;
59
+ let nextIndex = existingIndices.size > 0 ? Math.max(...existingIndices) + 1 : startIdx;
60
+ for (const item of items) {
61
+ let idx = item.index;
62
+ if (idx === 0) {
63
+ idx = nextIndex++;
64
+ }
65
+ usedIndices.add(idx);
66
+ const nameKey = storage.key.pattern.replace("{index}", String(idx));
67
+ const valueKey = storage.value.pattern.replace("{index}", String(idx));
68
+ if (storage.key.target === "jsonData") {
69
+ jsonData[nameKey] = item.name;
70
+ }
71
+ if (storage.value.target === "secureJsonData") {
72
+ if (item.value === SECURE_FIELD_CONFIGURED) {
73
+ secureJsonFields[valueKey] = true;
74
+ } else if (item.value) {
75
+ secureJsonData[valueKey] = item.value;
76
+ secureJsonFields[valueKey] = false;
77
+ }
78
+ } else if (storage.value.target === "jsonData") {
79
+ jsonData[valueKey] = item.value;
80
+ }
81
+ }
82
+ for (const idx of existingIndices) {
83
+ if (usedIndices.has(idx)) {
84
+ continue;
85
+ }
86
+ const nameKey = storage.key.pattern.replace("{index}", String(idx));
87
+ const valueKey = storage.value.pattern.replace("{index}", String(idx));
88
+ if (storage.key.target === "jsonData") {
89
+ delete jsonData[nameKey];
90
+ }
91
+ if (storage.value.target === "secureJsonData") {
92
+ delete secureJsonFields[valueKey];
93
+ delete secureJsonData[valueKey];
94
+ } else if (storage.value.target === "jsonData") {
95
+ delete jsonData[valueKey];
96
+ }
97
+ }
98
+ }
99
+ function resolveRawPath(ref, ds) {
100
+ var _a;
101
+ const trimmed = ref.trim();
102
+ if (trimmed.startsWith("jsonData.")) {
103
+ return (_a = ds.jsonData) == null ? void 0 : _a[trimmed.slice(9)];
104
+ }
105
+ if (trimmed.startsWith("root.")) {
106
+ return ds[trimmed.slice(5)];
107
+ }
108
+ return void 0;
109
+ }
110
+ async function fetchExistingValues(dsUid, fields) {
111
+ var _a, _b, _c, _d, _e;
112
+ try {
113
+ const ds = await getBackendSrv().get(`/api/datasources/uid/${dsUid}`, void 0, void 0, {
114
+ showErrorAlert: false
115
+ });
116
+ const values = {};
117
+ for (const field of fields) {
118
+ if (((_a = field.storage) == null ? void 0 : _a.type) === "indexedPair") {
119
+ values[field.key] = expandIndexedPair(field, ds);
120
+ continue;
121
+ }
122
+ const fk = formKey(field);
123
+ switch (field.target) {
124
+ case "root":
125
+ if (ds[field.key] !== void 0) {
126
+ values[fk] = ds[field.key];
127
+ }
128
+ break;
129
+ case "jsonData":
130
+ if (field.section) {
131
+ const sectionObj = (_b = ds.jsonData) == null ? void 0 : _b[field.section];
132
+ if ((sectionObj == null ? void 0 : sectionObj[field.key]) !== void 0) {
133
+ values[fk] = sectionObj[field.key];
134
+ }
135
+ } else if (((_c = ds.jsonData) == null ? void 0 : _c[field.key]) !== void 0) {
136
+ values[fk] = ds.jsonData[field.key];
137
+ }
138
+ break;
139
+ case "secureJsonData":
140
+ if ((_d = ds.secureJsonFields) == null ? void 0 : _d[field.key]) {
141
+ values[fk] = SECURE_FIELD_CONFIGURED;
142
+ }
143
+ break;
144
+ }
145
+ if (values[fk] === void 0 && ((_e = field.storage) == null ? void 0 : _e.type) === "computed" && field.storage.read) {
146
+ const fallback = resolveRawPath(field.storage.read, ds);
147
+ if (fallback !== void 0) {
148
+ values[fk] = fallback;
149
+ }
150
+ }
151
+ }
152
+ return { values, readOnly: !!ds.readOnly };
153
+ } catch (err) {
154
+ const message = err instanceof Error ? err.message : "Failed to load datasource configuration";
155
+ return { values: {}, readOnly: false, error: message };
156
+ }
157
+ }
158
+ function buildDatasourceConfigPayload(data, fields, existing, isFieldVisible) {
159
+ var _a, _b, _c, _d;
160
+ const rootFields = {};
161
+ const jsonData = { ...(_a = existing.jsonData) != null ? _a : {} };
162
+ const secureJsonData = {};
163
+ const secureJsonFields = { ...(_b = existing.secureJsonFields) != null ? _b : {} };
164
+ for (const field of fields) {
165
+ if (((_c = field.storage) == null ? void 0 : _c.type) === "indexedPair") {
166
+ const items = Array.isArray(data[field.key]) ? data[field.key] : [];
167
+ flattenIndexedPair(field, items, jsonData, secureJsonData, secureJsonFields);
168
+ continue;
169
+ }
170
+ const isManagedByEffect = (_d = field.tags) == null ? void 0 : _d.some((t) => t.startsWith("managed-by:"));
171
+ if (!isManagedByEffect && !isFieldVisible(field)) {
172
+ continue;
173
+ }
174
+ const fk = formKey(field);
175
+ const value = data[fk];
176
+ if (field.target === "secureJsonData") {
177
+ if (value === SECURE_FIELD_CONFIGURED) {
178
+ secureJsonFields[field.key] = true;
179
+ continue;
180
+ }
181
+ if (value && value !== "") {
182
+ secureJsonData[field.key] = String(value);
183
+ secureJsonFields[field.key] = false;
184
+ } else {
185
+ secureJsonFields[field.key] = false;
186
+ }
187
+ continue;
188
+ }
189
+ if (value === void 0 || value === "") {
190
+ continue;
191
+ }
192
+ switch (field.target) {
193
+ case "root":
194
+ rootFields[field.key] = value;
195
+ break;
196
+ case "jsonData":
197
+ if (field.section) {
198
+ if (!jsonData[field.section] || typeof jsonData[field.section] !== "object") {
199
+ jsonData[field.section] = {};
200
+ }
201
+ jsonData[field.section][field.key] = value;
202
+ } else {
203
+ jsonData[field.key] = value;
204
+ }
205
+ break;
206
+ }
207
+ }
208
+ return { rootFields, jsonData, secureJsonData, secureJsonFields };
209
+ }
210
+ async function submitDatasourceConfig(dsUid, data, fields, isFieldVisible) {
211
+ const existing = await getBackendSrv().get(`/api/datasources/uid/${dsUid}`);
212
+ const { rootFields, jsonData, secureJsonData, secureJsonFields } = buildDatasourceConfigPayload(
213
+ data,
214
+ fields,
215
+ existing,
216
+ isFieldVisible
217
+ );
218
+ await getBackendSrv().put(`/api/datasources/uid/${dsUid}`, {
219
+ ...existing,
220
+ ...rootFields,
221
+ jsonData,
222
+ secureJsonData,
223
+ secureJsonFields
224
+ });
225
+ }
226
+
227
+ export { SECURE_FIELD_CONFIGURED, buildDatasourceConfigPayload, expandIndexedPair, fetchExistingValues, flattenIndexedPair, submitDatasourceConfig };
228
+ //# sourceMappingURL=datasource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasource.js","sources":["../../../../src/datasource/schema/datasource.ts"],"sourcesContent":["import { getBackendSrv } from '@grafana/runtime';\nimport type { ConfigField } from './schema';\nimport { formKey } from './config';\nimport type { DatasourceResponse, DatasourceConfigPayload, FormValues } from './types';\n\nexport const SECURE_FIELD_CONFIGURED = '__CONFIGURED__';\n\nexport type FetchExistingResult = {\n values: FormValues;\n readOnly: boolean;\n error?: string;\n};\n\n/** Indexed pair item as stored in form values. Each item tracks its original storage index. */\nexport type IndexedPairItem = {\n /** Original storage index (e.g. 1 for httpHeaderName1). 0 = new item, not yet persisted. */\n index: number;\n name: string;\n value: string;\n};\n\n/**\n * Build a RegExp that matches keys produced by a pattern like \"httpHeaderName{index}\"\n * and captures the numeric index.\n */\nfunction patternToRegex(pattern: string): RegExp {\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp('^' + escaped.replace('\\\\{index\\\\}', '(\\\\d+)') + '$');\n}\n\n/**\n * Find all numeric indices present in a record for a given pattern.\n * E.g. for pattern \"httpHeaderName{index}\" and keys {httpHeaderName1, httpHeaderName3}\n * returns a sorted array [1, 3].\n */\nfunction findIndicesForPattern(record: Record<string, unknown>, pattern: string): number[] {\n const re = patternToRegex(pattern);\n const indices: number[] = [];\n for (const key of Object.keys(record)) {\n const m = key.match(re);\n if (m) {\n const n = Number(m[1]);\n if (!Number.isNaN(n)) {\n indices.push(n);\n }\n }\n }\n return indices.sort((a, b) => a - b);\n}\n\n/**\n * Expand indexed pair storage (e.g. httpHeaderName1..N / httpHeaderValue1..N)\n * into an array of {index, name, value} items for the form.\n * Each item's `index` tracks its storage position so deletes don't shift others.\n * Scans all keys in the source record to find matching indices — no gap heuristics.\n */\nexport function expandIndexedPair(field: ConfigField, ds: DatasourceResponse): IndexedPairItem[] {\n const storage = field.storage;\n if (storage?.type !== 'indexedPair' || !storage.key || !storage.value) {\n return [];\n }\n const source = storage.key.target === 'jsonData' ? (ds.jsonData ?? {}) : (ds as Record<string, unknown>);\n const indices = findIndicesForPattern(source as Record<string, unknown>, storage.key.pattern);\n const items: IndexedPairItem[] = [];\n for (const i of indices) {\n const nameKey = storage.key.pattern.replace('{index}', String(i));\n const valueKey = storage.value.pattern.replace('{index}', String(i));\n const nameVal = (source as Record<string, unknown>)[nameKey];\n if (nameVal === undefined || nameVal === null) {\n continue;\n }\n const hasValue =\n storage.value.target === 'secureJsonData' ? !!ds.secureJsonFields?.[valueKey] : !!ds.jsonData?.[valueKey];\n items.push({\n index: i,\n name: String(nameVal),\n value: hasValue ? SECURE_FIELD_CONFIGURED : '',\n });\n }\n return items;\n}\n\n/**\n * Flatten an array of indexed pair items back into individual indexed keys\n * for jsonData and secureJsonData.\n */\nexport function flattenIndexedPair(\n field: ConfigField,\n items: IndexedPairItem[],\n jsonData: Record<string, unknown>,\n secureJsonData: Record<string, string>,\n secureJsonFields: Record<string, boolean>\n) {\n const storage = field.storage;\n if (storage?.type !== 'indexedPair' || !storage.key || !storage.value) {\n return;\n }\n // Find all existing storage indices by scanning keys in jsonData.\n const existingIndices = new Set(\n storage.key.target === 'jsonData'\n ? findIndicesForPattern(jsonData as Record<string, unknown>, storage.key.pattern)\n : []\n );\n\n // Track which indices are still in use by the surviving items.\n const usedIndices = new Set<number>();\n const startIdx = storage.startIndex ?? 1;\n let nextIndex = existingIndices.size > 0 ? Math.max(...existingIndices) + 1 : startIdx;\n\n // Write each item at its original index. New items (index === 0) get the next available.\n for (const item of items) {\n let idx = item.index;\n if (idx === 0) {\n idx = nextIndex++;\n }\n usedIndices.add(idx);\n const nameKey = storage.key.pattern.replace('{index}', String(idx));\n const valueKey = storage.value.pattern.replace('{index}', String(idx));\n if (storage.key.target === 'jsonData') {\n jsonData[nameKey] = item.name;\n }\n if (storage.value.target === 'secureJsonData') {\n if (item.value === SECURE_FIELD_CONFIGURED) {\n secureJsonFields[valueKey] = true;\n } else if (item.value) {\n secureJsonData[valueKey] = item.value;\n secureJsonFields[valueKey] = false;\n }\n } else if (storage.value.target === 'jsonData') {\n jsonData[valueKey] = item.value;\n }\n }\n\n // Clear deleted indices: indices that existed before but are no longer in use.\n for (const idx of existingIndices) {\n if (usedIndices.has(idx)) {\n continue;\n }\n const nameKey = storage.key.pattern.replace('{index}', String(idx));\n const valueKey = storage.value.pattern.replace('{index}', String(idx));\n if (storage.key.target === 'jsonData') {\n delete jsonData[nameKey];\n }\n if (storage.value.target === 'secureJsonData') {\n delete secureJsonFields[valueKey];\n delete secureJsonData[valueKey];\n } else if (storage.value.target === 'jsonData') {\n delete jsonData[valueKey];\n }\n }\n}\n\n/**\n * Resolve a dotted storage path against the raw API response.\n * Handles: \"jsonData.server\", \"root.database\", \"secureJsonData.password\"\n */\nfunction resolveRawPath(ref: string, ds: DatasourceResponse): unknown {\n const trimmed = ref.trim();\n if (trimmed.startsWith('jsonData.')) {\n return ds.jsonData?.[trimmed.slice(9)];\n }\n if (trimmed.startsWith('root.')) {\n return (ds as Record<string, unknown>)[trimmed.slice(5)];\n }\n return undefined;\n}\n\nexport async function fetchExistingValues(dsUid: string, fields: ConfigField[]): Promise<FetchExistingResult> {\n try {\n const ds: DatasourceResponse = await getBackendSrv().get(`/api/datasources/uid/${dsUid}`, undefined, undefined, {\n showErrorAlert: false,\n });\n\n const values: FormValues = {};\n for (const field of fields) {\n // Expand indexedPair storage: read httpHeaderName1..N + secureJsonFields httpHeaderValue1..N\n if (field.storage?.type === 'indexedPair') {\n values[field.key] = expandIndexedPair(field, ds);\n continue;\n }\n const fk = formKey(field);\n switch (field.target) {\n case 'root':\n if (ds[field.key] !== undefined) {\n values[fk] = ds[field.key];\n }\n break;\n case 'jsonData':\n // Section-scoped fields are stored nested: jsonData.{section}.{key}\n if (field.section) {\n const sectionObj = ds.jsonData?.[field.section] as Record<string, unknown> | undefined;\n if (sectionObj?.[field.key] !== undefined) {\n values[fk] = sectionObj[field.key];\n }\n } else if (ds.jsonData?.[field.key] !== undefined) {\n values[fk] = ds.jsonData[field.key];\n }\n break;\n case 'secureJsonData':\n if (ds.secureJsonFields?.[field.key]) {\n values[fk] = SECURE_FIELD_CONFIGURED;\n }\n break;\n }\n\n // Fallback: if value is still missing and field has storage.read,\n // resolve the expression against the raw API response.\n if (values[fk] === undefined && field.storage?.type === 'computed' && field.storage.read) {\n const fallback = resolveRawPath(field.storage.read, ds);\n if (fallback !== undefined) {\n values[fk] = fallback;\n }\n }\n }\n return { values, readOnly: !!ds.readOnly };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to load datasource configuration';\n return { values: {}, readOnly: false, error: message };\n }\n}\n\nexport function buildDatasourceConfigPayload(\n data: FormValues,\n fields: ConfigField[],\n existing: DatasourceResponse,\n isFieldVisible: (field: ConfigField) => boolean\n): DatasourceConfigPayload {\n const rootFields: Record<string, unknown> = {};\n const jsonData: Record<string, unknown> = { ...(existing.jsonData ?? {}) };\n const secureJsonData: Record<string, string> = {};\n const secureJsonFields: Record<string, boolean> = { ...(existing.secureJsonFields ?? {}) };\n\n for (const field of fields) {\n // Flatten indexedPair storage back into individual indexed keys\n if (field.storage?.type === 'indexedPair') {\n const items = Array.isArray(data[field.key]) ? (data[field.key] as IndexedPairItem[]) : [];\n flattenIndexedPair(field, items, jsonData, secureJsonData, secureJsonFields);\n continue;\n }\n\n // Always include fields managed by effects (tagged \"managed-by:*\")\n // even when they're hidden from the UI — their values are set by effects.\n const isManagedByEffect = field.tags?.some((t) => t.startsWith('managed-by:'));\n if (!isManagedByEffect && !isFieldVisible(field)) {\n continue;\n }\n const fk = formKey(field);\n const value = data[fk];\n\n if (field.target === 'secureJsonData') {\n if (value === SECURE_FIELD_CONFIGURED) {\n secureJsonFields[field.key] = true;\n continue;\n }\n if (value && value !== '') {\n secureJsonData[field.key] = String(value);\n secureJsonFields[field.key] = false;\n } else {\n secureJsonFields[field.key] = false;\n }\n continue;\n }\n\n if (value === undefined || value === '') {\n continue;\n }\n switch (field.target) {\n case 'root':\n rootFields[field.key] = value;\n break;\n case 'jsonData':\n // Section-scoped fields write to jsonData.{section}.{key}\n if (field.section) {\n if (!jsonData[field.section] || typeof jsonData[field.section] !== 'object') {\n jsonData[field.section] = {};\n }\n (jsonData[field.section] as Record<string, unknown>)[field.key] = value;\n } else {\n jsonData[field.key] = value;\n }\n break;\n }\n }\n\n return { rootFields, jsonData, secureJsonData, secureJsonFields };\n}\n\nexport async function submitDatasourceConfig(\n dsUid: string,\n data: FormValues,\n fields: ConfigField[],\n isFieldVisible: (field: ConfigField) => boolean\n): Promise<void> {\n const existing: DatasourceResponse = await getBackendSrv().get(`/api/datasources/uid/${dsUid}`);\n const { rootFields, jsonData, secureJsonData, secureJsonFields } = buildDatasourceConfigPayload(\n data,\n fields,\n existing,\n isFieldVisible\n );\n\n await getBackendSrv().put(`/api/datasources/uid/${dsUid}`, {\n ...existing,\n ...rootFields,\n jsonData,\n secureJsonData,\n secureJsonFields,\n });\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,uBAAA,GAA0B;AAoBvC,SAAS,eAAe,OAAA,EAAyB;AAC/C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAC7D,EAAA,OAAO,IAAI,OAAO,GAAA,GAAM,OAAA,CAAQ,QAAQ,aAAA,EAAe,QAAQ,IAAI,GAAG,CAAA;AACxE;AAOA,SAAS,qBAAA,CAAsB,QAAiC,OAAA,EAA2B;AACzF,EAAA,MAAM,EAAA,GAAK,eAAe,OAAO,CAAA;AACjC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACtB,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACrB,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG;AACpB,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,QAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACrC;AAQO,SAAS,iBAAA,CAAkB,OAAoB,EAAA,EAA2C;AAxDjG,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAyDE,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,EAAA,IAAA,CAAI,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,UAAS,aAAA,IAAiB,CAAC,QAAQ,GAAA,IAAO,CAAC,QAAQ,KAAA,EAAO;AACrE,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,MAAA,KAAW,cAAc,EAAA,GAAA,EAAA,CAAG,QAAA,KAAH,IAAA,GAAA,EAAA,GAAe,EAAC,GAAM,EAAA;AAC1E,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,MAAA,EAAmC,OAAA,CAAQ,IAAI,OAAO,CAAA;AAC5F,EAAA,MAAM,QAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,OAAA,CAAQ,QAAQ,SAAA,EAAW,MAAA,CAAO,CAAC,CAAC,CAAA;AAChE,IAAA,MAAM,QAAA,GAAW,QAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,SAAA,EAAW,MAAA,CAAO,CAAC,CAAC,CAAA;AACnE,IAAA,MAAM,OAAA,GAAW,OAAmC,OAAO,CAAA;AAC3D,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM;AAC7C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GACJ,OAAA,CAAQ,KAAA,CAAM,MAAA,KAAW,mBAAmB,CAAC,EAAA,CAAC,EAAA,GAAA,EAAA,CAAG,gBAAA,KAAH,mBAAsB,QAAA,CAAA,CAAA,GAAY,CAAC,EAAA,CAAC,EAAA,GAAA,EAAA,CAAG,aAAH,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,QAAA,CAAA,CAAA;AAClG,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,KAAA,EAAO,CAAA;AAAA,MACP,IAAA,EAAM,OAAO,OAAO,CAAA;AAAA,MACpB,KAAA,EAAO,WAAW,uBAAA,GAA0B;AAAA,KAC7C,CAAA;AAAA,EACH;AACA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,kBAAA,CACd,KAAA,EACA,KAAA,EACA,QAAA,EACA,gBACA,gBAAA,EACA;AA5FF,EAAA,IAAA,EAAA;AA6FE,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,EAAA,IAAA,CAAI,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,UAAS,aAAA,IAAiB,CAAC,QAAQ,GAAA,IAAO,CAAC,QAAQ,KAAA,EAAO;AACrE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkB,IAAI,GAAA;AAAA,IAC1B,OAAA,CAAQ,GAAA,CAAI,MAAA,KAAW,UAAA,GACnB,qBAAA,CAAsB,UAAqC,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,GAC9E;AAAC,GACP;AAGA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,MAAM,QAAA,GAAA,CAAW,EAAA,GAAA,OAAA,CAAQ,UAAA,KAAR,IAAA,GAAA,EAAA,GAAsB,CAAA;AACvC,EAAA,IAAI,SAAA,GAAY,gBAAgB,IAAA,GAAO,CAAA,GAAI,KAAK,GAAA,CAAI,GAAG,eAAe,CAAA,GAAI,CAAA,GAAI,QAAA;AAG9E,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,MAAM,IAAA,CAAK,KAAA;AACf,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,GAAA,GAAM,SAAA,EAAA;AAAA,IACR;AACA,IAAA,WAAA,CAAY,IAAI,GAAG,CAAA;AACnB,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,OAAA,CAAQ,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAG,CAAC,CAAA;AAClE,IAAA,MAAM,QAAA,GAAW,QAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAG,CAAC,CAAA;AACrE,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAA,KAAW,UAAA,EAAY;AACrC,MAAA,QAAA,CAAS,OAAO,IAAI,IAAA,CAAK,IAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,MAAA,KAAW,gBAAA,EAAkB;AAC7C,MAAA,IAAI,IAAA,CAAK,UAAU,uBAAA,EAAyB;AAC1C,QAAA,gBAAA,CAAiB,QAAQ,CAAA,GAAI,IAAA;AAAA,MAC/B,CAAA,MAAA,IAAW,KAAK,KAAA,EAAO;AACrB,QAAA,cAAA,CAAe,QAAQ,IAAI,IAAA,CAAK,KAAA;AAChC,QAAA,gBAAA,CAAiB,QAAQ,CAAA,GAAI,KAAA;AAAA,MAC/B;AAAA,IACF,CAAA,MAAA,IAAW,OAAA,CAAQ,KAAA,CAAM,MAAA,KAAW,UAAA,EAAY;AAC9C,MAAA,QAAA,CAAS,QAAQ,IAAI,IAAA,CAAK,KAAA;AAAA,IAC5B;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,OAAO,eAAA,EAAiB;AACjC,IAAA,IAAI,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,OAAA,CAAQ,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAG,CAAC,CAAA;AAClE,IAAA,MAAM,QAAA,GAAW,QAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAG,CAAC,CAAA;AACrE,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAA,KAAW,UAAA,EAAY;AACrC,MAAA,OAAO,SAAS,OAAO,CAAA;AAAA,IACzB;AACA,IAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,MAAA,KAAW,gBAAA,EAAkB;AAC7C,MAAA,OAAO,iBAAiB,QAAQ,CAAA;AAChC,MAAA,OAAO,eAAe,QAAQ,CAAA;AAAA,IAChC,CAAA,MAAA,IAAW,OAAA,CAAQ,KAAA,CAAM,MAAA,KAAW,UAAA,EAAY;AAC9C,MAAA,OAAO,SAAS,QAAQ,CAAA;AAAA,IAC1B;AAAA,EACF;AACF;AAMA,SAAS,cAAA,CAAe,KAAa,EAAA,EAAiC;AA5JtE,EAAA,IAAA,EAAA;AA6JE,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,WAAW,CAAA,EAAG;AACnC,IAAA,OAAA,CAAO,EAAA,GAAA,EAAA,CAAG,QAAA,KAAH,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/B,IAAA,OAAQ,EAAA,CAA+B,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,mBAAA,CAAoB,OAAe,MAAA,EAAqD;AAvK9G,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAwKE,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAyB,MAAM,aAAA,EAAc,CAAE,IAAI,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAA,EAAI,KAAA,CAAA,EAAW,KAAA,CAAA,EAAW;AAAA,MAC9G,cAAA,EAAgB;AAAA,KACjB,CAAA;AAED,IAAA,MAAM,SAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,MAAA,IAAA,CAAA,CAAI,EAAA,GAAA,KAAA,CAAM,OAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAe,IAAA,MAAS,aAAA,EAAe;AACzC,QAAA,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAAI,iBAAA,CAAkB,OAAO,EAAE,CAAA;AAC/C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA,GAAK,QAAQ,KAAK,CAAA;AACxB,MAAA,QAAQ,MAAM,MAAA;AAAQ,QACpB,KAAK,MAAA;AACH,UAAA,IAAI,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA,KAAM,KAAA,CAAA,EAAW;AAC/B,YAAA,MAAA,CAAO,EAAE,CAAA,GAAI,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA;AAAA,UAC3B;AACA,UAAA;AAAA,QACF,KAAK,UAAA;AAEH,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,MAAM,UAAA,GAAA,CAAa,EAAA,GAAA,EAAA,CAAG,QAAA,KAAH,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,KAAA,CAAM,OAAA,CAAA;AACvC,YAAA,IAAA,CAAI,UAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,UAAA,CAAa,KAAA,CAAM,GAAA,CAAA,MAAS,KAAA,CAAA,EAAW;AACzC,cAAA,MAAA,CAAO,EAAE,CAAA,GAAI,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA;AAAA,YACnC;AAAA,UACF,aAAW,EAAA,GAAA,EAAA,CAAG,QAAA,KAAH,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,KAAA,CAAM,UAAS,KAAA,CAAA,EAAW;AACjD,YAAA,MAAA,CAAO,EAAE,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,MAAM,GAAG,CAAA;AAAA,UACpC;AACA,UAAA;AAAA,QACF,KAAK,gBAAA;AACH,UAAA,IAAA,CAAI,EAAA,GAAA,EAAA,CAAG,gBAAA,KAAH,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,KAAA,CAAM,GAAA,CAAA,EAAM;AACpC,YAAA,MAAA,CAAO,EAAE,CAAA,GAAI,uBAAA;AAAA,UACf;AACA,UAAA;AAAA;AAKJ,MAAA,IAAI,MAAA,CAAO,EAAE,CAAA,KAAM,KAAA,CAAA,IAAA,CAAA,CAAa,EAAA,GAAA,KAAA,CAAM,OAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAe,IAAA,MAAS,UAAA,IAAc,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM;AACxF,QAAA,MAAM,QAAA,GAAW,cAAA,CAAe,KAAA,CAAM,OAAA,CAAQ,MAAM,EAAE,CAAA;AACtD,QAAA,IAAI,aAAa,KAAA,CAAA,EAAW;AAC1B,UAAA,MAAA,CAAO,EAAE,CAAA,GAAI,QAAA;AAAA,QACf;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAC,CAAC,GAAG,QAAA,EAAS;AAAA,EAC3C,SAAS,GAAA,EAAc;AACrB,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,yCAAA;AACrD,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAI,QAAA,EAAU,KAAA,EAAO,OAAO,OAAA,EAAQ;AAAA,EACvD;AACF;AAEO,SAAS,4BAAA,CACd,IAAA,EACA,MAAA,EACA,QAAA,EACA,cAAA,EACyB;AAlO3B,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAmOE,EAAA,MAAM,aAAsC,EAAC;AAC7C,EAAA,MAAM,WAAoC,EAAE,GAAA,CAAI,cAAS,QAAA,KAAT,IAAA,GAAA,EAAA,GAAqB,EAAC,EAAG;AACzE,EAAA,MAAM,iBAAyC,EAAC;AAChD,EAAA,MAAM,mBAA4C,EAAE,GAAA,CAAI,cAAS,gBAAA,KAAT,IAAA,GAAA,EAAA,GAA6B,EAAC,EAAG;AAEzF,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,IAAA,IAAA,CAAA,CAAI,EAAA,GAAA,KAAA,CAAM,OAAA,KAAN,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,IAAA,MAAS,aAAA,EAAe;AACzC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAA0B,EAAC;AACzF,MAAA,kBAAA,CAAmB,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,cAAA,EAAgB,gBAAgB,CAAA;AAC3E,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,iBAAA,GAAA,CAAoB,WAAM,IAAA,KAAN,IAAA,GAAA,MAAA,GAAA,EAAA,CAAY,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,aAAa,CAAA,CAAA;AAC5E,IAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,cAAA,CAAe,KAAK,CAAA,EAAG;AAChD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,QAAQ,KAAK,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,KAAK,EAAE,CAAA;AAErB,IAAA,IAAI,KAAA,CAAM,WAAW,gBAAA,EAAkB;AACrC,MAAA,IAAI,UAAU,uBAAA,EAAyB;AACrC,QAAA,gBAAA,CAAiB,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AAC9B,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,IAAS,UAAU,EAAA,EAAI;AACzB,QAAA,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AACxC,QAAA,gBAAA,CAAiB,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,gBAAA,CAAiB,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,MAChC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA,EAAI;AACvC,MAAA;AAAA,IACF;AACA,IAAA,QAAQ,MAAM,MAAA;AAAQ,MACpB,KAAK,MAAA;AACH,QAAA,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AACxB,QAAA;AAAA,MACF,KAAK,UAAA;AAEH,QAAA,IAAI,MAAM,OAAA,EAAS;AACjB,UAAA,IAAI,CAAC,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,IAAK,OAAO,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,KAAM,QAAA,EAAU;AAC3E,YAAA,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,GAAI,EAAC;AAAA,UAC7B;AACA,UAAC,SAAS,KAAA,CAAM,OAAO,CAAA,CAA8B,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,QACpE,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,QACxB;AACA,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,OAAO,EAAE,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,gBAAA,EAAiB;AAClE;AAEA,eAAsB,sBAAA,CACpB,KAAA,EACA,IAAA,EACA,MAAA,EACA,cAAA,EACe;AACf,EAAA,MAAM,WAA+B,MAAM,aAAA,GAAgB,GAAA,CAAI,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAC9F,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,kBAAiB,GAAI,4BAAA;AAAA,IACjE,IAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,aAAA,EAAc,CAAE,GAAA,CAAI,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAA,EAAI;AAAA,IACzD,GAAG,QAAA;AAAA,IACH,GAAG,UAAA;AAAA,IACH,QAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;;;;"}
@@ -0,0 +1,54 @@
1
+ function generateLLMHint(schema) {
2
+ var _a, _b, _c, _d;
3
+ const hints = [];
4
+ for (const field of schema.fields) {
5
+ if (((_a = field.ui) == null ? void 0 : _a.component) !== "select" || field.target !== "jsonData" || field.kind === "virtual") {
6
+ continue;
7
+ }
8
+ const options = (_c = (_b = field.ui) == null ? void 0 : _b.options) != null ? _c : [];
9
+ const values = options.map((opt) => {
10
+ const isDefault = field.defaultValue != null && String(opt.value) === String(field.defaultValue);
11
+ return isDefault ? `"${opt.value}" (default)` : `"${opt.value}"`;
12
+ }).join(", ");
13
+ if (values) {
14
+ hints.push(`- ${(_d = field.label) != null ? _d : field.key}: jsonData.${field.key} \u2014 values: ${values}`);
15
+ }
16
+ }
17
+ return hints.join("\n");
18
+ }
19
+ function generateTroubleshootingFields(schema) {
20
+ var _a, _b, _c;
21
+ const result = [];
22
+ for (const field of schema.fields) {
23
+ if (field.kind === "virtual" || field.isItemField) {
24
+ continue;
25
+ }
26
+ const entry = {
27
+ label: (_a = field.label) != null ? _a : field.key,
28
+ key: field.target === "root" ? field.key : `${field.target}.${field.key}`,
29
+ target: (_b = field.target) != null ? _b : "jsonData",
30
+ type: field.valueType,
31
+ required: !!field.required
32
+ };
33
+ if (field.description) {
34
+ entry.description = field.description;
35
+ }
36
+ if (field.defaultValue != null) {
37
+ entry.defaultValue = field.defaultValue;
38
+ }
39
+ if (((_c = field.ui) == null ? void 0 : _c.options) && field.ui.options.length > 0) {
40
+ entry.options = field.ui.options.map((o) => String(o.value));
41
+ }
42
+ if (field.section) {
43
+ entry.section = field.section;
44
+ }
45
+ if (field.dependsOn) {
46
+ entry.dependsOn = field.dependsOn;
47
+ }
48
+ result.push(entry);
49
+ }
50
+ return result;
51
+ }
52
+
53
+ export { generateLLMHint, generateTroubleshootingFields };
54
+ //# sourceMappingURL=llmHints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmHints.js","sources":["../../../../src/datasource/schema/llmHints.ts"],"sourcesContent":["import type { DatasourceConfigSchema } from './schema';\n\n/**\n * Generate LLM hints for select fields (used when creating datasources).\n */\nexport function generateLLMHint(schema: DatasourceConfigSchema): string {\n const hints: string[] = [];\n for (const field of schema.fields) {\n if (field.ui?.component !== 'select' || field.target !== 'jsonData' || field.kind === 'virtual') {\n continue;\n }\n const options = field.ui?.options ?? [];\n const values = options\n .map((opt) => {\n const isDefault = field.defaultValue != null && String(opt.value) === String(field.defaultValue);\n return isDefault ? `\"${opt.value}\" (default)` : `\"${opt.value}\"`;\n })\n .join(', ');\n if (values) {\n hints.push(`- ${field.label ?? field.key}: jsonData.${field.key} — values: ${values}`);\n }\n }\n return hints.join('\\n');\n}\n\n/**\n * Generate comprehensive structured field data for troubleshooting context.\n * Returns an array of field descriptors the LLM can use to render rich tables.\n */\nexport function generateTroubleshootingFields(schema: DatasourceConfigSchema): Array<{\n label: string;\n key: string;\n target: string;\n type: string;\n required: boolean;\n description?: string;\n defaultValue?: unknown;\n options?: string[];\n section?: string;\n dependsOn?: string;\n}> {\n const result: Array<{\n label: string;\n key: string;\n target: string;\n type: string;\n required: boolean;\n description?: string;\n defaultValue?: unknown;\n options?: string[];\n section?: string;\n dependsOn?: string;\n }> = [];\n for (const field of schema.fields) {\n if (field.kind === 'virtual' || field.isItemField) {\n continue;\n }\n const entry: (typeof result)[0] = {\n label: field.label ?? field.key,\n key: field.target === 'root' ? field.key : `${field.target}.${field.key}`,\n target: field.target ?? 'jsonData',\n type: field.valueType,\n required: !!field.required,\n };\n if (field.description) {\n entry.description = field.description;\n }\n if (field.defaultValue != null) {\n entry.defaultValue = field.defaultValue;\n }\n if (field.ui?.options && field.ui.options.length > 0) {\n entry.options = field.ui.options.map((o) => String(o.value));\n }\n if (field.section) {\n entry.section = field.section;\n }\n if (field.dependsOn) {\n entry.dependsOn = field.dependsOn;\n }\n result.push(entry);\n }\n return result;\n}\n"],"names":[],"mappings":"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"}